From c3ba7d6a6be276da4afa5e96f61f66b865aacc43 Mon Sep 17 00:00:00 2001 From: Thomas Skerbis Date: Wed, 11 Jun 2025 22:52:25 +0200 Subject: [PATCH 1/3] Vendor update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erstmal nur Vendor updates. redaxo php-cs-fixer2 kommt im nächsten pr --- composer.json | 4 +- composer.lock | 1038 +++++++++-- package.yml | 2 +- vendor/clue/ndjson-react/CHANGELOG.md | 75 + vendor/clue/ndjson-react/LICENSE | 21 + vendor/clue/ndjson-react/README.md | 365 ++++ vendor/clue/ndjson-react/composer.json | 31 + vendor/clue/ndjson-react/src/Decoder.php | 166 ++ vendor/clue/ndjson-react/src/Encoder.php | 144 ++ vendor/composer/InstalledVersions.php | 27 +- vendor/composer/autoload_classmap.php | 163 +- vendor/composer/autoload_files.php | 1 + vendor/composer/autoload_psr4.php | 10 + vendor/composer/autoload_static.php | 220 ++- vendor/composer/installed.json | 1118 ++++++++++-- vendor/composer/installed.php | 216 ++- vendor/composer/pcre/composer.json | 4 +- .../PregMatchTypeSpecifyingExtension.php | 14 + vendor/composer/pcre/src/PcreException.php | 7 +- vendor/evenement/evenement/.gitattributes | 7 + vendor/evenement/evenement/LICENSE | 19 + vendor/evenement/evenement/README.md | 64 + vendor/evenement/evenement/composer.json | 29 + .../evenement/evenement/src/EventEmitter.php | 17 + .../evenement/src/EventEmitterInterface.php | 22 + .../evenement/src/EventEmitterTrait.php | 154 ++ vendor/fidry/cpu-core-counter/.envrc | 5 + vendor/fidry/cpu-core-counter/LICENSE.md | 16 + vendor/fidry/cpu-core-counter/README.md | 138 ++ .../fidry/cpu-core-counter/bin/diagnose.php | 27 + vendor/fidry/cpu-core-counter/bin/execute.php | 21 + vendor/fidry/cpu-core-counter/bin/trace.php | 32 + vendor/fidry/cpu-core-counter/composer.json | 48 + .../cpu-core-counter/src/CpuCoreCounter.php | 268 +++ .../fidry/cpu-core-counter/src/Diagnoser.php | 101 ++ .../src/Executor/ProcOpenExecutor.php | 56 + .../src/Executor/ProcessExecutor.php | 22 + .../src/Finder/CmiCmdletLogicalFinder.php | 46 + .../src/Finder/CmiCmdletPhysicalFinder.php | 47 + .../src/Finder/CpuCoreFinder.php | 37 + .../src/Finder/CpuInfoFinder.php | 100 ++ .../src/Finder/DummyCpuCoreFinder.php | 57 + .../src/Finder/EnvVariableFinder.php | 69 + .../src/Finder/FinderRegistry.php | 91 + .../src/Finder/HwLogicalFinder.php | 33 + .../src/Finder/HwPhysicalFinder.php | 33 + .../src/Finder/LscpuLogicalFinder.php | 52 + .../src/Finder/LscpuPhysicalFinder.php | 66 + .../src/Finder/NProcFinder.php | 59 + .../src/Finder/NProcessorFinder.php | 32 + .../src/Finder/NullCpuCoreFinder.php | 35 + .../src/Finder/OnlyInPowerShellFinder.php | 62 + .../src/Finder/OnlyOnOSFamilyFinder.php | 113 ++ .../src/Finder/ProcOpenBasedFinder.php | 107 ++ .../src/Finder/SkipOnOSFamilyFinder.php | 113 ++ .../Finder/WindowsRegistryLogicalFinder.php | 51 + .../src/Finder/WmicLogicalFinder.php | 47 + .../src/Finder/WmicPhysicalFinder.php | 47 + .../src/Finder/_NProcessorFinder.php | 32 + .../src/NumberOfCpuCoreNotFound.php | 26 + .../src/ParallelisationResult.php | 87 + vendor/friendsofphp/php-cs-fixer/CHANGELOG.md | 997 ++++++++++- .../friendsofphp/php-cs-fixer/CONTRIBUTING.md | 38 +- vendor/friendsofphp/php-cs-fixer/README.md | 30 +- .../friendsofphp/php-cs-fixer/UPGRADE-v3.md | 169 +- .../php-cs-fixer/ci-integration.sh | 2 +- .../friendsofphp/php-cs-fixer/composer.json | 107 +- vendor/friendsofphp/php-cs-fixer/logo.md | 2 +- vendor/friendsofphp/php-cs-fixer/php-cs-fixer | 30 +- .../src/AbstractDoctrineAnnotationFixer.php | 28 +- .../php-cs-fixer/src/AbstractFixer.php | 96 +- .../src/AbstractFunctionReferenceFixer.php | 7 +- .../src/AbstractNoUselessElseFixer.php | 2 +- .../AbstractPhpdocToTypeDeclarationFixer.php | 48 +- .../src/AbstractPhpdocTypesFixer.php | 47 +- .../php-cs-fixer/src/AbstractProxyFixer.php | 2 +- .../php-cs-fixer/src/Cache/Cache.php | 8 +- .../src/Cache/CacheManagerInterface.php | 2 + .../php-cs-fixer/src/Cache/Directory.php | 2 + .../src/Cache/FileCacheManager.php | 16 +- .../php-cs-fixer/src/Cache/FileHandler.php | 6 +- .../src/Cache/NullCacheManager.php | 3 + .../php-cs-fixer/src/Cache/Signature.php | 2 + .../friendsofphp/php-cs-fixer/src/Config.php | 72 +- .../php-cs-fixer/src/ConfigInterface.php | 28 +- .../InvalidFixerConfigurationException.php | 2 +- .../php-cs-fixer/src/Console/Application.php | 102 +- .../src/Console/Command/CheckCommand.php | 1 + .../src/Console/Command/DescribeCommand.php | 147 +- .../Console/Command/DocumentationCommand.php | 32 +- .../src/Console/Command/FixCommand.php | 66 +- .../FixCommandExitStatusCalculator.php | 9 +- .../src/Console/Command/ListSetsCommand.php | 2 +- .../src/Console/Command/SelfUpdateCommand.php | 25 +- .../src/Console/Command/WorkerCommand.php | 243 +++ .../src/Console/ConfigurationResolver.php | 208 +-- .../src/Console/Output/ErrorOutput.php | 30 +- .../src/Console/Output/OutputContext.php | 2 + .../Console/Output/Progress/DotsOutput.php | 43 +- .../Console/Output/Progress/NullOutput.php | 6 +- .../Output/Progress/PercentageBarOutput.php | 78 + .../Output/Progress/ProgressOutputFactory.php | 28 +- .../Progress/ProgressOutputInterface.php | 4 +- .../Output/Progress/ProgressOutputType.php | 16 +- .../Report/FixReport/CheckstyleReporter.php | 6 + .../Report/FixReport/GitlabReporter.php | 38 +- .../Console/Report/FixReport/JsonReporter.php | 8 +- .../Report/FixReport/JunitReporter.php | 14 +- .../Report/FixReport/ReportSummary.php | 2 + .../Report/FixReport/ReporterFactory.php | 8 +- .../Console/Report/FixReport/TextReporter.php | 16 +- .../Console/Report/FixReport/XmlReporter.php | 17 +- .../Report/ListSetsReport/JsonReporter.php | 4 +- .../Report/ListSetsReport/ReportSummary.php | 2 + .../Report/ListSetsReport/ReporterFactory.php | 8 +- .../Report/ListSetsReport/TextReporter.php | 6 +- .../src/Console/SelfUpdate/GithubClient.php | 32 +- .../SelfUpdate/GithubClientInterface.php | 7 +- .../Console/SelfUpdate/NewVersionChecker.php | 13 +- .../src/Console/WarningsDetector.php | 12 +- .../src/Differ/DiffConsoleFormatter.php | 8 +- .../php-cs-fixer/src/Differ/FullDiffer.php | 2 + .../php-cs-fixer/src/DocBlock/Annotation.php | 98 +- .../php-cs-fixer/src/DocBlock/DocBlock.php | 2 +- .../php-cs-fixer/src/DocBlock/Line.php | 4 +- .../src/DocBlock/ShortDescription.php | 2 + .../src/DocBlock/TagComparator.php | 4 +- .../src/DocBlock/TypeExpression.php | 379 +++- .../src/Doctrine/Annotation/DocLexer.php | 16 +- .../src/Doctrine/Annotation/Token.php | 2 +- .../src/Doctrine/Annotation/Tokens.php | 29 +- .../Documentation/DocumentationLocator.php | 9 +- .../Documentation/FixerDocumentGenerator.php | 99 +- .../Documentation/ListDocumentGenerator.php | 170 -- .../RuleSetDocumentationGenerator.php | 69 +- .../php-cs-fixer/src/Error/Error.php | 34 +- .../php-cs-fixer/src/Error/ErrorsManager.php | 18 +- .../src/Error/SourceExceptionFactory.php | 62 + .../src/ExecutorWithoutErrorHandler.php | 58 + .../ExecutorWithoutErrorHandlerException.php | 22 + .../php-cs-fixer/src/FileReader.php | 7 +- .../php-cs-fixer/src/FileRemoval.php | 4 +- .../src/Fixer/AbstractPhpUnitFixer.php | 126 +- .../src/Fixer/AbstractShortOperatorFixer.php | 2 +- .../Fixer/Alias/BacktickToShellExecFixer.php | 7 +- .../src/Fixer/Alias/EregToPregFixer.php | 6 +- .../src/Fixer/Alias/MbStrFunctionsFixer.php | 87 +- .../src/Fixer/Alias/ModernizeStrposFixer.php | 119 +- .../src/Fixer/Alias/NoAliasFunctionsFixer.php | 55 +- .../src/Fixer/Alias/NoMixedEchoPrintFixer.php | 45 +- .../Fixer/Alias/PowToExponentiationFixer.php | 4 +- .../Fixer/Alias/RandomApiMigrationFixer.php | 51 +- .../src/Fixer/Alias/SetTypeToCastFixer.php | 2 +- .../Fixer/ArrayNotation/ArraySyntaxFixer.php | 46 +- .../NoWhitespaceBeforeCommaInArrayFixer.php | 13 + .../NormalizeIndexBraceFixer.php | 8 +- .../WhitespaceAfterCommaInArrayFixer.php | 15 +- .../YieldFromArrayToYieldsFixer.php | 2 +- .../AttributeEmptyParenthesesFixer.php | 13 + .../GeneralAttributeRemoveFixer.php | 142 ++ .../OrderedAttributesFixer.php | 274 +++ .../src/Fixer/Basic/BracesFixer.php | 54 +- .../src/Fixer/Basic/BracesPositionFixer.php | 121 +- .../Fixer/Basic/CurlyBracesPositionFixer.php | 40 +- .../NoMultipleStatementsPerLineFixer.php | 10 + .../NoTrailingCommaInSinglelineFixer.php | 19 +- .../Basic/NonPrintableCharacterFixer.php | 33 +- .../Basic/NumericLiteralSeparatorFixer.php | 232 +++ .../src/Fixer/Basic/PsrAutoloadingFixer.php | 47 +- .../Casing/ClassReferenceNameCasingFixer.php | 4 + .../src/Fixer/Casing/ConstantCaseFixer.php | 115 +- .../Fixer/Casing/LowercaseKeywordsFixer.php | 7 +- .../Casing/LowercaseStaticReferenceFixer.php | 2 +- .../Fixer/Casing/MagicConstantCasingFixer.php | 2 +- .../Fixer/Casing/MagicMethodCasingFixer.php | 15 +- .../NativeTypeDeclarationCasingFixer.php | 261 +-- .../Fixer/CastNotation/CastSpacesFixer.php | 13 + .../ClassAttributesSeparationFixer.php | 104 +- .../ClassNotation/ClassDefinitionFixer.php | 95 +- .../Fixer/ClassNotation/FinalClassFixer.php | 2 +- .../ClassNotation/FinalInternalClassFixer.php | 60 +- ...FinalPublicMethodForAbstractClassFixer.php | 2 +- .../NoBlankLinesAfterClassOpeningFixer.php | 2 +- .../ClassNotation/NoPhp4ConstructorFixer.php | 2 +- .../NoUnneededFinalMethodFixer.php | 24 +- .../OrderedClassElementsFixer.php | 258 ++- .../ClassNotation/OrderedInterfacesFixer.php | 39 +- .../ClassNotation/OrderedTraitsFixer.php | 18 +- .../Fixer/ClassNotation/OrderedTypesFixer.php | 39 +- .../ClassNotation/ProtectedToPrivateFixer.php | 6 +- .../Fixer/ClassNotation/SelfAccessorFixer.php | 2 +- .../SingleClassElementPerStatementFixer.php | 17 +- .../SingleTraitInsertPerStatementFixer.php | 4 +- .../ClassNotation/VisibilityRequiredFixer.php | 21 +- .../Fixer/Comment/CommentToPhpdocFixer.php | 35 +- .../src/Fixer/Comment/HeaderCommentFixer.php | 133 +- .../MultilineCommentOpeningClosingFixer.php | 4 +- .../src/Fixer/Comment/NoEmptyCommentFixer.php | 20 +- .../Comment/SingleLineCommentSpacingFixer.php | 2 +- .../Comment/SingleLineCommentStyleFixer.php | 41 +- .../src/Fixer/ConfigurableFixerInterface.php | 5 +- .../src/Fixer/ConfigurableFixerTrait.php | 124 ++ .../NativeConstantInvocationFixer.php | 34 +- ...trolStructureContinuationPositionFixer.php | 18 +- .../ControlStructure/EmptyLoopBodyFixer.php | 16 +- .../EmptyLoopConditionFixer.php | 18 +- .../NoAlternativeSyntaxFixer.php | 13 + .../ControlStructure/NoBreakCommentFixer.php | 15 +- .../NoUnneededBracesFixer.php | 26 +- .../NoUnneededControlParenthesesFixer.php | 25 +- .../NoUnneededCurlyBracesFixer.php | 28 +- .../SimplifiedIfReturnFixer.php | 4 +- .../SwitchContinueToBreakFixer.php | 2 +- .../TrailingCommaInMultilineFixer.php | 146 +- .../Fixer/ControlStructure/YodaStyleFixer.php | 44 +- .../src/Fixer/DeprecatedFixerInterface.php | 2 +- ...DoctrineAnnotationArrayAssignmentFixer.php | 21 +- .../DoctrineAnnotationBracesFixer.php | 18 +- .../DoctrineAnnotationIndentationFixer.php | 23 +- .../DoctrineAnnotationSpacesFixer.php | 32 +- .../src/Fixer/ExperimentalFixerInterface.php | 20 + .../CombineNestedDirnameFixer.php | 10 +- .../DateTimeCreateFromFormatCallFixer.php | 5 +- .../FunctionNotation/FopenFlagOrderFixer.php | 4 +- .../FunctionNotation/FopenFlagsFixer.php | 14 + .../FunctionDeclarationFixer.php | 17 + .../FunctionNotation/ImplodeCallFixer.php | 4 +- .../LambdaNotUsedImportFixer.php | 28 +- .../MethodArgumentSpaceFixer.php | 26 +- .../NativeFunctionInvocationFixer.php | 65 +- .../NoSpacesAfterFunctionNameFixer.php | 16 +- ...NoUnreachableDefaultArgumentValueFixer.php | 6 + ...ypeDeclarationForDefaultNullValueFixer.php | 16 +- .../PhpdocToParamTypeFixer.php | 44 +- .../PhpdocToPropertyTypeFixer.php | 54 +- .../PhpdocToReturnTypeFixer.php | 53 +- .../RegularCallableCallFixer.php | 2 +- .../ReturnTypeDeclarationFixer.php | 13 + .../UseArrowFunctionsFixer.php | 26 +- .../FunctionNotation/VoidReturnFixer.php | 4 +- .../Import/FullyQualifiedStrictTypesFixer.php | 846 ++++++++- .../Import/GlobalNamespaceImportFixer.php | 134 +- .../src/Fixer/Import/GroupImportFixer.php | 137 +- .../src/Fixer/Import/NoUnusedImportsFixer.php | 209 ++- .../src/Fixer/Import/OrderedImportsFixer.php | 139 +- .../Import/SingleImportPerStatementFixer.php | 26 +- .../src/Fixer/InternalFixerInterface.php | 20 + .../LanguageConstruct/ClassKeywordFixer.php | 100 ++ .../ClassKeywordRemoveFixer.php | 6 +- .../CombineConsecutiveIssetsFixer.php | 8 +- .../CombineConsecutiveUnsetsFixer.php | 4 +- .../DeclareEqualNormalizeFixer.php | 30 +- .../ErrorSuppressionFixer.php | 19 +- .../ExplicitIndirectVariableFixer.php | 2 +- .../FunctionToConstantFixer.php | 72 +- .../NoUnsetOnPropertyFixer.php | 12 +- .../NullableTypeDeclarationFixer.php | 42 +- .../SingleSpaceAfterConstructFixer.php | 43 +- .../SingleSpaceAroundConstructFixer.php | 202 ++- .../Fixer/ListNotation/ListSyntaxFixer.php | 39 +- .../BlankLinesBeforeNamespaceFixer.php | 19 +- .../NamespaceNotation/CleanNamespaceFixer.php | 4 +- .../Fixer/Naming/NoHomoglyphNamesFixer.php | 6 +- .../Operator/BinaryOperatorSpacesFixer.php | 115 +- .../src/Fixer/Operator/ConcatSpaceFixer.php | 36 +- .../Fixer/Operator/IncrementStyleFixer.php | 13 + .../Operator/LongToShorthandOperatorFixer.php | 12 +- .../src/Fixer/Operator/NewWithBracesFixer.php | 30 +- .../Operator/NewWithParenthesesFixer.php | 48 +- .../NoSpaceAroundDoubleColonFixer.php | 10 + .../Operator/NoUselessConcatOperatorFixer.php | 128 +- .../Fixer/Operator/OperatorLinebreakFixer.php | 74 +- .../Operator/TernaryOperatorSpacesFixer.php | 31 +- .../Operator/TernaryToElvisOperatorFixer.php | 22 +- .../Operator/TernaryToNullCoalescingFixer.php | 4 +- .../Operator/UnaryOperatorSpacesFixer.php | 52 +- .../PhpTag/BlankLineAfterOpeningTagFixer.php | 31 +- .../src/Fixer/PhpTag/EchoTagSyntaxFixer.php | 19 +- .../src/Fixer/PhpTag/FullOpeningTagFixer.php | 2 +- .../PhpTag/LinebreakAfterOpeningTagFixer.php | 13 +- .../src/Fixer/PhpTag/NoClosingTagFixer.php | 8 +- .../PhpUnit/PhpUnitAssertNewNamesFixer.php | 107 ++ .../Fixer/PhpUnit/PhpUnitAttributesFixer.php | 620 +++++++ .../Fixer/PhpUnit/PhpUnitConstructFixer.php | 52 +- .../PhpUnitDataProviderMethodOrderFixer.php | 288 +++ .../PhpUnit/PhpUnitDataProviderNameFixer.php | 63 +- .../PhpUnitDataProviderReturnTypeFixer.php | 4 +- .../PhpUnitDataProviderStaticFixer.php | 27 +- .../PhpUnit/PhpUnitDedicateAssertFixer.php | 202 +-- ...PhpUnitDedicateAssertInternalTypeFixer.php | 13 + .../Fixer/PhpUnit/PhpUnitExpectationFixer.php | 51 +- .../PhpUnit/PhpUnitFqcnAnnotationFixer.php | 2 +- .../PhpUnit/PhpUnitInternalClassFixer.php | 20 +- .../PhpUnit/PhpUnitMethodCasingFixer.php | 48 +- .../src/Fixer/PhpUnit/PhpUnitMockFixer.php | 22 +- .../PhpUnitMockShortWillReturnFixer.php | 4 - .../Fixer/PhpUnit/PhpUnitNamespacedFixer.php | 26 +- .../PhpUnitNoExpectationAnnotationFixer.php | 30 +- .../PhpUnitSetUpTearDownVisibilityFixer.php | 49 +- .../Fixer/PhpUnit/PhpUnitSizeClassFixer.php | 26 +- .../src/Fixer/PhpUnit/PhpUnitStrictFixer.php | 23 +- .../Fixer/PhpUnit/PhpUnitTargetVersion.php | 3 +- .../PhpUnit/PhpUnitTestAnnotationFixer.php | 40 +- .../PhpUnitTestCaseStaticMethodCallsFixer.php | 122 +- .../PhpUnitTestClassRequiresCoversFixer.php | 14 +- .../Phpdoc/AlignMultilineCommentFixer.php | 37 +- .../GeneralPhpdocAnnotationRemoveFixer.php | 19 +- .../Phpdoc/GeneralPhpdocTagRenameFixer.php | 54 +- .../src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php | 30 +- .../Phpdoc/NoSuperfluousPhpdocTagsFixer.php | 161 +- .../PhpdocAddMissingParamAnnotationFixer.php | 19 +- .../src/Fixer/Phpdoc/PhpdocAlignFixer.php | 216 ++- .../PhpdocAnnotationWithoutDotFixer.php | 4 +- .../src/Fixer/Phpdoc/PhpdocArrayTypeFixer.php | 92 + .../src/Fixer/Phpdoc/PhpdocIndentFixer.php | 16 +- .../Phpdoc/PhpdocInlineTagNormalizerFixer.php | 18 +- .../src/Fixer/Phpdoc/PhpdocLineSpanFixer.php | 17 + .../src/Fixer/Phpdoc/PhpdocListTypeFixer.php | 70 + .../src/Fixer/Phpdoc/PhpdocNoAccessFixer.php | 8 +- .../Fixer/Phpdoc/PhpdocNoAliasTagFixer.php | 19 +- .../Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php | 2 +- .../src/Fixer/Phpdoc/PhpdocNoPackageFixer.php | 7 +- .../Phpdoc/PhpdocNoUselessInheritdocFixer.php | 2 +- .../Fixer/Phpdoc/PhpdocOrderByValueFixer.php | 29 +- .../src/Fixer/Phpdoc/PhpdocOrderFixer.php | 25 +- .../Fixer/Phpdoc/PhpdocParamOrderFixer.php | 29 +- .../Phpdoc/PhpdocReturnSelfReferenceFixer.php | 28 +- .../src/Fixer/Phpdoc/PhpdocScalarFixer.php | 31 +- .../Fixer/Phpdoc/PhpdocSeparationFixer.php | 47 +- .../src/Fixer/Phpdoc/PhpdocSummaryFixer.php | 2 +- .../src/Fixer/Phpdoc/PhpdocTagCasingFixer.php | 22 +- .../src/Fixer/Phpdoc/PhpdocTagTypeFixer.php | 22 +- .../src/Fixer/Phpdoc/PhpdocToCommentFixer.php | 54 +- ...rimConsecutiveBlankLineSeparationFixer.php | 7 +- .../src/Fixer/Phpdoc/PhpdocTrimFixer.php | 2 +- .../src/Fixer/Phpdoc/PhpdocTypesFixer.php | 91 +- .../Fixer/Phpdoc/PhpdocTypesOrderFixer.php | 32 +- .../PhpdocVarAnnotationCorrectOrderFixer.php | 2 +- .../Phpdoc/PhpdocVarWithoutNameFixer.php | 8 +- .../SimplifiedNullReturnFixer.php | 37 +- ...ltilineWhitespaceBeforeSemicolonsFixer.php | 18 +- .../Semicolon/SpaceAfterSemicolonFixer.php | 14 + .../Fixer/Strict/DeclareStrictTypesFixer.php | 44 +- .../src/Fixer/Strict/StrictParamFixer.php | 5 +- .../EscapeImplicitBackslashesFixer.php | 111 +- .../ExplicitStringVariableFixer.php | 9 +- .../HeredocClosingMarkerFixer.php | 205 +++ .../StringNotation/HeredocToNowdocFixer.php | 6 +- .../MultilineStringToHeredocFixer.php | 166 ++ .../SimpleToComplexStringVariableFixer.php | 30 +- .../Fixer/StringNotation/SingleQuoteFixer.php | 19 +- .../StringImplicitBackslashesFixer.php | 193 ++ .../BlankLineBeforeStatementFixer.php | 43 +- .../BlankLineBetweenImportGroupsFixer.php | 2 +- .../Whitespace/HeredocIndentationFixer.php | 25 +- .../Fixer/Whitespace/IndentationTypeFixer.php | 5 +- .../MethodChainingIndentationFixer.php | 20 +- .../Whitespace/NoExtraBlankLinesFixer.php | 143 +- .../Whitespace/NoSpacesAroundOffsetFixer.php | 15 +- .../Whitespace/NoTrailingWhitespaceFixer.php | 2 +- .../NoWhitespaceInBlankLineFixer.php | 2 +- .../SpacesInsideParenthesesFixer.php | 25 +- .../Whitespace/StatementIndentationFixer.php | 282 ++- .../Whitespace/TypeDeclarationSpacesFixer.php | 65 +- .../src/Fixer/Whitespace/TypesSpacesFixer.php | 33 +- .../FixerConfiguration/AliasedFixerOption.php | 2 + .../AliasedFixerOptionBuilder.php | 2 +- .../FixerConfiguration/AllowedValueSubset.php | 4 +- .../DeprecatedFixerOption.php | 6 + .../FixerConfigurationResolver.php | 67 +- .../src/FixerConfiguration/FixerOption.php | 25 +- .../FixerConfiguration/FixerOptionBuilder.php | 21 +- .../FixerOptionInterface.php | 2 +- .../FixerConfiguration/FixerOptionSorter.php | 2 +- .../src/FixerDefinition/CodeSample.php | 2 + .../FileSpecificCodeSample.php | 2 + .../src/FixerDefinition/FixerDefinition.php | 2 + .../VersionSpecificCodeSample.php | 2 + .../FixerDefinition/VersionSpecification.php | 2 + .../php-cs-fixer/src/FixerFactory.php | 30 +- .../{Tokenizer/CodeHasher.php => Hasher.php} | 12 +- .../Indicator/PhpUnitTestCaseIndicator.php | 4 +- .../php-cs-fixer/src/Linter/CachingLinter.php | 18 +- .../php-cs-fixer/src/Linter/Linter.php | 2 + .../php-cs-fixer/src/Linter/ProcessLinter.php | 10 +- .../Linter/ProcessLinterProcessBuilder.php | 2 + .../src/Linter/ProcessLintingResult.php | 10 +- .../src/Linter/TokenizerLinter.php | 6 +- .../src/Linter/TokenizerLintingResult.php | 4 +- .../src/ParallelAwareConfigInterface.php | 29 + vendor/friendsofphp/php-cs-fixer/src/Preg.php | 142 +- .../AbstractMigrationSetDescription.php | 6 +- .../DeprecatedRuleSetDescriptionInterface.php | 28 + .../php-cs-fixer/src/RuleSet/RuleSet.php | 38 +- .../src/RuleSet/RuleSetInterface.php | 2 +- .../php-cs-fixer/src/RuleSet/RuleSets.php | 10 +- .../src/RuleSet/Sets/PERCS1x0RiskySet.php | 9 +- .../src/RuleSet/Sets/PERCS1x0Set.php | 9 +- .../src/RuleSet/Sets/PERCS2x0Set.php | 62 + .../src/RuleSet/Sets/PERRiskySet.php | 14 +- .../php-cs-fixer/src/RuleSet/Sets/PERSet.php | 14 +- .../RuleSet/Sets/PHP82MigrationRiskySet.php | 31 + .../src/RuleSet/Sets/PHP83MigrationSet.php | 30 + .../src/RuleSet/Sets/PHP84MigrationSet.php | 31 + .../Sets/PHPUnit100MigrationRiskySet.php | 2 +- .../Sets/PHPUnit91MigrationRiskySet.php | 31 + .../src/RuleSet/Sets/PSR12Set.php | 49 +- .../php-cs-fixer/src/RuleSet/Sets/PSR2Set.php | 34 + .../src/RuleSet/Sets/PhpCsFixerRiskySet.php | 2 +- .../src/RuleSet/Sets/PhpCsFixerSet.php | 12 +- .../src/RuleSet/Sets/SymfonyRiskySet.php | 1 - .../src/RuleSet/Sets/SymfonySet.php | 32 +- .../src/Runner/Event/AnalysisStarted.php | 54 + .../Event/FileProcessed.php} | 30 +- ...php => FileCachingLintingFileIterator.php} | 16 +- .../src/Runner/FileFilterIterator.php | 9 +- ...ngIterator.php => LintingFileIterator.php} | 7 +- ...intingResultAwareFileIteratorInterface.php | 29 + .../src/Runner/Parallel/ParallelAction.php | 35 + .../src/Runner/Parallel/ParallelConfig.php | 67 + .../Runner/Parallel/ParallelConfigFactory.php | 61 + .../Parallel/ParallelisationException.php | 30 + .../src/Runner/Parallel/Process.php | 189 ++ .../src/Runner/Parallel/ProcessFactory.php | 111 ++ .../src/Runner/Parallel/ProcessIdentifier.php | 55 + .../src/Runner/Parallel/ProcessPool.php | 99 ++ .../src/Runner/Parallel/WorkerException.php | 66 + .../php-cs-fixer/src/Runner/Runner.php | 399 ++++- .../php-cs-fixer/src/Runner/RunnerConfig.php | 64 + .../php-cs-fixer/src/StdinFileInfo.php | 20 +- .../Analyzer/AlternativeSyntaxAnalyzer.php | 5 + .../AbstractControlCaseStructuresAnalysis.php | 2 + .../Analyzer/Analysis/ArgumentAnalysis.php | 2 + .../Analyzer/Analysis/AttributeAnalysis.php | 76 + .../Analyzer/Analysis/CaseAnalysis.php | 2 + .../Analysis/DataProviderAnalysis.php | 21 +- .../Analyzer/Analysis/DefaultAnalysis.php | 2 + .../Analyzer/Analysis/EnumAnalysis.php | 2 + .../Analyzer/Analysis/MatchAnalysis.php | 2 + .../Analyzer/Analysis/NamespaceAnalysis.php | 2 + .../Analysis/NamespaceUseAnalysis.php | 85 +- .../Analysis/StartEndTokenAwareAnalysis.php | 5 + .../Analyzer/Analysis/SwitchAnalysis.php | 2 + .../Analyzer/Analysis/TypeAnalysis.php | 35 +- .../Tokenizer/Analyzer/AttributeAnalyzer.php | 141 ++ .../src/Tokenizer/Analyzer/BlocksAnalyzer.php | 10 +- .../src/Tokenizer/Analyzer/ClassyAnalyzer.php | 2 +- .../Tokenizer/Analyzer/CommentsAnalyzer.php | 78 +- .../ControlCaseStructuresAnalyzer.php | 15 +- .../Analyzer/DataProviderAnalyzer.php | 46 +- .../Analyzer/FullyQualifiedNameAnalyzer.php | 103 ++ .../Tokenizer/Analyzer/FunctionsAnalyzer.php | 30 +- .../Analyzer/NamespaceUsesAnalyzer.php | 163 +- .../Tokenizer/Analyzer/NamespacesAnalyzer.php | 36 +- .../src/Tokenizer/Analyzer/SwitchAnalyzer.php | 71 + .../php-cs-fixer/src/Tokenizer/CT.php | 90 +- .../Tokenizer/Processor/ImportProcessor.php | 103 ++ .../php-cs-fixer/src/Tokenizer/Token.php | 71 +- .../php-cs-fixer/src/Tokenizer/Tokens.php | 540 ++++-- .../src/Tokenizer/TokensAnalyzer.php | 79 +- .../Transformer/BraceTransformer.php | 101 +- .../Transformer/NameQualifiedTransformer.php | 30 +- .../src/Tokenizer/Transformers.php | 2 +- .../php-cs-fixer/src/ToolInfo.php | 19 +- .../php-cs-fixer/src/ToolInfoInterface.php | 2 + .../friendsofphp/php-cs-fixer/src/Utils.php | 45 +- .../src/WhitespacesFixerConfig.php | 14 + .../php-cs-fixer/src/WordMatcher.php | 6 +- vendor/phpstan/phpstan/phpstan.phar | Bin 23542957 -> 23789783 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 26 +- vendor/react/cache/CHANGELOG.md | 96 + vendor/react/cache/LICENSE | 21 + vendor/react/cache/README.md | 367 ++++ vendor/react/cache/composer.json | 45 + vendor/react/cache/src/ArrayCache.php | 181 ++ vendor/react/cache/src/CacheInterface.php | 194 ++ vendor/react/child-process/CHANGELOG.md | 176 ++ vendor/react/child-process/LICENSE | 21 + vendor/react/child-process/README.md | 619 +++++++ vendor/react/child-process/composer.json | 49 + vendor/react/child-process/src/Process.php | 585 ++++++ vendor/react/dns/CHANGELOG.md | 452 +++++ vendor/react/dns/LICENSE | 21 + vendor/react/dns/README.md | 453 +++++ vendor/react/dns/composer.json | 49 + vendor/react/dns/src/BadServerException.php | 7 + vendor/react/dns/src/Config/Config.php | 137 ++ vendor/react/dns/src/Config/HostsFile.php | 153 ++ vendor/react/dns/src/Model/Message.php | 230 +++ vendor/react/dns/src/Model/Record.php | 153 ++ .../react/dns/src/Protocol/BinaryDumper.php | 199 +++ vendor/react/dns/src/Protocol/Parser.php | 356 ++++ .../react/dns/src/Query/CachingExecutor.php | 88 + .../dns/src/Query/CancellationException.php | 7 + vendor/react/dns/src/Query/CoopExecutor.php | 91 + .../react/dns/src/Query/ExecutorInterface.php | 43 + .../react/dns/src/Query/FallbackExecutor.php | 49 + .../react/dns/src/Query/HostsFileExecutor.php | 89 + vendor/react/dns/src/Query/Query.php | 69 + vendor/react/dns/src/Query/RetryExecutor.php | 85 + .../src/Query/SelectiveTransportExecutor.php | 85 + .../dns/src/Query/TcpTransportExecutor.php | 382 ++++ .../react/dns/src/Query/TimeoutException.php | 7 + .../react/dns/src/Query/TimeoutExecutor.php | 78 + .../dns/src/Query/UdpTransportExecutor.php | 221 +++ .../react/dns/src/RecordNotFoundException.php | 7 + vendor/react/dns/src/Resolver/Factory.php | 226 +++ vendor/react/dns/src/Resolver/Resolver.php | 147 ++ .../dns/src/Resolver/ResolverInterface.php | 94 + vendor/react/event-loop/CHANGELOG.md | 468 +++++ vendor/react/event-loop/LICENSE | 21 + vendor/react/event-loop/README.md | 930 ++++++++++ vendor/react/event-loop/composer.json | 47 + vendor/react/event-loop/src/ExtEvLoop.php | 253 +++ vendor/react/event-loop/src/ExtEventLoop.php | 275 +++ vendor/react/event-loop/src/ExtLibevLoop.php | 201 +++ .../react/event-loop/src/ExtLibeventLoop.php | 285 +++ vendor/react/event-loop/src/ExtUvLoop.php | 342 ++++ vendor/react/event-loop/src/Factory.php | 75 + vendor/react/event-loop/src/Loop.php | 266 +++ vendor/react/event-loop/src/LoopInterface.php | 472 +++++ .../react/event-loop/src/SignalsHandler.php | 63 + .../react/event-loop/src/StreamSelectLoop.php | 330 ++++ .../event-loop/src/Tick/FutureTickQueue.php | 60 + vendor/react/event-loop/src/Timer/Timer.php | 55 + vendor/react/event-loop/src/Timer/Timers.php | 113 ++ .../react/event-loop/src/TimerInterface.php | 27 + vendor/react/promise/CHANGELOG.md | 156 ++ vendor/react/promise/LICENSE | 24 + vendor/react/promise/README.md | 722 ++++++++ vendor/react/promise/composer.json | 57 + vendor/react/promise/src/Deferred.php | 52 + .../src/Exception/CompositeException.php | 32 + .../promise/src/Exception/LengthException.php | 7 + .../src/Internal/CancellationQueue.php | 64 + .../promise/src/Internal/FulfilledPromise.php | 89 + .../promise/src/Internal/RejectedPromise.php | 128 ++ vendor/react/promise/src/Promise.php | 303 ++++ vendor/react/promise/src/PromiseInterface.php | 152 ++ vendor/react/promise/src/functions.php | 345 ++++ .../react/promise/src/functions_include.php | 5 + vendor/react/socket/CHANGELOG.md | 785 +++++++++ vendor/react/socket/LICENSE | 21 + vendor/react/socket/README.md | 1564 +++++++++++++++++ vendor/react/socket/composer.json | 52 + vendor/react/socket/src/Connection.php | 183 ++ .../react/socket/src/ConnectionInterface.php | 119 ++ vendor/react/socket/src/Connector.php | 236 +++ .../react/socket/src/ConnectorInterface.php | 59 + vendor/react/socket/src/DnsConnector.php | 117 ++ vendor/react/socket/src/FdServer.php | 222 +++ vendor/react/socket/src/FixedUriConnector.php | 41 + .../src/HappyEyeBallsConnectionBuilder.php | 334 ++++ .../socket/src/HappyEyeBallsConnector.php | 80 + vendor/react/socket/src/LimitingServer.php | 203 +++ vendor/react/socket/src/SecureConnector.php | 132 ++ vendor/react/socket/src/SecureServer.php | 210 +++ vendor/react/socket/src/Server.php | 118 ++ vendor/react/socket/src/ServerInterface.php | 151 ++ vendor/react/socket/src/SocketServer.php | 215 +++ vendor/react/socket/src/StreamEncryption.php | 158 ++ vendor/react/socket/src/TcpConnector.php | 173 ++ vendor/react/socket/src/TcpServer.php | 262 +++ vendor/react/socket/src/TimeoutConnector.php | 79 + vendor/react/socket/src/UnixConnector.php | 58 + vendor/react/socket/src/UnixServer.php | 162 ++ vendor/react/stream/CHANGELOG.md | 460 +++++ vendor/react/stream/LICENSE | 21 + vendor/react/stream/README.md | 1249 +++++++++++++ vendor/react/stream/composer.json | 47 + vendor/react/stream/src/CompositeStream.php | 83 + .../react/stream/src/DuplexResourceStream.php | 240 +++ .../stream/src/DuplexStreamInterface.php | 39 + .../stream/src/ReadableResourceStream.php | 188 ++ .../stream/src/ReadableStreamInterface.php | 362 ++++ vendor/react/stream/src/ThroughStream.php | 195 ++ vendor/react/stream/src/Util.php | 75 + .../stream/src/WritableResourceStream.php | 178 ++ .../stream/src/WritableStreamInterface.php | 347 ++++ vendor/rector/rector/bin/rector | 2 +- vendor/rector/rector/bin/rector.php | 12 +- vendor/rector/rector/config/config.php | 4 +- .../rector/rector/config/set/code-quality.php | 2 +- .../rector/rector/config/set/coding-style.php | 2 +- .../rector/config/set/datetime-to-carbon.php | 2 +- vendor/rector/rector/config/set/dead-code.php | 2 +- .../rector/rector/config/set/early-return.php | 2 +- .../rector/config/set/gmagick-to-imagick.php | 2 +- .../rector/rector/config/set/instanceof.php | 2 +- .../rector/config/set/level/up-to-php53.php | 2 +- .../rector/config/set/level/up-to-php54.php | 2 +- .../rector/config/set/level/up-to-php55.php | 2 +- .../rector/config/set/level/up-to-php56.php | 2 +- .../rector/config/set/level/up-to-php70.php | 2 +- .../rector/config/set/level/up-to-php71.php | 2 +- .../rector/config/set/level/up-to-php72.php | 2 +- .../rector/config/set/level/up-to-php73.php | 2 +- .../rector/config/set/level/up-to-php74.php | 2 +- .../rector/config/set/level/up-to-php80.php | 2 +- .../rector/config/set/level/up-to-php81.php | 2 +- .../rector/config/set/level/up-to-php82.php | 2 +- .../rector/config/set/level/up-to-php83.php | 2 +- .../rector/config/set/level/up-to-php84.php | 2 +- vendor/rector/rector/config/set/naming.php | 2 +- .../rector/config/set/php-polyfills.php | 2 +- vendor/rector/rector/config/set/php52.php | 2 +- vendor/rector/rector/config/set/php53.php | 2 +- vendor/rector/rector/config/set/php54.php | 2 +- vendor/rector/rector/config/set/php55.php | 2 +- vendor/rector/rector/config/set/php56.php | 2 +- vendor/rector/rector/config/set/php70.php | 2 +- vendor/rector/rector/config/set/php71.php | 2 +- vendor/rector/rector/config/set/php72.php | 2 +- vendor/rector/rector/config/set/php73.php | 5 +- vendor/rector/rector/config/set/php74.php | 2 +- vendor/rector/rector/config/set/php80.php | 2 +- vendor/rector/rector/config/set/php81.php | 2 +- vendor/rector/rector/config/set/php82.php | 2 +- vendor/rector/rector/config/set/php83.php | 5 +- vendor/rector/rector/config/set/php84.php | 2 +- .../rector/config/set/privatization.php | 2 +- .../rector/config/set/rector-preset.php | 2 +- .../rector/config/set/strict-booleans.php | 2 +- .../rector/config/set/type-declaration.php | 2 +- .../ClassMethod/ArgumentAdderRector.php | 2 +- .../ReplaceArgumentDefaultValueRector.php | 2 +- ...tionArgumentDefaultValueReplacerRector.php | 2 +- .../RemoveMethodCallParamRector.php | 2 +- .../Carbon/NodeFactory/CarbonCallFactory.php | 2 +- .../NodeFactory/TypedPropertyFactory.php | 46 + ...DocBlockPropertyToNativePropertyRector.php | 223 +++ .../Rector/Concat/JoinStringConcatRector.php | 7 +- ...hItemsAssignToEmptyArrayToAssignRector.php | 4 + .../FuncCall/SimplifyRegexPatternRector.php | 2 +- .../FuncCall/SimplifyStrposLowerRector.php | 2 +- .../Rector/If_/ExplicitBoolCompareRector.php | 13 +- .../If_/SimplifyIfNotNullReturnRector.php | 7 + .../Rector/If_/SimplifyIfReturnBoolRector.php | 19 +- .../AbsolutizeRequireAndIncludePathRector.php | 2 +- .../Application/UseImportsAdder.php | 2 +- ...yQualifiedNameClassNameImportSkipVoter.php | 2 +- .../rules/CodingStyle/Naming/ClassNaming.php | 2 +- .../NodeAnalyzer/UseImportNameMatcher.php | 2 +- .../CatchExceptionNameMatchingTypeRector.php | 2 +- ...itedMethodVisibilitySameAsParentRector.php | 2 +- .../EncapsedStringsToSprintfRector.php | 2 +- ...RemoveUselessAliasInUseStatementRector.php | 2 +- ...assKeywordForClassNameResolutionRector.php | 2 +- .../SafeLeftTypeBooleanAndOrAnalyzer.php | 19 +- .../PhpDoc/DeadParamTagValueNodeAnalyzer.php | 20 +- .../PhpDoc/DeadReturnTagValueNodeAnalyzer.php | 13 +- .../PhpDoc/DeadVarTagValueNodeAnalyzer.php | 12 +- .../PhpDoc/Guard/TemplateTypeRemovalGuard.php | 26 + .../PhpDoc/TagRemover/VarTagRemover.php | 15 + .../ClassLike/RemoveAnnotationRector.php | 2 +- ...moveTypedPropertyNonMockDocblockRector.php | 144 ++ .../RemoveUnusedPrivateMethodRector.php | 18 +- .../RemoveDuplicatedCaseInSwitchRector.php | 14 + .../SideEffect/SideEffectNodeDetector.php | 2 +- .../InflectorSingularResolver.php | 4 +- .../rules/Naming/Naming/PropertyNaming.php | 2 +- ...iableToMatchMethodCallReturnTypeRector.php | 2 +- .../rules/Naming/RectorNamingInflector.php | 4 +- .../PropertyRenameFactory.php | 2 +- .../StringClassNameToClassConstantRector.php | 2 +- .../rector/rules/Php55/RegexMatcher.php | 2 +- .../rules/Php70/EregToPcreTransformer.php | 29 +- .../Rector/FuncCall/EregToPregMatchRector.php | 2 +- .../NodeFactory/AnonymousFunctionFactory.php | 2 +- .../Rector/FuncCall/RegexDashEscapeRector.php | 2 +- .../AddLiteralSeparatorToNumberRector.php | 2 +- .../Class_/AnnotationToAttributeRector.php | 2 +- .../NestedAnnotationToAttributeRector.php | 2 +- .../Switch_/ChangeSwitchToMatchRector.php | 46 + .../ValueObject/AnnotationToAttribute.php | 2 +- .../rules/Php81/NodeFactory/EnumFactory.php | 2 +- .../AddSensitiveParameterAttributeRector.php | 5 +- ...rideAttributeToOverriddenMethodsRector.php | 5 +- ...moveGetClassGetParentClassNoArgsRector.php | 73 + .../Guard/ParentPropertyLookupGuard.php | 7 +- .../NodeManipulator/VisibilityManipulator.php | 14 +- .../PrivatizeLocalGetterToPropertyRector.php | 3 + .../PrivatizeFinalClassPropertyRector.php | 27 +- .../ClassMethod/ArgumentRemoverRector.php | 2 +- .../Rector/Class_/RemoveInterfacesRector.php | 2 +- .../Rector/Class_/RemoveTraitUseRector.php | 2 +- .../FuncCall/RemoveFuncCallArgRector.php | 2 +- .../Rector/FuncCall/RemoveFuncCallRector.php | 2 +- .../RenameClassConstFetchRector.php | 2 +- .../ClassMethod/RenameAnnotationRector.php | 2 +- .../Rector/Class_/RenameAttributeRector.php | 2 +- .../ConstFetch/RenameConstantRector.php | 2 +- .../Rector/FuncCall/RenameFunctionRector.php | 2 +- ...nctionLikeParamWithinCallLikeArgRector.php | 2 +- .../Rector/MethodCall/RenameMethodRector.php | 2 +- .../Rector/Name/RenameClassRector.php | 2 +- .../PropertyFetch/RenamePropertyRector.php | 2 +- .../StaticCall/RenameStaticMethodRector.php | 2 +- .../Rector/String_/RenameStringRector.php | 2 +- .../NodeFactory/ExactCompareFactory.php | 75 +- .../AbstractFalsyScalarRuleFixerRector.php | 2 +- .../ArrayDimFetchToMethodCallRector.php | 2 +- .../PropertyAssignToMethodCallRector.php | 2 +- .../PropertyFetchToMethodCallRector.php | 2 +- .../AttributeKeyToClassConstFetchRector.php | 2 +- .../ReturnTypeWillChangeRector.php | 2 +- .../Rector/ClassMethod/WrapReturnRector.php | 2 +- ...dAllowDynamicPropertiesAttributeRector.php | 2 +- .../Class_/AddInterfaceByTraitRector.php | 2 +- .../Rector/Class_/MergeInterfacesRector.php | 2 +- .../Class_/ParentClassToTraitsRector.php | 2 +- .../ConstFetchToClassConstFetchRector.php | 2 +- .../RectorConfigBuilderRector.php | 2 +- .../FuncCall/FuncCallToConstFetchRector.php | 2 +- .../FuncCall/FuncCallToMethodCallRector.php | 2 +- .../Rector/FuncCall/FuncCallToNewRector.php | 2 +- .../FuncCall/FuncCallToStaticCallRector.php | 2 +- .../MethodCall/MethodCallToFuncCallRector.php | 2 +- .../MethodCall/MethodCallToNewRector.php | 67 + .../MethodCallToPropertyFetchRector.php | 2 +- .../MethodCallToStaticCallRector.php | 2 +- .../ReplaceParentCallByPropertyCallRector.php | 2 +- .../Rector/New_/NewToStaticCallRector.php | 2 +- .../Scalar/ScalarValueToConstFetchRector.php | 2 +- .../StaticCall/StaticCallToFuncCallRector.php | 2 +- .../StaticCallToMethodCallRector.php | 2 +- .../StaticCall/StaticCallToNewRector.php | 2 +- .../String_/StringToClassConstantRector.php | 2 +- .../Transform/ValueObject/MethodCallToNew.php | 45 + .../ValueObject/ParentClassToTraits.php | 2 +- .../PHPStan/ObjectTypeSpecifier.php | 35 +- ...amTypeBasedOnPHPUnitDataProviderRector.php | 2 +- .../AddParamTypeDeclarationRector.php | 2 +- .../AddReturnTypeDeclarationRector.php | 2 +- .../AddTypeFromResourceDocblockRector.php | 2 +- .../ReturnTypeFromMockObjectRector.php | 7 +- .../ReturnTypeFromStrictNewArrayRector.php | 8 +- ...ypedPropertyFromCreateMockAssignRector.php | 7 +- ...tyFromJMSSerializerAttributeTypeRector.php | 2 +- .../AddClosureParamTypeFromArgRector.php | 2 +- ...eParamTypeFromIterableMethodCallRector.php | 221 +++ .../AddClosureParamTypeFromObjectRector.php | 2 +- ...LikeWithinCallLikeArgDeclarationRector.php | 2 +- .../AddPropertyTypeDeclarationRector.php | 2 +- .../IncreaseDeclareStrictTypesRector.php | 2 +- .../ChangeConstantVisibilityRector.php | 2 +- .../ChangeMethodVisibilityRector.php | 2 +- .../Application/ApplicationFileProcessor.php | 12 +- .../rector/src/Application/FileProcessor.php | 6 +- .../src/Application/VersionResolver.php | 4 +- .../src/Autoloading/AdditionalAutoloader.php | 4 +- .../Autoloading/BootstrapFilesIncluder.php | 2 +- .../PhpDoc/ArrayItemNode.php | 2 +- .../PhpDocManipulator/PhpDocClassRenamer.php | 2 +- .../BetterPhpDocParser/PhpDocNodeMapper.php | 2 +- .../PhpDocParser/BetterPhpDocParser.php | 2 +- .../DoctrineAnnotationDecorator.php | 4 +- .../Printer/DocBlockInliner.php | 2 +- .../Printer/PhpDocInfoPrinter.php | 2 +- .../DoctrineAnnotation/CurlyListNode.php | 2 +- .../src/Bootstrap/RectorConfigsResolver.php | 4 +- .../rector/src/Bridge/SetRectorsResolver.php | 49 +- .../rector/src/Caching/CacheFactory.php | 2 +- .../ValueObject/Storage/FileCacheStorage.php | 6 +- .../Output/ConsoleOutputFormatter.php | 19 +- .../Output/JsonOutputFormatter.php | 2 +- .../ValueObject/RectorWithLineChange.php | 6 +- .../src/Composer/InstalledPackageResolver.php | 6 +- .../rector/src/Config/Level/DeadCodeLevel.php | 2 + .../rector/rector/src/Config/RectorConfig.php | 16 +- .../src/Configuration/ConfigInitializer.php | 4 +- .../Configuration/ConfigurationFactory.php | 4 +- .../Levels/LevelRulesResolver.php | 2 +- .../rector/src/Configuration/Option.php | 6 + .../Parameter/SimpleParameterProvider.php | 2 +- .../src/Configuration/PhpLevelSetResolver.php | 2 +- .../src/Configuration/RectorConfigBuilder.php | 53 +- .../src/Console/Command/CustomRuleCommand.php | 16 +- .../src/Console/Command/ListRulesCommand.php | 12 +- .../src/Console/Command/ProcessCommand.php | 10 +- .../src/Console/Command/SetupCICommand.php | 12 +- .../src/Console/Command/WorkerCommand.php | 24 +- .../rector/src/Console/ConsoleApplication.php | 16 +- vendor/rector/rector/src/Console/ExitCode.php | 2 +- .../Formatter/ColorConsoleDiffFormatter.php | 4 +- .../src/Console/Formatter/ConsoleDiffer.php | 4 +- vendor/rector/rector/src/Console/Notifier.php | 6 +- .../src/Console/ProcessConfigureDecorator.php | 6 +- .../rector/src/Console/Style/RectorStyle.php | 12 +- .../src/Console/Style/SymfonyStyleFactory.php | 8 +- .../Laravel/ContainerMemento.php | 2 +- .../LazyContainerFactory.php | 14 +- .../RectorContainerFactory.php | 2 +- .../rector/src/Differ/DefaultDiffer.php | 4 +- vendor/rector/rector/src/Enum/ClassName.php | 12 + .../rector/src/FileSystem/FilePathHelper.php | 6 +- .../rector/src/FileSystem/FilesFinder.php | 4 +- .../src/FileSystem/InitFilePathsResolver.php | 4 +- .../rector/src/FileSystem/JsonFileSystem.php | 4 +- .../rector/src/Git/RepositoryHelper.php | 4 +- .../rector/src/NodeAnalyzer/ClassAnalyzer.php | 29 +- .../rector/src/NodeAnalyzer/ExprAnalyzer.php | 4 + .../src/NodeAnalyzer/VariadicAnalyzer.php | 29 +- .../ClassDependencyManipulator.php | 3 + .../ClassInsertManipulator.php | 79 +- .../src/NodeManipulator/IfManipulator.php | 4 + .../NodeManipulator/PropertyManipulator.php | 4 +- .../PHPStanServicesFactory.php | 8 +- .../src/NodeTypeResolver/NodeTypeResolver.php | 9 +- .../NodeVisitor/AssignedToNodeVisitor.php | 1 + .../Scope/PHPStanNodeScopeResolver.php | 2 +- .../NameImportingPhpDocNodeVisitor.php | 2 +- .../TypeComparator/TypeComparator.php | 13 + .../PHPStanStaticTypeMapper.php | 2 +- .../TypeMapper/ConditionalTypeMapper.php | 2 +- .../TypeMapper/IntersectionTypeMapper.php | 42 +- .../TypeMapper/ObjectTypeMapper.php | 2 +- .../TypeMapper/UnionTypeMapper.php | 4 +- .../Utils/TypeUnwrapper.php | 42 + .../Application/ParallelFileProcessor.php | 30 +- .../Command/WorkerCommandLineFactory.php | 17 +- .../ComposerJsonPhpVersionResolver.php | 2 +- .../src/Php/PolyfillPackagesProvider.php | 4 +- .../AnnotationToAttributeMapper.php | 2 +- .../ArrayAnnotationToAttributeMapper.php | 2 +- ...rayItemNodeAnnotationToAttributeMapper.php | 2 +- ...rlyListNodeAnnotationToAttributeMapper.php | 2 +- .../AttributeArrayNameInliner.php | 2 +- ...nnotationToAttributeIntegerValueCaster.php | 2 +- .../NodeFactory/NamedArgsFactory.php | 2 +- .../PhpNestedAttributeGroupFactory.php | 4 +- .../src/PhpParser/Node/BetterNodeFinder.php | 2 +- .../src/PhpParser/Parser/InlineCodeParser.php | 4 +- .../src/PhpParser/Parser/SimplePhpParser.php | 2 +- .../Printer/BetterStandardPrinter.php | 2 +- .../PostRector/Rector/AbstractPostRector.php | 2 +- .../Rector/UnusedImportRemovingPostRector.php | 42 +- .../src/Reporting/DeprecatedRulesReporter.php | 2 +- .../Reporting/MissConfigurationReporter.php | 2 +- .../Set/ValueObject/ComposerTriggeredSet.php | 2 +- .../rector/rector/src/Set/ValueObject/Set.php | 2 +- .../Mapper/ScalarStringToTypeMapper.php | 5 +- .../PhpDoc/PhpDocTypeMapper.php | 2 +- .../IdentifierPhpDocTypeMapper.php | 2 +- .../Type/FullyQualifiedObjectType.php | 2 +- .../src/Testing/Fixture/FixtureFileFinder.php | 2 +- .../Testing/Fixture/FixtureFileUpdater.php | 2 +- .../src/Testing/Fixture/FixtureSplitter.php | 2 +- .../Testing/Fixture/FixtureTempFileDumper.php | 2 +- .../PHPUnit/AbstractRectorTestCase.php | 6 +- .../Testing/TestingParser/TestingParser.php | 2 +- .../rector/rector/src/Util/MemoryLimiter.php | 2 +- .../rector/src/Util/NewLineSplitter.php | 2 +- vendor/rector/rector/src/Util/NodePrinter.php | 4 +- vendor/rector/rector/src/Util/StringUtils.php | 2 +- .../rector/src/Validation/RectorAssert.php | 2 +- .../rector/src/ValueObject/Configuration.php | 2 +- .../src/ValueObject/Error/SystemError.php | 4 +- .../src/ValueObject/FileProcessResult.php | 2 +- .../src/ValueObject/PhpVersionFeature.php | 11 + .../rector/src/ValueObject/ProcessResult.php | 2 +- .../src/ValueObject/Reporting/FileDiff.php | 8 +- .../rector/src/functions/node_helper.php | 6 +- vendor/rector/rector/vendor/autoload.php | 2 +- vendor/rector/rector/vendor/bin/php-parse | 6 +- vendor/rector/rector/vendor/bin/yaml-lint | 6 +- .../vendor/clue/ndjson-react/composer.json | 4 +- .../vendor/clue/ndjson-react/src/Decoder.php | 10 +- .../vendor/clue/ndjson-react/src/Encoder.php | 6 +- .../vendor/composer/InstalledVersions.php | 10 +- .../vendor/composer/autoload_classmap.php | 1311 +++++++------- .../rector/vendor/composer/autoload_psr4.php | 56 +- .../rector/vendor/composer/autoload_real.php | 10 +- .../vendor/composer/autoload_static.php | 1431 +++++++-------- .../rector/vendor/composer/installed.json | 184 +- .../rector/vendor/composer/installed.php | 4 +- .../rector/vendor/composer/pcre/composer.json | 4 +- .../composer/pcre/src/MatchAllResult.php | 2 +- .../pcre/src/MatchAllStrictGroupsResult.php | 2 +- .../pcre/src/MatchAllWithOffsetsResult.php | 2 +- .../vendor/composer/pcre/src/MatchResult.php | 2 +- .../pcre/src/MatchStrictGroupsResult.php | 2 +- .../pcre/src/MatchWithOffsetsResult.php | 2 +- .../src/PHPStan/InvalidRegexPatternRule.php | 12 +- .../pcre/src/PHPStan/PregMatchFlags.php | 2 +- .../PregMatchParameterOutTypeExtension.php | 4 +- .../PregMatchTypeSpecifyingExtension.php | 4 +- ...regReplaceCallbackClosureTypeExtension.php | 6 +- .../PHPStan/UnsafeStrictGroupsCallRule.php | 6 +- .../composer/pcre/src/PcreException.php | 2 +- .../rector/vendor/composer/pcre/src/Preg.php | 2 +- .../rector/vendor/composer/pcre/src/Regex.php | 2 +- .../composer/pcre/src/ReplaceResult.php | 2 +- .../pcre/src/UnexpectedNullMatchException.php | 2 +- .../vendor/composer/semver/composer.json | 4 +- .../vendor/composer/semver/src/Comparator.php | 4 +- .../composer/semver/src/CompilingMatcher.php | 6 +- .../composer/semver/src/Constraint/Bound.php | 2 +- .../semver/src/Constraint/Constraint.php | 2 +- .../src/Constraint/ConstraintInterface.php | 2 +- .../src/Constraint/MatchAllConstraint.php | 2 +- .../src/Constraint/MatchNoneConstraint.php | 2 +- .../semver/src/Constraint/MultiConstraint.php | 2 +- .../vendor/composer/semver/src/Interval.php | 4 +- .../vendor/composer/semver/src/Intervals.php | 12 +- .../vendor/composer/semver/src/Semver.php | 4 +- .../composer/semver/src/VersionParser.php | 10 +- .../composer/xdebug-handler/composer.json | 4 +- .../composer/xdebug-handler/src/PhpConfig.php | 2 +- .../composer/xdebug-handler/src/Process.php | 4 +- .../composer/xdebug-handler/src/Status.php | 6 +- .../xdebug-handler/src/XdebugHandler.php | 6 +- .../vendor/doctrine/inflector/composer.json | 4 +- .../Inflector/CachedWordInflector.php | 2 +- .../GenericLanguageInflectorFactory.php | 4 +- .../lib/Doctrine/Inflector/Inflector.php | 4 +- .../Doctrine/Inflector/InflectorFactory.php | 14 +- .../lib/Doctrine/Inflector/Language.php | 2 +- .../Inflector/LanguageInflectorFactory.php | 4 +- .../Doctrine/Inflector/NoopWordInflector.php | 2 +- .../Inflector/Rules/English/Inflectible.php | 38 +- .../Rules/English/InflectorFactory.php | 6 +- .../Inflector/Rules/English/Rules.php | 10 +- .../Inflector/Rules/English/Uninflected.php | 4 +- .../Inflector/Rules/French/Inflectible.php | 10 +- .../Rules/French/InflectorFactory.php | 6 +- .../Doctrine/Inflector/Rules/French/Rules.php | 10 +- .../Inflector/Rules/French/Uninflected.php | 4 +- .../Rules/NorwegianBokmal/Inflectible.php | 10 +- .../NorwegianBokmal/InflectorFactory.php | 6 +- .../Inflector/Rules/NorwegianBokmal/Rules.php | 10 +- .../Rules/NorwegianBokmal/Uninflected.php | 4 +- .../lib/Doctrine/Inflector/Rules/Pattern.php | 2 +- .../lib/Doctrine/Inflector/Rules/Patterns.php | 2 +- .../Rules/Portuguese/Inflectible.php | 10 +- .../Rules/Portuguese/InflectorFactory.php | 6 +- .../Inflector/Rules/Portuguese/Rules.php | 10 +- .../Rules/Portuguese/Uninflected.php | 4 +- .../lib/Doctrine/Inflector/Rules/Ruleset.php | 2 +- .../Inflector/Rules/Spanish/Inflectible.php | 20 +- .../Rules/Spanish/InflectorFactory.php | 6 +- .../Inflector/Rules/Spanish/Rules.php | 10 +- .../Inflector/Rules/Spanish/Uninflected.php | 4 +- .../Doctrine/Inflector/Rules/Substitution.php | 2 +- .../Inflector/Rules/Substitutions.php | 4 +- .../Inflector/Rules/Transformation.php | 4 +- .../Inflector/Rules/Transformations.php | 4 +- .../Inflector/Rules/Turkish/Inflectible.php | 10 +- .../Rules/Turkish/InflectorFactory.php | 6 +- .../Inflector/Rules/Turkish/Rules.php | 10 +- .../Inflector/Rules/Turkish/Uninflected.php | 4 +- .../lib/Doctrine/Inflector/Rules/Word.php | 2 +- .../Doctrine/Inflector/RulesetInflector.php | 4 +- .../lib/Doctrine/Inflector/WordInflector.php | 2 +- .../vendor/evenement/evenement/composer.json | 4 +- .../evenement/evenement/src/EventEmitter.php | 2 +- .../evenement/src/EventEmitterInterface.php | 2 +- .../evenement/src/EventEmitterTrait.php | 2 +- .../fidry/cpu-core-counter/bin/diagnose.php | 6 +- .../fidry/cpu-core-counter/bin/execute.php | 6 +- .../fidry/cpu-core-counter/bin/trace.php | 6 +- .../fidry/cpu-core-counter/composer.json | 4 +- .../cpu-core-counter/src/CpuCoreCounter.php | 8 +- .../fidry/cpu-core-counter/src/Diagnoser.php | 4 +- .../src/Executor/ProcOpenExecutor.php | 2 +- .../src/Executor/ProcessExecutor.php | 2 +- .../src/Finder/CmiCmdletLogicalFinder.php | 2 +- .../src/Finder/CmiCmdletPhysicalFinder.php | 2 +- .../src/Finder/CpuCoreFinder.php | 2 +- .../src/Finder/CpuInfoFinder.php | 2 +- .../src/Finder/DummyCpuCoreFinder.php | 2 +- .../src/Finder/EnvVariableFinder.php | 2 +- .../src/Finder/FinderRegistry.php | 2 +- .../src/Finder/HwLogicalFinder.php | 2 +- .../src/Finder/HwPhysicalFinder.php | 2 +- .../src/Finder/LscpuLogicalFinder.php | 2 +- .../src/Finder/LscpuPhysicalFinder.php | 2 +- .../src/Finder/NProcFinder.php | 4 +- .../src/Finder/NProcessorFinder.php | 2 +- .../src/Finder/NullCpuCoreFinder.php | 2 +- .../src/Finder/OnlyInPowerShellFinder.php | 2 +- .../src/Finder/OnlyOnOSFamilyFinder.php | 2 +- .../src/Finder/ProcOpenBasedFinder.php | 6 +- .../src/Finder/SkipOnOSFamilyFinder.php | 2 +- .../Finder/WindowsRegistryLogicalFinder.php | 2 +- .../src/Finder/WmicLogicalFinder.php | 2 +- .../src/Finder/WmicPhysicalFinder.php | 2 +- .../src/Finder/_NProcessorFinder.php | 2 +- .../src/NumberOfCpuCoreNotFound.php | 2 +- .../src/ParallelisationResult.php | 2 +- .../illuminate/container/Attributes/Auth.php | 6 +- .../container/Attributes/Authenticated.php | 6 +- .../illuminate/container/Attributes/Cache.php | 6 +- .../container/Attributes/Config.php | 6 +- .../container/Attributes/CurrentUser.php | 2 +- .../illuminate/container/Attributes/DB.php | 2 +- .../container/Attributes/Database.php | 6 +- .../illuminate/container/Attributes/Log.php | 6 +- .../container/Attributes/RouteParameter.php | 33 + .../container/Attributes/Storage.php | 6 +- .../illuminate/container/Attributes/Tag.php | 6 +- .../illuminate/container/BoundMethod.php | 4 +- .../vendor/illuminate/container/Container.php | 12 +- .../container/ContextualBindingBuilder.php | 6 +- .../container/EntryNotFoundException.php | 4 +- .../container/RewindableGenerator.php | 2 +- .../vendor/illuminate/container/Util.php | 4 +- .../vendor/illuminate/container/composer.json | 2 +- .../contracts/Auth/Access/Authorizable.php | 2 +- .../illuminate/contracts/Auth/Access/Gate.php | 2 +- .../contracts/Auth/Authenticatable.php | 2 +- .../contracts/Auth/CanResetPassword.php | 2 +- .../illuminate/contracts/Auth/Factory.php | 2 +- .../illuminate/contracts/Auth/Guard.php | 2 +- .../Auth/Middleware/AuthenticatesRequests.php | 2 +- .../contracts/Auth/MustVerifyEmail.php | 2 +- .../contracts/Auth/PasswordBroker.php | 2 +- .../contracts/Auth/PasswordBrokerFactory.php | 2 +- .../contracts/Auth/StatefulGuard.php | 2 +- .../contracts/Auth/SupportsBasicAuth.php | 2 +- .../contracts/Auth/UserProvider.php | 2 +- .../contracts/Broadcasting/Broadcaster.php | 2 +- .../contracts/Broadcasting/Factory.php | 2 +- .../Broadcasting/HasBroadcastChannel.php | 2 +- .../contracts/Broadcasting/ShouldBeUnique.php | 2 +- .../Broadcasting/ShouldBroadcast.php | 2 +- .../Broadcasting/ShouldBroadcastNow.php | 2 +- .../illuminate/contracts/Bus/Dispatcher.php | 2 +- .../contracts/Bus/QueueingDispatcher.php | 2 +- .../illuminate/contracts/Cache/Factory.php | 2 +- .../illuminate/contracts/Cache/Lock.php | 2 +- .../contracts/Cache/LockProvider.php | 2 +- .../contracts/Cache/LockTimeoutException.php | 2 +- .../illuminate/contracts/Cache/Repository.php | 4 +- .../illuminate/contracts/Cache/Store.php | 2 +- .../contracts/Concurrency/Driver.php | 4 +- .../contracts/Config/Repository.php | 2 +- .../contracts/Console/Application.php | 2 +- .../contracts/Console/Isolatable.php | 2 +- .../illuminate/contracts/Console/Kernel.php | 2 +- .../Console/PromptsForMissingInput.php | 2 +- .../Container/BindingResolutionException.php | 4 +- .../Container/CircularDependencyException.php | 4 +- .../contracts/Container/Container.php | 4 +- .../Container/ContextualAttribute.php | 2 +- .../Container/ContextualBindingBuilder.php | 2 +- .../illuminate/contracts/Cookie/Factory.php | 2 +- .../contracts/Cookie/QueueingFactory.php | 2 +- .../contracts/Database/Eloquent/Builder.php | 4 +- .../contracts/Database/Eloquent/Castable.php | 2 +- .../Database/Eloquent/CastsAttributes.php | 4 +- .../Eloquent/CastsInboundAttributes.php | 4 +- .../Eloquent/DeviatesCastableAttributes.php | 2 +- .../Eloquent/SerializesCastableAttributes.php | 4 +- .../Eloquent/SupportsPartialRelations.php | 2 +- .../Database/Events/MigrationEvent.php | 2 +- .../contracts/Database/ModelIdentifier.php | 2 +- .../contracts/Database/Query/Builder.php | 2 +- .../Database/Query/ConditionExpression.php | 2 +- .../contracts/Database/Query/Expression.php | 4 +- .../contracts/Debug/ExceptionHandler.php | 2 +- .../contracts/Debug/ShouldntReport.php | 2 +- .../contracts/Encryption/DecryptException.php | 2 +- .../contracts/Encryption/EncryptException.php | 2 +- .../contracts/Encryption/Encrypter.php | 2 +- .../contracts/Encryption/StringEncrypter.php | 2 +- .../contracts/Events/Dispatcher.php | 2 +- .../Events/ShouldDispatchAfterCommit.php | 2 +- .../Events/ShouldHandleEventsAfterCommit.php | 2 +- .../illuminate/contracts/Filesystem/Cloud.php | 2 +- .../contracts/Filesystem/Factory.php | 2 +- .../Filesystem/FileNotFoundException.php | 2 +- .../contracts/Filesystem/Filesystem.php | 2 +- .../Filesystem/LockTimeoutException.php | 2 +- .../contracts/Foundation/Application.php | 4 +- .../Foundation/CachesConfiguration.php | 2 +- .../contracts/Foundation/CachesRoutes.php | 2 +- .../Foundation/ExceptionRenderer.php | 2 +- .../contracts/Foundation/MaintenanceMode.php | 2 +- .../illuminate/contracts/Hashing/Hasher.php | 2 +- .../illuminate/contracts/Http/Kernel.php | 2 +- .../illuminate/contracts/Mail/Attachable.php | 2 +- .../illuminate/contracts/Mail/Factory.php | 2 +- .../illuminate/contracts/Mail/MailQueue.php | 2 +- .../illuminate/contracts/Mail/Mailable.php | 4 +- .../illuminate/contracts/Mail/Mailer.php | 2 +- .../contracts/Notifications/Dispatcher.php | 2 +- .../contracts/Notifications/Factory.php | 2 +- .../contracts/Pagination/CursorPaginator.php | 2 +- .../Pagination/LengthAwarePaginator.php | 2 +- .../contracts/Pagination/Paginator.php | 2 +- .../illuminate/contracts/Pipeline/Hub.php | 2 +- .../contracts/Pipeline/Pipeline.php | 2 +- .../contracts/Process/InvokedProcess.php | 2 +- .../contracts/Process/ProcessResult.php | 2 +- .../contracts/Queue/ClearableQueue.php | 2 +- .../Queue/EntityNotFoundException.php | 2 +- .../contracts/Queue/EntityResolver.php | 2 +- .../illuminate/contracts/Queue/Factory.php | 2 +- .../vendor/illuminate/contracts/Queue/Job.php | 2 +- .../illuminate/contracts/Queue/Monitor.php | 2 +- .../illuminate/contracts/Queue/Queue.php | 2 +- .../contracts/Queue/QueueableCollection.php | 2 +- .../contracts/Queue/QueueableEntity.php | 2 +- .../contracts/Queue/ShouldBeEncrypted.php | 2 +- .../contracts/Queue/ShouldBeUnique.php | 2 +- .../Queue/ShouldBeUniqueUntilProcessing.php | 2 +- .../contracts/Queue/ShouldQueue.php | 2 +- .../Queue/ShouldQueueAfterCommit.php | 2 +- .../illuminate/contracts/Redis/Connection.php | 2 +- .../illuminate/contracts/Redis/Connector.php | 2 +- .../illuminate/contracts/Redis/Factory.php | 2 +- .../Redis/LimiterTimeoutException.php | 2 +- .../contracts/Routing/BindingRegistrar.php | 2 +- .../contracts/Routing/Registrar.php | 2 +- .../contracts/Routing/ResponseFactory.php | 2 +- .../contracts/Routing/UrlGenerator.php | 2 +- .../contracts/Routing/UrlRoutable.php | 2 +- .../Middleware/AuthenticatesSessions.php | 2 +- .../illuminate/contracts/Session/Session.php | 2 +- .../contracts/Support/Arrayable.php | 2 +- .../Support/CanBeEscapedWhenCastToString.php | 2 +- .../contracts/Support/DeferrableProvider.php | 2 +- .../Support/DeferringDisplayableValue.php | 2 +- .../illuminate/contracts/Support/Htmlable.php | 2 +- .../illuminate/contracts/Support/Jsonable.php | 2 +- .../contracts/Support/MessageBag.php | 2 +- .../contracts/Support/MessageProvider.php | 2 +- .../contracts/Support/Renderable.php | 2 +- .../contracts/Support/Responsable.php | 2 +- .../contracts/Support/ValidatedData.php | 2 +- .../Translation/HasLocalePreference.php | 2 +- .../contracts/Translation/Loader.php | 2 +- .../contracts/Translation/Translator.php | 2 +- .../contracts/Validation/DataAwareRule.php | 2 +- .../contracts/Validation/Factory.php | 2 +- .../contracts/Validation/ImplicitRule.php | 2 +- .../contracts/Validation/InvokableRule.php | 2 +- .../illuminate/contracts/Validation/Rule.php | 2 +- .../Validation/UncompromisedVerifier.php | 2 +- .../Validation/ValidatesWhenResolved.php | 2 +- .../contracts/Validation/ValidationRule.php | 2 +- .../contracts/Validation/Validator.php | 4 +- .../Validation/ValidatorAwareRule.php | 4 +- .../illuminate/contracts/View/Engine.php | 2 +- .../illuminate/contracts/View/Factory.php | 2 +- .../vendor/illuminate/contracts/View/View.php | 4 +- .../View/ViewCompilationException.php | 2 +- .../vendor/illuminate/contracts/composer.json | 2 +- .../vendor/nette/utils/src/HtmlStringable.php | 2 +- .../utils/src/Iterators/CachingIterator.php | 4 +- .../nette/utils/src/Iterators/Mapper.php | 2 +- .../vendor/nette/utils/src/SmartObject.php | 4 +- .../vendor/nette/utils/src/StaticClass.php | 2 +- .../vendor/nette/utils/src/Translator.php | 2 +- .../nette/utils/src/Utils/ArrayHash.php | 4 +- .../nette/utils/src/Utils/ArrayList.php | 6 +- .../vendor/nette/utils/src/Utils/Arrays.php | 6 +- .../vendor/nette/utils/src/Utils/Callback.php | 4 +- .../vendor/nette/utils/src/Utils/DateTime.php | 4 +- .../vendor/nette/utils/src/Utils/FileInfo.php | 4 +- .../nette/utils/src/Utils/FileSystem.php | 4 +- .../vendor/nette/utils/src/Utils/Finder.php | 4 +- .../vendor/nette/utils/src/Utils/Floats.php | 4 +- .../vendor/nette/utils/src/Utils/Helpers.php | 4 +- .../vendor/nette/utils/src/Utils/Html.php | 6 +- .../vendor/nette/utils/src/Utils/Image.php | 4 +- .../nette/utils/src/Utils/ImageColor.php | 4 +- .../nette/utils/src/Utils/ImageType.php | 2 +- .../nette/utils/src/Utils/Iterables.php | 4 +- .../vendor/nette/utils/src/Utils/Json.php | 4 +- .../nette/utils/src/Utils/ObjectHelpers.php | 6 +- .../nette/utils/src/Utils/Paginator.php | 4 +- .../vendor/nette/utils/src/Utils/Random.php | 4 +- .../nette/utils/src/Utils/Reflection.php | 4 +- .../utils/src/Utils/ReflectionMethod.php | 2 +- .../vendor/nette/utils/src/Utils/Strings.php | 6 +- .../vendor/nette/utils/src/Utils/Type.php | 4 +- .../nette/utils/src/Utils/Validators.php | 4 +- .../nette/utils/src/Utils/exceptions.php | 2 +- .../vendor/nette/utils/src/compatibility.php | 6 +- .../vendor/nette/utils/src/exceptions.php | 2 +- .../vendor/nikic/php-parser/bin/php-parse | 2 +- .../vendor/ondram/ci-detector/composer.json | 4 +- .../rector/vendor/ondram/ci-detector/ecs.php | 14 +- .../ondram/ci-detector/src/Ci/AbstractCi.php | 4 +- .../ondram/ci-detector/src/Ci/AppVeyor.php | 8 +- .../ci-detector/src/Ci/AwsCodeBuild.php | 8 +- .../ci-detector/src/Ci/AzurePipelines.php | 8 +- .../ondram/ci-detector/src/Ci/Bamboo.php | 8 +- .../ci-detector/src/Ci/BitbucketPipelines.php | 8 +- .../ondram/ci-detector/src/Ci/Buddy.php | 8 +- .../ondram/ci-detector/src/Ci/CiInterface.php | 6 +- .../ondram/ci-detector/src/Ci/Circle.php | 8 +- .../ondram/ci-detector/src/Ci/Codeship.php | 8 +- .../ci-detector/src/Ci/Continuousphp.php | 8 +- .../ondram/ci-detector/src/Ci/Drone.php | 8 +- .../ci-detector/src/Ci/GitHubActions.php | 8 +- .../ondram/ci-detector/src/Ci/GitLab.php | 8 +- .../ondram/ci-detector/src/Ci/Jenkins.php | 8 +- .../ondram/ci-detector/src/Ci/SourceHut.php | 8 +- .../ondram/ci-detector/src/Ci/TeamCity.php | 8 +- .../ondram/ci-detector/src/Ci/Travis.php | 8 +- .../ondram/ci-detector/src/Ci/Wercker.php | 8 +- .../ondram/ci-detector/src/CiDetector.php | 6 +- .../ci-detector/src/CiDetectorInterface.php | 6 +- .../vendor/ondram/ci-detector/src/Env.php | 2 +- .../src/Exception/CiNotDetectedException.php | 2 +- .../ondram/ci-detector/src/TrinaryLogic.php | 2 +- .../src/Ast/Type/ArrayShapeNode.php | 2 + .../phpdoc-parser/src/Parser/TypeParser.php | 4 +- .../rector/vendor/psr/container/composer.json | 2 +- .../src/ContainerExceptionInterface.php | 2 +- .../psr/container/src/ContainerInterface.php | 2 +- .../src/NotFoundExceptionInterface.php | 2 +- .../rector/vendor/psr/log/composer.json | 2 +- .../vendor/psr/log/src/AbstractLogger.php | 2 +- .../psr/log/src/InvalidArgumentException.php | 2 +- .../rector/vendor/psr/log/src/LogLevel.php | 2 +- .../psr/log/src/LoggerAwareInterface.php | 2 +- .../vendor/psr/log/src/LoggerAwareTrait.php | 2 +- .../vendor/psr/log/src/LoggerInterface.php | 2 +- .../rector/vendor/psr/log/src/LoggerTrait.php | 2 +- .../rector/vendor/psr/log/src/NullLogger.php | 2 +- .../vendor/psr/simple-cache/composer.json | 2 +- .../psr/simple-cache/src/CacheException.php | 2 +- .../psr/simple-cache/src/CacheInterface.php | 2 +- .../src/InvalidArgumentException.php | 2 +- .../rector/vendor/react/cache/composer.json | 4 +- .../vendor/react/cache/src/ArrayCache.php | 6 +- .../vendor/react/cache/src/CacheInterface.php | 4 +- .../vendor/react/child-process/composer.json | 4 +- .../react/child-process/src/Process.php | 20 +- .../rector/vendor/react/dns/composer.json | 4 +- .../react/dns/src/BadServerException.php | 2 +- .../vendor/react/dns/src/Config/Config.php | 2 +- .../vendor/react/dns/src/Config/HostsFile.php | 2 +- .../vendor/react/dns/src/Model/Message.php | 4 +- .../vendor/react/dns/src/Model/Record.php | 2 +- .../react/dns/src/Protocol/BinaryDumper.php | 8 +- .../vendor/react/dns/src/Protocol/Parser.php | 8 +- .../react/dns/src/Query/CachingExecutor.php | 8 +- .../dns/src/Query/CancellationException.php | 2 +- .../react/dns/src/Query/CoopExecutor.php | 4 +- .../react/dns/src/Query/ExecutorInterface.php | 2 +- .../react/dns/src/Query/FallbackExecutor.php | 4 +- .../react/dns/src/Query/HostsFileExecutor.php | 10 +- .../vendor/react/dns/src/Query/Query.php | 6 +- .../react/dns/src/Query/RetryExecutor.php | 6 +- .../src/Query/SelectiveTransportExecutor.php | 4 +- .../dns/src/Query/TcpTransportExecutor.php | 18 +- .../react/dns/src/Query/TimeoutException.php | 2 +- .../react/dns/src/Query/TimeoutExecutor.php | 8 +- .../dns/src/Query/UdpTransportExecutor.php | 20 +- .../react/dns/src/RecordNotFoundException.php | 2 +- .../vendor/react/dns/src/Resolver/Factory.php | 34 +- .../react/dns/src/Resolver/Resolver.php | 10 +- .../dns/src/Resolver/ResolverInterface.php | 2 +- .../vendor/react/event-loop/composer.json | 4 +- .../vendor/react/event-loop/src/ExtEvLoop.php | 6 +- .../react/event-loop/src/ExtEventLoop.php | 6 +- .../react/event-loop/src/ExtLibevLoop.php | 16 +- .../react/event-loop/src/ExtLibeventLoop.php | 6 +- .../vendor/react/event-loop/src/ExtUvLoop.php | 8 +- .../vendor/react/event-loop/src/Factory.php | 4 +- .../vendor/react/event-loop/src/Loop.php | 2 +- .../react/event-loop/src/LoopInterface.php | 2 +- .../react/event-loop/src/SignalsHandler.php | 2 +- .../react/event-loop/src/StreamSelectLoop.php | 8 +- .../event-loop/src/Tick/FutureTickQueue.php | 2 +- .../react/event-loop/src/Timer/Timer.php | 4 +- .../react/event-loop/src/Timer/Timers.php | 4 +- .../react/event-loop/src/TimerInterface.php | 2 +- .../rector/vendor/react/promise/composer.json | 4 +- .../vendor/react/promise/src/Deferred.php | 2 +- .../src/Exception/CompositeException.php | 2 +- .../promise/src/Exception/LengthException.php | 2 +- .../src/Internal/CancellationQueue.php | 2 +- .../promise/src/Internal/FulfilledPromise.php | 6 +- .../promise/src/Internal/RejectedPromise.php | 10 +- .../vendor/react/promise/src/Promise.php | 4 +- .../react/promise/src/PromiseInterface.php | 2 +- .../vendor/react/promise/src/functions.php | 8 +- .../react/promise/src/functions_include.php | 4 +- .../rector/vendor/react/socket/composer.json | 4 +- .../vendor/react/socket/src/Connection.php | 14 +- .../react/socket/src/ConnectionInterface.php | 4 +- .../vendor/react/socket/src/Connector.php | 12 +- .../react/socket/src/ConnectorInterface.php | 2 +- .../vendor/react/socket/src/DnsConnector.php | 8 +- .../vendor/react/socket/src/FdServer.php | 8 +- .../react/socket/src/FixedUriConnector.php | 2 +- .../src/HappyEyeBallsConnectionBuilder.php | 14 +- .../socket/src/HappyEyeBallsConnector.php | 10 +- .../react/socket/src/LimitingServer.php | 4 +- .../react/socket/src/SecureConnector.php | 10 +- .../vendor/react/socket/src/SecureServer.php | 8 +- .../rector/vendor/react/socket/src/Server.php | 8 +- .../react/socket/src/ServerInterface.php | 4 +- .../vendor/react/socket/src/SocketServer.php | 6 +- .../react/socket/src/StreamEncryption.php | 6 +- .../vendor/react/socket/src/TcpConnector.php | 8 +- .../vendor/react/socket/src/TcpServer.php | 8 +- .../react/socket/src/TimeoutConnector.php | 8 +- .../vendor/react/socket/src/UnixConnector.php | 8 +- .../vendor/react/socket/src/UnixServer.php | 8 +- .../rector/vendor/react/stream/composer.json | 4 +- .../react/stream/src/CompositeStream.php | 4 +- .../react/stream/src/DuplexResourceStream.php | 8 +- .../stream/src/DuplexStreamInterface.php | 2 +- .../stream/src/ReadableResourceStream.php | 8 +- .../stream/src/ReadableStreamInterface.php | 4 +- .../vendor/react/stream/src/ThroughStream.php | 4 +- .../rector/vendor/react/stream/src/Util.php | 2 +- .../stream/src/WritableResourceStream.php | 8 +- .../stream/src/WritableStreamInterface.php | 4 +- .../rector/extension-installer/rector.php | 4 +- .../src/GeneratedConfig.php | 2 +- .../src/PluginInstaller.php | 10 +- .../config/sets/attributes/doctrine.php | 2 +- .../config/sets/attributes/gedmo.php | 2 +- .../config/sets/attributes/mongodb.php | 2 +- .../config/sets/doctrine-bundle-210.php | 2 +- .../config/sets/doctrine-code-quality.php | 2 +- .../config/sets/doctrine-collection-22.php | 2 +- .../config/sets/doctrine-common-20.php | 2 +- .../config/sets/doctrine-dbal-210.php | 2 +- .../config/sets/doctrine-dbal-211.php | 2 +- .../config/sets/doctrine-dbal-30.php | 2 +- .../config/sets/doctrine-dbal-40.php | 2 +- .../config/sets/doctrine-orm-213.php | 2 +- .../config/sets/doctrine-orm-214.php | 2 +- .../config/sets/doctrine-orm-25.php | 2 +- .../config/sets/doctrine-orm-29.php | 2 +- .../config/sets/typed-collections.php | 2 +- .../config/yaml-to-annotations.php | 2 +- .../CodeQuality/EntityMappingResolver.php | 8 +- .../RemoveEmptyTableAttributeRector.php | 8 +- .../YamlToAttributeDoctrineMappingRector.php | 2 +- ...pedPropertyFromToOneRelationTypeRector.php | 2 +- .../CodeQuality/Utils/CaseStringHelper.php | 2 +- .../CodeQuality/ValueObject/EntityMapping.php | 2 +- .../ToOneRelationPropertyTypeResolver.php | 2 +- .../src/PhpDoc/ShortClassExpander.php | 2 +- .../config/set/downgrade-php72.php | 2 +- .../config/set/downgrade-php73.php | 2 +- .../config/set/downgrade-php74.php | 2 +- .../config/set/downgrade-php80.php | 2 +- .../config/set/downgrade-php81.php | 2 +- .../config/set/downgrade-php82.php | 2 +- .../config/set/downgrade-php83.php | 2 +- .../config/set/level/down-to-php71.php | 2 +- .../config/set/level/down-to-php72.php | 2 +- .../config/set/level/down-to-php73.php | 2 +- .../config/set/level/down-to-php74.php | 2 +- .../config/set/level/down-to-php80.php | 2 +- .../config/set/level/down-to-php81.php | 2 +- .../config/set/level/down-to-php82.php | 2 +- .../DowngradeParameterTypeWideningRector.php | 2 +- .../DowngradeAttributeToAnnotationRector.php | 2 +- .../Symfony/Component/Annotation/Route.php | 2 +- .../rector/rector-phpunit/composer.json | 12 +- .../config/sets/annotations-to-attributes.php | 2 +- .../config/sets/phpunit-code-quality.php | 10 +- .../rector-phpunit/config/sets/phpunit100.php | 2 +- .../rector-phpunit/config/sets/phpunit110.php | 2 +- .../rector-phpunit/config/sets/phpunit40.php | 2 +- .../rector-phpunit/config/sets/phpunit50.php | 2 +- .../rector-phpunit/config/sets/phpunit60.php | 2 +- .../rector-phpunit/config/sets/phpunit70.php | 2 +- .../rector-phpunit/config/sets/phpunit80.php | 2 +- .../rector-phpunit/config/sets/phpunit90.php | 5 +- .../TestWithAnnotationToAttributeRector.php | 2 +- .../AnnotationWithValueToAttributeRector.php | 14 +- ...rsAnnotationWithValueToAttributeRector.php | 2 +- .../DoctrineEntityDocumentAnalyser.php | 28 + .../NestedClosureAssertFactory.php | 78 + ...ityDocumentCreateMockToDirectNewRector.php | 251 +++ ...eTestFunctionPrefixWithAttributeRector.php | 101 ++ ...NarrowUnusedSetUpDefinedPropertyRector.php | 183 ++ .../Class_/SingleMockPropertyTypeRector.php | 98 ++ .../Class_/TestWithToDataProviderRector.php | 4 +- ...CountableWithMethodToAssertCountRector.php | 21 +- .../MethodCall/AssertEqualsToSameRector.php | 8 +- .../Rector/MethodCall/FlipAssertRector.php | 106 ++ .../UseSpecificWillMethodRector.php | 6 +- .../WillReturnIfNodeDecorator.php | 25 + .../WillReturnCallbackFactory.php} | 81 +- ...rtIssetToAssertObjectHasPropertyRector.php | 3 + .../ExpectsMethodCallDecorator.php | 79 + .../WithConsecutiveRector.php | 256 +-- .../RemoveDataProviderTestPrefixRector.php | 2 +- .../src/Enum/ConsecutiveMethodName.php | 40 + .../rector-phpunit/src/MethodCallRemover.php | 40 + .../src/NodeFactory/ConsecutiveIfsFactory.php | 102 +- .../src/NodeFactory/UsedVariablesResolver.php | 5 +- .../src/NodeFinder/MethodCallNodeFinder.php | 55 + .../src/PhpDoc/DataProviderMethodRenamer.php | 2 +- .../vendor/rector/rector-symfony/README.md | 3 +- .../fosrest/annotations-to-attributes.php | 2 +- .../sets/jms/annotations-to-attributes.php | 2 +- .../sensiolabs/annotations-to-attributes.php | 2 +- .../swiftmailer-to-symfony-mailer.php | 2 +- .../symfony/annotations-to-attributes.php | 2 +- .../config/sets/symfony/configs.php | 2 +- .../sets/symfony/symfony-code-quality.php | 2 +- .../symfony/symfony-constructor-injection.php | 2 +- .../config/sets/symfony/symfony25.php | 2 +- .../config/sets/symfony/symfony26.php | 2 +- .../config/sets/symfony/symfony27.php | 2 +- .../config/sets/symfony/symfony28.php | 2 +- .../config/sets/symfony/symfony30.php | 2 +- .../config/sets/symfony/symfony31.php | 2 +- .../config/sets/symfony/symfony32.php | 2 +- .../config/sets/symfony/symfony33.php | 2 +- .../config/sets/symfony/symfony34.php | 2 +- .../config/sets/symfony/symfony40.php | 2 +- .../config/sets/symfony/symfony41.php | 2 +- .../config/sets/symfony/symfony42.php | 2 +- .../config/sets/symfony/symfony43.php | 2 +- .../config/sets/symfony/symfony44.php | 2 +- .../config/sets/symfony/symfony50-types.php | 2 +- .../config/sets/symfony/symfony50.php | 2 +- .../config/sets/symfony/symfony51.php | 2 +- .../symfony52-validator-attributes.php | 2 +- .../config/sets/symfony/symfony52.php | 2 +- .../config/sets/symfony/symfony53.php | 2 +- .../config/sets/symfony/symfony54.php | 2 +- .../symfony/symfony6/symfony-return-types.php | 2 +- .../config/sets/symfony/symfony60.php | 2 +- .../config/sets/symfony/symfony61.php | 2 +- .../config/sets/symfony/symfony62.php | 2 +- .../config/sets/symfony/symfony63.php | 2 +- .../config/sets/symfony/symfony64.php | 2 +- .../config/sets/symfony/symfony70.php | 2 +- .../config/sets/symfony/symfony71.php | 4 +- .../twig/twig-underscore-to-namespace.php | 2 +- .../config/sets/twig/twig112.php | 2 +- .../config/sets/twig/twig127.php | 2 +- .../config/sets/twig/twig134.php | 2 +- .../config/sets/twig/twig140.php | 2 +- .../config/sets/twig/twig20.php | 2 +- .../config/sets/twig/twig240.php | 2 +- .../ClassMethod/ActionSuffixRemoverRector.php | 2 +- .../RemoveUnusedRequestParamRector.php | 78 +- .../EventListenerToEventSubscriberRector.php | 2 +- .../StringExtensionToConfigBuilderRector.php | 2 +- ...rReturnTypeBasedOnSetterRequiredRector.php | 161 ++ .../NestedConfigCallsFactory.php | 2 +- .../ConfigServiceArgumentsResolver.php | 2 +- .../CollectServiceArgumentsNodeVisitor.php | 2 +- .../Rector/Class_/AutowireAttributeRector.php | 6 +- ...iceSettersToSettersAutodiscoveryRector.php | 2 +- .../MethodCall/RedirectToRouteRector.php | 2 +- .../Rector/StaticCall/ParseFileRector.php | 2 +- .../RemoveDefaultGetBlockPrefixRector.php | 2 +- .../StringToArrayArgumentProcessRector.php | 2 +- ...plateShortNotationToBundleSyntaxRector.php | 2 +- .../FuncCall/ReplaceServiceArgumentRector.php | 2 +- .../CommandPropertyToAttributeRector.php | 2 +- ...mentValueResolverToValueResolverRector.php | 4 +- ...ityAttributeToIsGrantedAttributeRector.php | 2 +- .../Class_/ParamAndEnvAttributeRector.php | 2 +- .../Symfony/ContainerServiceProvider.php | 4 +- .../Symfony/Routing/SymfonyRoutesProvider.php | 4 +- .../FormTypeStringToTypeProvider.php | 2 +- .../src/Helper/TemplateGuesser.php | 2 +- .../ValueObject/IntlBundleClassToNewClass.php | 2 +- .../ValueObjectFactory/ServiceMapFactory.php | 6 +- .../rector/rector/vendor/scoper-autoload.php | 113 +- .../vendor/sebastian/diff/src/Chunk.php | 2 +- .../rector/vendor/sebastian/diff/src/Diff.php | 2 +- .../vendor/sebastian/diff/src/Differ.php | 4 +- .../src/Exception/ConfigurationException.php | 2 +- .../diff/src/Exception/Exception.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../rector/vendor/sebastian/diff/src/Line.php | 2 +- .../LongestCommonSubsequenceCalculator.php | 2 +- ...ientLongestCommonSubsequenceCalculator.php | 2 +- .../src/Output/AbstractChunkOutputBuilder.php | 2 +- .../diff/src/Output/DiffOnlyOutputBuilder.php | 4 +- .../src/Output/DiffOutputBuilderInterface.php | 2 +- .../Output/StrictUnifiedDiffOutputBuilder.php | 6 +- .../src/Output/UnifiedDiffOutputBuilder.php | 4 +- .../vendor/sebastian/diff/src/Parser.php | 2 +- ...ientLongestCommonSubsequenceCalculator.php | 2 +- .../vendor/symfony/console/Application.php | 92 +- .../symfony/console/Attribute/AsCommand.php | 2 +- .../console/CI/GithubActionReporter.php | 4 +- .../rector/vendor/symfony/console/Color.php | 4 +- .../symfony/console/Command/Command.php | 32 +- .../console/Command/CompleteCommand.php | 26 +- .../console/Command/DumpCompletionCommand.php | 16 +- .../symfony/console/Command/HelpCommand.php | 14 +- .../symfony/console/Command/LazyCommand.php | 20 +- .../symfony/console/Command/ListCommand.php | 16 +- .../symfony/console/Command/LockableTrait.php | 12 +- .../Command/SignalableCommandInterface.php | 2 +- .../console/Command/TraceableCommand.php | 22 +- .../CommandLoader/CommandLoaderInterface.php | 6 +- .../CommandLoader/ContainerCommandLoader.php | 8 +- .../CommandLoader/FactoryCommandLoader.php | 6 +- .../console/Completion/CompletionInput.php | 10 +- .../Completion/CompletionSuggestions.php | 4 +- .../Output/BashCompletionOutput.php | 6 +- .../Output/CompletionOutputInterface.php | 6 +- .../Output/FishCompletionOutput.php | 6 +- .../Completion/Output/ZshCompletionOutput.php | 6 +- .../symfony/console/Completion/Suggestion.php | 2 +- .../vendor/symfony/console/ConsoleEvents.php | 10 +- .../rector/vendor/symfony/console/Cursor.php | 4 +- .../DataCollector/CommandDataCollector.php | 18 +- .../symfony/console/Debug/CliRequest.php | 8 +- .../AddConsoleCommandPass.php | 22 +- .../Descriptor/ApplicationDescription.php | 8 +- .../symfony/console/Descriptor/Descriptor.php | 16 +- .../Descriptor/DescriptorInterface.php | 4 +- .../console/Descriptor/JsonDescriptor.php | 12 +- .../console/Descriptor/MarkdownDescriptor.php | 16 +- .../Descriptor/ReStructuredTextDescriptor.php | 18 +- .../console/Descriptor/TextDescriptor.php | 16 +- .../console/Descriptor/XmlDescriptor.php | 12 +- .../Exception/CommandNotFoundException.php | 2 +- .../console/Exception/ExceptionInterface.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../Exception/InvalidOptionException.php | 2 +- .../console/Exception/LogicException.php | 2 +- .../Exception/MissingInputException.php | 2 +- .../Exception/NamespaceNotFoundException.php | 2 +- .../Exception/RunCommandFailedException.php | 4 +- .../console/Exception/RuntimeException.php | 2 +- .../console/Formatter/NullOutputFormatter.php | 2 +- .../Formatter/NullOutputFormatterStyle.php | 2 +- .../console/Formatter/OutputFormatter.php | 6 +- .../Formatter/OutputFormatterInterface.php | 2 +- .../Formatter/OutputFormatterStyle.php | 4 +- .../OutputFormatterStyleInterface.php | 2 +- .../Formatter/OutputFormatterStyleStack.php | 6 +- .../WrappableOutputFormatterInterface.php | 2 +- .../console/Helper/DebugFormatterHelper.php | 2 +- .../console/Helper/DescriptorHelper.php | 18 +- .../vendor/symfony/console/Helper/Dumper.php | 10 +- .../console/Helper/FormatterHelper.php | 4 +- .../vendor/symfony/console/Helper/Helper.php | 6 +- .../console/Helper/HelperInterface.php | 2 +- .../symfony/console/Helper/HelperSet.php | 4 +- .../console/Helper/InputAwareHelper.php | 6 +- .../symfony/console/Helper/OutputWrapper.php | 2 +- .../symfony/console/Helper/ProcessHelper.php | 10 +- .../symfony/console/Helper/ProgressBar.php | 14 +- .../console/Helper/ProgressIndicator.php | 8 +- .../symfony/console/Helper/QuestionHelper.php | 30 +- .../console/Helper/SymfonyQuestionHelper.php | 14 +- .../vendor/symfony/console/Helper/Table.php | 14 +- .../symfony/console/Helper/TableCell.php | 4 +- .../symfony/console/Helper/TableCellStyle.php | 4 +- .../symfony/console/Helper/TableRows.php | 2 +- .../symfony/console/Helper/TableSeparator.php | 2 +- .../symfony/console/Helper/TableStyle.php | 6 +- .../symfony/console/Input/ArgvInput.php | 4 +- .../symfony/console/Input/ArrayInput.php | 6 +- .../vendor/symfony/console/Input/Input.php | 6 +- .../symfony/console/Input/InputArgument.php | 14 +- .../console/Input/InputAwareInterface.php | 2 +- .../symfony/console/Input/InputDefinition.php | 6 +- .../symfony/console/Input/InputInterface.php | 6 +- .../symfony/console/Input/InputOption.php | 14 +- .../Input/StreamableInputInterface.php | 2 +- .../symfony/console/Input/StringInput.php | 4 +- .../symfony/console/Logger/ConsoleLogger.php | 12 +- .../console/Messenger/RunCommandContext.php | 2 +- .../console/Messenger/RunCommandMessage.php | 4 +- .../Messenger/RunCommandMessageHandler.php | 12 +- .../symfony/console/Output/AnsiColorMode.php | 4 +- .../symfony/console/Output/BufferedOutput.php | 2 +- .../symfony/console/Output/ConsoleOutput.php | 4 +- .../console/Output/ConsoleOutputInterface.php | 2 +- .../console/Output/ConsoleSectionOutput.php | 8 +- .../symfony/console/Output/NullOutput.php | 6 +- .../vendor/symfony/console/Output/Output.php | 6 +- .../console/Output/OutputInterface.php | 4 +- .../symfony/console/Output/StreamOutput.php | 6 +- .../console/Output/TrimmedBufferOutput.php | 6 +- .../console/Question/ChoiceQuestion.php | 4 +- .../console/Question/ConfirmationQuestion.php | 2 +- .../symfony/console/Question/Question.php | 6 +- .../console/SignalRegistry/SignalMap.php | 2 +- .../console/SignalRegistry/SignalRegistry.php | 2 +- .../console/SingleCommandApplication.php | 8 +- .../symfony/console/Style/OutputStyle.php | 10 +- .../symfony/console/Style/StyleInterface.php | 2 +- .../symfony/console/Style/SymfonyStyle.php | 40 +- .../vendor/symfony/console/Terminal.php | 6 +- .../vendor/symfony/console/composer.json | 2 +- .../deprecation-contracts/function.php | 4 +- .../Exception/ExceptionInterface.php | 2 +- .../Exception/FileNotFoundException.php | 2 +- .../filesystem/Exception/IOException.php | 2 +- .../Exception/IOExceptionInterface.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../filesystem/Exception/RuntimeException.php | 2 +- .../vendor/symfony/filesystem/Filesystem.php | 12 +- .../rector/vendor/symfony/filesystem/Path.php | 6 +- .../vendor/symfony/filesystem/composer.json | 2 +- .../symfony/finder/Comparator/Comparator.php | 2 +- .../finder/Comparator/DateComparator.php | 2 +- .../finder/Comparator/NumberComparator.php | 2 +- .../Exception/AccessDeniedException.php | 2 +- .../Exception/DirectoryNotFoundException.php | 2 +- .../rector/vendor/symfony/finder/Finder.php | 26 +- .../vendor/symfony/finder/Gitignore.php | 2 +- .../rector/vendor/symfony/finder/Glob.php | 2 +- .../finder/Iterator/CustomFilterIterator.php | 2 +- .../Iterator/DateRangeFilterIterator.php | 4 +- .../Iterator/DepthRangeFilterIterator.php | 2 +- .../ExcludeDirectoryFilterIterator.php | 4 +- .../Iterator/FileTypeFilterIterator.php | 2 +- .../Iterator/FilecontentFilterIterator.php | 4 +- .../Iterator/FilenameFilterIterator.php | 4 +- .../symfony/finder/Iterator/LazyIterator.php | 2 +- .../Iterator/MultiplePcreFilterIterator.php | 2 +- .../finder/Iterator/PathFilterIterator.php | 4 +- .../Iterator/RecursiveDirectoryIterator.php | 6 +- .../Iterator/SizeRangeFilterIterator.php | 4 +- .../finder/Iterator/SortableIterator.php | 2 +- .../Iterator/VcsIgnoredFilterIterator.php | 4 +- .../vendor/symfony/finder/SplFileInfo.php | 2 +- .../vendor/symfony/finder/composer.json | 2 +- .../Resources/unidata/caseFolding.php | 2 +- .../Resources/unidata/lowerCase.php | 2 +- .../Resources/unidata/titleCaseRegexp.php | 2 +- .../Resources/unidata/upperCase.php | 2 +- .../process/Exception/ExceptionInterface.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../process/Exception/LogicException.php | 2 +- .../Exception/ProcessFailedException.php | 4 +- .../Exception/ProcessSignaledException.php | 4 +- .../Exception/ProcessTimedOutException.php | 4 +- .../Exception/RunProcessFailedException.php | 4 +- .../process/Exception/RuntimeException.php | 2 +- .../symfony/process/ExecutableFinder.php | 25 +- .../vendor/symfony/process/InputStream.php | 4 +- .../process/Messenger/RunProcessContext.php | 4 +- .../process/Messenger/RunProcessMessage.php | 2 +- .../Messenger/RunProcessMessageHandler.php | 8 +- .../symfony/process/PhpExecutableFinder.php | 13 +- .../vendor/symfony/process/PhpProcess.php | 6 +- .../vendor/symfony/process/PhpSubprocess.php | 6 +- .../symfony/process/Pipes/AbstractPipes.php | 4 +- .../symfony/process/Pipes/PipesInterface.php | 2 +- .../symfony/process/Pipes/UnixPipes.php | 4 +- .../symfony/process/Pipes/WindowsPipes.php | 6 +- .../rector/vendor/symfony/process/Process.php | 27 +- .../vendor/symfony/process/ProcessUtils.php | 4 +- .../vendor/symfony/process/composer.json | 2 +- .../service-contracts/Attribute/Required.php | 2 +- .../Attribute/SubscribedService.php | 6 +- .../service-contracts/ResetInterface.php | 2 +- .../ServiceCollectionInterface.php | 2 +- .../service-contracts/ServiceLocatorTrait.php | 6 +- .../ServiceMethodsSubscriberTrait.php | 8 +- .../ServiceProviderInterface.php | 4 +- .../ServiceSubscriberInterface.php | 4 +- .../ServiceSubscriberTrait.php | 8 +- .../symfony/service-contracts/composer.json | 2 +- .../symfony/yaml/Command/LintCommand.php | 32 +- .../rector/vendor/symfony/yaml/Dumper.php | 4 +- .../rector/vendor/symfony/yaml/Escaper.php | 2 +- .../symfony/yaml/Exception/DumpException.php | 2 +- .../yaml/Exception/ExceptionInterface.php | 2 +- .../symfony/yaml/Exception/ParseException.php | 2 +- .../yaml/Exception/RuntimeException.php | 2 +- .../rector/vendor/symfony/yaml/Inline.php | 8 +- .../rector/vendor/symfony/yaml/Parser.php | 6 +- .../symfony/yaml/Resources/bin/yaml-lint | 6 +- .../vendor/symfony/yaml/Tag/TaggedValue.php | 2 +- .../rector/vendor/symfony/yaml/Unescaper.php | 4 +- .../rector/vendor/symfony/yaml/Yaml.php | 4 +- .../rector/vendor/symfony/yaml/composer.json | 2 +- .../symplify/easy-parallel/composer.json | 4 +- .../symplify/easy-parallel/config/config.php | 4 +- .../CommandLine/WorkerCommandLineFactory.php | 10 +- .../src/Contract/SerializableInterface.php | 2 +- .../src/CpuCoreCountProvider.php | 6 +- .../easy-parallel/src/Enum/Action.php | 2 +- .../easy-parallel/src/Enum/Content.php | 2 +- .../easy-parallel/src/Enum/ReactCommand.php | 2 +- .../easy-parallel/src/Enum/ReactEvent.php | 2 +- .../ParallelShouldNotHappenException.php | 2 +- .../CommandFromReflectionFactory.php | 6 +- .../easy-parallel/src/ScheduleFactory.php | 4 +- .../src/ValueObject/EasyParallelConfig.php | 2 +- .../src/ValueObject/ParallelProcess.php | 22 +- .../src/ValueObject/ProcessPool.php | 6 +- .../src/ValueObject/Schedule.php | 2 +- .../vendor/webmozart/assert/composer.json | 6 +- .../vendor/webmozart/assert/src/Assert.php | 2 +- .../assert/src/InvalidArgumentException.php | 2 +- .../vendor/webmozart/assert/src/Mixin.php | 2 +- vendor/symfony/console/Application.php | 6 +- vendor/symfony/console/Terminal.php | 2 +- .../symfony/deprecation-contracts/.gitignore | 3 - .../event-dispatcher-contracts/.gitignore | 3 - vendor/symfony/filesystem/Filesystem.php | 4 +- vendor/symfony/polyfill-mbstring/Mbstring.php | 2 +- .../symfony/polyfill-mbstring/bootstrap80.php | 4 +- .../symfony/polyfill-mbstring/composer.json | 3 +- vendor/symfony/polyfill-php80/PhpToken.php | 7 +- vendor/symfony/process/ExecutableFinder.php | 33 +- .../symfony/process/PhpExecutableFinder.php | 11 +- vendor/symfony/process/Process.php | 11 +- vendor/symfony/service-contracts/.gitignore | 3 - .../string/Inflector/EnglishInflector.php | 10 +- 1713 files changed, 49635 insertions(+), 9287 deletions(-) create mode 100644 vendor/clue/ndjson-react/CHANGELOG.md create mode 100644 vendor/clue/ndjson-react/LICENSE create mode 100644 vendor/clue/ndjson-react/README.md create mode 100644 vendor/clue/ndjson-react/composer.json create mode 100644 vendor/clue/ndjson-react/src/Decoder.php create mode 100644 vendor/clue/ndjson-react/src/Encoder.php create mode 100644 vendor/evenement/evenement/.gitattributes create mode 100644 vendor/evenement/evenement/LICENSE create mode 100644 vendor/evenement/evenement/README.md create mode 100644 vendor/evenement/evenement/composer.json create mode 100644 vendor/evenement/evenement/src/EventEmitter.php create mode 100644 vendor/evenement/evenement/src/EventEmitterInterface.php create mode 100644 vendor/evenement/evenement/src/EventEmitterTrait.php create mode 100644 vendor/fidry/cpu-core-counter/.envrc create mode 100644 vendor/fidry/cpu-core-counter/LICENSE.md create mode 100644 vendor/fidry/cpu-core-counter/README.md create mode 100755 vendor/fidry/cpu-core-counter/bin/diagnose.php create mode 100755 vendor/fidry/cpu-core-counter/bin/execute.php create mode 100755 vendor/fidry/cpu-core-counter/bin/trace.php create mode 100644 vendor/fidry/cpu-core-counter/composer.json create mode 100644 vendor/fidry/cpu-core-counter/src/CpuCoreCounter.php create mode 100644 vendor/fidry/cpu-core-counter/src/Diagnoser.php create mode 100644 vendor/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php create mode 100644 vendor/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/FinderRegistry.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/NProcFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php create mode 100644 vendor/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php create mode 100644 vendor/fidry/cpu-core-counter/src/ParallelisationResult.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Command/WorkerCommand.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/PercentageBarOutput.php delete mode 100644 vendor/friendsofphp/php-cs-fixer/src/Documentation/ListDocumentGenerator.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Error/SourceExceptionFactory.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandler.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandlerException.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/GeneralAttributeRemoveFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/OrderedAttributesFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NumericLiteralSeparatorFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerTrait.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/ExperimentalFixerInterface.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/InternalFixerInterface.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAssertNewNamesFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAttributesFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderMethodOrderFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocArrayTypeFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocListTypeFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocClosingMarkerFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/MultilineStringToHeredocFixer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringImplicitBackslashesFixer.php rename vendor/friendsofphp/php-cs-fixer/src/{Tokenizer/CodeHasher.php => Hasher.php} (68%) create mode 100644 vendor/friendsofphp/php-cs-fixer/src/ParallelAwareConfigInterface.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/RuleSet/DeprecatedRuleSetDescriptionInterface.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationRiskySet.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP83MigrationSet.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP84MigrationSet.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit91MigrationRiskySet.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Event/AnalysisStarted.php rename vendor/friendsofphp/php-cs-fixer/src/{FixerFileProcessedEvent.php => Runner/Event/FileProcessed.php} (58%) rename vendor/friendsofphp/php-cs-fixer/src/Runner/{FileCachingLintingIterator.php => FileCachingLintingFileIterator.php} (84%) rename vendor/friendsofphp/php-cs-fixer/src/Runner/{FileLintingIterator.php => LintingFileIterator.php} (89%) create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/LintingResultAwareFileIteratorInterface.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelAction.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfig.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfigFactory.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelisationException.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/Process.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessFactory.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessIdentifier.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessPool.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/WorkerException.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Runner/RunnerConfig.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AttributeAnalysis.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FullyQualifiedNameAnalyzer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php create mode 100644 vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Processor/ImportProcessor.php create mode 100644 vendor/react/cache/CHANGELOG.md create mode 100644 vendor/react/cache/LICENSE create mode 100644 vendor/react/cache/README.md create mode 100644 vendor/react/cache/composer.json create mode 100644 vendor/react/cache/src/ArrayCache.php create mode 100644 vendor/react/cache/src/CacheInterface.php create mode 100644 vendor/react/child-process/CHANGELOG.md create mode 100644 vendor/react/child-process/LICENSE create mode 100644 vendor/react/child-process/README.md create mode 100644 vendor/react/child-process/composer.json create mode 100644 vendor/react/child-process/src/Process.php create mode 100644 vendor/react/dns/CHANGELOG.md create mode 100644 vendor/react/dns/LICENSE create mode 100644 vendor/react/dns/README.md create mode 100644 vendor/react/dns/composer.json create mode 100644 vendor/react/dns/src/BadServerException.php create mode 100644 vendor/react/dns/src/Config/Config.php create mode 100644 vendor/react/dns/src/Config/HostsFile.php create mode 100644 vendor/react/dns/src/Model/Message.php create mode 100644 vendor/react/dns/src/Model/Record.php create mode 100644 vendor/react/dns/src/Protocol/BinaryDumper.php create mode 100644 vendor/react/dns/src/Protocol/Parser.php create mode 100644 vendor/react/dns/src/Query/CachingExecutor.php create mode 100644 vendor/react/dns/src/Query/CancellationException.php create mode 100644 vendor/react/dns/src/Query/CoopExecutor.php create mode 100644 vendor/react/dns/src/Query/ExecutorInterface.php create mode 100644 vendor/react/dns/src/Query/FallbackExecutor.php create mode 100644 vendor/react/dns/src/Query/HostsFileExecutor.php create mode 100644 vendor/react/dns/src/Query/Query.php create mode 100644 vendor/react/dns/src/Query/RetryExecutor.php create mode 100644 vendor/react/dns/src/Query/SelectiveTransportExecutor.php create mode 100644 vendor/react/dns/src/Query/TcpTransportExecutor.php create mode 100644 vendor/react/dns/src/Query/TimeoutException.php create mode 100644 vendor/react/dns/src/Query/TimeoutExecutor.php create mode 100644 vendor/react/dns/src/Query/UdpTransportExecutor.php create mode 100644 vendor/react/dns/src/RecordNotFoundException.php create mode 100644 vendor/react/dns/src/Resolver/Factory.php create mode 100644 vendor/react/dns/src/Resolver/Resolver.php create mode 100644 vendor/react/dns/src/Resolver/ResolverInterface.php create mode 100644 vendor/react/event-loop/CHANGELOG.md create mode 100644 vendor/react/event-loop/LICENSE create mode 100644 vendor/react/event-loop/README.md create mode 100644 vendor/react/event-loop/composer.json create mode 100644 vendor/react/event-loop/src/ExtEvLoop.php create mode 100644 vendor/react/event-loop/src/ExtEventLoop.php create mode 100644 vendor/react/event-loop/src/ExtLibevLoop.php create mode 100644 vendor/react/event-loop/src/ExtLibeventLoop.php create mode 100644 vendor/react/event-loop/src/ExtUvLoop.php create mode 100644 vendor/react/event-loop/src/Factory.php create mode 100644 vendor/react/event-loop/src/Loop.php create mode 100644 vendor/react/event-loop/src/LoopInterface.php create mode 100644 vendor/react/event-loop/src/SignalsHandler.php create mode 100644 vendor/react/event-loop/src/StreamSelectLoop.php create mode 100644 vendor/react/event-loop/src/Tick/FutureTickQueue.php create mode 100644 vendor/react/event-loop/src/Timer/Timer.php create mode 100644 vendor/react/event-loop/src/Timer/Timers.php create mode 100644 vendor/react/event-loop/src/TimerInterface.php create mode 100644 vendor/react/promise/CHANGELOG.md create mode 100644 vendor/react/promise/LICENSE create mode 100644 vendor/react/promise/README.md create mode 100644 vendor/react/promise/composer.json create mode 100644 vendor/react/promise/src/Deferred.php create mode 100644 vendor/react/promise/src/Exception/CompositeException.php create mode 100644 vendor/react/promise/src/Exception/LengthException.php create mode 100644 vendor/react/promise/src/Internal/CancellationQueue.php create mode 100644 vendor/react/promise/src/Internal/FulfilledPromise.php create mode 100644 vendor/react/promise/src/Internal/RejectedPromise.php create mode 100644 vendor/react/promise/src/Promise.php create mode 100644 vendor/react/promise/src/PromiseInterface.php create mode 100644 vendor/react/promise/src/functions.php create mode 100644 vendor/react/promise/src/functions_include.php create mode 100644 vendor/react/socket/CHANGELOG.md create mode 100644 vendor/react/socket/LICENSE create mode 100644 vendor/react/socket/README.md create mode 100644 vendor/react/socket/composer.json create mode 100644 vendor/react/socket/src/Connection.php create mode 100644 vendor/react/socket/src/ConnectionInterface.php create mode 100644 vendor/react/socket/src/Connector.php create mode 100644 vendor/react/socket/src/ConnectorInterface.php create mode 100644 vendor/react/socket/src/DnsConnector.php create mode 100644 vendor/react/socket/src/FdServer.php create mode 100644 vendor/react/socket/src/FixedUriConnector.php create mode 100644 vendor/react/socket/src/HappyEyeBallsConnectionBuilder.php create mode 100644 vendor/react/socket/src/HappyEyeBallsConnector.php create mode 100644 vendor/react/socket/src/LimitingServer.php create mode 100644 vendor/react/socket/src/SecureConnector.php create mode 100644 vendor/react/socket/src/SecureServer.php create mode 100644 vendor/react/socket/src/Server.php create mode 100644 vendor/react/socket/src/ServerInterface.php create mode 100644 vendor/react/socket/src/SocketServer.php create mode 100644 vendor/react/socket/src/StreamEncryption.php create mode 100644 vendor/react/socket/src/TcpConnector.php create mode 100644 vendor/react/socket/src/TcpServer.php create mode 100644 vendor/react/socket/src/TimeoutConnector.php create mode 100644 vendor/react/socket/src/UnixConnector.php create mode 100644 vendor/react/socket/src/UnixServer.php create mode 100644 vendor/react/stream/CHANGELOG.md create mode 100644 vendor/react/stream/LICENSE create mode 100644 vendor/react/stream/README.md create mode 100644 vendor/react/stream/composer.json create mode 100644 vendor/react/stream/src/CompositeStream.php create mode 100644 vendor/react/stream/src/DuplexResourceStream.php create mode 100644 vendor/react/stream/src/DuplexStreamInterface.php create mode 100644 vendor/react/stream/src/ReadableResourceStream.php create mode 100644 vendor/react/stream/src/ReadableStreamInterface.php create mode 100644 vendor/react/stream/src/ThroughStream.php create mode 100644 vendor/react/stream/src/Util.php create mode 100644 vendor/react/stream/src/WritableResourceStream.php create mode 100644 vendor/react/stream/src/WritableStreamInterface.php create mode 100644 vendor/rector/rector/rules/CodeQuality/NodeFactory/TypedPropertyFactory.php create mode 100644 vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php create mode 100644 vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php create mode 100644 vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php create mode 100644 vendor/rector/rector/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php create mode 100644 vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php create mode 100644 vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php create mode 100644 vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php create mode 100644 vendor/rector/rector/src/Enum/ClassName.php create mode 100644 vendor/rector/rector/vendor/illuminate/container/Attributes/RouteParameter.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php rename vendor/rector/rector/vendor/rector/rector-phpunit/{src/NodeFactory/WithConsecutiveMatchFactory.php => rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php} (54%) create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/src/MethodCallRemover.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php delete mode 100644 vendor/symfony/deprecation-contracts/.gitignore delete mode 100644 vendor/symfony/event-dispatcher-contracts/.gitignore delete mode 100644 vendor/symfony/service-contracts/.gitignore diff --git a/composer.json b/composer.json index 64f8912a3..8db465812 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,8 @@ { "require": { "php": ">=7.4", - "rector/rector": "1.2.10", - "friendsofphp/php-cs-fixer": "3.38.2", + "rector/rector": "^1.2.10", + "friendsofphp/php-cs-fixer": "^3.38.2", "redaxo/php-cs-fixer-config": "^1.0" }, "config": { diff --git a/composer.lock b/composer.lock index 4c167c38f..34fa5c06c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,84 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "22f383990728cbaff78a3c192d13dfbf", + "content-hash": "fc91af47631b4b06b3cedbd2da3e13d3", "packages": [ + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, { "name": "composer/pcre", - "version": "3.3.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { @@ -27,19 +91,19 @@ "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.10", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - }, "phpstan": { "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { @@ -67,7 +131,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.1" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -83,7 +147,7 @@ "type": "tidelift" } ], - "time": "2024-08-27T18:44:43+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", @@ -232,52 +296,168 @@ ], "time": "2024-05-06T16:37:16+00:00" }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.38.2", + "version": "v3.75.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "d872cdd543797ade030aaa307c0a4954a712e081" + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d872cdd543797ade030aaa307c0a4954a712e081", - "reference": "d872cdd543797ade030aaa307c0a4954a712e081", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/399a128ff2fdaf4281e4e79b755693286cdf325c", + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c", "shasum": "" }, "require": { - "composer/semver": "^3.3", + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.2", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0 || ^5.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.27", - "symfony/polyfill-php80": "^1.27", - "symfony/polyfill-php81": "^1.27", - "symfony/process": "^5.4 || ^6.0", - "symfony/stopwatch": "^5.4 || ^6.0" + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/polyfill-mbstring": "^1.31", + "symfony/polyfill-php80": "^1.31", + "symfony/polyfill-php81": "^1.31", + "symfony/process": "^5.4 || ^6.4 || ^7.2", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3 || ^2.0", - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^2.0", - "mikey179/vfsstream": "^1.6.11", - "php-coveralls/php-coveralls": "^2.5.3", + "facile-it/paraunit": "^1.3.1 || ^2.6", + "infection/infection": "^0.29.14", + "justinrainbow/json-schema": "^5.3 || ^6.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.16", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "symfony/phpunit-bridge": "^6.2.3", - "symfony/yaml": "^5.4 || ^6.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", + "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12", + "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3", + "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -290,7 +470,10 @@ "autoload": { "psr-4": { "PhpCsFixer\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -315,7 +498,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.38.2" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.75.0" }, "funding": [ { @@ -323,20 +506,20 @@ "type": "github" } ], - "time": "2023-11-14T00:19:22+00:00" + "time": "2025-03-31T18:40:42+00:00" }, { "name": "phpstan/phpstan", - "version": "1.12.9", + "version": "1.12.27", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "ceb937fb39a92deabc02d20709cf14b2c452502c" + "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ceb937fb39a92deabc02d20709cf14b2c452502c", - "reference": "ceb937fb39a92deabc02d20709cf14b2c452502c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a6e423c076ab39dfedc307e2ac627ef579db162", + "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162", "shasum": "" }, "require": { @@ -381,7 +564,7 @@ "type": "github" } ], - "time": "2024-11-10T17:10:04+00:00" + "time": "2025-05-21T20:51:45+00:00" }, { "name": "psr/container", @@ -531,6 +714,532 @@ }, "time": "2021-05-03T11:20:27+00:00" }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.6", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-01-01T16:37:48+00:00" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, + { + "name": "react/socket", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-07-26T10:38:09+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, { "name": "rector/rector", "version": "1.2.10", @@ -699,16 +1408,16 @@ }, { "name": "symfony/console", - "version": "v5.4.44", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "5b5a0aa66e3296e303e22490f90f521551835a83" + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5b5a0aa66e3296e303e22490f90f521551835a83", - "reference": "5b5a0aa66e3296e303e22490f90f521551835a83", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { @@ -778,7 +1487,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.44" + "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { @@ -794,20 +1503,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T07:56:40+00:00" + "time": "2024-11-06T11:30:55+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.3", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "80d075412b557d41002320b96a096ca65aa2c98d" + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", - "reference": "80d075412b557d41002320b96a096ca65aa2c98d", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", "shasum": "" }, "require": { @@ -815,12 +1524,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -845,7 +1554,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" }, "funding": [ { @@ -861,20 +1570,20 @@ "type": "tidelift" } ], - "time": "2023-01-24T14:02:46+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4" + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", "shasum": "" }, "require": { @@ -930,7 +1639,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.40" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45" }, "funding": [ { @@ -946,20 +1655,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.3", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73" + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73", - "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", "shasum": "" }, "require": { @@ -971,12 +1680,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -1009,7 +1718,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4" }, "funding": [ { @@ -1025,20 +1734,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.44", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc" + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/76c3818964e9d32be3862c9318ae3ba9aa280ddc", - "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", "shasum": "" }, "require": { @@ -1076,7 +1785,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.44" + "source": "https://github.com/symfony/filesystem/tree/v5.4.45" }, "funding": [ { @@ -1092,20 +1801,20 @@ "type": "tidelift" } ], - "time": "2024-09-16T14:52:48+00:00" + "time": "2024-10-22T13:05:35+00:00" }, { "name": "symfony/finder", - "version": "v5.4.43", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ae25a9145a900764158d439653d5630191155ca0" + "reference": "63741784cd7b9967975eec610b256eed3ede022b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ae25a9145a900764158d439653d5630191155ca0", - "reference": "ae25a9145a900764158d439653d5630191155ca0", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", "shasum": "" }, "require": { @@ -1139,7 +1848,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.43" + "source": "https://github.com/symfony/finder/tree/v5.4.45" }, "funding": [ { @@ -1155,20 +1864,20 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:03:51+00:00" + "time": "2024-09-28T13:32:08+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4" + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/bd1afbde6613a8d6b956115e0e14b196191fd0c4", - "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", "shasum": "" }, "require": { @@ -1208,7 +1917,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.40" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.45" }, "funding": [ { @@ -1224,11 +1933,11 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -1252,8 +1961,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1287,7 +1996,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" }, "funding": [ { @@ -1307,7 +2016,7 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -1328,8 +2037,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1365,7 +2074,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" }, "funding": [ { @@ -1385,7 +2094,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -1406,8 +2115,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1446,7 +2155,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" }, "funding": [ { @@ -1466,19 +2175,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -1490,8 +2200,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1526,7 +2236,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" }, "funding": [ { @@ -1542,11 +2252,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -1564,8 +2274,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1602,7 +2312,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" }, "funding": [ { @@ -1622,16 +2332,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -1640,8 +2350,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1682,7 +2392,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" }, "funding": [ { @@ -1698,11 +2408,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -1720,8 +2430,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1758,7 +2468,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0" }, "funding": [ { @@ -1778,16 +2488,16 @@ }, { "name": "symfony/process", - "version": "v5.4.46", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "01906871cb9b5e3cf872863b91aba4ec9767daf4" + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/01906871cb9b5e3cf872863b91aba4ec9767daf4", - "reference": "01906871cb9b5e3cf872863b91aba4ec9767daf4", + "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", "shasum": "" }, "require": { @@ -1820,7 +2530,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.46" + "source": "https://github.com/symfony/process/tree/v5.4.47" }, "funding": [ { @@ -1836,20 +2546,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T09:18:28+00:00" + "time": "2024-11-06T11:36:42+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.3", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", - "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", "shasum": "" }, "require": { @@ -1865,12 +2575,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -1903,7 +2613,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.3" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" }, "funding": [ { @@ -1919,20 +2629,20 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:04:16+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625" + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e9daf3b7c805c747638b2cc48f1649e594f9625", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fb2c199cf302eb207f8c23e7ee174c1c31a5c004", + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004", "shasum": "" }, "require": { @@ -1965,7 +2675,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.40" + "source": "https://github.com/symfony/stopwatch/tree/v5.4.45" }, "funding": [ { @@ -1981,20 +2691,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/string", - "version": "v5.4.44", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "832caa16b6d9aac6bf11747315225f5aba384c24" + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/832caa16b6d9aac6bf11747315225f5aba384c24", - "reference": "832caa16b6d9aac6bf11747315225f5aba384c24", + "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", "shasum": "" }, "require": { @@ -2051,7 +2761,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.44" + "source": "https://github.com/symfony/string/tree/v5.4.47" }, "funding": [ { @@ -2067,19 +2777,19 @@ "type": "tidelift" } ], - "time": "2024-09-20T07:56:40+00:00" + "time": "2024-11-10T20:33:58+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=7.4" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "7.4.30" }, diff --git a/package.yml b/package.yml index 5006d8b48..c4abd1046 100644 --- a/package.yml +++ b/package.yml @@ -1,5 +1,5 @@ package: rexfactor -version: '0.1.27' +version: '0.1.28' author: Friends Of REDAXO supportpage: https://github.com/FriendsOfREDAXO/rexfactor diff --git a/vendor/clue/ndjson-react/CHANGELOG.md b/vendor/clue/ndjson-react/CHANGELOG.md new file mode 100644 index 000000000..bc4faf693 --- /dev/null +++ b/vendor/clue/ndjson-react/CHANGELOG.md @@ -0,0 +1,75 @@ +# Changelog + +## 1.3.0 (2022-12-23) + +* Feature: Add support for PHP 8.1 and PHP 8.2. + (#31 by @clue and #30 by @SimonFring) + +* Feature: Check type of incoming `data` before trying to decode NDJSON. + (#29 by @SimonFrings) + +* Improve documentation and examples and update to new [default loop](https://reactphp.org/event-loop/#loop). + (#26 by @clue, #27 by @SimonFrings and #25 by @PaulRotmann) + +* Improve test suite, report failed assertions and ensure 100% code coverage. + (#32 and #33 by @clue and #28 by @SimonFrings) + +## 1.2.0 (2020-12-09) + +* Improve test suite and add `.gitattributes` to exclude dev files from exports. + Add PHP 8 support, update to PHPUnit 9 and simplify test setup. + (#18 by @clue and #19, #22 and #23 by @SimonFrings) + +## 1.1.0 (2020-02-04) + +* Feature: Improve error reporting and add parsing error message to Exception and + ignore `JSON_THROW_ON_ERROR` option (available as of PHP 7.3). + (#14 by @clue) + +* Feature: Add bechmarking script and import all global function references. + (#16 by @clue) + +* Improve documentation and add NDJSON format description and + add support / sponsorship info. + (#12 and #17 by @clue) + +* Improve test suite to run tests on PHP 7.4 and simplify test matrix and + apply minor code style adjustments to make phpstan happy. + (#13 and #15 by @clue) + +## 1.0.0 (2018-05-17) + +* First stable release, now following SemVer + +* Improve documentation and usage examples + +> Contains no other changes, so it's actually fully compatible with the v0.1.2 release. + +## 0.1.2 (2018-05-11) + +* Feature: Limit buffer size to 64 KiB by default. + (#10 by @clue) + +* Feature: Forward compatiblity with EventLoop v0.5 and upcoming v1.0. + (#8 by @clue) + +* Fix: Return bool `false` if encoding fails due to invalid value to pause source. + (#9 by @clue) + +* Improve test suite by supporting PHPUnit v6 and test against legacy PHP 5.3 through PHP 7.2. + (#7 by @clue) + +* Update project homepage. + (#11 by @clue) + +## 0.1.1 (2017-05-22) + +* Feature: Forward compatibility with Stream v0.7, v0.6, v0.5 and upcoming v1.0 (while keeping BC) + (#6 by @thklein) + +* Improved test suite by adding PHPUnit to `require-dev` + (#5 by @thklein) + +## 0.1.0 (2016-11-24) + +* First tagged release diff --git a/vendor/clue/ndjson-react/LICENSE b/vendor/clue/ndjson-react/LICENSE new file mode 100644 index 000000000..7baae8e9a --- /dev/null +++ b/vendor/clue/ndjson-react/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Christian Lück + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/clue/ndjson-react/README.md b/vendor/clue/ndjson-react/README.md new file mode 100644 index 000000000..0ca4eabe1 --- /dev/null +++ b/vendor/clue/ndjson-react/README.md @@ -0,0 +1,365 @@ +# clue/reactphp-ndjson + +[![CI status](https://github.com/clue/reactphp-ndjson/actions/workflows/ci.yml/badge.svg)](https://github.com/clue/reactphp-ndjson/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/clue/ndjson-react?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/clue/ndjson-react) +[![code coverage](https://img.shields.io/badge/code%20coverage-100%25-success)](#tests) + +Streaming newline-delimited JSON ([NDJSON](http://ndjson.org/)) parser and encoder for [ReactPHP](https://reactphp.org/). + +[NDJSON](http://ndjson.org/) can be used to store multiple JSON records in a +file to store any kind of (uniform) structured data, such as a list of user +objects or log entries. It uses a simple newline character between each +individual record and as such can be both used for efficient persistence and +simple append-style operations. This also allows it to be used in a streaming +context, such as a simple inter-process communication (IPC) protocol or for a +remote procedure call (RPC) mechanism. This library provides a simple +streaming API to process very large NDJSON files with thousands or even millions +of rows efficiently without having to load the whole file into memory at once. + +* **Standard interfaces** - + Allows easy integration with existing higher-level components by implementing + ReactPHP's standard streaming interfaces. +* **Lightweight, SOLID design** - + Provides a thin abstraction that is [*just good enough*](https://en.wikipedia.org/wiki/Principle_of_good_enough) + and does not get in your way. + Builds on top of well-tested components and well-established concepts instead of reinventing the wheel. +* **Good test coverage** - + Comes with an [automated tests suite](#tests) and is regularly tested in the *real world*. + +**Table of contents** + +* [Support us](#support-us) +* [NDJSON format](#ndjson-format) +* [Usage](#usage) + * [Decoder](#decoder) + * [Encoder](#encoder) +* [Install](#install) +* [Tests](#tests) +* [License](#license) +* [More](#more) + +## Support us + +We invest a lot of time developing, maintaining, and updating our awesome +open-source projects. You can help us sustain this high-quality of our work by +[becoming a sponsor on GitHub](https://github.com/sponsors/clue). Sponsors get +numerous benefits in return, see our [sponsoring page](https://github.com/sponsors/clue) +for details. + +Let's take these projects to the next level together! 🚀 + +## NDJSON format + +NDJSON ("Newline-Delimited JSON" or sometimes referred to as "JSON lines") is a +very simple text-based format for storing a large number of records, such as a +list of user records or log entries. + +```JSON +{"name":"Alice","age":30,"comment":"Yes, I like cheese"} +{"name":"Bob","age":50,"comment":"Hello\nWorld!"} +``` + +If you understand JSON and you're now looking at this newline-delimited JSON for +the first time, you should already know everything you need to know to +understand NDJSON: As the name implies, this format essentially consists of +individual lines where each individual line is any valid JSON text and each line +is delimited with a newline character. + +This example uses a list of user objects where each user has some arbitrary +properties. This can easily be adjusted for many different use cases, such as +storing for example products instead of users, assigning additional properties +or having a significantly larger number of records. You can edit NDJSON files in +any text editor or use them in a streaming context where individual records +should be processed. Unlike normal JSON files, adding a new log entry to this +NDJSON file does not require modification of this file's structure (note there's +no "outer array" to be modified). This makes it a perfect fit for a streaming +context, for line-oriented CLI tools (such as `grep` and others) or for a logging +context where you want to append records at a later time. Additionally, this +also allows it to be used in a streaming context, such as a simple inter-process +communication (IPC) protocol or for a remote procedure call (RPC) mechanism. + +The newline character at the end of each line allows for some really simple +*framing* (detecting individual records). While each individual line is valid +JSON, the complete file as a whole is technically no longer valid JSON, because +it contains multiple JSON texts. This implies that for example calling PHP's +`json_decode()` on this complete input would fail because it would try to parse +multiple records at once. Likewise, using "pretty printing" JSON +(`JSON_PRETTY_PRINT`) is not allowed because each JSON text is limited to exactly +one line. On the other hand, values containing newline characters (such as the +`comment` property in the above example) do not cause issues because each newline +within a JSON string will be represented by a `\n` instead. + +One common alternative to NDJSON would be Comma-Separated Values (CSV). +If you want to process CSV files, you may want to take a look at the related +project [clue/reactphp-csv](https://github.com/clue/reactphp-csv) instead: + +``` +name,age,comment +Alice,30,"Yes, I like cheese" +Bob,50,"Hello +World!" +``` + +CSV may look slightly simpler, but this simplicity comes at a price. CSV is +limited to untyped, two-dimensional data, so there's no standard way of storing +any nested structures or to differentiate a boolean value from a string or +integer. Field names are sometimes used, sometimes they're not +(application-dependant). Inconsistent handling for fields that contain +separators such as `,` or spaces or line breaks (see the `comment` field above) +introduce additional complexity and its text encoding is usually undefined, +Unicode (or UTF-8) is unlikely to be supported and CSV files often use ISO +8859-1 encoding or some variant (again application-dependant). + +While NDJSON helps avoiding many of CSV's shortcomings, it is still a +(relatively) young format while CSV files have been used in production systems +for decades. This means that if you want to interface with an existing system, +you may have to rely on the format that's already supported. If you're building +a new system, using NDJSON is an excellent choice as it provides a flexible way +to process individual records using a common text-based format that can include +any kind of structured data. + +## Usage + +### Decoder + +The `Decoder` (parser) class can be used to make sure you only get back +complete, valid JSON elements when reading from a stream. +It wraps a given +[`ReadableStreamInterface`](https://github.com/reactphp/stream#readablestreaminterface) +and exposes its data through the same interface, but emits the JSON elements +as parsed values instead of just chunks of strings: + +``` +{"name":"test","active":true} +{"name":"hello w\u00f6rld","active":true} +``` + +```php +$stdin = new React\Stream\ReadableResourceStream(STDIN); + +$ndjson = new Clue\React\NDJson\Decoder($stdin); + +$ndjson->on('data', function ($data) { + // $data is a parsed element from the JSON stream + // line 1: $data = (object)array('name' => 'test', 'active' => true); + // line 2: $data = (object)array('name' => 'hello wörld', 'active' => true); + var_dump($data); +}); +``` + +ReactPHP's streams emit chunks of data strings and make no assumption about their lengths. +These chunks do not necessarily represent complete JSON elements, as an +element may be broken up into multiple chunks. +This class reassembles these elements by buffering incomplete ones. + +The `Decoder` supports the same optional parameters as the underlying +[`json_decode()`](https://www.php.net/manual/en/function.json-decode.php) function. +This means that, by default, JSON objects will be emitted as a `stdClass`. +This behavior can be controlled through the optional constructor parameters: + +```php +$ndjson = new Clue\React\NDJson\Decoder($stdin, true); + +$ndjson->on('data', function ($data) { + // JSON objects will be emitted as assoc arrays now +}); +``` + +Additionally, the `Decoder` limits the maximum buffer size (maximum line +length) to avoid buffer overflows due to malformed user input. Usually, there +should be no need to change this value, unless you know you're dealing with some +unreasonably long lines. It accepts an additional argument if you want to change +this from the default of 64 KiB: + +```php +$ndjson = new Clue\React\NDJson\Decoder($stdin, false, 512, 0, 64 * 1024); +``` + +If the underlying stream emits an `error` event or the plain stream contains +any data that does not represent a valid NDJson stream, +it will emit an `error` event and then `close` the input stream: + +```php +$ndjson->on('error', function (Exception $error) { + // an error occured, stream will close next +}); +``` + +If the underlying stream emits an `end` event, it will flush any incomplete +data from the buffer, thus either possibly emitting a final `data` event +followed by an `end` event on success or an `error` event for +incomplete/invalid JSON data as above: + +```php +$ndjson->on('end', function () { + // stream successfully ended, stream will close next +}); +``` + +If either the underlying stream or the `Decoder` is closed, it will forward +the `close` event: + +```php +$ndjson->on('close', function () { + // stream closed + // possibly after an "end" event or due to an "error" event +}); +``` + +The `close(): void` method can be used to explicitly close the `Decoder` and +its underlying stream: + +```php +$ndjson->close(); +``` + +The `pipe(WritableStreamInterface $dest, array $options = array(): WritableStreamInterface` +method can be used to forward all data to the given destination stream. +Please note that the `Decoder` emits decoded/parsed data events, while many +(most?) writable streams expect only data chunks: + +```php +$ndjson->pipe($logger); +``` + +For more details, see ReactPHP's +[`ReadableStreamInterface`](https://github.com/reactphp/stream#readablestreaminterface). + +### Encoder + +The `Encoder` (serializer) class can be used to make sure anything you write to +a stream ends up as valid JSON elements in the resulting NDJSON stream. +It wraps a given +[`WritableStreamInterface`](https://github.com/reactphp/stream#writablestreaminterface) +and accepts its data through the same interface, but handles any data as complete +JSON elements instead of just chunks of strings: + +```php +$stdout = new React\Stream\WritableResourceStream(STDOUT); + +$ndjson = new Clue\React\NDJson\Encoder($stdout); + +$ndjson->write(array('name' => 'test', 'active' => true)); +$ndjson->write(array('name' => 'hello wörld', 'active' => true)); +``` +``` +{"name":"test","active":true} +{"name":"hello w\u00f6rld","active":true} +``` + +The `Encoder` supports the same parameters as the underlying +[`json_encode()`](https://www.php.net/manual/en/function.json-encode.php) function. +This means that, by default, Unicode characters will be escaped in the output. +This behavior can be controlled through the optional constructor parameters: + +```php +$ndjson = new Clue\React\NDJson\Encoder($stdout, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + +$ndjson->write('hello wörld'); +``` +``` +"hello wörld" +``` + +Note that trying to pass the `JSON_PRETTY_PRINT` option will yield an +`InvalidArgumentException` because it is not compatible with NDJSON. + +If the underlying stream emits an `error` event or the given data contains +any data that can not be represented as a valid NDJSON stream, +it will emit an `error` event and then `close` the input stream: + +```php +$ndjson->on('error', function (Exception $error) { + // an error occured, stream will close next +}); +``` + +If either the underlying stream or the `Encoder` is closed, it will forward +the `close` event: + +```php +$ndjson->on('close', function () { + // stream closed + // possibly after an "end" event or due to an "error" event +}); +``` + +The `end(mixed $data = null): void` method can be used to optionally emit +any final data and then soft-close the `Encoder` and its underlying stream: + +```php +$ndjson->end(); +``` + +The `close(): void` method can be used to explicitly close the `Encoder` and +its underlying stream: + +```php +$ndjson->close(); +``` + +For more details, see ReactPHP's +[`WritableStreamInterface`](https://github.com/reactphp/stream#writablestreaminterface). + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](https://semver.org/). +This will install the latest supported version: + +```bash +composer require clue/ndjson-react:^1.3 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 8+ and +HHVM. +It's *highly recommended to use the latest supported PHP version* for this project. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org/): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +## License + +This project is released under the permissive [MIT license](LICENSE). + +> Did you know that I offer custom development services and issuing invoices for + sponsorships of releases and for contributions? Contact me (@clue) for details. + +## More + +* If you want to learn more about processing streams of data, refer to the documentation of + the underlying [react/stream](https://github.com/reactphp/stream) component. + +* If you want to process compressed NDJSON files (`.ndjson.gz` file extension), + you may want to use [clue/reactphp-zlib](https://github.com/clue/reactphp-zlib) + on the compressed input stream before passing the decompressed stream to the NDJSON decoder. + +* If you want to create compressed NDJSON files (`.ndjson.gz` file extension), + you may want to use [clue/reactphp-zlib](https://github.com/clue/reactphp-zlib) + on the resulting NDJSON encoder output stream before passing the compressed + stream to the file output stream. + +* If you want to concurrently process the records from your NDJSON stream, + you may want to use [clue/reactphp-flux](https://github.com/clue/reactphp-flux) + to concurrently process many (but not too many) records at once. + +* If you want to process structured data in the more common text-based format, + you may want to use [clue/reactphp-csv](https://github.com/clue/reactphp-csv) + to process Comma-Separated-Values (CSV) files (`.csv` file extension). diff --git a/vendor/clue/ndjson-react/composer.json b/vendor/clue/ndjson-react/composer.json new file mode 100644 index 000000000..01a4b8594 --- /dev/null +++ b/vendor/clue/ndjson-react/composer.json @@ -0,0 +1,31 @@ +{ + "name": "clue/ndjson-react", + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "keywords": ["NDJSON", "newline", "JSON", "jsonlines", "streaming", "ReactPHP"], + "homepage": "https://github.com/clue/reactphp-ndjson", + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Clue\\Tests\\React\\NDJson\\": "tests/" + } + } +} diff --git a/vendor/clue/ndjson-react/src/Decoder.php b/vendor/clue/ndjson-react/src/Decoder.php new file mode 100644 index 000000000..876ff2b11 --- /dev/null +++ b/vendor/clue/ndjson-react/src/Decoder.php @@ -0,0 +1,166 @@ +input = $input; + + if (!$input->isReadable()) { + $this->close(); + return; + } + + $this->assoc = $assoc; + $this->depth = $depth; + $this->options = $options; + $this->maxlength = $maxlength; + + $this->input->on('data', array($this, 'handleData')); + $this->input->on('end', array($this, 'handleEnd')); + $this->input->on('error', array($this, 'handleError')); + $this->input->on('close', array($this, 'close')); + } + + public function isReadable() + { + return !$this->closed; + } + + public function close() + { + if ($this->closed) { + return; + } + + $this->closed = true; + $this->buffer = ''; + + $this->input->close(); + + $this->emit('close'); + $this->removeAllListeners(); + } + + public function pause() + { + $this->input->pause(); + } + + public function resume() + { + $this->input->resume(); + } + + public function pipe(WritableStreamInterface $dest, array $options = array()) + { + Util::pipe($this, $dest, $options); + + return $dest; + } + + /** @internal */ + public function handleData($data) + { + if (!\is_string($data)) { + $this->handleError(new \UnexpectedValueException('Expected stream to emit string, but got ' . \gettype($data))); + return; + } + + $this->buffer .= $data; + + // keep parsing while a newline has been found + while (($newline = \strpos($this->buffer, "\n")) !== false && $newline <= $this->maxlength) { + // read data up until newline and remove from buffer + $data = (string)\substr($this->buffer, 0, $newline); + $this->buffer = (string)\substr($this->buffer, $newline + 1); + + // decode data with options given in ctor + // @codeCoverageIgnoreStart + if ($this->options === 0) { + $data = \json_decode($data, $this->assoc, $this->depth); + } else { + assert(\PHP_VERSION_ID >= 50400); + $data = \json_decode($data, $this->assoc, $this->depth, $this->options); + } + // @codeCoverageIgnoreEnd + + // abort stream if decoding failed + if ($data === null && \json_last_error() !== \JSON_ERROR_NONE) { + // @codeCoverageIgnoreStart + if (\PHP_VERSION_ID > 50500) { + $errstr = \json_last_error_msg(); + } elseif (\json_last_error() === \JSON_ERROR_SYNTAX) { + $errstr = 'Syntax error'; + } else { + $errstr = 'Unknown error'; + } + // @codeCoverageIgnoreEnd + return $this->handleError(new \RuntimeException('Unable to decode JSON: ' . $errstr, \json_last_error())); + } + + $this->emit('data', array($data)); + } + + if (isset($this->buffer[$this->maxlength])) { + $this->handleError(new \OverflowException('Buffer size exceeded')); + } + } + + /** @internal */ + public function handleEnd() + { + if ($this->buffer !== '') { + $this->handleData("\n"); + } + + if (!$this->closed) { + $this->emit('end'); + $this->close(); + } + } + + /** @internal */ + public function handleError(\Exception $error) + { + $this->emit('error', array($error)); + $this->close(); + } +} diff --git a/vendor/clue/ndjson-react/src/Encoder.php b/vendor/clue/ndjson-react/src/Encoder.php new file mode 100644 index 000000000..30d5c311d --- /dev/null +++ b/vendor/clue/ndjson-react/src/Encoder.php @@ -0,0 +1,144 @@ +output = $output; + + if (!$output->isWritable()) { + $this->close(); + return; + } + + $this->options = $options; + $this->depth = $depth; + + $this->output->on('drain', array($this, 'handleDrain')); + $this->output->on('error', array($this, 'handleError')); + $this->output->on('close', array($this, 'close')); + } + + public function write($data) + { + if ($this->closed) { + return false; + } + + // we have to handle PHP warnings for legacy PHP < 5.5 + // certain values (such as INF etc.) emit a warning, but still encode successfully + // @codeCoverageIgnoreStart + if (\PHP_VERSION_ID < 50500) { + $errstr = null; + \set_error_handler(function ($_, $error) use (&$errstr) { + $errstr = $error; + }); + + // encode data with options given in ctor (depth not supported) + $data = \json_encode($data, $this->options); + + // always check error code and match missing error messages + \restore_error_handler(); + $errno = \json_last_error(); + if (\defined('JSON_ERROR_UTF8') && $errno === \JSON_ERROR_UTF8) { + // const JSON_ERROR_UTF8 added in PHP 5.3.3, but no error message assigned in legacy PHP < 5.5 + // this overrides PHP 5.3.14 only: https://3v4l.org/IGP8Z#v5314 + $errstr = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + } elseif ($errno !== \JSON_ERROR_NONE && $errstr === null) { + // error number present, but no error message applicable + $errstr = 'Unknown error'; + } + + // abort stream if encoding fails + if ($errno !== \JSON_ERROR_NONE || $errstr !== null) { + $this->handleError(new \RuntimeException('Unable to encode JSON: ' . $errstr, $errno)); + return false; + } + } else { + // encode data with options given in ctor + $data = \json_encode($data, $this->options, $this->depth); + + // abort stream if encoding fails + if ($data === false && \json_last_error() !== \JSON_ERROR_NONE) { + $this->handleError(new \RuntimeException('Unable to encode JSON: ' . \json_last_error_msg(), \json_last_error())); + return false; + } + } + // @codeCoverageIgnoreEnd + + return $this->output->write($data . "\n"); + } + + public function end($data = null) + { + if ($data !== null) { + $this->write($data); + } + + $this->output->end(); + } + + public function isWritable() + { + return !$this->closed; + } + + public function close() + { + if ($this->closed) { + return; + } + + $this->closed = true; + $this->output->close(); + + $this->emit('close'); + $this->removeAllListeners(); + } + + /** @internal */ + public function handleDrain() + { + $this->emit('drain'); + } + + /** @internal */ + public function handleError(\Exception $error) + { + $this->emit('error', array($error)); + $this->close(); + } +} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php index 51e734a77..6d29bff66 100644 --- a/vendor/composer/InstalledVersions.php +++ b/vendor/composer/InstalledVersions.php @@ -32,6 +32,11 @@ class InstalledVersions */ private static $installed; + /** + * @var bool + */ + private static $installedIsLocalDir; + /** * @var bool|null */ @@ -309,6 +314,12 @@ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; } /** @@ -322,19 +333,27 @@ private static function getInstalled() } $installed = array(); + $copiedLocalDir = false; if (self::$canGetVendors) { + $selfDir = strtr(__DIR__, '\\', '/'); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = require $vendorDir.'/composer/installed.php'; - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = true; } } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } } } @@ -350,7 +369,7 @@ private static function getInstalled() } } - if (self::$installed !== array()) { + if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 47877ddf5..7d558af15 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -8,6 +8,8 @@ return array( 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'CURLStringFile' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', + 'Clue\\React\\NDJson\\Decoder' => $vendorDir . '/clue/ndjson-react/src/Decoder.php', + 'Clue\\React\\NDJson\\Encoder' => $vendorDir . '/clue/ndjson-react/src/Encoder.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', 'Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', @@ -42,6 +44,37 @@ 'Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', 'Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', 'Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', + 'Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/EventEmitter.php', + 'Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/EventEmitterInterface.php', + 'Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/EventEmitterTrait.php', + 'Fidry\\CpuCoreCounter\\CpuCoreCounter' => $vendorDir . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', + 'Fidry\\CpuCoreCounter\\Diagnoser' => $vendorDir . '/fidry/cpu-core-counter/src/Diagnoser.php', + 'Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', + 'Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', + 'Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', + 'Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', + 'Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => $vendorDir . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', + 'Fidry\\CpuCoreCounter\\ParallelisationResult' => $vendorDir . '/fidry/cpu-core-counter/src/ParallelisationResult.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PhpCsFixer\\AbstractDoctrineAnnotationFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php', @@ -80,11 +113,13 @@ 'PhpCsFixer\\Console\\Command\\ListFilesCommand' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Command/ListFilesCommand.php', 'PhpCsFixer\\Console\\Command\\ListSetsCommand' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php', 'PhpCsFixer\\Console\\Command\\SelfUpdateCommand' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php', + 'PhpCsFixer\\Console\\Command\\WorkerCommand' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Command/WorkerCommand.php', 'PhpCsFixer\\Console\\ConfigurationResolver' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php', 'PhpCsFixer\\Console\\Output\\ErrorOutput' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php', 'PhpCsFixer\\Console\\Output\\OutputContext' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/OutputContext.php', 'PhpCsFixer\\Console\\Output\\Progress\\DotsOutput' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/DotsOutput.php', 'PhpCsFixer\\Console\\Output\\Progress\\NullOutput' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/NullOutput.php', + 'PhpCsFixer\\Console\\Output\\Progress\\PercentageBarOutput' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/PercentageBarOutput.php', 'PhpCsFixer\\Console\\Output\\Progress\\ProgressOutputFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputFactory.php', 'PhpCsFixer\\Console\\Output\\Progress\\ProgressOutputInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputInterface.php', 'PhpCsFixer\\Console\\Output\\Progress\\ProgressOutputType' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputType.php', @@ -124,11 +159,13 @@ 'PhpCsFixer\\Doctrine\\Annotation\\Tokens' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php', 'PhpCsFixer\\Documentation\\DocumentationLocator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Documentation/DocumentationLocator.php', 'PhpCsFixer\\Documentation\\FixerDocumentGenerator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Documentation/FixerDocumentGenerator.php', - 'PhpCsFixer\\Documentation\\ListDocumentGenerator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Documentation/ListDocumentGenerator.php', 'PhpCsFixer\\Documentation\\RstUtils' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Documentation/RstUtils.php', 'PhpCsFixer\\Documentation\\RuleSetDocumentationGenerator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Documentation/RuleSetDocumentationGenerator.php', 'PhpCsFixer\\Error\\Error' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Error/Error.php', 'PhpCsFixer\\Error\\ErrorsManager' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php', + 'PhpCsFixer\\Error\\SourceExceptionFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Error/SourceExceptionFactory.php', + 'PhpCsFixer\\ExecutorWithoutErrorHandler' => $vendorDir . '/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandler.php', + 'PhpCsFixer\\ExecutorWithoutErrorHandlerException' => $vendorDir . '/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandlerException.php', 'PhpCsFixer\\FileReader' => $vendorDir . '/friendsofphp/php-cs-fixer/src/FileReader.php', 'PhpCsFixer\\FileRemoval' => $vendorDir . '/friendsofphp/php-cs-fixer/src/FileRemoval.php', 'PhpCsFixer\\Finder' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Finder.php', @@ -155,7 +192,6 @@ 'PhpCsFixer\\FixerDefinition\\VersionSpecification' => $vendorDir . '/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php', 'PhpCsFixer\\FixerDefinition\\VersionSpecificationInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php', 'PhpCsFixer\\FixerFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/src/FixerFactory.php', - 'PhpCsFixer\\FixerFileProcessedEvent' => $vendorDir . '/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php', 'PhpCsFixer\\FixerNameValidator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/FixerNameValidator.php', 'PhpCsFixer\\Fixer\\AbstractIncrementOperatorFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/AbstractIncrementOperatorFixer.php', 'PhpCsFixer\\Fixer\\AbstractPhpUnitFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php', @@ -181,6 +217,8 @@ 'PhpCsFixer\\Fixer\\ArrayNotation\\WhitespaceAfterCommaInArrayFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php', 'PhpCsFixer\\Fixer\\ArrayNotation\\YieldFromArrayToYieldsFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/YieldFromArrayToYieldsFixer.php', 'PhpCsFixer\\Fixer\\AttributeNotation\\AttributeEmptyParenthesesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/AttributeEmptyParenthesesFixer.php', + 'PhpCsFixer\\Fixer\\AttributeNotation\\GeneralAttributeRemoveFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/GeneralAttributeRemoveFixer.php', + 'PhpCsFixer\\Fixer\\AttributeNotation\\OrderedAttributesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/OrderedAttributesFixer.php', 'PhpCsFixer\\Fixer\\Basic\\BracesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php', 'PhpCsFixer\\Fixer\\Basic\\BracesPositionFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesPositionFixer.php', 'PhpCsFixer\\Fixer\\Basic\\CurlyBracesPositionFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/CurlyBracesPositionFixer.php', @@ -188,6 +226,7 @@ 'PhpCsFixer\\Fixer\\Basic\\NoMultipleStatementsPerLineFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php', 'PhpCsFixer\\Fixer\\Basic\\NoTrailingCommaInSinglelineFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoTrailingCommaInSinglelineFixer.php', 'PhpCsFixer\\Fixer\\Basic\\NonPrintableCharacterFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php', + 'PhpCsFixer\\Fixer\\Basic\\NumericLiteralSeparatorFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NumericLiteralSeparatorFixer.php', 'PhpCsFixer\\Fixer\\Basic\\OctalNotationFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/OctalNotationFixer.php', 'PhpCsFixer\\Fixer\\Basic\\PsrAutoloadingFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php', 'PhpCsFixer\\Fixer\\Basic\\SingleLineEmptyBodyFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/SingleLineEmptyBodyFixer.php', @@ -236,6 +275,7 @@ 'PhpCsFixer\\Fixer\\Comment\\SingleLineCommentSpacingFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentSpacingFixer.php', 'PhpCsFixer\\Fixer\\Comment\\SingleLineCommentStyleFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php', 'PhpCsFixer\\Fixer\\ConfigurableFixerInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php', + 'PhpCsFixer\\Fixer\\ConfigurableFixerTrait' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerTrait.php', 'PhpCsFixer\\Fixer\\ConstantNotation\\NativeConstantInvocationFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php', 'PhpCsFixer\\Fixer\\ControlStructure\\ControlStructureBracesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureBracesFixer.php', 'PhpCsFixer\\Fixer\\ControlStructure\\ControlStructureContinuationPositionFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureContinuationPositionFixer.php', @@ -262,6 +302,7 @@ 'PhpCsFixer\\Fixer\\DoctrineAnnotation\\DoctrineAnnotationBracesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php', 'PhpCsFixer\\Fixer\\DoctrineAnnotation\\DoctrineAnnotationIndentationFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php', 'PhpCsFixer\\Fixer\\DoctrineAnnotation\\DoctrineAnnotationSpacesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php', + 'PhpCsFixer\\Fixer\\ExperimentalFixerInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/ExperimentalFixerInterface.php', 'PhpCsFixer\\Fixer\\FixerInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php', 'PhpCsFixer\\Fixer\\FunctionNotation\\CombineNestedDirnameFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php', 'PhpCsFixer\\Fixer\\FunctionNotation\\DateTimeCreateFromFormatCallFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/DateTimeCreateFromFormatCallFixer.php', @@ -297,6 +338,8 @@ 'PhpCsFixer\\Fixer\\Import\\SingleImportPerStatementFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php', 'PhpCsFixer\\Fixer\\Import\\SingleLineAfterImportsFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php', 'PhpCsFixer\\Fixer\\Indentation' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Indentation.php', + 'PhpCsFixer\\Fixer\\InternalFixerInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/InternalFixerInterface.php', + 'PhpCsFixer\\Fixer\\LanguageConstruct\\ClassKeywordFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordFixer.php', 'PhpCsFixer\\Fixer\\LanguageConstruct\\ClassKeywordRemoveFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php', 'PhpCsFixer\\Fixer\\LanguageConstruct\\CombineConsecutiveIssetsFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php', 'PhpCsFixer\\Fixer\\LanguageConstruct\\CombineConsecutiveUnsetsFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php', @@ -346,7 +389,10 @@ 'PhpCsFixer\\Fixer\\PhpTag\\FullOpeningTagFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php', 'PhpCsFixer\\Fixer\\PhpTag\\LinebreakAfterOpeningTagFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php', 'PhpCsFixer\\Fixer\\PhpTag\\NoClosingTagFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php', + 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitAssertNewNamesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAssertNewNamesFixer.php', + 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitAttributesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAttributesFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitConstructFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php', + 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderMethodOrderFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderMethodOrderFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderNameFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderNameFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderReturnTypeFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderReturnTypeFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderStaticFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderStaticFixer.php', @@ -376,9 +422,11 @@ 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocAddMissingParamAnnotationFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocAlignFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocAnnotationWithoutDotFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php', + 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocArrayTypeFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocArrayTypeFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocIndentFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocInlineTagNormalizerFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocLineSpanFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php', + 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocListTypeFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocListTypeFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocNoAccessFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocNoAliasTagFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocNoEmptyReturnFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php', @@ -414,11 +462,14 @@ 'PhpCsFixer\\Fixer\\Strict\\StrictParamFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\EscapeImplicitBackslashesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\ExplicitStringVariableFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php', + 'PhpCsFixer\\Fixer\\StringNotation\\HeredocClosingMarkerFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocClosingMarkerFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\HeredocToNowdocFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php', + 'PhpCsFixer\\Fixer\\StringNotation\\MultilineStringToHeredocFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/MultilineStringToHeredocFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\NoBinaryStringFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\NoTrailingWhitespaceInStringFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoTrailingWhitespaceInStringFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\SimpleToComplexStringVariableFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\SingleQuoteFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php', + 'PhpCsFixer\\Fixer\\StringNotation\\StringImplicitBackslashesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringImplicitBackslashesFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\StringLengthToEmptyFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLengthToEmptyFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\StringLineEndingFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php', 'PhpCsFixer\\Fixer\\Whitespace\\ArrayIndentationFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php', @@ -441,6 +492,7 @@ 'PhpCsFixer\\Fixer\\Whitespace\\TypeDeclarationSpacesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypeDeclarationSpacesFixer.php', 'PhpCsFixer\\Fixer\\Whitespace\\TypesSpacesFixer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php', 'PhpCsFixer\\Fixer\\WhitespacesAwareFixerInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php', + 'PhpCsFixer\\Hasher' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Hasher.php', 'PhpCsFixer\\Indicator\\PhpUnitTestCaseIndicator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php', 'PhpCsFixer\\Linter\\CachingLinter' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php', 'PhpCsFixer\\Linter\\Linter' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Linter/Linter.php', @@ -453,12 +505,14 @@ 'PhpCsFixer\\Linter\\TokenizerLinter' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php', 'PhpCsFixer\\Linter\\TokenizerLintingResult' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php', 'PhpCsFixer\\Linter\\UnavailableLinterException' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php', + 'PhpCsFixer\\ParallelAwareConfigInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/ParallelAwareConfigInterface.php', 'PhpCsFixer\\PharChecker' => $vendorDir . '/friendsofphp/php-cs-fixer/src/PharChecker.php', 'PhpCsFixer\\PharCheckerInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php', 'PhpCsFixer\\Preg' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Preg.php', 'PhpCsFixer\\PregException' => $vendorDir . '/friendsofphp/php-cs-fixer/src/PregException.php', 'PhpCsFixer\\RuleSet\\AbstractMigrationSetDescription' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/AbstractMigrationSetDescription.php', 'PhpCsFixer\\RuleSet\\AbstractRuleSetDescription' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/AbstractRuleSetDescription.php', + 'PhpCsFixer\\RuleSet\\DeprecatedRuleSetDescriptionInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/DeprecatedRuleSetDescriptionInterface.php', 'PhpCsFixer\\RuleSet\\RuleSet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php', 'PhpCsFixer\\RuleSet\\RuleSetDescriptionInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetDescriptionInterface.php', 'PhpCsFixer\\RuleSet\\RuleSetInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php', @@ -484,7 +538,10 @@ 'PhpCsFixer\\RuleSet\\Sets\\PHP80MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHP80MigrationSet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationSet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHP81MigrationSet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP81MigrationSet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHP82MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHP82MigrationSet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationSet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHP83MigrationSet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP83MigrationSet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHP84MigrationSet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP84MigrationSet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit100MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit100MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit30MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit30MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit32MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit32MigrationRiskySet.php', @@ -500,6 +557,7 @@ 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit60MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit60MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit75MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit75MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit84MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit84MigrationRiskySet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit91MigrationRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit91MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PSR12RiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12RiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PSR12Set' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php', 'PhpCsFixer\\RuleSet\\Sets\\PSR1Set' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR1Set.php', @@ -508,16 +566,30 @@ 'PhpCsFixer\\RuleSet\\Sets\\PhpCsFixerSet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php', 'PhpCsFixer\\RuleSet\\Sets\\SymfonyRiskySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\SymfonySet' => $vendorDir . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php', - 'PhpCsFixer\\Runner\\FileCachingLintingIterator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php', + 'PhpCsFixer\\Runner\\Event\\AnalysisStarted' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Event/AnalysisStarted.php', + 'PhpCsFixer\\Runner\\Event\\FileProcessed' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Event/FileProcessed.php', + 'PhpCsFixer\\Runner\\FileCachingLintingFileIterator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingFileIterator.php', 'PhpCsFixer\\Runner\\FileFilterIterator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php', - 'PhpCsFixer\\Runner\\FileLintingIterator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php', + 'PhpCsFixer\\Runner\\LintingFileIterator' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/LintingFileIterator.php', + 'PhpCsFixer\\Runner\\LintingResultAwareFileIteratorInterface' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/LintingResultAwareFileIteratorInterface.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelAction' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelAction.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelConfig' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfig.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelConfigFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfigFactory.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelisationException' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelisationException.php', + 'PhpCsFixer\\Runner\\Parallel\\Process' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/Process.php', + 'PhpCsFixer\\Runner\\Parallel\\ProcessFactory' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessFactory.php', + 'PhpCsFixer\\Runner\\Parallel\\ProcessIdentifier' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessIdentifier.php', + 'PhpCsFixer\\Runner\\Parallel\\ProcessPool' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessPool.php', + 'PhpCsFixer\\Runner\\Parallel\\WorkerException' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/WorkerException.php', 'PhpCsFixer\\Runner\\Runner' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/Runner.php', + 'PhpCsFixer\\Runner\\RunnerConfig' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Runner/RunnerConfig.php', 'PhpCsFixer\\StdinFileInfo' => $vendorDir . '/friendsofphp/php-cs-fixer/src/StdinFileInfo.php', 'PhpCsFixer\\Tokenizer\\AbstractTransformer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php', 'PhpCsFixer\\Tokenizer\\AbstractTypeTransformer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTypeTransformer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\AlternativeSyntaxAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AlternativeSyntaxAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\AbstractControlCaseStructuresAnalysis' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AbstractControlCaseStructuresAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\ArgumentAnalysis' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php', + 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\AttributeAnalysis' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AttributeAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\CaseAnalysis' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\DataProviderAnalysis' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DataProviderAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\DefaultAnalysis' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DefaultAnalysis.php', @@ -535,15 +607,17 @@ 'PhpCsFixer\\Tokenizer\\Analyzer\\CommentsAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\ControlCaseStructuresAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ControlCaseStructuresAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\DataProviderAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/DataProviderAnalyzer.php', + 'PhpCsFixer\\Tokenizer\\Analyzer\\FullyQualifiedNameAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FullyQualifiedNameAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\FunctionsAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\GotoLabelAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/GotoLabelAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\NamespaceUsesAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\NamespacesAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\RangeAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/RangeAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\ReferenceAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ReferenceAnalyzer.php', + 'PhpCsFixer\\Tokenizer\\Analyzer\\SwitchAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\WhitespacesAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/WhitespacesAnalyzer.php', 'PhpCsFixer\\Tokenizer\\CT' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php', - 'PhpCsFixer\\Tokenizer\\CodeHasher' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php', + 'PhpCsFixer\\Tokenizer\\Processor\\ImportProcessor' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Processor/ImportProcessor.php', 'PhpCsFixer\\Tokenizer\\Token' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php', 'PhpCsFixer\\Tokenizer\\Tokens' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php', 'PhpCsFixer\\Tokenizer\\TokensAnalyzer' => $vendorDir . '/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php', @@ -592,6 +666,85 @@ 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', + 'React\\Cache\\ArrayCache' => $vendorDir . '/react/cache/src/ArrayCache.php', + 'React\\Cache\\CacheInterface' => $vendorDir . '/react/cache/src/CacheInterface.php', + 'React\\ChildProcess\\Process' => $vendorDir . '/react/child-process/src/Process.php', + 'React\\Dns\\BadServerException' => $vendorDir . '/react/dns/src/BadServerException.php', + 'React\\Dns\\Config\\Config' => $vendorDir . '/react/dns/src/Config/Config.php', + 'React\\Dns\\Config\\HostsFile' => $vendorDir . '/react/dns/src/Config/HostsFile.php', + 'React\\Dns\\Model\\Message' => $vendorDir . '/react/dns/src/Model/Message.php', + 'React\\Dns\\Model\\Record' => $vendorDir . '/react/dns/src/Model/Record.php', + 'React\\Dns\\Protocol\\BinaryDumper' => $vendorDir . '/react/dns/src/Protocol/BinaryDumper.php', + 'React\\Dns\\Protocol\\Parser' => $vendorDir . '/react/dns/src/Protocol/Parser.php', + 'React\\Dns\\Query\\CachingExecutor' => $vendorDir . '/react/dns/src/Query/CachingExecutor.php', + 'React\\Dns\\Query\\CancellationException' => $vendorDir . '/react/dns/src/Query/CancellationException.php', + 'React\\Dns\\Query\\CoopExecutor' => $vendorDir . '/react/dns/src/Query/CoopExecutor.php', + 'React\\Dns\\Query\\ExecutorInterface' => $vendorDir . '/react/dns/src/Query/ExecutorInterface.php', + 'React\\Dns\\Query\\FallbackExecutor' => $vendorDir . '/react/dns/src/Query/FallbackExecutor.php', + 'React\\Dns\\Query\\HostsFileExecutor' => $vendorDir . '/react/dns/src/Query/HostsFileExecutor.php', + 'React\\Dns\\Query\\Query' => $vendorDir . '/react/dns/src/Query/Query.php', + 'React\\Dns\\Query\\RetryExecutor' => $vendorDir . '/react/dns/src/Query/RetryExecutor.php', + 'React\\Dns\\Query\\SelectiveTransportExecutor' => $vendorDir . '/react/dns/src/Query/SelectiveTransportExecutor.php', + 'React\\Dns\\Query\\TcpTransportExecutor' => $vendorDir . '/react/dns/src/Query/TcpTransportExecutor.php', + 'React\\Dns\\Query\\TimeoutException' => $vendorDir . '/react/dns/src/Query/TimeoutException.php', + 'React\\Dns\\Query\\TimeoutExecutor' => $vendorDir . '/react/dns/src/Query/TimeoutExecutor.php', + 'React\\Dns\\Query\\UdpTransportExecutor' => $vendorDir . '/react/dns/src/Query/UdpTransportExecutor.php', + 'React\\Dns\\RecordNotFoundException' => $vendorDir . '/react/dns/src/RecordNotFoundException.php', + 'React\\Dns\\Resolver\\Factory' => $vendorDir . '/react/dns/src/Resolver/Factory.php', + 'React\\Dns\\Resolver\\Resolver' => $vendorDir . '/react/dns/src/Resolver/Resolver.php', + 'React\\Dns\\Resolver\\ResolverInterface' => $vendorDir . '/react/dns/src/Resolver/ResolverInterface.php', + 'React\\EventLoop\\ExtEvLoop' => $vendorDir . '/react/event-loop/src/ExtEvLoop.php', + 'React\\EventLoop\\ExtEventLoop' => $vendorDir . '/react/event-loop/src/ExtEventLoop.php', + 'React\\EventLoop\\ExtLibevLoop' => $vendorDir . '/react/event-loop/src/ExtLibevLoop.php', + 'React\\EventLoop\\ExtLibeventLoop' => $vendorDir . '/react/event-loop/src/ExtLibeventLoop.php', + 'React\\EventLoop\\ExtUvLoop' => $vendorDir . '/react/event-loop/src/ExtUvLoop.php', + 'React\\EventLoop\\Factory' => $vendorDir . '/react/event-loop/src/Factory.php', + 'React\\EventLoop\\Loop' => $vendorDir . '/react/event-loop/src/Loop.php', + 'React\\EventLoop\\LoopInterface' => $vendorDir . '/react/event-loop/src/LoopInterface.php', + 'React\\EventLoop\\SignalsHandler' => $vendorDir . '/react/event-loop/src/SignalsHandler.php', + 'React\\EventLoop\\StreamSelectLoop' => $vendorDir . '/react/event-loop/src/StreamSelectLoop.php', + 'React\\EventLoop\\Tick\\FutureTickQueue' => $vendorDir . '/react/event-loop/src/Tick/FutureTickQueue.php', + 'React\\EventLoop\\TimerInterface' => $vendorDir . '/react/event-loop/src/TimerInterface.php', + 'React\\EventLoop\\Timer\\Timer' => $vendorDir . '/react/event-loop/src/Timer/Timer.php', + 'React\\EventLoop\\Timer\\Timers' => $vendorDir . '/react/event-loop/src/Timer/Timers.php', + 'React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php', + 'React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php', + 'React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php', + 'React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php', + 'React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php', + 'React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php', + 'React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php', + 'React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php', + 'React\\Socket\\Connection' => $vendorDir . '/react/socket/src/Connection.php', + 'React\\Socket\\ConnectionInterface' => $vendorDir . '/react/socket/src/ConnectionInterface.php', + 'React\\Socket\\Connector' => $vendorDir . '/react/socket/src/Connector.php', + 'React\\Socket\\ConnectorInterface' => $vendorDir . '/react/socket/src/ConnectorInterface.php', + 'React\\Socket\\DnsConnector' => $vendorDir . '/react/socket/src/DnsConnector.php', + 'React\\Socket\\FdServer' => $vendorDir . '/react/socket/src/FdServer.php', + 'React\\Socket\\FixedUriConnector' => $vendorDir . '/react/socket/src/FixedUriConnector.php', + 'React\\Socket\\HappyEyeBallsConnectionBuilder' => $vendorDir . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', + 'React\\Socket\\HappyEyeBallsConnector' => $vendorDir . '/react/socket/src/HappyEyeBallsConnector.php', + 'React\\Socket\\LimitingServer' => $vendorDir . '/react/socket/src/LimitingServer.php', + 'React\\Socket\\SecureConnector' => $vendorDir . '/react/socket/src/SecureConnector.php', + 'React\\Socket\\SecureServer' => $vendorDir . '/react/socket/src/SecureServer.php', + 'React\\Socket\\Server' => $vendorDir . '/react/socket/src/Server.php', + 'React\\Socket\\ServerInterface' => $vendorDir . '/react/socket/src/ServerInterface.php', + 'React\\Socket\\SocketServer' => $vendorDir . '/react/socket/src/SocketServer.php', + 'React\\Socket\\StreamEncryption' => $vendorDir . '/react/socket/src/StreamEncryption.php', + 'React\\Socket\\TcpConnector' => $vendorDir . '/react/socket/src/TcpConnector.php', + 'React\\Socket\\TcpServer' => $vendorDir . '/react/socket/src/TcpServer.php', + 'React\\Socket\\TimeoutConnector' => $vendorDir . '/react/socket/src/TimeoutConnector.php', + 'React\\Socket\\UnixConnector' => $vendorDir . '/react/socket/src/UnixConnector.php', + 'React\\Socket\\UnixServer' => $vendorDir . '/react/socket/src/UnixServer.php', + 'React\\Stream\\CompositeStream' => $vendorDir . '/react/stream/src/CompositeStream.php', + 'React\\Stream\\DuplexResourceStream' => $vendorDir . '/react/stream/src/DuplexResourceStream.php', + 'React\\Stream\\DuplexStreamInterface' => $vendorDir . '/react/stream/src/DuplexStreamInterface.php', + 'React\\Stream\\ReadableResourceStream' => $vendorDir . '/react/stream/src/ReadableResourceStream.php', + 'React\\Stream\\ReadableStreamInterface' => $vendorDir . '/react/stream/src/ReadableStreamInterface.php', + 'React\\Stream\\ThroughStream' => $vendorDir . '/react/stream/src/ThroughStream.php', + 'React\\Stream\\Util' => $vendorDir . '/react/stream/src/Util.php', + 'React\\Stream\\WritableResourceStream' => $vendorDir . '/react/stream/src/WritableResourceStream.php', + 'React\\Stream\\WritableStreamInterface' => $vendorDir . '/react/stream/src/WritableStreamInterface.php', 'Redaxo\\PhpCsFixerConfig\\Config' => $vendorDir . '/redaxo/php-cs-fixer-config/src/Config.php', 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index ad2deb46c..1c57731e6 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -8,6 +8,7 @@ return array( 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', + 'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 76f42455d..3021551d8 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -24,11 +24,21 @@ 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), 'Redaxo\\PhpCsFixerConfig\\' => array($vendorDir . '/redaxo/php-cs-fixer-config/src'), + 'React\\Stream\\' => array($vendorDir . '/react/stream/src'), + 'React\\Socket\\' => array($vendorDir . '/react/socket/src'), + 'React\\Promise\\' => array($vendorDir . '/react/promise/src'), + 'React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'), + 'React\\Dns\\' => array($vendorDir . '/react/dns/src'), + 'React\\ChildProcess\\' => array($vendorDir . '/react/child-process/src'), + 'React\\Cache\\' => array($vendorDir . '/react/cache/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'PhpCsFixer\\' => array($vendorDir . '/friendsofphp/php-cs-fixer/src'), + 'Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), + 'Evenement\\' => array($vendorDir . '/evenement/evenement/src'), 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), 'Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), + 'Clue\\React\\NDJson\\' => array($vendorDir . '/clue/ndjson-react/src'), ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 880392e1b..6868a9da8 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -9,6 +9,7 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 public static $files = array ( 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', @@ -44,6 +45,13 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'R' => array ( 'Redaxo\\PhpCsFixerConfig\\' => 24, + 'React\\Stream\\' => 13, + 'React\\Socket\\' => 13, + 'React\\Promise\\' => 14, + 'React\\EventLoop\\' => 16, + 'React\\Dns\\' => 10, + 'React\\ChildProcess\\' => 19, + 'React\\Cache\\' => 12, ), 'P' => array ( @@ -52,11 +60,20 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'Psr\\Container\\' => 14, 'PhpCsFixer\\' => 11, ), + 'F' => + array ( + 'Fidry\\CpuCoreCounter\\' => 21, + ), + 'E' => + array ( + 'Evenement\\' => 10, + ), 'C' => array ( 'Composer\\XdebugHandler\\' => 23, 'Composer\\Semver\\' => 16, 'Composer\\Pcre\\' => 14, + 'Clue\\React\\NDJson\\' => 18, ), ); @@ -133,6 +150,34 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 array ( 0 => __DIR__ . '/..' . '/redaxo/php-cs-fixer-config/src', ), + 'React\\Stream\\' => + array ( + 0 => __DIR__ . '/..' . '/react/stream/src', + ), + 'React\\Socket\\' => + array ( + 0 => __DIR__ . '/..' . '/react/socket/src', + ), + 'React\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/react/promise/src', + ), + 'React\\EventLoop\\' => + array ( + 0 => __DIR__ . '/..' . '/react/event-loop/src', + ), + 'React\\Dns\\' => + array ( + 0 => __DIR__ . '/..' . '/react/dns/src', + ), + 'React\\ChildProcess\\' => + array ( + 0 => __DIR__ . '/..' . '/react/child-process/src', + ), + 'React\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/react/cache/src', + ), 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', @@ -149,6 +194,14 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 array ( 0 => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src', ), + 'Fidry\\CpuCoreCounter\\' => + array ( + 0 => __DIR__ . '/..' . '/fidry/cpu-core-counter/src', + ), + 'Evenement\\' => + array ( + 0 => __DIR__ . '/..' . '/evenement/evenement/src', + ), 'Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', @@ -161,11 +214,17 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), + 'Clue\\React\\NDJson\\' => + array ( + 0 => __DIR__ . '/..' . '/clue/ndjson-react/src', + ), ); public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'CURLStringFile' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', + 'Clue\\React\\NDJson\\Decoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Decoder.php', + 'Clue\\React\\NDJson\\Encoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Encoder.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', 'Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', @@ -200,6 +259,37 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', 'Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', 'Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', + 'Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitter.php', + 'Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterInterface.php', + 'Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterTrait.php', + 'Fidry\\CpuCoreCounter\\CpuCoreCounter' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', + 'Fidry\\CpuCoreCounter\\Diagnoser' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Diagnoser.php', + 'Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', + 'Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', + 'Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', + 'Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', + 'Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', + 'Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', + 'Fidry\\CpuCoreCounter\\ParallelisationResult' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/ParallelisationResult.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PhpCsFixer\\AbstractDoctrineAnnotationFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php', @@ -238,11 +328,13 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Console\\Command\\ListFilesCommand' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Command/ListFilesCommand.php', 'PhpCsFixer\\Console\\Command\\ListSetsCommand' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php', 'PhpCsFixer\\Console\\Command\\SelfUpdateCommand' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php', + 'PhpCsFixer\\Console\\Command\\WorkerCommand' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Command/WorkerCommand.php', 'PhpCsFixer\\Console\\ConfigurationResolver' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php', 'PhpCsFixer\\Console\\Output\\ErrorOutput' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php', 'PhpCsFixer\\Console\\Output\\OutputContext' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/OutputContext.php', 'PhpCsFixer\\Console\\Output\\Progress\\DotsOutput' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/DotsOutput.php', 'PhpCsFixer\\Console\\Output\\Progress\\NullOutput' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/NullOutput.php', + 'PhpCsFixer\\Console\\Output\\Progress\\PercentageBarOutput' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/PercentageBarOutput.php', 'PhpCsFixer\\Console\\Output\\Progress\\ProgressOutputFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputFactory.php', 'PhpCsFixer\\Console\\Output\\Progress\\ProgressOutputInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputInterface.php', 'PhpCsFixer\\Console\\Output\\Progress\\ProgressOutputType' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputType.php', @@ -282,11 +374,13 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Doctrine\\Annotation\\Tokens' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php', 'PhpCsFixer\\Documentation\\DocumentationLocator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Documentation/DocumentationLocator.php', 'PhpCsFixer\\Documentation\\FixerDocumentGenerator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Documentation/FixerDocumentGenerator.php', - 'PhpCsFixer\\Documentation\\ListDocumentGenerator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Documentation/ListDocumentGenerator.php', 'PhpCsFixer\\Documentation\\RstUtils' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Documentation/RstUtils.php', 'PhpCsFixer\\Documentation\\RuleSetDocumentationGenerator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Documentation/RuleSetDocumentationGenerator.php', 'PhpCsFixer\\Error\\Error' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Error/Error.php', 'PhpCsFixer\\Error\\ErrorsManager' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php', + 'PhpCsFixer\\Error\\SourceExceptionFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Error/SourceExceptionFactory.php', + 'PhpCsFixer\\ExecutorWithoutErrorHandler' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandler.php', + 'PhpCsFixer\\ExecutorWithoutErrorHandlerException' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandlerException.php', 'PhpCsFixer\\FileReader' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/FileReader.php', 'PhpCsFixer\\FileRemoval' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/FileRemoval.php', 'PhpCsFixer\\Finder' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Finder.php', @@ -313,7 +407,6 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\FixerDefinition\\VersionSpecification' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php', 'PhpCsFixer\\FixerDefinition\\VersionSpecificationInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificationInterface.php', 'PhpCsFixer\\FixerFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/FixerFactory.php', - 'PhpCsFixer\\FixerFileProcessedEvent' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php', 'PhpCsFixer\\FixerNameValidator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/FixerNameValidator.php', 'PhpCsFixer\\Fixer\\AbstractIncrementOperatorFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/AbstractIncrementOperatorFixer.php', 'PhpCsFixer\\Fixer\\AbstractPhpUnitFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php', @@ -339,6 +432,8 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\ArrayNotation\\WhitespaceAfterCommaInArrayFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/WhitespaceAfterCommaInArrayFixer.php', 'PhpCsFixer\\Fixer\\ArrayNotation\\YieldFromArrayToYieldsFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/YieldFromArrayToYieldsFixer.php', 'PhpCsFixer\\Fixer\\AttributeNotation\\AttributeEmptyParenthesesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/AttributeEmptyParenthesesFixer.php', + 'PhpCsFixer\\Fixer\\AttributeNotation\\GeneralAttributeRemoveFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/GeneralAttributeRemoveFixer.php', + 'PhpCsFixer\\Fixer\\AttributeNotation\\OrderedAttributesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/OrderedAttributesFixer.php', 'PhpCsFixer\\Fixer\\Basic\\BracesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php', 'PhpCsFixer\\Fixer\\Basic\\BracesPositionFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesPositionFixer.php', 'PhpCsFixer\\Fixer\\Basic\\CurlyBracesPositionFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/CurlyBracesPositionFixer.php', @@ -346,6 +441,7 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\Basic\\NoMultipleStatementsPerLineFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php', 'PhpCsFixer\\Fixer\\Basic\\NoTrailingCommaInSinglelineFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoTrailingCommaInSinglelineFixer.php', 'PhpCsFixer\\Fixer\\Basic\\NonPrintableCharacterFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php', + 'PhpCsFixer\\Fixer\\Basic\\NumericLiteralSeparatorFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/NumericLiteralSeparatorFixer.php', 'PhpCsFixer\\Fixer\\Basic\\OctalNotationFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/OctalNotationFixer.php', 'PhpCsFixer\\Fixer\\Basic\\PsrAutoloadingFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php', 'PhpCsFixer\\Fixer\\Basic\\SingleLineEmptyBodyFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Basic/SingleLineEmptyBodyFixer.php', @@ -394,6 +490,7 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\Comment\\SingleLineCommentSpacingFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentSpacingFixer.php', 'PhpCsFixer\\Fixer\\Comment\\SingleLineCommentStyleFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php', 'PhpCsFixer\\Fixer\\ConfigurableFixerInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php', + 'PhpCsFixer\\Fixer\\ConfigurableFixerTrait' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerTrait.php', 'PhpCsFixer\\Fixer\\ConstantNotation\\NativeConstantInvocationFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php', 'PhpCsFixer\\Fixer\\ControlStructure\\ControlStructureBracesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureBracesFixer.php', 'PhpCsFixer\\Fixer\\ControlStructure\\ControlStructureContinuationPositionFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureContinuationPositionFixer.php', @@ -420,6 +517,7 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\DoctrineAnnotation\\DoctrineAnnotationBracesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php', 'PhpCsFixer\\Fixer\\DoctrineAnnotation\\DoctrineAnnotationIndentationFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php', 'PhpCsFixer\\Fixer\\DoctrineAnnotation\\DoctrineAnnotationSpacesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php', + 'PhpCsFixer\\Fixer\\ExperimentalFixerInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/ExperimentalFixerInterface.php', 'PhpCsFixer\\Fixer\\FixerInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/FixerInterface.php', 'PhpCsFixer\\Fixer\\FunctionNotation\\CombineNestedDirnameFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php', 'PhpCsFixer\\Fixer\\FunctionNotation\\DateTimeCreateFromFormatCallFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/DateTimeCreateFromFormatCallFixer.php', @@ -455,6 +553,8 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\Import\\SingleImportPerStatementFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php', 'PhpCsFixer\\Fixer\\Import\\SingleLineAfterImportsFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleLineAfterImportsFixer.php', 'PhpCsFixer\\Fixer\\Indentation' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Indentation.php', + 'PhpCsFixer\\Fixer\\InternalFixerInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/InternalFixerInterface.php', + 'PhpCsFixer\\Fixer\\LanguageConstruct\\ClassKeywordFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordFixer.php', 'PhpCsFixer\\Fixer\\LanguageConstruct\\ClassKeywordRemoveFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php', 'PhpCsFixer\\Fixer\\LanguageConstruct\\CombineConsecutiveIssetsFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php', 'PhpCsFixer\\Fixer\\LanguageConstruct\\CombineConsecutiveUnsetsFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php', @@ -504,7 +604,10 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\PhpTag\\FullOpeningTagFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php', 'PhpCsFixer\\Fixer\\PhpTag\\LinebreakAfterOpeningTagFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/LinebreakAfterOpeningTagFixer.php', 'PhpCsFixer\\Fixer\\PhpTag\\NoClosingTagFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php', + 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitAssertNewNamesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAssertNewNamesFixer.php', + 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitAttributesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAttributesFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitConstructFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php', + 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderMethodOrderFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderMethodOrderFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderNameFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderNameFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderReturnTypeFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderReturnTypeFixer.php', 'PhpCsFixer\\Fixer\\PhpUnit\\PhpUnitDataProviderStaticFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderStaticFixer.php', @@ -534,9 +637,11 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocAddMissingParamAnnotationFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocAlignFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocAnnotationWithoutDotFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php', + 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocArrayTypeFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocArrayTypeFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocIndentFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocInlineTagNormalizerFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocLineSpanFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php', + 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocListTypeFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocListTypeFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocNoAccessFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocNoAliasTagFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php', 'PhpCsFixer\\Fixer\\Phpdoc\\PhpdocNoEmptyReturnFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php', @@ -572,11 +677,14 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\Strict\\StrictParamFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\EscapeImplicitBackslashesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\ExplicitStringVariableFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php', + 'PhpCsFixer\\Fixer\\StringNotation\\HeredocClosingMarkerFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocClosingMarkerFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\HeredocToNowdocFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php', + 'PhpCsFixer\\Fixer\\StringNotation\\MultilineStringToHeredocFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/MultilineStringToHeredocFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\NoBinaryStringFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoBinaryStringFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\NoTrailingWhitespaceInStringFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/NoTrailingWhitespaceInStringFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\SimpleToComplexStringVariableFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\SingleQuoteFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php', + 'PhpCsFixer\\Fixer\\StringNotation\\StringImplicitBackslashesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringImplicitBackslashesFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\StringLengthToEmptyFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLengthToEmptyFixer.php', 'PhpCsFixer\\Fixer\\StringNotation\\StringLineEndingFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/StringLineEndingFixer.php', 'PhpCsFixer\\Fixer\\Whitespace\\ArrayIndentationFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/ArrayIndentationFixer.php', @@ -599,6 +707,7 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Fixer\\Whitespace\\TypeDeclarationSpacesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypeDeclarationSpacesFixer.php', 'PhpCsFixer\\Fixer\\Whitespace\\TypesSpacesFixer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php', 'PhpCsFixer\\Fixer\\WhitespacesAwareFixerInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Fixer/WhitespacesAwareFixerInterface.php', + 'PhpCsFixer\\Hasher' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Hasher.php', 'PhpCsFixer\\Indicator\\PhpUnitTestCaseIndicator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php', 'PhpCsFixer\\Linter\\CachingLinter' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php', 'PhpCsFixer\\Linter\\Linter' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Linter/Linter.php', @@ -611,12 +720,14 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Linter\\TokenizerLinter' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php', 'PhpCsFixer\\Linter\\TokenizerLintingResult' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php', 'PhpCsFixer\\Linter\\UnavailableLinterException' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Linter/UnavailableLinterException.php', + 'PhpCsFixer\\ParallelAwareConfigInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/ParallelAwareConfigInterface.php', 'PhpCsFixer\\PharChecker' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/PharChecker.php', 'PhpCsFixer\\PharCheckerInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/PharCheckerInterface.php', 'PhpCsFixer\\Preg' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Preg.php', 'PhpCsFixer\\PregException' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/PregException.php', 'PhpCsFixer\\RuleSet\\AbstractMigrationSetDescription' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/AbstractMigrationSetDescription.php', 'PhpCsFixer\\RuleSet\\AbstractRuleSetDescription' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/AbstractRuleSetDescription.php', + 'PhpCsFixer\\RuleSet\\DeprecatedRuleSetDescriptionInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/DeprecatedRuleSetDescriptionInterface.php', 'PhpCsFixer\\RuleSet\\RuleSet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php', 'PhpCsFixer\\RuleSet\\RuleSetDescriptionInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetDescriptionInterface.php', 'PhpCsFixer\\RuleSet\\RuleSetInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php', @@ -642,7 +753,10 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\RuleSet\\Sets\\PHP80MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHP80MigrationSet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP80MigrationSet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHP81MigrationSet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP81MigrationSet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHP82MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHP82MigrationSet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationSet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHP83MigrationSet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP83MigrationSet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHP84MigrationSet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP84MigrationSet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit100MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit100MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit30MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit30MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit32MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit32MigrationRiskySet.php', @@ -658,6 +772,7 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit60MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit60MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit75MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit75MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit84MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit84MigrationRiskySet.php', + 'PhpCsFixer\\RuleSet\\Sets\\PHPUnit91MigrationRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit91MigrationRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PSR12RiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12RiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\PSR12Set' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php', 'PhpCsFixer\\RuleSet\\Sets\\PSR1Set' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR1Set.php', @@ -666,16 +781,30 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\RuleSet\\Sets\\PhpCsFixerSet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php', 'PhpCsFixer\\RuleSet\\Sets\\SymfonyRiskySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php', 'PhpCsFixer\\RuleSet\\Sets\\SymfonySet' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php', - 'PhpCsFixer\\Runner\\FileCachingLintingIterator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php', + 'PhpCsFixer\\Runner\\Event\\AnalysisStarted' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Event/AnalysisStarted.php', + 'PhpCsFixer\\Runner\\Event\\FileProcessed' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Event/FileProcessed.php', + 'PhpCsFixer\\Runner\\FileCachingLintingFileIterator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingFileIterator.php', 'PhpCsFixer\\Runner\\FileFilterIterator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php', - 'PhpCsFixer\\Runner\\FileLintingIterator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php', + 'PhpCsFixer\\Runner\\LintingFileIterator' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/LintingFileIterator.php', + 'PhpCsFixer\\Runner\\LintingResultAwareFileIteratorInterface' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/LintingResultAwareFileIteratorInterface.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelAction' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelAction.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelConfig' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfig.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelConfigFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfigFactory.php', + 'PhpCsFixer\\Runner\\Parallel\\ParallelisationException' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelisationException.php', + 'PhpCsFixer\\Runner\\Parallel\\Process' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/Process.php', + 'PhpCsFixer\\Runner\\Parallel\\ProcessFactory' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessFactory.php', + 'PhpCsFixer\\Runner\\Parallel\\ProcessIdentifier' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessIdentifier.php', + 'PhpCsFixer\\Runner\\Parallel\\ProcessPool' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessPool.php', + 'PhpCsFixer\\Runner\\Parallel\\WorkerException' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Parallel/WorkerException.php', 'PhpCsFixer\\Runner\\Runner' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/Runner.php', + 'PhpCsFixer\\Runner\\RunnerConfig' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Runner/RunnerConfig.php', 'PhpCsFixer\\StdinFileInfo' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/StdinFileInfo.php', 'PhpCsFixer\\Tokenizer\\AbstractTransformer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTransformer.php', 'PhpCsFixer\\Tokenizer\\AbstractTypeTransformer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/AbstractTypeTransformer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\AlternativeSyntaxAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AlternativeSyntaxAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\AbstractControlCaseStructuresAnalysis' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AbstractControlCaseStructuresAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\ArgumentAnalysis' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php', + 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\AttributeAnalysis' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AttributeAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\CaseAnalysis' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\DataProviderAnalysis' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DataProviderAnalysis.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\DefaultAnalysis' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DefaultAnalysis.php', @@ -693,15 +822,17 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'PhpCsFixer\\Tokenizer\\Analyzer\\CommentsAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\ControlCaseStructuresAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ControlCaseStructuresAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\DataProviderAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/DataProviderAnalyzer.php', + 'PhpCsFixer\\Tokenizer\\Analyzer\\FullyQualifiedNameAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FullyQualifiedNameAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\FunctionsAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\GotoLabelAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/GotoLabelAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\NamespaceUsesAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\NamespacesAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\RangeAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/RangeAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\ReferenceAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ReferenceAnalyzer.php', + 'PhpCsFixer\\Tokenizer\\Analyzer\\SwitchAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php', 'PhpCsFixer\\Tokenizer\\Analyzer\\WhitespacesAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/WhitespacesAnalyzer.php', 'PhpCsFixer\\Tokenizer\\CT' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php', - 'PhpCsFixer\\Tokenizer\\CodeHasher' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php', + 'PhpCsFixer\\Tokenizer\\Processor\\ImportProcessor' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Processor/ImportProcessor.php', 'PhpCsFixer\\Tokenizer\\Token' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php', 'PhpCsFixer\\Tokenizer\\Tokens' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php', 'PhpCsFixer\\Tokenizer\\TokensAnalyzer' => __DIR__ . '/..' . '/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php', @@ -750,6 +881,85 @@ class ComposerStaticInit432d9322d3d4193d52e9a1d1ec2ff418 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', + 'React\\Cache\\ArrayCache' => __DIR__ . '/..' . '/react/cache/src/ArrayCache.php', + 'React\\Cache\\CacheInterface' => __DIR__ . '/..' . '/react/cache/src/CacheInterface.php', + 'React\\ChildProcess\\Process' => __DIR__ . '/..' . '/react/child-process/src/Process.php', + 'React\\Dns\\BadServerException' => __DIR__ . '/..' . '/react/dns/src/BadServerException.php', + 'React\\Dns\\Config\\Config' => __DIR__ . '/..' . '/react/dns/src/Config/Config.php', + 'React\\Dns\\Config\\HostsFile' => __DIR__ . '/..' . '/react/dns/src/Config/HostsFile.php', + 'React\\Dns\\Model\\Message' => __DIR__ . '/..' . '/react/dns/src/Model/Message.php', + 'React\\Dns\\Model\\Record' => __DIR__ . '/..' . '/react/dns/src/Model/Record.php', + 'React\\Dns\\Protocol\\BinaryDumper' => __DIR__ . '/..' . '/react/dns/src/Protocol/BinaryDumper.php', + 'React\\Dns\\Protocol\\Parser' => __DIR__ . '/..' . '/react/dns/src/Protocol/Parser.php', + 'React\\Dns\\Query\\CachingExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CachingExecutor.php', + 'React\\Dns\\Query\\CancellationException' => __DIR__ . '/..' . '/react/dns/src/Query/CancellationException.php', + 'React\\Dns\\Query\\CoopExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CoopExecutor.php', + 'React\\Dns\\Query\\ExecutorInterface' => __DIR__ . '/..' . '/react/dns/src/Query/ExecutorInterface.php', + 'React\\Dns\\Query\\FallbackExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/FallbackExecutor.php', + 'React\\Dns\\Query\\HostsFileExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/HostsFileExecutor.php', + 'React\\Dns\\Query\\Query' => __DIR__ . '/..' . '/react/dns/src/Query/Query.php', + 'React\\Dns\\Query\\RetryExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/RetryExecutor.php', + 'React\\Dns\\Query\\SelectiveTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/SelectiveTransportExecutor.php', + 'React\\Dns\\Query\\TcpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TcpTransportExecutor.php', + 'React\\Dns\\Query\\TimeoutException' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutException.php', + 'React\\Dns\\Query\\TimeoutExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutExecutor.php', + 'React\\Dns\\Query\\UdpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/UdpTransportExecutor.php', + 'React\\Dns\\RecordNotFoundException' => __DIR__ . '/..' . '/react/dns/src/RecordNotFoundException.php', + 'React\\Dns\\Resolver\\Factory' => __DIR__ . '/..' . '/react/dns/src/Resolver/Factory.php', + 'React\\Dns\\Resolver\\Resolver' => __DIR__ . '/..' . '/react/dns/src/Resolver/Resolver.php', + 'React\\Dns\\Resolver\\ResolverInterface' => __DIR__ . '/..' . '/react/dns/src/Resolver/ResolverInterface.php', + 'React\\EventLoop\\ExtEvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEvLoop.php', + 'React\\EventLoop\\ExtEventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEventLoop.php', + 'React\\EventLoop\\ExtLibevLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibevLoop.php', + 'React\\EventLoop\\ExtLibeventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibeventLoop.php', + 'React\\EventLoop\\ExtUvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtUvLoop.php', + 'React\\EventLoop\\Factory' => __DIR__ . '/..' . '/react/event-loop/src/Factory.php', + 'React\\EventLoop\\Loop' => __DIR__ . '/..' . '/react/event-loop/src/Loop.php', + 'React\\EventLoop\\LoopInterface' => __DIR__ . '/..' . '/react/event-loop/src/LoopInterface.php', + 'React\\EventLoop\\SignalsHandler' => __DIR__ . '/..' . '/react/event-loop/src/SignalsHandler.php', + 'React\\EventLoop\\StreamSelectLoop' => __DIR__ . '/..' . '/react/event-loop/src/StreamSelectLoop.php', + 'React\\EventLoop\\Tick\\FutureTickQueue' => __DIR__ . '/..' . '/react/event-loop/src/Tick/FutureTickQueue.php', + 'React\\EventLoop\\TimerInterface' => __DIR__ . '/..' . '/react/event-loop/src/TimerInterface.php', + 'React\\EventLoop\\Timer\\Timer' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timer.php', + 'React\\EventLoop\\Timer\\Timers' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timers.php', + 'React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php', + 'React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php', + 'React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php', + 'React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php', + 'React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php', + 'React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php', + 'React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php', + 'React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php', + 'React\\Socket\\Connection' => __DIR__ . '/..' . '/react/socket/src/Connection.php', + 'React\\Socket\\ConnectionInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectionInterface.php', + 'React\\Socket\\Connector' => __DIR__ . '/..' . '/react/socket/src/Connector.php', + 'React\\Socket\\ConnectorInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectorInterface.php', + 'React\\Socket\\DnsConnector' => __DIR__ . '/..' . '/react/socket/src/DnsConnector.php', + 'React\\Socket\\FdServer' => __DIR__ . '/..' . '/react/socket/src/FdServer.php', + 'React\\Socket\\FixedUriConnector' => __DIR__ . '/..' . '/react/socket/src/FixedUriConnector.php', + 'React\\Socket\\HappyEyeBallsConnectionBuilder' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', + 'React\\Socket\\HappyEyeBallsConnector' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnector.php', + 'React\\Socket\\LimitingServer' => __DIR__ . '/..' . '/react/socket/src/LimitingServer.php', + 'React\\Socket\\SecureConnector' => __DIR__ . '/..' . '/react/socket/src/SecureConnector.php', + 'React\\Socket\\SecureServer' => __DIR__ . '/..' . '/react/socket/src/SecureServer.php', + 'React\\Socket\\Server' => __DIR__ . '/..' . '/react/socket/src/Server.php', + 'React\\Socket\\ServerInterface' => __DIR__ . '/..' . '/react/socket/src/ServerInterface.php', + 'React\\Socket\\SocketServer' => __DIR__ . '/..' . '/react/socket/src/SocketServer.php', + 'React\\Socket\\StreamEncryption' => __DIR__ . '/..' . '/react/socket/src/StreamEncryption.php', + 'React\\Socket\\TcpConnector' => __DIR__ . '/..' . '/react/socket/src/TcpConnector.php', + 'React\\Socket\\TcpServer' => __DIR__ . '/..' . '/react/socket/src/TcpServer.php', + 'React\\Socket\\TimeoutConnector' => __DIR__ . '/..' . '/react/socket/src/TimeoutConnector.php', + 'React\\Socket\\UnixConnector' => __DIR__ . '/..' . '/react/socket/src/UnixConnector.php', + 'React\\Socket\\UnixServer' => __DIR__ . '/..' . '/react/socket/src/UnixServer.php', + 'React\\Stream\\CompositeStream' => __DIR__ . '/..' . '/react/stream/src/CompositeStream.php', + 'React\\Stream\\DuplexResourceStream' => __DIR__ . '/..' . '/react/stream/src/DuplexResourceStream.php', + 'React\\Stream\\DuplexStreamInterface' => __DIR__ . '/..' . '/react/stream/src/DuplexStreamInterface.php', + 'React\\Stream\\ReadableResourceStream' => __DIR__ . '/..' . '/react/stream/src/ReadableResourceStream.php', + 'React\\Stream\\ReadableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/ReadableStreamInterface.php', + 'React\\Stream\\ThroughStream' => __DIR__ . '/..' . '/react/stream/src/ThroughStream.php', + 'React\\Stream\\Util' => __DIR__ . '/..' . '/react/stream/src/Util.php', + 'React\\Stream\\WritableResourceStream' => __DIR__ . '/..' . '/react/stream/src/WritableResourceStream.php', + 'React\\Stream\\WritableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/WritableStreamInterface.php', 'Redaxo\\PhpCsFixerConfig\\Config' => __DIR__ . '/..' . '/redaxo/php-cs-fixer-config/src/Config.php', 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 49a83f482..a203a584d 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,18 +1,85 @@ { "packages": [ + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "time": "2022-12-23T10:58:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "install-path": "../clue/ndjson-react" + }, { "name": "composer/pcre", - "version": "3.3.1", - "version_normalized": "3.3.1.0", + "version": "3.3.2", + "version_normalized": "3.3.2.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { @@ -22,20 +89,20 @@ "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.10", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", "phpunit/phpunit": "^8 || ^9" }, - "time": "2024-08-27T18:44:43+00:00", + "time": "2024-11-12T16:29:46+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - }, "phpstan": { "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-main": "3.x-dev" } }, "installation-source": "dist", @@ -64,7 +131,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.1" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -235,59 +302,181 @@ ], "install-path": "./xdebug-handler" }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "time": "2023-08-08T05:53:35+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "install-path": "../evenement/evenement" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "time": "2024-08-06T10:04:20+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "install-path": "../fidry/cpu-core-counter" + }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.38.2", - "version_normalized": "3.38.2.0", + "version": "v3.75.0", + "version_normalized": "3.75.0.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "d872cdd543797ade030aaa307c0a4954a712e081" + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d872cdd543797ade030aaa307c0a4954a712e081", - "reference": "d872cdd543797ade030aaa307c0a4954a712e081", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/399a128ff2fdaf4281e4e79b755693286cdf325c", + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c", "shasum": "" }, "require": { - "composer/semver": "^3.3", + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.2", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0 || ^5.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.27", - "symfony/polyfill-php80": "^1.27", - "symfony/polyfill-php81": "^1.27", - "symfony/process": "^5.4 || ^6.0", - "symfony/stopwatch": "^5.4 || ^6.0" + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/polyfill-mbstring": "^1.31", + "symfony/polyfill-php80": "^1.31", + "symfony/polyfill-php81": "^1.31", + "symfony/process": "^5.4 || ^6.4 || ^7.2", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3 || ^2.0", - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^2.0", - "mikey179/vfsstream": "^1.6.11", - "php-coveralls/php-coveralls": "^2.5.3", + "facile-it/paraunit": "^1.3.1 || ^2.6", + "infection/infection": "^0.29.14", + "justinrainbow/json-schema": "^5.3 || ^6.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.16", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "symfony/phpunit-bridge": "^6.2.3", - "symfony/yaml": "^5.4 || ^6.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", + "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12", + "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3", + "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3" }, "suggest": { "ext-dom": "For handling output formats in XML", "ext-mbstring": "For handling non-UTF8 characters." }, - "time": "2023-11-14T00:19:22+00:00", + "time": "2025-03-31T18:40:42+00:00", "bin": [ "php-cs-fixer" ], @@ -296,7 +485,10 @@ "autoload": { "psr-4": { "PhpCsFixer\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -321,7 +513,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.38.2" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.75.0" }, "funding": [ { @@ -333,17 +525,17 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.5", - "version_normalized": "1.12.5.0", + "version": "1.12.27", + "version_normalized": "1.12.27.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17" + "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", - "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a6e423c076ab39dfedc307e2ac627ef579db162", + "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162", "shasum": "" }, "require": { @@ -352,7 +544,7 @@ "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2024-09-26T12:45:22+00:00", + "time": "2025-05-21T20:51:45+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -549,19 +741,566 @@ }, "install-path": "../psr/log" }, + { + "name": "react/cache", + "version": "v1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "time": "2022-11-30T15:59:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "install-path": "../react/cache" + }, + { + "name": "react/child-process", + "version": "v0.6.6", + "version_normalized": "0.6.6.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "time": "2025-01-01T16:37:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "install-path": "../react/child-process" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "version_normalized": "1.13.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "time": "2024-06-13T14:18:03+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "install-path": "../react/dns" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "version_normalized": "1.5.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "time": "2023-11-13T13:48:05+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "install-path": "../react/event-loop" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "version_normalized": "3.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "time": "2024-05-24T10:39:05+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "install-path": "../react/promise" + }, + { + "name": "react/socket", + "version": "v1.16.0", + "version_normalized": "1.16.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "time": "2024-07-26T10:38:09+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "install-path": "../react/socket" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "time": "2024-06-11T12:45:25+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "install-path": "../react/stream" + }, { "name": "rector/rector", - "version": "1.2.6", - "version_normalized": "1.2.6.0", + "version": "1.2.10", + "version_normalized": "1.2.10.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99" + "reference": "40f9cf38c05296bd32f444121336a521a293fa61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/6ca85da28159dbd3bb36211c5104b7bc91278e99", - "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61", "shasum": "" }, "require": { @@ -577,7 +1316,7 @@ "suggest": { "ext-dom": "To manipulate phpunit.xml via the custom-rule command" }, - "time": "2024-10-03T08:56:44+00:00", + "time": "2024-11-08T13:59:10+00:00", "bin": [ "bin/rector" ], @@ -601,7 +1340,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.2.6" + "source": "https://github.com/rectorphp/rector/tree/1.2.10" }, "funding": [ { @@ -726,17 +1465,17 @@ }, { "name": "symfony/console", - "version": "v5.4.44", - "version_normalized": "5.4.44.0", + "version": "v5.4.47", + "version_normalized": "5.4.47.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "5b5a0aa66e3296e303e22490f90f521551835a83" + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5b5a0aa66e3296e303e22490f90f521551835a83", - "reference": "5b5a0aa66e3296e303e22490f90f521551835a83", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { @@ -774,7 +1513,7 @@ "symfony/lock": "", "symfony/process": "" }, - "time": "2024-09-20T07:56:40+00:00", + "time": "2024-11-06T11:30:55+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -808,7 +1547,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.44" + "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { @@ -828,31 +1567,31 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.3", - "version_normalized": "2.5.3.0", + "version": "v2.5.4", + "version_normalized": "2.5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "80d075412b557d41002320b96a096ca65aa2c98d" + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", - "reference": "80d075412b557d41002320b96a096ca65aa2c98d", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2023-01-24T14:02:46+00:00", + "time": "2024-09-25T14:11:13+00:00", "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "installation-source": "dist", @@ -878,7 +1617,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" }, "funding": [ { @@ -898,17 +1637,17 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.40", - "version_normalized": "5.4.40.0", + "version": "v5.4.45", + "version_normalized": "5.4.45.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4" + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", "shasum": "" }, "require": { @@ -938,7 +1677,7 @@ "symfony/dependency-injection": "", "symfony/http-kernel": "" }, - "time": "2024-05-31T14:33:22+00:00", + "time": "2024-09-25T14:11:13+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -966,7 +1705,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.40" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45" }, "funding": [ { @@ -986,17 +1725,17 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.3", - "version_normalized": "2.5.3.0", + "version": "v2.5.4", + "version_normalized": "2.5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73" + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73", - "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", "shasum": "" }, "require": { @@ -1006,15 +1745,15 @@ "suggest": { "symfony/event-dispatcher-implementation": "" }, - "time": "2024-01-23T13:51:25+00:00", + "time": "2024-09-25T14:11:13+00:00", "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "installation-source": "dist", @@ -1048,7 +1787,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4" }, "funding": [ { @@ -1068,17 +1807,17 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.44", - "version_normalized": "5.4.44.0", + "version": "v5.4.45", + "version_normalized": "5.4.45.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc" + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/76c3818964e9d32be3862c9318ae3ba9aa280ddc", - "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", "shasum": "" }, "require": { @@ -1090,7 +1829,7 @@ "require-dev": { "symfony/process": "^5.4|^6.4" }, - "time": "2024-09-16T14:52:48+00:00", + "time": "2024-10-22T13:05:35+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1118,7 +1857,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.44" + "source": "https://github.com/symfony/filesystem/tree/v5.4.45" }, "funding": [ { @@ -1138,17 +1877,17 @@ }, { "name": "symfony/finder", - "version": "v5.4.43", - "version_normalized": "5.4.43.0", + "version": "v5.4.45", + "version_normalized": "5.4.45.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ae25a9145a900764158d439653d5630191155ca0" + "reference": "63741784cd7b9967975eec610b256eed3ede022b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ae25a9145a900764158d439653d5630191155ca0", - "reference": "ae25a9145a900764158d439653d5630191155ca0", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", "shasum": "" }, "require": { @@ -1156,7 +1895,7 @@ "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, - "time": "2024-08-13T14:03:51+00:00", + "time": "2024-09-28T13:32:08+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1184,7 +1923,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.43" + "source": "https://github.com/symfony/finder/tree/v5.4.45" }, "funding": [ { @@ -1204,17 +1943,17 @@ }, { "name": "symfony/options-resolver", - "version": "v5.4.40", - "version_normalized": "5.4.40.0", + "version": "v5.4.45", + "version_normalized": "5.4.45.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4" + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/bd1afbde6613a8d6b956115e0e14b196191fd0c4", - "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", "shasum": "" }, "require": { @@ -1223,7 +1962,7 @@ "symfony/polyfill-php73": "~1.0", "symfony/polyfill-php80": "^1.16" }, - "time": "2024-05-31T14:33:22+00:00", + "time": "2024-09-25T14:11:13+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1256,7 +1995,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.40" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.45" }, "funding": [ { @@ -1276,8 +2015,8 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -1302,8 +2041,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "installation-source": "dist", @@ -1338,7 +2077,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" }, "funding": [ { @@ -1358,8 +2097,8 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -1381,8 +2120,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "installation-source": "dist", @@ -1419,7 +2158,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" }, "funding": [ { @@ -1439,8 +2178,8 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -1462,8 +2201,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "installation-source": "dist", @@ -1503,7 +2242,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" }, "funding": [ { @@ -1523,20 +2262,21 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -1545,12 +2285,12 @@ "suggest": { "ext-mbstring": "For best performance" }, - "time": "2024-09-09T11:45:10+00:00", + "time": "2024-12-23T08:48:59+00:00", "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "installation-source": "dist", @@ -1586,7 +2326,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" }, "funding": [ { @@ -1606,8 +2346,8 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -1626,8 +2366,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "installation-source": "dist", @@ -1665,7 +2405,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" }, "funding": [ { @@ -1685,28 +2425,28 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { "php": ">=7.2" }, - "time": "2024-09-09T11:45:10+00:00", + "time": "2025-01-02T08:10:11+00:00", "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "installation-source": "dist", @@ -1748,7 +2488,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" }, "funding": [ { @@ -1768,8 +2508,8 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -1788,8 +2528,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "installation-source": "dist", @@ -1827,7 +2567,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0" }, "funding": [ { @@ -1847,24 +2587,24 @@ }, { "name": "symfony/process", - "version": "v5.4.44", - "version_normalized": "5.4.44.0", + "version": "v5.4.47", + "version_normalized": "5.4.47.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "1b9fa82b5c62cd49da8c9e3952dd8531ada65096" + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/1b9fa82b5c62cd49da8c9e3952dd8531ada65096", - "reference": "1b9fa82b5c62cd49da8c9e3952dd8531ada65096", + "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, - "time": "2024-09-17T12:46:43+00:00", + "time": "2024-11-06T11:36:42+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1892,7 +2632,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.44" + "source": "https://github.com/symfony/process/tree/v5.4.47" }, "funding": [ { @@ -1912,17 +2652,17 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.3", - "version_normalized": "2.5.3.0", + "version": "v2.5.4", + "version_normalized": "2.5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", - "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", "shasum": "" }, "require": { @@ -1936,15 +2676,15 @@ "suggest": { "symfony/service-implementation": "" }, - "time": "2023-04-21T15:04:16+00:00", + "time": "2024-09-25T14:11:13+00:00", "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "installation-source": "dist", @@ -1978,7 +2718,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.3" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" }, "funding": [ { @@ -1998,24 +2738,24 @@ }, { "name": "symfony/stopwatch", - "version": "v5.4.40", - "version_normalized": "5.4.40.0", + "version": "v5.4.45", + "version_normalized": "5.4.45.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625" + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e9daf3b7c805c747638b2cc48f1649e594f9625", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fb2c199cf302eb207f8c23e7ee174c1c31a5c004", + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/service-contracts": "^1|^2|^3" }, - "time": "2024-05-31T14:33:22+00:00", + "time": "2024-09-25T14:11:13+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2043,7 +2783,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.40" + "source": "https://github.com/symfony/stopwatch/tree/v5.4.45" }, "funding": [ { @@ -2063,17 +2803,17 @@ }, { "name": "symfony/string", - "version": "v5.4.44", - "version_normalized": "5.4.44.0", + "version": "v5.4.47", + "version_normalized": "5.4.47.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "832caa16b6d9aac6bf11747315225f5aba384c24" + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/832caa16b6d9aac6bf11747315225f5aba384c24", - "reference": "832caa16b6d9aac6bf11747315225f5aba384c24", + "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", "shasum": "" }, "require": { @@ -2093,7 +2833,7 @@ "symfony/translation-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0|^6.0" }, - "time": "2024-09-20T07:56:40+00:00", + "time": "2024-11-10T20:33:58+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2132,7 +2872,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.44" + "source": "https://github.com/symfony/string/tree/v5.4.47" }, "funding": [ { diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index cf72add7f..96e1945d3 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' => '824f3fc5cbbfbc7f920ecb43af9a8663b61e16ef', + 'reference' => '1efba25b1b4c497bb52860aeeef4b2c56f306a20', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,16 +13,25 @@ '__root__' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '824f3fc5cbbfbc7f920ecb43af9a8663b61e16ef', + 'reference' => '1efba25b1b4c497bb52860aeeef4b2c56f306a20', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), + '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.3.1', - 'version' => '3.3.1.0', - 'reference' => '63aaeac21d7e775ff9bc9d45021e1745c97521c4', + 'pretty_version' => '3.3.2', + 'version' => '3.3.2.0', + 'reference' => 'b2bed4734f0cc156ee1fe9c0da2550420d99a21e', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), @@ -46,19 +55,37 @@ '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' => '1.2.0', + 'version' => '1.2.0.0', + 'reference' => '8520451a140d3f46ac33042715115e290cf5785f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'friendsofphp/php-cs-fixer' => array( - 'pretty_version' => 'v3.38.2', - 'version' => '3.38.2.0', - 'reference' => 'd872cdd543797ade030aaa307c0a4954a712e081', + 'pretty_version' => 'v3.75.0', + 'version' => '3.75.0.0', + 'reference' => '399a128ff2fdaf4281e4e79b755693286cdf325c', 'type' => 'application', 'install_path' => __DIR__ . '/../friendsofphp/php-cs-fixer', 'aliases' => array(), 'dev_requirement' => false, ), 'phpstan/phpstan' => array( - 'pretty_version' => '1.12.5', - 'version' => '1.12.5.0', - 'reference' => '7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17', + 'pretty_version' => '1.12.27', + 'version' => '1.12.27.0', + 'reference' => '3a6e423c076ab39dfedc307e2ac627ef579db162', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), @@ -103,10 +130,73 @@ 0 => '1.0|2.0', ), ), + '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.6', + 'version' => '0.6.6.0', + 'reference' => '1721e2b93d89b745664353b9cfc8f155ba8a6159', + 'type' => 'library', + 'install_path' => __DIR__ . '/../react/child-process', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'react/dns' => array( + 'pretty_version' => 'v1.13.0', + 'version' => '1.13.0.0', + 'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5', + 'type' => 'library', + 'install_path' => __DIR__ . '/../react/dns', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'react/event-loop' => array( + 'pretty_version' => 'v1.5.0', + 'version' => '1.5.0.0', + 'reference' => 'bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354', + 'type' => 'library', + 'install_path' => __DIR__ . '/../react/event-loop', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'react/promise' => array( + 'pretty_version' => 'v3.2.0', + 'version' => '3.2.0.0', + 'reference' => '8a164643313c71354582dc850b42b33fa12a4b63', + 'type' => 'library', + 'install_path' => __DIR__ . '/../react/promise', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'react/socket' => array( + 'pretty_version' => 'v1.16.0', + 'version' => '1.16.0.0', + 'reference' => '23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1', + 'type' => 'library', + 'install_path' => __DIR__ . '/../react/socket', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'react/stream' => array( + 'pretty_version' => 'v1.4.0', + 'version' => '1.4.0.0', + 'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../react/stream', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'rector/rector' => array( - 'pretty_version' => '1.2.6', - 'version' => '1.2.6.0', - 'reference' => '6ca85da28159dbd3bb36211c5104b7bc91278e99', + 'pretty_version' => '1.2.10', + 'version' => '1.2.10.0', + 'reference' => '40f9cf38c05296bd32f444121336a521a293fa61', 'type' => 'library', 'install_path' => __DIR__ . '/../rector/rector', 'aliases' => array(), @@ -131,36 +221,36 @@ 'dev_requirement' => false, ), 'symfony/console' => array( - 'pretty_version' => 'v5.4.44', - 'version' => '5.4.44.0', - 'reference' => '5b5a0aa66e3296e303e22490f90f521551835a83', + 'pretty_version' => 'v5.4.47', + 'version' => '5.4.47.0', + 'reference' => 'c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v2.5.3', - 'version' => '2.5.3.0', - 'reference' => '80d075412b557d41002320b96a096ca65aa2c98d', + 'pretty_version' => 'v2.5.4', + 'version' => '2.5.4.0', + 'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/event-dispatcher' => array( - 'pretty_version' => 'v5.4.40', - 'version' => '5.4.40.0', - 'reference' => 'a54e2a8a114065f31020d6a89ede83e34c3b27a4', + 'pretty_version' => 'v5.4.45', + 'version' => '5.4.45.0', + 'reference' => '72982eb416f61003e9bb6e91f8b3213600dcf9e9', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/event-dispatcher-contracts' => array( - 'pretty_version' => 'v2.5.3', - 'version' => '2.5.3.0', - 'reference' => '540f4c73e87fd0c71ca44a6aa305d024ac68cb73', + 'pretty_version' => 'v2.5.4', + 'version' => '2.5.4.0', + 'reference' => 'e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', 'aliases' => array(), @@ -173,35 +263,35 @@ ), ), 'symfony/filesystem' => array( - 'pretty_version' => 'v5.4.44', - 'version' => '5.4.44.0', - 'reference' => '76c3818964e9d32be3862c9318ae3ba9aa280ddc', + 'pretty_version' => 'v5.4.45', + 'version' => '5.4.45.0', + 'reference' => '57c8294ed37d4a055b77057827c67f9558c95c54', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/finder' => array( - 'pretty_version' => 'v5.4.43', - 'version' => '5.4.43.0', - 'reference' => 'ae25a9145a900764158d439653d5630191155ca0', + 'pretty_version' => 'v5.4.45', + 'version' => '5.4.45.0', + 'reference' => '63741784cd7b9967975eec610b256eed3ede022b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/options-resolver' => array( - 'pretty_version' => 'v5.4.40', - 'version' => '5.4.40.0', - 'reference' => 'bd1afbde6613a8d6b956115e0e14b196191fd0c4', + 'pretty_version' => 'v5.4.45', + 'version' => '5.4.45.0', + 'reference' => '74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/options-resolver', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-ctype' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', + 'pretty_version' => 'v1.32.0', + 'version' => '1.32.0.0', 'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', @@ -209,8 +299,8 @@ 'dev_requirement' => false, ), 'symfony/polyfill-intl-grapheme' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', + 'pretty_version' => 'v1.32.0', + 'version' => '1.32.0.0', 'reference' => 'b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', @@ -218,8 +308,8 @@ 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', + 'pretty_version' => 'v1.32.0', + 'version' => '1.32.0.0', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', @@ -227,17 +317,17 @@ 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', - 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', + 'pretty_version' => 'v1.32.0', + 'version' => '1.32.0.0', + 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', + 'pretty_version' => 'v1.32.0', + 'version' => '1.32.0.0', 'reference' => '0f68c03565dcaaf25a890667542e8bd75fe7e5bb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', @@ -245,17 +335,17 @@ 'dev_requirement' => false, ), 'symfony/polyfill-php80' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', - 'reference' => '60328e362d4c2c802a54fcbf04f9d3fb892b4cf8', + 'pretty_version' => 'v1.32.0', + 'version' => '1.32.0.0', + 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php81' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', + 'pretty_version' => 'v1.32.0', + 'version' => '1.32.0.0', 'reference' => '4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', @@ -263,36 +353,36 @@ 'dev_requirement' => false, ), 'symfony/process' => array( - 'pretty_version' => 'v5.4.44', - 'version' => '5.4.44.0', - 'reference' => '1b9fa82b5c62cd49da8c9e3952dd8531ada65096', + 'pretty_version' => 'v5.4.47', + 'version' => '5.4.47.0', + 'reference' => '5d1662fb32ebc94f17ddb8d635454a776066733d', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/service-contracts' => array( - 'pretty_version' => 'v2.5.3', - 'version' => '2.5.3.0', - 'reference' => 'a2329596ddc8fd568900e3fc76cba42489ecc7f3', + 'pretty_version' => 'v2.5.4', + 'version' => '2.5.4.0', + 'reference' => 'f37b419f7aea2e9abf10abd261832cace12e3300', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/stopwatch' => array( - 'pretty_version' => 'v5.4.40', - 'version' => '5.4.40.0', - 'reference' => '0e9daf3b7c805c747638b2cc48f1649e594f9625', + 'pretty_version' => 'v5.4.45', + 'version' => '5.4.45.0', + 'reference' => 'fb2c199cf302eb207f8c23e7ee174c1c31a5c004', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/stopwatch', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/string' => array( - 'pretty_version' => 'v5.4.44', - 'version' => '5.4.44.0', - 'reference' => '832caa16b6d9aac6bf11747315225f5aba384c24', + 'pretty_version' => 'v5.4.47', + 'version' => '5.4.47.0', + 'reference' => '136ca7d72f72b599f2631aca474a4f8e26719799', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), diff --git a/vendor/composer/pcre/composer.json b/vendor/composer/pcre/composer.json index 30a2c953d..d3a7e67cb 100644 --- a/vendor/composer/pcre/composer.json +++ b/vendor/composer/pcre/composer.json @@ -21,8 +21,8 @@ }, "require-dev": { "phpunit/phpunit": "^8 || ^9", - "phpstan/phpstan": "^1.11.10", - "phpstan/phpstan-strict-rules": "^1.1" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2" }, "conflict": { "phpstan/phpstan": "<1.11.10" diff --git a/vendor/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php b/vendor/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php index cf22f6020..3db0ce06a 100644 --- a/vendor/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php +++ b/vendor/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php @@ -93,10 +93,24 @@ public function specifyTypes(MethodReflection $methodReflection, StaticCall $nod $context = $context->negate(); } + // @phpstan-ignore function.alreadyNarrowedType + if (method_exists('PHPStan\Analyser\SpecifiedTypes', 'setRootExpr')) { + $typeSpecifier = $this->typeSpecifier->create( + $matchesArg->value, + $matchedType, + $context, + $scope + )->setRootExpr($node); + + return $overwrite ? $typeSpecifier->setAlwaysOverwriteTypes() : $typeSpecifier; + } + + // @phpstan-ignore arguments.count return $this->typeSpecifier->create( $matchesArg->value, $matchedType, $context, + // @phpstan-ignore argument.type $overwrite, $scope, $node diff --git a/vendor/composer/pcre/src/PcreException.php b/vendor/composer/pcre/src/PcreException.php index 218b2f2d8..23d93279d 100644 --- a/vendor/composer/pcre/src/PcreException.php +++ b/vendor/composer/pcre/src/PcreException.php @@ -39,13 +39,8 @@ private static function pcreLastErrorMessage($code) return preg_last_error_msg(); } - // older php versions did not set the code properly in all cases - if (PHP_VERSION_ID < 70201 && $code === 0) { - return 'UNDEFINED_ERROR'; - } - $constants = get_defined_constants(true); - if (!isset($constants['pcre'])) { + if (!isset($constants['pcre']) || !is_array($constants['pcre'])) { return 'UNDEFINED_ERROR'; } diff --git a/vendor/evenement/evenement/.gitattributes b/vendor/evenement/evenement/.gitattributes new file mode 100644 index 000000000..8e493b8ce --- /dev/null +++ b/vendor/evenement/evenement/.gitattributes @@ -0,0 +1,7 @@ +/.github export-ignore +/doc export-ignore +/examples export-ignore +/tests export-ignore +/.gitignore export-ignore +/CHANGELOG.md export-ignore +/phpunit.xml.dist export-ignore diff --git a/vendor/evenement/evenement/LICENSE b/vendor/evenement/evenement/LICENSE new file mode 100644 index 000000000..d9a37d0a0 --- /dev/null +++ b/vendor/evenement/evenement/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/evenement/evenement/README.md b/vendor/evenement/evenement/README.md new file mode 100644 index 000000000..455dd22c2 --- /dev/null +++ b/vendor/evenement/evenement/README.md @@ -0,0 +1,64 @@ +# Événement + +Événement is a very simple event dispatching library for PHP. + +It has the same design goals as [Silex](https://silex.symfony.com/) and +[Pimple](https://github.com/silexphp/Pimple), to empower the user while staying concise +and simple. + +It is very strongly inspired by the [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter) API found in +[node.js](http://nodejs.org). + +![Continuous Integration](https://github.com/igorw/evenement/workflows/CI/badge.svg) +[![Latest Stable Version](https://poser.pugx.org/evenement/evenement/v/stable.png)](https://packagist.org/packages/evenement/evenement) +[![Total Downloads](https://poser.pugx.org/evenement/evenement/downloads.png)](https://packagist.org/packages/evenement/evenement/stats) +[![License](https://poser.pugx.org/evenement/evenement/license.png)](https://packagist.org/packages/evenement/evenement) + +## Fetch + +The recommended way to install Événement is [through composer](http://getcomposer.org). By running the following command: + + $ composer require evenement/evenement + +## Usage + +### Creating an Emitter + +```php +on('user.created', function (User $user) use ($logger) { + $logger->log(sprintf("User '%s' was created.", $user->getLogin())); +}); +``` + +### Removing Listeners + +```php +removeListener('user.created', function (User $user) use ($logger) { + $logger->log(sprintf("User '%s' was created.", $user->getLogin())); +}); +``` + +### Emitting Events + +```php +emit('user.created', [$user]); +``` + +Tests +----- + + $ ./vendor/bin/phpunit + +License +------- +MIT, see LICENSE. diff --git a/vendor/evenement/evenement/composer.json b/vendor/evenement/evenement/composer.json new file mode 100644 index 000000000..5444d93e2 --- /dev/null +++ b/vendor/evenement/evenement/composer.json @@ -0,0 +1,29 @@ +{ + "name": "evenement/evenement", + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": ["event-dispatcher", "event-emitter"], + "license": "MIT", + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Evenement\\Tests\\": "tests/" + }, + "files": ["tests/functions.php"] + } +} diff --git a/vendor/evenement/evenement/src/EventEmitter.php b/vendor/evenement/evenement/src/EventEmitter.php new file mode 100644 index 000000000..db189b972 --- /dev/null +++ b/vendor/evenement/evenement/src/EventEmitter.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +class EventEmitter implements EventEmitterInterface +{ + use EventEmitterTrait; +} diff --git a/vendor/evenement/evenement/src/EventEmitterInterface.php b/vendor/evenement/evenement/src/EventEmitterInterface.php new file mode 100644 index 000000000..310631a10 --- /dev/null +++ b/vendor/evenement/evenement/src/EventEmitterInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +interface EventEmitterInterface +{ + public function on($event, callable $listener); + public function once($event, callable $listener); + public function removeListener($event, callable $listener); + public function removeAllListeners($event = null); + public function listeners($event = null); + public function emit($event, array $arguments = []); +} diff --git a/vendor/evenement/evenement/src/EventEmitterTrait.php b/vendor/evenement/evenement/src/EventEmitterTrait.php new file mode 100644 index 000000000..150342960 --- /dev/null +++ b/vendor/evenement/evenement/src/EventEmitterTrait.php @@ -0,0 +1,154 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +use InvalidArgumentException; + +use function count; +use function array_keys; +use function array_merge; +use function array_search; +use function array_unique; +use function array_values; + +trait EventEmitterTrait +{ + protected $listeners = []; + protected $onceListeners = []; + + public function on($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (!isset($this->listeners[$event])) { + $this->listeners[$event] = []; + } + + $this->listeners[$event][] = $listener; + + return $this; + } + + public function once($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (!isset($this->onceListeners[$event])) { + $this->onceListeners[$event] = []; + } + + $this->onceListeners[$event][] = $listener; + + return $this; + } + + public function removeListener($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (isset($this->listeners[$event])) { + $index = array_search($listener, $this->listeners[$event], true); + if (false !== $index) { + unset($this->listeners[$event][$index]); + if (count($this->listeners[$event]) === 0) { + unset($this->listeners[$event]); + } + } + } + + if (isset($this->onceListeners[$event])) { + $index = array_search($listener, $this->onceListeners[$event], true); + if (false !== $index) { + unset($this->onceListeners[$event][$index]); + if (count($this->onceListeners[$event]) === 0) { + unset($this->onceListeners[$event]); + } + } + } + } + + public function removeAllListeners($event = null) + { + if ($event !== null) { + unset($this->listeners[$event]); + } else { + $this->listeners = []; + } + + if ($event !== null) { + unset($this->onceListeners[$event]); + } else { + $this->onceListeners = []; + } + } + + public function listeners($event = null): array + { + if ($event === null) { + $events = []; + $eventNames = array_unique( + array_merge( + array_keys($this->listeners), + array_keys($this->onceListeners) + ) + ); + foreach ($eventNames as $eventName) { + $events[$eventName] = array_merge( + isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [], + isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : [] + ); + } + return $events; + } + + return array_merge( + isset($this->listeners[$event]) ? $this->listeners[$event] : [], + isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : [] + ); + } + + public function emit($event, array $arguments = []) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + $listeners = []; + if (isset($this->listeners[$event])) { + $listeners = array_values($this->listeners[$event]); + } + + $onceListeners = []; + if (isset($this->onceListeners[$event])) { + $onceListeners = array_values($this->onceListeners[$event]); + } + + if(empty($listeners) === false) { + foreach ($listeners as $listener) { + $listener(...$arguments); + } + } + + if(empty($onceListeners) === false) { + unset($this->onceListeners[$event]); + foreach ($onceListeners as $listener) { + $listener(...$arguments); + } + } + } +} diff --git a/vendor/fidry/cpu-core-counter/.envrc b/vendor/fidry/cpu-core-counter/.envrc new file mode 100644 index 000000000..a7c02efba --- /dev/null +++ b/vendor/fidry/cpu-core-counter/.envrc @@ -0,0 +1,5 @@ +use nix --packages \ + gnumake \ + yamllint + +source_env_if_exists .envrc.local diff --git a/vendor/fidry/cpu-core-counter/LICENSE.md b/vendor/fidry/cpu-core-counter/LICENSE.md new file mode 100644 index 000000000..02442130a --- /dev/null +++ b/vendor/fidry/cpu-core-counter/LICENSE.md @@ -0,0 +1,16 @@ +# The MIT License (MIT) + +Copyright (c) 2022 Théo FIDRY + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the _Software_), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED **AS IS**, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/fidry/cpu-core-counter/README.md b/vendor/fidry/cpu-core-counter/README.md new file mode 100644 index 000000000..6b554d2eb --- /dev/null +++ b/vendor/fidry/cpu-core-counter/README.md @@ -0,0 +1,138 @@ +# CPU Core Counter + +This package is a tiny utility to get the number of CPU cores. + +```sh +composer require fidry/cpu-core-counter +``` + + +## Usage + +```php +use Fidry\CpuCoreCounter\CpuCoreCounter; +use Fidry\CpuCoreCounter\NumberOfCpuCoreNotFound; +use Fidry\CpuCoreCounter\Finder\DummyCpuCoreFinder; + +$counter = new CpuCoreCounter(); + +// For knowing the number of cores you can use for launching parallel processes: +$counter->getAvailableForParallelisation()->availableCpus; + +// Get the number of CPU cores (by default it will use the logical cores count): +try { + $counter->getCount(); // e.g. 8 +} catch (NumberOfCpuCoreNotFound) { + return 1; // Fallback value +} + +// An alternative form where we not want to catch the exception: + +$counter = new CpuCoreCounter([ + ...CpuCoreCounter::getDefaultFinders(), + new DummyCpuCoreFinder(1), // Fallback value +]); + +// A type-safe alternative form: +$counter->getCountWithFallback(1); + +// Note that the result is memoized. +$counter->getCount(); // e.g. 8 + +``` + + +## Advanced usage + +### Changing the finders + +When creating `CpuCoreCounter`, you may want to change the order of the finders +used or disable a specific finder. You can easily do so by passing the finders +you want + +```php +// Remove WindowsWmicFinder +$finders = array_filter( + CpuCoreCounter::getDefaultFinders(), + static fn (CpuCoreFinder $finder) => !($finder instanceof WindowsWmicFinder) +); + +$cores = (new CpuCoreCounter($finders))->getCount(); +``` + +```php +// Use CPUInfo first & don't use Nproc +$finders = [ + new CpuInfoFinder(), + new WindowsWmicFinder(), + new HwLogicalFinder(), +]; + +$cores = (new CpuCoreCounter($finders))->getCount(); +``` + +### Choosing only logical or physical finders + +`FinderRegistry` provides two helpful entries: + +- `::getDefaultLogicalFinders()`: gives an ordered list of finders that will + look for the _logical_ CPU cores count. +- `::getDefaultPhysicalFinders()`: gives an ordered list of finders that will + look for the _physical_ CPU cores count. + +By default, when using `CpuCoreCounter`, it will use the logical finders since +it is more likely what you are looking for and is what is used by PHP source to +build the PHP binary. + + +### Checks what finders find what on your system + +You have three scrips available that provides insight about what the finders +can find: + +```shell +# Checks what each given finder will find on your system with details about the +# information it had. +make diagnose # From this repository +./vendor/fidry/cpu-core-counter/bin/diagnose.php # From the library +``` + +And: +```shell +# Execute all finders and display the result they found. +make execute # From this repository +./vendor/fidry/cpu-core-counter/bin/execute.php # From the library +``` + + +### Debug the results found + +You have 3 methods available to help you find out what happened: + +1. If you are using the default configuration of finder registries, you can check + the previous section which will provide plenty of information. +2. If what you are interested in is how many CPU cores were found, you can use + the `CpuCoreCounter::trace()` method. +3. If what you are interested in is how the calculation of CPU cores available + for parallelisation was done, you can inspect the values of `ParallelisationResult` + returned by `CpuCoreCounter::getAvailableForParallelisation()`. + + +## Backward Compatibility Promise (BCP) + +The policy is for the major part following the same as [Symfony's one][symfony-bc-policy]. +Note that the code marked as `@private` or `@internal` are excluded from the BCP. + +The following elements are also excluded: + +- The `diagnose` and `execute` commands: those are for debugging/inspection purposes only +- `FinderRegistry::get*Finders()`: new finders may be added or the order of finders changed at any time + + +## License + +This package is licensed using the MIT License. + +Please have a look at [`LICENSE.md`](LICENSE.md). + +[symfony-bc-policy]: https://symfony.com/doc/current/contributing/code/bc.html diff --git a/vendor/fidry/cpu-core-counter/bin/diagnose.php b/vendor/fidry/cpu-core-counter/bin/diagnose.php new file mode 100755 index 000000000..7dd894a11 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/bin/diagnose.php @@ -0,0 +1,27 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +use Fidry\CpuCoreCounter\Diagnoser; +use Fidry\CpuCoreCounter\Finder\FinderRegistry; + +require_once __DIR__.'/../vendor/autoload.php'; + +echo 'Running diagnosis...'.PHP_EOL.PHP_EOL; +echo Diagnoser::diagnose(FinderRegistry::getAllVariants()).PHP_EOL; + +echo 'Logical CPU cores finders...'.PHP_EOL.PHP_EOL; +echo Diagnoser::diagnose(FinderRegistry::getDefaultLogicalFinders()).PHP_EOL; + +echo 'Physical CPU cores finders...'.PHP_EOL.PHP_EOL; +echo Diagnoser::diagnose(FinderRegistry::getDefaultPhysicalFinders()).PHP_EOL; diff --git a/vendor/fidry/cpu-core-counter/bin/execute.php b/vendor/fidry/cpu-core-counter/bin/execute.php new file mode 100755 index 000000000..edadebb1e --- /dev/null +++ b/vendor/fidry/cpu-core-counter/bin/execute.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +use Fidry\CpuCoreCounter\Diagnoser; +use Fidry\CpuCoreCounter\Finder\FinderRegistry; + +require_once __DIR__.'/../vendor/autoload.php'; + +echo 'Executing finders...'.PHP_EOL.PHP_EOL; +echo Diagnoser::execute(FinderRegistry::getAllVariants()).PHP_EOL; diff --git a/vendor/fidry/cpu-core-counter/bin/trace.php b/vendor/fidry/cpu-core-counter/bin/trace.php new file mode 100755 index 000000000..adb52e24b --- /dev/null +++ b/vendor/fidry/cpu-core-counter/bin/trace.php @@ -0,0 +1,32 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +use Fidry\CpuCoreCounter\CpuCoreCounter; +use Fidry\CpuCoreCounter\Finder\FinderRegistry; + +require_once __DIR__.'/../vendor/autoload.php'; + +$separator = str_repeat('–', 80); + +echo 'With all finders...'.PHP_EOL.PHP_EOL; +echo (new CpuCoreCounter(FinderRegistry::getAllVariants()))->trace().PHP_EOL; +echo $separator.PHP_EOL.PHP_EOL; + +echo 'Logical CPU cores finders...'.PHP_EOL.PHP_EOL; +echo (new CpuCoreCounter(FinderRegistry::getDefaultLogicalFinders()))->trace().PHP_EOL; +echo $separator.PHP_EOL.PHP_EOL; + +echo 'Physical CPU cores finders...'.PHP_EOL.PHP_EOL; +echo (new CpuCoreCounter(FinderRegistry::getDefaultPhysicalFinders()))->trace().PHP_EOL; +echo $separator.PHP_EOL.PHP_EOL; diff --git a/vendor/fidry/cpu-core-counter/composer.json b/vendor/fidry/cpu-core-counter/composer.json new file mode 100644 index 000000000..3f324d19f --- /dev/null +++ b/vendor/fidry/cpu-core-counter/composer.json @@ -0,0 +1,48 @@ +{ + "name": "fidry/cpu-core-counter", + "description": "Tiny utility to get the number of CPU cores.", + "license": "MIT", + "type": "library", + "keywords": [ + "cpu", + "core" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Fidry\\CpuCoreCounter\\Test\\": "tests/" + } + }, + "config": { + "allow-plugins": { + "ergebnis/composer-normalize": true, + "infection/extension-installer": true, + "phpstan/extension-installer": true + }, + "sort-packages": true + } +} diff --git a/vendor/fidry/cpu-core-counter/src/CpuCoreCounter.php b/vendor/fidry/cpu-core-counter/src/CpuCoreCounter.php new file mode 100644 index 000000000..8c8b55bd8 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/CpuCoreCounter.php @@ -0,0 +1,268 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter; + +use Fidry\CpuCoreCounter\Finder\CpuCoreFinder; +use Fidry\CpuCoreCounter\Finder\EnvVariableFinder; +use Fidry\CpuCoreCounter\Finder\FinderRegistry; +use InvalidArgumentException; +use function implode; +use function max; +use function sprintf; +use function sys_getloadavg; +use const PHP_EOL; + +final class CpuCoreCounter +{ + /** + * @var list + */ + private $finders; + + /** + * @var positive-int|null + */ + private $count; + + /** + * @param list|null $finders + */ + public function __construct(?array $finders = null) + { + $this->finders = $finders ?? FinderRegistry::getDefaultLogicalFinders(); + } + + /** + * @param positive-int|0 $reservedCpus Number of CPUs to reserve. This is useful when you want + * to reserve some CPUs for other processes. If the main + * process is going to be busy still, you may want to set + * this value to 1. + * @param non-zero-int|null $countLimit The maximum number of CPUs to return. If not provided, it + * may look for a limit in the environment variables, e.g. + * KUBERNETES_CPU_LIMIT. If negative, the limit will be + * the total number of cores found minus the absolute value. + * For instance if the system has 10 cores and countLimit=-2, + * then the effective limit considered will be 8. + * @param float|null $loadLimit Element of [0., 1.]. Percentage representing the + * amount of cores that should be used among the available + * resources. For instance, if set to 0.7, it will use 70% + * of the available cores, i.e. if 1 core is reserved, 11 + * cores are available and 5 are busy, it will use 70% + * of (11-1-5)=5 cores, so 3 cores. Set this parameter to null + * to skip this check. Beware that 1 does not mean "no limit", + * but 100% of the _available_ resources, i.e. with the + * previous example, it will return 5 cores. How busy is + * the system is determined by the system load average + * (see $systemLoadAverage). + * @param float|null $systemLoadAverage The system load average. If passed, it will use + * this information to limit the available cores based + * on the _available_ resources. For instance, if there + * is 10 cores but 3 are busy, then only 7 cores will + * be considered for further calculation. If set to + * `null`, it will use `sys_getloadavg()` to check the + * load of the system in the past minute. You can + * otherwise pass an arbitrary value. Should be a + * positive float. + * + * @see https://php.net/manual/en/function.sys-getloadavg.php + */ + public function getAvailableForParallelisation( + int $reservedCpus = 0, + ?int $countLimit = null, + ?float $loadLimit = null, + ?float $systemLoadAverage = 0. + ): ParallelisationResult { + self::checkCountLimit($countLimit); + self::checkLoadLimit($loadLimit); + self::checkSystemLoadAverage($systemLoadAverage); + + $totalCoreCount = $this->getCountWithFallback(1); + $availableCores = max(1, $totalCoreCount - $reservedCpus); + + // Adjust available CPUs based on current load + if (null !== $loadLimit) { + $correctedSystemLoadAverage = null === $systemLoadAverage + ? sys_getloadavg()[0] ?? 0. + : $systemLoadAverage; + + $availableCores = max( + 1, + $loadLimit * ($availableCores - $correctedSystemLoadAverage) + ); + } + + if (null === $countLimit) { + $correctedCountLimit = self::getKubernetesLimit(); + } else { + $correctedCountLimit = $countLimit > 0 + ? $countLimit + : max(1, $totalCoreCount + $countLimit); + } + + if (null !== $correctedCountLimit && $availableCores > $correctedCountLimit) { + $availableCores = $correctedCountLimit; + } + + return new ParallelisationResult( + $reservedCpus, + $countLimit, + $loadLimit, + $systemLoadAverage, + $correctedCountLimit, + $correctedSystemLoadAverage ?? $systemLoadAverage, + $totalCoreCount, + (int) $availableCores + ); + } + + /** + * @throws NumberOfCpuCoreNotFound + * + * @return positive-int + */ + public function getCount(): int + { + // Memoize result + if (null === $this->count) { + $this->count = $this->findCount(); + } + + return $this->count; + } + + /** + * @param positive-int $fallback + * + * @return positive-int + */ + public function getCountWithFallback(int $fallback): int + { + try { + return $this->getCount(); + } catch (NumberOfCpuCoreNotFound $exception) { + return $fallback; + } + } + + /** + * This method is mostly for debugging purposes. + */ + public function trace(): string + { + $output = []; + + foreach ($this->finders as $finder) { + $output[] = sprintf( + 'Executing the finder "%s":', + $finder->toString() + ); + $output[] = $finder->diagnose(); + + $cores = $finder->find(); + + if (null !== $cores) { + $output[] = 'Result found: '.$cores; + + break; + } + + $output[] = '–––'; + } + + return implode(PHP_EOL, $output); + } + + /** + * @throws NumberOfCpuCoreNotFound + * + * @return positive-int + */ + private function findCount(): int + { + foreach ($this->finders as $finder) { + $cores = $finder->find(); + + if (null !== $cores) { + return $cores; + } + } + + throw NumberOfCpuCoreNotFound::create(); + } + + /** + * @throws NumberOfCpuCoreNotFound + * + * @return array{CpuCoreFinder, positive-int} + */ + public function getFinderAndCores(): array + { + foreach ($this->finders as $finder) { + $cores = $finder->find(); + + if (null !== $cores) { + return [$finder, $cores]; + } + } + + throw NumberOfCpuCoreNotFound::create(); + } + + /** + * @return positive-int|null + */ + public static function getKubernetesLimit(): ?int + { + $finder = new EnvVariableFinder('KUBERNETES_CPU_LIMIT'); + + return $finder->find(); + } + + private static function checkCountLimit(?int $countLimit): void + { + if (0 === $countLimit) { + throw new InvalidArgumentException( + 'The count limit must be a non zero integer. Got "0".' + ); + } + } + + private static function checkLoadLimit(?float $loadLimit): void + { + if (null === $loadLimit) { + return; + } + + if ($loadLimit < 0. || $loadLimit > 1.) { + throw new InvalidArgumentException( + sprintf( + 'The load limit must be in the range [0., 1.], got "%s".', + $loadLimit + ) + ); + } + } + + private static function checkSystemLoadAverage(?float $systemLoadAverage): void + { + if (null !== $systemLoadAverage && $systemLoadAverage < 0.) { + throw new InvalidArgumentException( + sprintf( + 'The system load average must be a positive float, got "%s".', + $systemLoadAverage + ) + ); + } + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Diagnoser.php b/vendor/fidry/cpu-core-counter/src/Diagnoser.php new file mode 100644 index 000000000..872b55f80 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Diagnoser.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter; + +use Fidry\CpuCoreCounter\Finder\CpuCoreFinder; +use function array_map; +use function explode; +use function implode; +use function max; +use function str_repeat; +use const PHP_EOL; + +/** + * Utility to debug. + * + * @private + */ +final class Diagnoser +{ + /** + * Provides an aggregated diagnosis based on each finders diagnosis. + * + * @param list $finders + */ + public static function diagnose(array $finders): string + { + $diagnoses = array_map( + static function (CpuCoreFinder $finder): string { + return self::diagnoseFinder($finder); + }, + $finders + ); + + return implode(PHP_EOL, $diagnoses); + } + + /** + * Executes each finders. + * + * @param list $finders + */ + public static function execute(array $finders): string + { + $diagnoses = array_map( + static function (CpuCoreFinder $finder): string { + $coresCount = $finder->find(); + + return implode( + '', + [ + $finder->toString(), + ': ', + null === $coresCount ? 'NULL' : $coresCount, + ] + ); + }, + $finders + ); + + return implode(PHP_EOL, $diagnoses); + } + + private static function diagnoseFinder(CpuCoreFinder $finder): string + { + $diagnosis = $finder->diagnose(); + + $maxLineLength = max( + array_map( + 'strlen', + explode(PHP_EOL, $diagnosis) + ) + ); + + $separator = str_repeat('-', $maxLineLength); + + return implode( + '', + [ + $finder->toString().':'.PHP_EOL, + $separator.PHP_EOL, + $diagnosis.PHP_EOL, + $separator.PHP_EOL, + ] + ); + } + + private function __construct() + { + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php b/vendor/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php new file mode 100644 index 000000000..751a311d2 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Executor; + +use function fclose; +use function function_exists; +use function is_resource; +use function proc_close; +use function proc_open; +use function stream_get_contents; + +final class ProcOpenExecutor implements ProcessExecutor +{ + public function execute(string $command): ?array + { + if (!function_exists('proc_open')) { + return null; + } + + $pipes = []; + + $process = @proc_open( + $command, + [ + ['pipe', 'rb'], + ['pipe', 'wb'], // stdout + ['pipe', 'wb'], // stderr + ], + $pipes + ); + + if (!is_resource($process)) { + return null; + } + + fclose($pipes[0]); + + $stdout = (string) stream_get_contents($pipes[1]); + $stderr = (string) stream_get_contents($pipes[2]); + + proc_close($process); + + return [$stdout, $stderr]; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php b/vendor/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php new file mode 100644 index 000000000..287c01e15 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Executor; + +interface ProcessExecutor +{ + /** + * @return array{string, string}|null STDOUT & STDERR tuple + */ + public function execute(string $command): ?array; +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php new file mode 100644 index 000000000..ee5c7d3dc --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function preg_match; + +/** + * Find the number of logical CPU cores for Windows leveraging the Get-CimInstance + * cmdlet, which is a newer version that is recommended over Get-WmiObject. + */ +final class CmiCmdletLogicalFinder extends ProcOpenBasedFinder +{ + private const CPU_CORE_COUNT_REGEX = '/NumberOfLogicalProcessors[\s\n]-+[\s\n]+(?\d+)/'; + + protected function getCommand(): string + { + return 'Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property NumberOfLogicalProcessors'; + } + + public function toString(): string + { + return 'CmiCmdletLogicalFinder'; + } + + protected function countCpuCores(string $process): ?int + { + if (0 === preg_match(self::CPU_CORE_COUNT_REGEX, $process, $matches)) { + return parent::countCpuCores($process); + } + + $count = $matches['count']; + + return parent::countCpuCores($count); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php new file mode 100644 index 000000000..853012364 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function preg_match; + +/** + * Find the number of physical CPU cores for Windows. + * + * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L912-L916 + */ +final class CmiCmdletPhysicalFinder extends ProcOpenBasedFinder +{ + private const CPU_CORE_COUNT_REGEX = '/NumberOfCores[\s\n]-+[\s\n]+(?\d+)/'; + + protected function getCommand(): string + { + return 'Get-CimInstance -ClassName Win32_Processor | Select-Object -Property NumberOfCores'; + } + + public function toString(): string + { + return 'CmiCmdletPhysicalFinder'; + } + + protected function countCpuCores(string $process): ?int + { + if (0 === preg_match(self::CPU_CORE_COUNT_REGEX, $process, $matches)) { + return parent::countCpuCores($process); + } + + $count = $matches['count']; + + return parent::countCpuCores($count); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php new file mode 100644 index 000000000..edb40e864 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +interface CpuCoreFinder +{ + /** + * Provides an explanation which may offer some insight as to what the finder + * will be able to find. + * + * This is practical to have an idea of what each finder will find collect + * information for the unit tests, since integration tests are quite complicated + * as dependent on complex infrastructures. + */ + public function diagnose(): string; + + /** + * Find the number of CPU cores. If it could not find it, returns null. The + * means used to find the cores are at the implementation discretion. + * + * @return positive-int|null + */ + public function find(): ?int; + + public function toString(): string; +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php new file mode 100644 index 000000000..8013877d2 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function file_get_contents; +use function is_file; +use function sprintf; +use function substr_count; +use const PHP_EOL; + +/** + * Find the number of CPU cores looking up at the cpuinfo file which is available + * on Linux systems and Windows systems with a Linux sub-system. + * + * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L903-L909 + * @see https://unix.stackexchange.com/questions/146051/number-of-processors-in-proc-cpuinfo + */ +final class CpuInfoFinder implements CpuCoreFinder +{ + private const CPU_INFO_PATH = '/proc/cpuinfo'; + + public function diagnose(): string + { + if (!is_file(self::CPU_INFO_PATH)) { + return sprintf( + 'The file "%s" could not be found.', + self::CPU_INFO_PATH + ); + } + + $cpuInfo = file_get_contents(self::CPU_INFO_PATH); + + if (false === $cpuInfo) { + return sprintf( + 'Could not get the content of the file "%s".', + self::CPU_INFO_PATH + ); + } + + return sprintf( + 'Found the file "%s" with the content:%s%s%sWill return "%s".', + self::CPU_INFO_PATH, + PHP_EOL, + $cpuInfo, + PHP_EOL, + self::countCpuCores($cpuInfo) + ); + } + + /** + * @return positive-int|null + */ + public function find(): ?int + { + $cpuInfo = self::getCpuInfo(); + + return null === $cpuInfo ? null : self::countCpuCores($cpuInfo); + } + + public function toString(): string + { + return 'CpuInfoFinder'; + } + + private static function getCpuInfo(): ?string + { + if (!@is_file(self::CPU_INFO_PATH)) { + return null; + } + + $cpuInfo = @file_get_contents(self::CPU_INFO_PATH); + + return false === $cpuInfo + ? null + : $cpuInfo; + } + + /** + * @internal + * + * @return positive-int|null + */ + public static function countCpuCores(string $cpuInfo): ?int + { + $processorCount = substr_count($cpuInfo, 'processor'); + + return $processorCount > 0 ? $processorCount : null; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php new file mode 100644 index 000000000..1efa4da69 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function sprintf; + +/** + * This finder returns whatever value you gave to it. This is useful for testing + * or as a fallback to avoid to catch the NumberOfCpuCoreNotFound exception. + */ +final class DummyCpuCoreFinder implements CpuCoreFinder +{ + /** + * @var positive-int + */ + private $count; + + public function diagnose(): string + { + return sprintf( + 'Will return "%d".', + $this->count + ); + } + + /** + * @param positive-int $count + */ + public function __construct(int $count) + { + $this->count = $count; + } + + public function find(): ?int + { + return $this->count; + } + + public function toString(): string + { + return sprintf( + 'DummyCpuCoreFinder(value=%d)', + $this->count + ); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php new file mode 100644 index 000000000..fa23278fb --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function getenv; +use function preg_match; +use function sprintf; +use function var_export; + +final class EnvVariableFinder implements CpuCoreFinder +{ + /** @var string */ + private $environmentVariableName; + + public function __construct(string $environmentVariableName) + { + $this->environmentVariableName = $environmentVariableName; + } + + public function diagnose(): string + { + $value = getenv($this->environmentVariableName); + + return sprintf( + 'parse(getenv(%s)=%s)=%s', + $this->environmentVariableName, + var_export($value, true), + self::isPositiveInteger($value) ? $value : 'null' + ); + } + + public function find(): ?int + { + $value = getenv($this->environmentVariableName); + + return self::isPositiveInteger($value) + ? (int) $value + : null; + } + + public function toString(): string + { + return sprintf( + 'getenv(%s)', + $this->environmentVariableName + ); + } + + /** + * @param string|false $value + */ + private static function isPositiveInteger($value): bool + { + return false !== $value + && 1 === preg_match('/^\d+$/', $value) + && (int) $value > 0; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/FinderRegistry.php b/vendor/fidry/cpu-core-counter/src/Finder/FinderRegistry.php new file mode 100644 index 000000000..ca9b8602f --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/FinderRegistry.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +final class FinderRegistry +{ + /** + * @return list List of all the known finders with all their variants. + */ + public static function getAllVariants(): array + { + return [ + new CpuInfoFinder(), + new DummyCpuCoreFinder(1), + new HwLogicalFinder(), + new HwPhysicalFinder(), + new LscpuLogicalFinder(), + new LscpuPhysicalFinder(), + new _NProcessorFinder(), + new NProcessorFinder(), + new NProcFinder(true), + new NProcFinder(false), + new NullCpuCoreFinder(), + SkipOnOSFamilyFinder::forWindows( + new DummyCpuCoreFinder(1) + ), + OnlyOnOSFamilyFinder::forWindows( + new DummyCpuCoreFinder(1) + ), + new OnlyInPowerShellFinder(new CmiCmdletLogicalFinder()), + new OnlyInPowerShellFinder(new CmiCmdletPhysicalFinder()), + new WindowsRegistryLogicalFinder(), + new WmicPhysicalFinder(), + new WmicLogicalFinder(), + ]; + } + + /** + * @return list + */ + public static function getDefaultLogicalFinders(): array + { + return [ + OnlyOnOSFamilyFinder::forWindows( + new OnlyInPowerShellFinder( + new CmiCmdletLogicalFinder() + ) + ), + OnlyOnOSFamilyFinder::forWindows(new WindowsRegistryLogicalFinder()), + OnlyOnOSFamilyFinder::forWindows(new WmicLogicalFinder()), + new NProcFinder(), + new HwLogicalFinder(), + new _NProcessorFinder(), + new NProcessorFinder(), + new LscpuLogicalFinder(), + new CpuInfoFinder(), + ]; + } + + /** + * @return list + */ + public static function getDefaultPhysicalFinders(): array + { + return [ + OnlyOnOSFamilyFinder::forWindows( + new OnlyInPowerShellFinder( + new CmiCmdletPhysicalFinder() + ) + ), + OnlyOnOSFamilyFinder::forWindows(new WmicPhysicalFinder()), + new HwPhysicalFinder(), + new LscpuPhysicalFinder(), + ]; + } + + private function __construct() + { + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php new file mode 100644 index 000000000..d1129038a --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +/** + * Find the number of logical CPU cores for Linux, BSD and OSX. + * + * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L903-L909 + * @see https://opensource.apple.com/source/xnu/xnu-792.2.4/libkern/libkern/sysctl.h.auto.html + */ +final class HwLogicalFinder extends ProcOpenBasedFinder +{ + protected function getCommand(): string + { + return 'sysctl -n hw.logicalcpu'; + } + + public function toString(): string + { + return 'HwLogicalFinder'; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php new file mode 100644 index 000000000..65ca1cfd6 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +/** + * Find the number of physical CPU cores for Linux, BSD and OSX. + * + * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L903-L909 + * @see https://opensource.apple.com/source/xnu/xnu-792.2.4/libkern/libkern/sysctl.h.auto.html + */ +final class HwPhysicalFinder extends ProcOpenBasedFinder +{ + protected function getCommand(): string + { + return 'sysctl -n hw.physicalcpu'; + } + + public function toString(): string + { + return 'HwPhysicalFinder'; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php new file mode 100644 index 000000000..bce09ebf5 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function count; +use function explode; +use function is_array; +use function preg_grep; +use const PHP_EOL; + +/** + * The number of logical cores. + * + * @see https://stackoverflow.com/a/23378780/5846754 + */ +final class LscpuLogicalFinder extends ProcOpenBasedFinder +{ + public function getCommand(): string + { + return 'lscpu -p'; + } + + protected function countCpuCores(string $process): ?int + { + $lines = explode(PHP_EOL, $process); + $actualLines = preg_grep('/^\d+,/', $lines); + + if (!is_array($actualLines)) { + return null; + } + + $count = count($actualLines); + + return 0 === $count ? null : $count; + } + + public function toString(): string + { + return 'LscpuLogicalFinder'; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php new file mode 100644 index 000000000..58523cee0 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function count; +use function explode; +use function is_array; +use function preg_grep; +use function strtok; +use const PHP_EOL; + +/** + * The number of physical processors. + * + * @see https://stackoverflow.com/a/23378780/5846754 + */ +final class LscpuPhysicalFinder extends ProcOpenBasedFinder +{ + public function toString(): string + { + return 'LscpuPhysicalFinder'; + } + + public function getCommand(): string + { + return 'lscpu -p'; + } + + protected function countCpuCores(string $process): ?int + { + $lines = explode(PHP_EOL, $process); + $actualLines = preg_grep('/^\d+/', $lines); + + if (!is_array($actualLines)) { + return null; + } + + $cores = []; + foreach ($actualLines as $line) { + strtok($line, ','); + $core = strtok(','); + + if (false === $core) { + continue; + } + + $cores[$core] = true; + } + unset($cores['-']); + + $count = count($cores); + + return 0 === $count ? null : $count; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/NProcFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/NProcFinder.php new file mode 100644 index 000000000..c0f7a6f7f --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/NProcFinder.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use Fidry\CpuCoreCounter\Executor\ProcessExecutor; +use function sprintf; + +/** + * The number of (logical) cores. + * + * @see https://github.com/infection/infection/blob/fbd8c44/src/Resource/Processor/CpuCoresCountProvider.php#L69-L82 + * @see https://unix.stackexchange.com/questions/146051/number-of-processors-in-proc-cpuinfo + */ +final class NProcFinder extends ProcOpenBasedFinder +{ + /** + * @var bool + */ + private $all; + + /** + * @param bool $all If disabled will give the number of cores available for the current process + * only. This is disabled by default as it is known to be "buggy" on virtual + * environments as the virtualization tool, e.g. VMWare, might over-commit + * resources by default. + */ + public function __construct( + bool $all = false, + ?ProcessExecutor $executor = null + ) { + parent::__construct($executor); + + $this->all = $all; + } + + public function toString(): string + { + return sprintf( + 'NProcFinder(all=%s)', + $this->all ? 'true' : 'false' + ); + } + + protected function getCommand(): string + { + return 'nproc'.($this->all ? ' --all' : ''); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php new file mode 100644 index 000000000..9143e31cd --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +/** + * Find the number of logical CPU cores for FreeSBD, Solaris and the likes. + * + * @see https://twitter.com/freebsdfrau/status/1052016199452700678?s=20&t=M2pHkRqmmna-UF68lfL2hw + */ +final class NProcessorFinder extends ProcOpenBasedFinder +{ + protected function getCommand(): string + { + return 'getconf NPROCESSORS_ONLN'; + } + + public function toString(): string + { + return 'NProcessorFinder'; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php new file mode 100644 index 000000000..50af2d4d8 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +/** + * This finder returns whatever value you gave to it. This is useful for testing. + */ +final class NullCpuCoreFinder implements CpuCoreFinder +{ + public function diagnose(): string + { + return 'Will return "null".'; + } + + public function find(): ?int + { + return null; + } + + public function toString(): string + { + return 'NullCpuCoreFinder'; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php new file mode 100644 index 000000000..d36d03051 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function getenv; +use function sprintf; + +final class OnlyInPowerShellFinder implements CpuCoreFinder +{ + /** + * @var CpuCoreFinder + */ + private $decoratedFinder; + + public function __construct(CpuCoreFinder $decoratedFinder) + { + $this->decoratedFinder = $decoratedFinder; + } + + public function diagnose(): string + { + $powerShellModulePath = getenv('PSModulePath'); + + return $this->skip() + ? sprintf( + 'Skipped; no power shell module path detected ("%s").', + $powerShellModulePath + ) + : $this->decoratedFinder->diagnose(); + } + + public function find(): ?int + { + return $this->skip() + ? null + : $this->decoratedFinder->find(); + } + + public function toString(): string + { + return sprintf( + 'OnlyInPowerShellFinder(%s)', + $this->decoratedFinder->toString() + ); + } + + private function skip(): bool + { + return false === getenv('PSModulePath'); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php new file mode 100644 index 000000000..314780839 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function implode; +use function sprintf; +use const PHP_OS_FAMILY; + +final class OnlyOnOSFamilyFinder implements CpuCoreFinder +{ + /** + * @var list + */ + private $skippedOSFamilies; + + /** + * @var CpuCoreFinder + */ + private $decoratedFinder; + + /** + * @param string|list $skippedOSFamilyOrFamilies + */ + public function __construct( + $skippedOSFamilyOrFamilies, + CpuCoreFinder $decoratedFinder + ) { + $this->skippedOSFamilies = (array) $skippedOSFamilyOrFamilies; + $this->decoratedFinder = $decoratedFinder; + } + + public static function forWindows(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Windows', + $decoratedFinder + ); + } + + public static function forBSD(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'BSD', + $decoratedFinder + ); + } + + public static function forDarwin(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Darwin', + $decoratedFinder + ); + } + + public static function forSolaris(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Solaris', + $decoratedFinder + ); + } + + public static function forLinux(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Linux', + $decoratedFinder + ); + } + + public function diagnose(): string + { + return $this->skip() + ? sprintf( + 'Skipped platform detected ("%s").', + PHP_OS_FAMILY + ) + : $this->decoratedFinder->diagnose(); + } + + public function find(): ?int + { + return $this->skip() + ? null + : $this->decoratedFinder->find(); + } + + public function toString(): string + { + return sprintf( + 'OnlyOnOSFamilyFinder(only=(%s),%s)', + implode(',', $this->skippedOSFamilies), + $this->decoratedFinder->toString() + ); + } + + private function skip(): bool + { + return !in_array(PHP_OS_FAMILY, $this->skippedOSFamilies, true); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php new file mode 100644 index 000000000..4d51f898d --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use Fidry\CpuCoreCounter\Executor\ProcessExecutor; +use Fidry\CpuCoreCounter\Executor\ProcOpenExecutor; +use function filter_var; +use function function_exists; +use function is_int; +use function sprintf; +use function trim; +use const FILTER_VALIDATE_INT; +use const PHP_EOL; + +abstract class ProcOpenBasedFinder implements CpuCoreFinder +{ + /** + * @var ProcessExecutor + */ + private $executor; + + public function __construct(?ProcessExecutor $executor = null) + { + $this->executor = $executor ?? new ProcOpenExecutor(); + } + + public function diagnose(): string + { + if (!function_exists('proc_open')) { + return 'The function "proc_open" is not available.'; + } + + $command = $this->getCommand(); + $output = $this->executor->execute($command); + + if (null === $output) { + return sprintf( + 'Failed to execute the command "%s".', + $command + ); + } + + [$stdout, $stderr] = $output; + $failed = '' !== trim($stderr); + + return $failed + ? sprintf( + 'Executed the command "%s" which wrote the following output to the STDERR:%s%s%sWill return "null".', + $command, + PHP_EOL, + $stderr, + PHP_EOL + ) + : sprintf( + 'Executed the command "%s" and got the following (STDOUT) output:%s%s%sWill return "%s".', + $command, + PHP_EOL, + $stdout, + PHP_EOL, + $this->countCpuCores($stdout) ?? 'null' + ); + } + + /** + * @return positive-int|null + */ + public function find(): ?int + { + $output = $this->executor->execute($this->getCommand()); + + if (null === $output) { + return null; + } + + [$stdout, $stderr] = $output; + $failed = '' !== trim($stderr); + + return $failed + ? null + : $this->countCpuCores($stdout); + } + + /** + * @internal + * + * @return positive-int|null + */ + protected function countCpuCores(string $process): ?int + { + $cpuCount = filter_var($process, FILTER_VALIDATE_INT); + + return is_int($cpuCount) && $cpuCount > 0 ? $cpuCount : null; + } + + abstract protected function getCommand(): string; +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php new file mode 100644 index 000000000..66a50164f --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function implode; +use function in_array; +use function sprintf; + +final class SkipOnOSFamilyFinder implements CpuCoreFinder +{ + /** + * @var list + */ + private $skippedOSFamilies; + + /** + * @var CpuCoreFinder + */ + private $decoratedFinder; + + /** + * @param string|list $skippedOSFamilyOrFamilies + */ + public function __construct( + $skippedOSFamilyOrFamilies, + CpuCoreFinder $decoratedFinder + ) { + $this->skippedOSFamilies = (array) $skippedOSFamilyOrFamilies; + $this->decoratedFinder = $decoratedFinder; + } + + public static function forWindows(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Windows', + $decoratedFinder + ); + } + + public static function forBSD(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'BSD', + $decoratedFinder + ); + } + + public static function forDarwin(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Darwin', + $decoratedFinder + ); + } + + public static function forSolaris(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Solaris', + $decoratedFinder + ); + } + + public static function forLinux(CpuCoreFinder $decoratedFinder): self + { + return new self( + 'Linux', + $decoratedFinder + ); + } + + public function diagnose(): string + { + return $this->skip() + ? sprintf( + 'Skipped platform detected ("%s").', + PHP_OS_FAMILY + ) + : $this->decoratedFinder->diagnose(); + } + + public function find(): ?int + { + return $this->skip() + ? null + : $this->decoratedFinder->find(); + } + + public function toString(): string + { + return sprintf( + 'SkipOnOSFamilyFinder(skip=(%s),%s)', + implode(',', $this->skippedOSFamilies), + $this->decoratedFinder->toString() + ); + } + + private function skip(): bool + { + return in_array(PHP_OS_FAMILY, $this->skippedOSFamilies, true); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php new file mode 100644 index 000000000..b223652b1 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function array_filter; +use function count; +use function explode; +use const PHP_EOL; + +/** + * Find the number of logical CPU cores for Windows. + * + * @see https://knowledge.informatica.com/s/article/151521 + */ +final class WindowsRegistryLogicalFinder extends ProcOpenBasedFinder +{ + protected function getCommand(): string + { + return 'reg query HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor'; + } + + public function toString(): string + { + return 'WindowsRegistryLogicalFinder'; + } + + protected function countCpuCores(string $process): ?int + { + $count = count( + array_filter( + explode(PHP_EOL, $process), + static function (string $line): bool { + return '' !== trim($line); + } + ) + ); + + return $count > 0 ? $count : null; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php new file mode 100644 index 000000000..db576a640 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function preg_match; + +/** + * Find the number of logical CPU cores for Windows. + * + * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L912-L916 + */ +final class WmicLogicalFinder extends ProcOpenBasedFinder +{ + private const CPU_CORE_COUNT_REGEX = '/NumberOfLogicalProcessors[\s\n]+(?\d+)/'; + + protected function getCommand(): string + { + return 'wmic cpu get NumberOfLogicalProcessors'; + } + + public function toString(): string + { + return 'WmicLogicalFinder'; + } + + protected function countCpuCores(string $process): ?int + { + if (0 === preg_match(self::CPU_CORE_COUNT_REGEX, $process, $matches)) { + return parent::countCpuCores($process); + } + + $count = $matches['count']; + + return parent::countCpuCores($count); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php new file mode 100644 index 000000000..140b9fdb5 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +use function preg_match; + +/** + * Find the number of physical CPU cores for Windows. + * + * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L912-L916 + */ +final class WmicPhysicalFinder extends ProcOpenBasedFinder +{ + private const CPU_CORE_COUNT_REGEX = '/NumberOfCores[\s\n]+(?\d+)/'; + + protected function getCommand(): string + { + return 'wmic cpu get NumberOfCores'; + } + + public function toString(): string + { + return 'WmicPhysicalFinder'; + } + + protected function countCpuCores(string $process): ?int + { + if (0 === preg_match(self::CPU_CORE_COUNT_REGEX, $process, $matches)) { + return parent::countCpuCores($process); + } + + $count = $matches['count']; + + return parent::countCpuCores($count); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php b/vendor/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php new file mode 100644 index 000000000..23f452e44 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter\Finder; + +/** + * Find the number of logical CPU cores for Linux and the likes. + * + * @see https://twitter.com/freebsdfrau/status/1052016199452700678?s=20&t=M2pHkRqmmna-UF68lfL2hw + */ +final class _NProcessorFinder extends ProcOpenBasedFinder +{ + protected function getCommand(): string + { + return 'getconf _NPROCESSORS_ONLN'; + } + + public function toString(): string + { + return '_NProcessorFinder'; + } +} diff --git a/vendor/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php b/vendor/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php new file mode 100644 index 000000000..e54f89315 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter; + +use RuntimeException; + +final class NumberOfCpuCoreNotFound extends RuntimeException +{ + public static function create(): self + { + return new self( + 'Could not find the number of CPU cores available.' + ); + } +} diff --git a/vendor/fidry/cpu-core-counter/src/ParallelisationResult.php b/vendor/fidry/cpu-core-counter/src/ParallelisationResult.php new file mode 100644 index 000000000..1f2943493 --- /dev/null +++ b/vendor/fidry/cpu-core-counter/src/ParallelisationResult.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Fidry\CpuCoreCounter; + +/** + * @readonly + */ +final class ParallelisationResult +{ + /** + * @var positive-int|0 + */ + public $passedReservedCpus; + + /** + * @var non-zero-int|null + */ + public $passedCountLimit; + + /** + * @var float|null + */ + public $passedLoadLimit; + + /** + * @var float|null + */ + public $passedSystemLoadAverage; + + /** + * @var non-zero-int|null + */ + public $correctedCountLimit; + + /** + * @var float|null + */ + public $correctedSystemLoadAverage; + + /** + * @var positive-int + */ + public $totalCoresCount; + + /** + * @var positive-int + */ + public $availableCpus; + + /** + * @param positive-int|0 $passedReservedCpus + * @param non-zero-int|null $passedCountLimit + * @param non-zero-int|null $correctedCountLimit + * @param positive-int $totalCoresCount + * @param positive-int $availableCpus + */ + public function __construct( + int $passedReservedCpus, + ?int $passedCountLimit, + ?float $passedLoadLimit, + ?float $passedSystemLoadAverage, + ?int $correctedCountLimit, + ?float $correctedSystemLoadAverage, + int $totalCoresCount, + int $availableCpus + ) { + $this->passedReservedCpus = $passedReservedCpus; + $this->passedCountLimit = $passedCountLimit; + $this->passedLoadLimit = $passedLoadLimit; + $this->passedSystemLoadAverage = $passedSystemLoadAverage; + $this->correctedCountLimit = $correctedCountLimit; + $this->correctedSystemLoadAverage = $correctedSystemLoadAverage; + $this->totalCoresCount = $totalCoresCount; + $this->availableCpus = $availableCpus; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md b/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md index 1ddea4295..3dc0d43e7 100644 --- a/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md +++ b/vendor/friendsofphp/php-cs-fixer/CHANGELOG.md @@ -3,6 +3,932 @@ CHANGELOG for PHP CS Fixer This file contains changelogs for stable releases only. +Changelog for v3.75.0 +--------------------- + +* feat: `ClassAttributesSeparationFixer` - add support for asymmetric visibility (#8518) +* fix: `NativeFunctionInvocationFixer` - fix for property hooks (#8540) +* chore: add return types for data providers for fixers (#8542) +* chore: add return types for data providers for non-fixers (#8543) +* chore: add return types for remaining data providers (#8544) +* chore: make data providers key type `int` if all the keys are strings (#8550) +* chore: make data providers key type `string` if all the keys are strings (#8545) +* chore: SwitchContinueToBreakFixerTest - improve test case descriptions/typehint (#8546) +* chore: `FunctionsAnalyzerTest` cleanup (#8539) +* deps: bump the phpstan group in /dev-tools with 2 updates (#8537) +* test: ProjectCodeTest::testDataProvidersDeclaredReturnType - allow for int as iterable keys (#8548) + +Changelog for v3.74.0 +--------------------- + +* feat: add `--format=@auto` (#8513) +* fix: `BracesPositionFixer` - do not create two consecutive whitespace tokens (#8496) +* fix: `MbStrFunctionsFixer` - fix imports with leading backslash (#8507) +* fix: `NoUnreachableDefaultArgumentValueFixer` - do not crash on property hook (#8512) +* fix: `OrderedImportsFixer` - do not take the braces part in grouped imports into account (#8459) +* fix: `OrderedImportsFixer` - fix syntax error with grouped use statement and multiple use with comma (#8483) +* fix: `PhpUnitAttributesFixer` - handle parentheses after data provider method name (#8510) +* fix: `PhpUnitMethodCasingFixer` - do not touch anonymous class (#8463) +* chore: make options that have default and allowed sets the same size the same array (#8529) +* chore: update return type of `FixerOptionInterface::getAllowedValues` (#8530) +* chore: `Preg` - improve types (#8527) +* CI: fix code coverage job (#8520) +* CI: try MacOS job without ParaUnit (#8528) +* deps: update PHPStan (#8531) +* deps: upgrade `PHPStan/*` (#8524) + +Changelog for v3.73.1 +--------------------- + +* fix: `OrderedClassElementsFixer` - do not crash on property hook (#8517) + +Changelog for v3.73.0 +--------------------- + +* feat: add support for asymmetric visibility to Doctrine's fixers (#8415) +* fix: `GeneralPhpdocTagRenameFixer` - do not rename keys in array shape definition (#8477) +* fix: `MethodArgumentSpaceFixer` - handle when nested in HTML (#8503) +* chore: update `checkbashisms` to 2.25.5 (#8519) +* DX: cleanup `NoExtraBlankLinesFixerTest` (#8505) +* DX: for duplicated test methods check methods without parameters (#8508) +* DX: remove more duplicated test methods (#8506) +* refactor: `Tokenizer` hash metode using `xxHash` (#8491) +* refactor: `TokensAnalyzerTest` - better test `isArray` and `isArrayMultiLine` (#8504) +* test: run code coverage on PHP 8.4 (#8448) + +Changelog for v3.72.0 +--------------------- + +* feat: `StatementIndentationFixer` - handle property hooks (#8492) +* fix: `MbStrFunctionsFixer` - fix imports (#8474) +* fix: `TrailingCommaInMultilineFixer` - handle empty match body (#8480) +* fix: `VisibilityRequiredFixer` - handle property hooks (#8495) +* deps: upgrade few dev-deps (#8490) +* deps: Upgrade PHPStan to 2.1.8 (#8489) +* DX: add trailing comma to multiline auto-generated types (#8499) +* refactor: generalize CodeHasher into Hasher (#8500) +* refactor: Runner - unify paths used when using parallel runner (#8488) +* refactor: use Hasher instead of md5 directly (#8501) + +Changelog for v3.71.0 +--------------------- + +* feat: OrderedImportsFixer - deprecate length sorting algorithm (#8473) +* fix: `BinaryOperatorSpacesFixer` - do not break alignment of UTF-8 array keys (#8484) +* fix: `PhpdocAlignFixer` - align correctly type with UTF8 characters (#8486) +* fix: `SingleSpaceAroundConstructFixer` - handle alternative syntax (#8317) +* fix: `StatementIndentationFixer` - return in braceless if (#8479) +* chore: update type in `SingleSpaceAroundConstructFixerTest::provideFixWithElseIfCases` (#8481) +* chore: update type in `SingleSpaceAroundConstructFixerTest::provideFixWithIfCases` (#8482) +* deps: bump phpstan/phpstan from 2.1.6 to 2.1.7 in /dev-tools in the phpstan group (#8485) +* DX: cleanup `PhpdocNoAliasTagFixerTest` (#8476) +* refactor: add `FullyQualifiedNameAnalyzer` (#8048) +* refactor: codeHash - update when it's (re-)generated (#8470) +* refactor: `SwitchAnalyzer` - improve performance (#8407) +* test: NameQualifiedTransformerTest - correct test case (#8471) + +Changelog for v3.70.2 +--------------------- + +* deps: upgrade deep dev-tools deps (#8472) +* fix: `MbStrFunctionsFixer` must run before `NativeFunctionInvocationFixer` (#8466) +* fix: `MethodArgumentSpaceFixer` - fix nested calls for `ensure_fully_multiline` option (#8469) + +Changelog for v3.70.1 +--------------------- + +* fix: `PhpUnitSizeClassFixer` must run before `PhpUnitAttributesFixer` (#8457) +* DX: cleanup `OrderedImportsFixerTest` (#8458) + +Changelog for v3.70.0 +--------------------- + +* feat: Add `PhpUnitDataProviderMethodOrderFixer` fixer (#8225) +* feat: `HeaderCommentFixer` - allow validators (#8452) +* feat: `PhpCsFixer` ruleset: use `operator_linebreak` rule for all operators (#8417) +* feat: `PhpUnitMethodCasingFixer` to support PHPUnit's `Test` attribute (#8451) +* feat: `TypeDeclarationSpacesFixer` - Fix whitespace between const type and const name (#8442) +* chore: extend bug report template (#8447) +* chore: extend bug report template - more installation options (#8450) +* CI: phpstan-symfony - add entry point for console (#8292) +* deps: bump alpine from 3.21.2 to 3.21.3 (#8454) +* deps: bump phpstan/phpstan from 2.1.5 to 2.1.6 in /dev-tools in the phpstan group (#8453) +* fix: `CommentsAnalyzer` - allow other forms of assignment as valid structural elements for PHPDocs (#8371) +* fix: `PhpUnitTestClassRequiresCoversFixer` must run before `PhpUnitAttributesFixer` (#8444) +* test: fix `CheckCommandTest::testDryRunModeIsUnavailable` to correctly check that option `--dry-run` is unavailable (#8438) + +Changelog for v3.69.1 +--------------------- + +* fix: `PhpUnitAttributesFixer` - convert correctly version constraint (#8439) +* test: `PhpUnitAttributesFixer` must run before `NoEmptyPhpdocFixer` (#8443) + +Changelog for v3.69.0 +--------------------- + +* feat: Add unsealed array shape phpdoc support (#8299) +* fix: `OrderedClassElementsFixer` - sort correctly typed constants (#8408) +* chore: do not use test class as test data (#8430) +* chore: update `checkbashisms` to 2.25.2 (#8427) +* chore: use constants instead of literal strings (#8422) +* CI: no need to unlock deps on master (#8426) +* CI: run tests using PHPUnit 12 (#8431) +* deps: bump kubawerlos/composer-smaller-lock from 1.0.1 to 1.1.0 in /dev-tools (#8414) +* deps: bump maglnet/composer-require-checker from 4.14.0 to 4.15.0 in /dev-tools (#8406) +* deps: bump phpstan/phpstan from 2.1.3 to 2.1.5 in /dev-tools in the phpstan group (#8437) +* deps: bump the phpstan (#8423) +* deps: upgrade dev requirements (#8424) + +Changelog for v3.68.5 +--------------------- + +* fix: `NativeTypeDeclarationCasingFixer` - do not touch constants named as native types (#8404) + +Changelog for v3.68.4 +--------------------- + +* chore: run SCA on PHP 8.4 (#8396) +* fix: NativeTypeDeclarationCasingFixer should not touch property names (#8400) + +Changelog for v3.68.3 +--------------------- + +* fix: `NativeTypeDeclarationCasingFixer` - fix for enum with "Mixed" case (#8395) + +Changelog for v3.68.2 +--------------------- + +* fix: `NativeTypeDeclarationCasingFixer` - fix for promoted properties, enums, `false` and `mixed` (#8386) +* chore: ensure that `dev-tools` dependencies are bumped (#8389) +* chore: experiment to see if we can auto-shrink the lock after dependabot (#8383) +* chore: experiment to see if we can auto-shrink the lock after dependabot /part (#8384) +* chore: Get rid of Docker warnings during build (#8379) +* chore: remove redundant check (#8391) +* chore: update types (#8390) +* CI: stale - update close msg to emphasize contribution over demand (#8385) +* deps: bump phpcompatibility/phpcompatibility-symfony from 1.2.1 to 1.2.2 in /dev-tools (#8378) +* deps: bump the phpstan group in /dev-tools with 4 updates (#8387) +* refactor: Use native `Yaml::parseFile()` instead of custom method (#8380) + +Changelog for v3.68.1 +--------------------- + +* chore: `AutoReview/CiConfigurationTest` - handle failure of reading files (#8375) +* CI: `Docker` - check all `compose` services (#8370) +* deps: bump alpine from 3.18 to 3.21 (#8377) +* deps: bump alpine from 3.18.4 to 3.21.2 (#8362) +* refactor: Tokens::clearEmptyTokens - optimize cache handling (#8335) + +Changelog for v3.68.0 +--------------------- + +* feat: `ModernizeStrposFixer` - support `stripos` (#8019) +* chore: `FullyQualifiedStrictTypesFixer` - reduce conditions count (#8368) +* test: `PhpUnitSetUpTearDownVisibilityFixer` - extend test for anonymous classes (#8369) + +Changelog for v3.67.1 +--------------------- + +* fix: `FullyQualifiedStrictTypesFixer` - fix return types (#8367) +* fix: `PhpUnitSetUpTearDownVisibilityFixer` - do not touch anonymous classes (#8366) +* chore: allow for class-string in doc types of rule options (#8358) +* chore: CS: Move data provider methods after their test method (#8302) +* chore: dependabot integration (#8357) +* chore: `PHPStan` - upgrade to 2.1 (#8355) +* CI: Introduce PHP compatibility check (#7844) +* deps: bump docker/build-push-action from 5 to 6 (#8361) +* docs: update installation instructions (#8356) + +Changelog for v3.67.0 +--------------------- + +* chore: simplify loops using `end`/`prev` functions (#8352) +* feat: Introduce `general_attribute_remove` fixer (#8339) + +Changelog for v3.66.2 +--------------------- + +* chore: do not use bitwise "or" assignment operator (#8346) +* chore: remove extra check, never happening (#8348) +* chore: remove impossible `@throws` annotation (#8353) +* chore: Tokens - cleanup (#8350) +* chore: Tokens - minor performance and types optimizations (#8349) + +Changelog for v3.66.1 +--------------------- + +* chore: fix CI for Windows (#8326) +* chore: `NoMultipleStatementsPerLineFixer` - be aware of PHP 8.4 property hooks (#8344) +* chore: `TernaryToElvisOperatorFixer` - improvements based on PHPStan detections (#8345) +* chore: `PhpUnitTestCaseStaticMethodCallsFixer` - fix type of `methods` option in documemtation and add example with it (#8338) +* chore: update legacy deps (#8342) +* deps: update box (#8336) + +Changelog for v3.66.0 +--------------------- + +* feat: `Tokenizer` - initial support for PHP 8.4 property hooks (#8312) +* feat: `PhpUnitTestCaseStaticMethodCallsFixer` - cover PHPUnit v11.5 methods (#8314) +* feat: `PhpUnitTestCaseStaticMethodCallsFixer` - make sure all static protected methods are handled (#8327) +* feat: `PhpUnitTestCaseStaticMethodCallsFixer` - support createStub (#8319) +* feat: `UseArrowFunctionsFixer` - support multiline statements (#8311) +* fix: `NullableTypeDeclarationFixer` - do not break multi-line declaration (#8331) +* test: `CiConfigurationTest` - drop not needed condition, logic is checked in upcoming assertion (#8303) +* chore: add more typehints (#8325) +* chore: `DotsOutput` - more const, better typing (#8318) +* chore: mark classes as readonly (#8275) +* chore: more const, better typing (#8320) +* chore: temporarily prevent symfony/process 7.2+ (#8322) +* chore: `Tokens` - simplify (un)registerFoundToken types (#8328) +* chore: upgrade PHPStan (#8321) +* chore: `BraceTransformer` - don't touch curly index braces since 8.4, as it's not a valid syntax anymore (#8313) +* CI: enable phpdoc_to_property_type on php-lowest (#8324) +* Create SECURITY.md +* docs: `Tokens` - fix docs (#8332) + +Changelog for v3.65.0 +--------------------- + +* feat: Ability to set upper limit when using CPU auto-detection (#8280) +* feat: create `@PHP82Migration:risky` ruleset (#8277) +* feat: Impl. TypeExpression::mapTypes() (#8077) +* feat: Parse array/generic/nullable type into inner expression (#8106) +* feat: phpdoc_to_property_type - handle virtual types and null initialization, enable in php-highest CI job (#8283) +* feat: Store PHPDoc offset in `DataProviderAnalysis` (#8226) +* feat: Support for complex PHPDoc types in `fully_qualified_strict_types` (#8085) +* fix: check for priority tests correctly (#8221) +* fix: Do not mark with `@coversNothing` if `CoversMethod`/`CoversFunction` attribute is used (#8268) +* fix: enum-case mistaken for const invocation (#8190) +* fix: fix typing of few properties wrongly typed as non-nullable (#8285) +* fix: fix typing property wrongly typed as non-nullable (#8290) +* fix: MethodChainingIndentationFixer does not fix indentation of last chained property (#8080) +* fix: NoSuperfluousPhpdocTagsFixer - Remove superfluous phpdoc of parameter with attribute (#8237) +* fix: parsing mixed `&` and `|` in `TypeExpression` (#8210) +* fix: proper base class used for AbstractDoctrineAnnotationFixer templates generation (#8291) +* fix: Properly recognise constants in foreach loops (#8203) +* fix: Tokens::overrideRange() block cache pruning (#8240) +* fix: `BlankLineAfterOpeningTagFixer` - add blank line in file starting with multi-line comment (#8256) +* fix: `MultilineWhitespaceBeforeSemicolonsFixer` - do not produce syntax error when there is a meaningful token after semicolon (#8230) +* fix: `NullableTypeDeclarationFixer` - do not break syntax when there is no space before `?` (#8224) +* fix: `PhpUnitDataProvider(.+)Fixer` - do not omit when there is an attribute between PHPDoc and test method (#8185) +* fix: `PhpUnitDataProviderNameFixer` - for an attribute between PHPDoc and test method (#8217) +* chore: add todo for PHP v8 (#8274) +* chore: auto-fallback to sequential runner if single CPU would handle it (#8154) +* chore: block changing tokens collection size using `PhpCsFixer\Tokenizer\Tokens::setSize` (#8257) +* chore: bump dev-tools (#8286) +* chore: bump PHPStan (#8245) +* chore: Cheaper file check first (#8252) +* chore: ConfigInterface - better types (#8244) +* chore: do not call `Tokens::setSize` in `GroupImportFixer` (#8253) +* chore: do not use `Reflection*::setAccessible` (#8264) +* chore: fix priority tests (#8223) +* chore: Fix typos in AbstractFixerTestCase (#8247) +* chore: GithubClient - make URL injectable (#8272) +* chore: Implement PHPStan `Preg::match()` extensions (#8103) +* chore: mark remaining Analysis as `@internal` (#8284) +* chore: PHPStan - upgrade to v2 (#8288) +* chore: reduce amount of class mutable properties (#8281) +* chore: remove from priority tests exceptions tests that are not actually exceptions (#8222) +* chore: remove incorrect priority tests (#8231) +* chore: remove not needed PHP version requirements in descriptions (#8265) +* chore: remove unnecessary methods (#8200) +* chore: tests/Tokenizer/Transformer - better typehinting (#8243) +* chore: Token - remove 'changed' property (#8273) +* chore: Token::getContent() phpdoc return type (#8236) +* chore: update dev dependencies in root (#8289) +* chore: update PHPStan to 1.12.9 (#8271) +* chore: update `checkbashisms` to 2.24.1 (#8258) +* chore: use null coalescing assignment operator where possible (#8219) +* CI: allow macos to fail (#8194) +* CI: build phar on PHP 8.3 (#8195) +* CI: drop matrix for single-matrix-entry jobs of SCA and Deployment checks (#8193) +* CI: Ensure php-cs-fixer PHP compatibility /part (#8241) +* CI: Ensure `php-cs-fixer` PHP compatibility (#8235) +* CI: generate and execute code in `assert` (#8207) +* CI: update PHPStan to 1.12.2 (#8198) +* CI: update PHPStan to 1.12.3 (#8204) +* CI: use phpstan-symfony (#8287) +* depr: ConfigInterface::getPhpExecutable() and ConfigInterface::setPhpExecutable() (#8192) +* deps: add `composer-smaller-lock` (#8263) +* deps: Update PHPStan to 1.12.4 (#8215) +* deps: Update PHPStan to 1.12.5 (#8218) +* deps: update PHPStan to 1.12.7 (#8255) +* docs: fix unconsistency in config doc (#8269) +* docs: mention github action example instead of travis-ci (#8250) +* DX: Cover `php-cs-fixer` file with static analysis (#8229) +* DX: Make `TypeExpression` API more explicit about composite types (#8214) +* refactor: change `_AttributeItems` to `non-empty-list<_AttributeItem>` to allow using single attribute item (#8199) +* refactor: Rename newly introduced option (#8293) +* refactor: Runner - Enhance eventing system (#8276) +* refactor: Runner - make 4.0 TODOs easier to understand (#8196) +* refactor: use arrow functions in more places (#8294) +* test: `@PHP82Migration:risky` - add integration tests (#8278) + +Changelog for v3.64.0 +--------------------- + +* feat: Symfony - adjust configuration for sets (#8188) +* feat: Symfony.trailing_comma_in_multiline - adjust configuration (#8161) +* feat: Update PSR2, PSR12 and PER-CS2 with `single_space_around_construct` config (#8171) +* CI: Update PHPStan to 1.12.0 and fix the error that appeared (#8184) + +Changelog for v3.63.2 +--------------------- + +* fix: `FullyQualifiedStrictTypesFixer` - reset cache even if there is no `use` (#8183) + +Changelog for v3.63.1 +--------------------- + +* dummy release + +Changelog for v3.63.0 +--------------------- + +* feat: Add `array_destructuring` as option for `trailing_comma_in_multiline` (#8172) +* feat: remove braces even for single import (#8156) +* feat: TrailingCommaInMultilineFixer - dynamically evaluate config against PHP version (#8167) +* fix: Do not shorten FQN for class resolution if imported symbol is not a class (#7705) +* fix: Ensure PHP binary path is used as a single CLI argument in parallel worker process (#8180) +* fix: `PhpUnitAttributesFixer` - fix priorities with `PhpUnitDataProvider(.+)Fixer` (#8169) +* chore: add tags for data providers that will change PHPStan's baseline (#8178) +* chore: add `@return` tags for data providers already having PHPDoc (#8176) +* chore: add `@return` tags for data providers that do not have array in data (#8179) +* chore: remove duplicates from data providers (#8164) +* chore: remove duplicates from data providers that are copies in code (#8145) +* chore: remove `beStrictAboutTodoAnnotatedTests` from PHPUnit's config (#8160) +* CI: Update PHPStan to 1.11.10 (#8163) +* CI: Update PHPStan to 1.11.11 and fix error that changed (#8174) +* docs: fix indent on rule `date_time_create_from_format_call` (#8173) + +Changelog for v3.62.0 +--------------------- + +* feat: set new_with_parentheses for anonymous_class to false in PER-CS2.0 (#8140) +* chore: NewWithParenthesesFixer - create TODO to change the default configuration to match PER-CS2 (#8148) + +Changelog for v3.61.1 +--------------------- + +* fix: `NoSuperfluousPhpdocTagsFixer` - fix "Undefined array key 0" error (#8150) + +Changelog for v3.61.0 +--------------------- + +* feat: no_superfluous_phpdoc_tags - also cover ?type (#8125) +* feat: support PHPUnit v9.1 naming for some asserts (#7997) +* fix: Do not mangle non-whitespace token in `PhpdocIndentFixer` (#8147) +* DX: add more typehints for `class-string` (#8139) +* DX: refactor `ProjectCodeTest::provideDataProviderMethodCases` (#8138) + +Changelog for v3.60.0 +--------------------- + +* feat: Add sprintf in the list of compiler optimized functions (#8092) +* feat: `PhpUnitAttributesFixer` - add option to keep annotations (#8090) +* chore: cleanup tests that had `@requires PHP 7.4` ages ago (#8122) +* chore: cleanup `TokensAnalyzerTest` (#8123) +* chore: fix example issue reported by reportPossiblyNonexistentGeneralArrayOffset from PHPStan (#8089) +* chore: NoSuperfluousPhpdocTagsFixer - no need to call heavy toComparableNames method to add null type (#8132) +* chore: PHPStan 11 array rules (#8011) +* chore: PhpUnitSizeClassFixerTest - solve PHP 8.4 issues (#8105) +* chore: reduce PHPStan errors in PhpUnitAttributesFixer (#8091) +* chore: reuse test methods (#8119) +* CI: check autoload (#8121) +* CI: Update PHPStan to 1.11.8 (#8133) +* deps: upgrade dev-tools (#8102) +* DX: check for duplicated test data (#8131) +* DX: check for duplicated test methods (#8124) +* DX: check for duplicated test methods (as AutoReview test) (#8134) +* DX: do not exclude duplicates that are clearly mistakes (#8135) +* DX: Dump `offsetAccess.notFound` errors to baseline (#8107) +* fix: Better way of walking types in `TypeExpression` (#8076) +* fix: CI for PHP 8.4 (#8114) +* fix: update `TokensTest` to shrink PHPStan's baseline (#8112) +* fix: `no_useless_concat_operator` - do not break variable (2) (#7927) +* fix: `NullableTypeDeclarationFixer` - don't convert standalone `null` into nullable union type (#8098) +* fix: `NullableTypeDeclarationFixer` - don't convert standalone `NULL` into nullable union type (#8111) +* fix: `NullableTypeDeclarationFixer` - insert correct token (#8118) +* fix: `PhpUnitAttributesFixer` - handle multiple annotations of the same name (#8075) + +Changelog for v3.59.3 +--------------------- + +* refactor: refactor to templated trait+interface (#7988) + +Changelog for v3.59.2 +--------------------- + +* fix: "list" is reserved type (#8087) +* chore: add missing type in method prototype (#8088) +* CI: bump Ubuntu version (#8086) +* deps: bump infection to unblock PHPUnit 11, and few more as chore (#8083) + +Changelog for v3.59.1 +--------------------- + +* fix: Bump React's JSON decoder buffer size (#8068) +* docs: options - handle enums in dicts (#8082) + +Changelog for v3.59.0 +--------------------- + +* feat(Docker): Multi-arch build (support for `arm64`) (#8079) +* feat: `@PhpCsFixer` ruleset - normalise implicit backslashes in single quoted strings (#7965) +* feat: `SimpleToComplexStringVariableFixer` - support variable being an array (#8064) +* fix: Look up for PHPDoc's variable name by only chars allowed in the variables (#8062) +* fix: Update `PhpUnitTestCaseStaticMethodCallsFixer::STATIC_METHODS` (#8073) +* fix: `native_constant_invocation` - array constants with native constant names (#8008) +* chore: update PHPStan (#8060) +* CI: Update PHPStan to 1.11.4 (#8074) +* docs: don't expose list as config type for dicts (#8081) +* docs: Make wording in `final_class` docs less dismissive (#8065) +* docs: Update 1-bug_report.yml (#8067) +* DX: Remove version from Docker Compose files (#8061) + +Changelog for v3.58.1 +--------------------- + +* fix: `ConstantCaseFixer` - do not change class constant usages (#8055) +* fix: `PhpUnitTestClassRequiresCoversFixer` - do not add annotation when attribute with leading slash present (#8054) + +Changelog for v3.58.0 +--------------------- + +* chore(doc): Use FQCN for parallel config in documentation (#8029) +* chore: fix typo in `PhpUnitTestClassRequiresCoversFixerTest` (#8047) +* chore: RandomApiMigrationFixer - do not modify configuration property (#8033) +* chore: Tokens::setCode - further improvements to cache (#8053) +* chore: update PHPStan (#8045) +* docs: Add missing imports in a cookbook about creating custom rules (#8031) +* docs: fix deprecated string interpolation style (#8036) +* docs: global_namespace_import - simplify allowed config types (#8023) +* feat(GroupImportFixer): Ability to configure which type of imports should be grouped (#8046) +* fix: clear `Tokens::$blockStartCache` and `Tokens::$blockEndCache` when calling `Tokens::setCode` (#8051) +* fix: correctly handle PHP closing tag with `simplified_null_return` (#8049) +* fix: `ConstantCaseFixer` - do not change namespace (#8004) +* fix: `PhpUnitAttributesFixer` - do not add attribute if already present (#8043) +* fix: `PhpUnitSizeClassFixer` - do not add annotation when there are attributes (#8044) +* fix: `PhpUnitTestClassRequiresCoversFixer` - attribute detection when class is `readonly` (#8042) + +Changelog for v3.57.2 +--------------------- + +* docs: better ConfigurableFixer allowed types (#8024) +* docs: Improve Docker usage example (#8021) +* feat: Report used memory to 2 decimal digits only (#8017) +* fix: Support named args in `ParallelConfigFactory::detect()` (#8026) +* fix: `php_unit_test_class_requires_covers` Attribute detection when class is final (#8016) + +Changelog for v3.57.1 +--------------------- + +* chore: update PHPDoc in `Preg::matchAll` (#8012) +* fix: Runner - handle no files while in parallel runner (#8015) + +Changelog for v3.57.0 +--------------------- + +* feat: Ability to run Fixer with parallel runner 🎉 (#7777) + +Changelog for v3.56.2 +--------------------- + +* chore: update PHPStan (#8010) +* DX: Fix Mess Detector violations (#8007) +* DX: Install PCov extension for local Docker (#8006) + +Changelog for v3.56.1 +--------------------- + +* chore: improve PHPDoc typehints (#7994) +* CI: Allow any integer in PHPStan error for Token's constructor (#8000) +* fix: Better array shape in `PhpUnitDedicateAssertFixer` (#7999) +* fix: `ConstantCaseFixer` - do not touch typed constants (#7998) + +Changelog for v3.56.0 +--------------------- + +* feat: `TrailingCommaInMultilineFixer` - handle trailing comma in language constructs (#7989) +* fix: `TrailingCommaInMultilineFixer` - language constructs should be covered by arguments, not parameters (#7990) +* chore: remove invalid comment (#7987) +* DX: Cache optimisation (#7985) + +Changelog for v3.55.0 +--------------------- + +* feat: Introduce `OrderedAttributesFixer` (#7395) +* chore: few SCA fixes and dev-tools update (#7969) +* chore: fix phpdoc types (#7977) +* chore: narrow PHPDoc types (#7979) +* chore: Normalize implicit backslahes in single quoted strings internally (#7786) +* chore: phpdoc - rely on strict list/tuple/assoc instead of array (#7978) +* chore: PhpUnitDataProviderNameFixer - follow config creation pattern (#7980) +* chore: Preg - drop half-support for array-pattern (#7976) +* chore: re-use CodeHasher (#7984) +* chore: RuleSetsTest - assert that Fixer is configurable (#7961) +* chore: sugar syntax (#7986) +* chore: Tokens should be always a list (#7698) +* CI: Ad-hoc fix for MacOS jobs (#7970) +* CI: Fix calculating diff between branches in PRs (#7973) +* DX: allow to enforce cache mechanism by env var (#7983) +* DX: do not typehint fixed-length arrays as lists (#7974) +* DX: Prevent having deprecated fixers listed as successors of other deprecated fixers (#7967) +* DX: Resolve/Ignore PHPStan issues on level 6 + bump to level 7 with new baseline (#7971) +* DX: use `list` type in PHPDoc (#7975) +* fix: `PhpUnitAttributesFixer` - fix for `#[RequiresPhp]` exceeding its constructor parameters (#7966) +* test: don't count comment after class as another classy element (#7982) + +Changelog for v3.54.0 +--------------------- + +* feat: introduce `PhpUnitAttributesFixer` (#7831) +* chore: Properly determine self-approval trigger commit (#7936) +* chore: Revert ref for self-approval Git checkout (#7944) +* CI: check if proper array key is declared (#7912) +* DX: cleanup `FullyQualifiedStrictTypesFixerTest` (#7954) +* DX: cleanup `PhpdocNoAccessFixerTest` (#7933) +* DX: cleanup `PhpUnitMethodCasingFixerTest` (#7948) +* DX: cleanup `PhpUnitStrictFixerTest` (#7938) +* DX: Improve internal dist config for Fixer (#7952) +* DX: Improve issue templates (#7942) +* DX: there is no namespace if there is no PHP code (#7953) +* DX: update .gitattributes (#7931) +* fix: Remove Infection during Docker release (#7937) +* fix: `FullyQualifiedStrictTypesFixer` - do not add imports before PHP opening tag (#7955) +* fix: `PhpUnitMethodCasingFixer` - do not double underscore (#7949) +* fix: `PhpUnitTestClassRequiresCoversFixer` - do not add annotation when there are attributes (#7880) +* test: Ignore PHP version related mutations (#7935) + +Changelog for v3.53.0 +--------------------- + +* chore: Use `list` over `array` in more places (#7905) +* CI: allow for self-approvals for maintainers (#7921) +* CI: Improve Infection setup (#7913) +* CI: no need to trigger enable auto-merge when self-approve (#7929) +* DX: reduce `array_filter` function usages (#7923) +* DX: remove duplicated character from `trim` call (#7930) +* DX: update actions producing warnings (#7925) +* DX: update actions producing warnings (#7928) +* DX: update `phpstan/phpstan-strict-rules` (#7924) +* feat: Add trailing comma in multiline to PER-CS 2.0 (#7916) +* feat: Introduce `AttributeAnalysis` (#7909) +* feat: `@PHP84Migration` introduction (#7774) +* fix: Constant invocation detected in typed constants (#7892) +* fix: `PhpdocArrayTypeFixer` - JIT stack limit exhausted (#7895) +* test: Introduce Infection for mutation tests (#7874) + +Changelog for v3.52.1 +--------------------- + +* fix: StatementIndentationFixer - do not crash on ternary operator in class property (#7899) +* fix: `PhpCsFixer\Tokenizer\Tokens::setSize` return type (#7900) + +Changelog for v3.52.0 +--------------------- + +* chore: fix PHP 8.4 deprecations (#7894) +* chore: fix PHPStan 1.10.60 issues (#7873) +* chore: list over array in more places (#7876) +* chore: replace template with variable in Preg class (#7882) +* chore: update PHPStan (#7871) +* depr: `nullable_type_declaration_for_default_null_value` - deprecate option that is against `@PHP84Migration` (#7872) +* docs: Fix typo (#7889) +* feat: Add support for callable template in PHPDoc parser (#7084) +* feat: Add `array_indentation` to `PER-CS2.0` ruleset (#7881) +* feat: `@Symfony:risky` - add `no_unreachable_default_argument_value` (#7863) +* feat: `PhpCsFixer` ruleset - enable `nullable_type_declaration_for_default_null_value` (#7870) +* fix: Constant invocation detected in DNF types (#7869) +* fix: Correctly indent multiline constants and properties (#7875) +* fix: `no_useless_concat_operator` - do not break variable (#7827) +* fix: `TokensAnalyzer` - handle unary operator in arrow functions (#7862) +* fix: `TypeExpression` - fix "JIT stack limit exhausted" error (#7843) + +Changelog for v3.51.0 +--------------------- + +* chore: add missing tests for non-documentation classes (#7848) +* chore: do not perform type analysis in tests (#7852) +* chore: list over array in more places (#7857) +* chore: tests documentation classes (#7855) +* feat: `@Symfony` - add nullable_type_declaration (#7856) +* test: fix wrong type in param annotation (#7858) + +Changelog for v3.50.0 +--------------------- + +* chore: add missing types (#7842) +* chore: BlocksAnalyzer - raise exception on invalid index (#7819) +* chore: DataProviderAnalysis - expect list over array (#7800) +* chore: do not use `@large` on method level (#7832) +* chore: do not use `@medium` on method level (#7833) +* chore: Fix typos (#7835) +* chore: rename variables (#7847) +* chore: some improvements around array typehints (#7799) +* CI: fix PHP 8.4 job (#7829) +* DX: Include `symfony/var-dumper` in dev tools (#7795) +* feat: Ability to remove unused imports from multi-use statements (#7815) +* feat: allow PHPUnit 11 (#7824) +* feat: Allow shortening symbols from multi-use statements (only classes for now) (#7816) +* feat: introduce `PhpdocArrayTypeFixer` (#7812) +* feat: PhpUnitTestCaseStaticMethodCallsFixer - cover PHPUnit v11 methods (#7822) +* feat: Support for multi-use statements in `NamespaceUsesAnalyzer` (#7814) +* feat: `MbStrFunctionsFixer` - add support for `mb_trim`, `mb_ltrim` and `mb_rtrim` functions (#7840) +* feat: `NoEmptyPhpdocFixer` - do not leave empty line after removing PHPDoc (#7820) +* feat: `no_superfluous_phpdoc_tags` - introduce `allow_future_params` option (#7743) +* fix: do not use wrongly named arguments in data providers (#7823) +* fix: Ensure PCNTL extension is always installed in Docker (#7782) +* fix: PhpdocListTypeFixer - support key types containing `<…>` (#7817) +* fix: Proper build target for local Docker Compose (#7834) +* fix: union PHPDoc support in `fully_qualified_strict_types` fixer (#7719) +* fix: `ExecutorWithoutErrorHandler` - remove invalid PHP 7.4 type (#7845) +* fix: `fully_qualified_strict_types` must honor template/local type identifiers (#7724) +* fix: `MethodArgumentSpaceFixer` - do not break heredoc/nowdoc (#7828) +* fix: `NumericLiteralSeparatorFixer` - do not change `float` to `int` when there is nothing after the dot (#7805) +* fix: `PhpUnitStrictFixer` - do not crash on property having the name of method to fix (#7804) +* fix: `SingleSpaceAroundConstructFixer` - correctly recognise multiple constants (#7700) +* fix: `TypeExpression` - handle array shape key with dash (#7841) + +Changelog for v3.49.0 +--------------------- + +* chore(checkbashisms): update to 2.23.7 (#7780) +* chore: add missing key types in PHPDoc types (#7779) +* chore: Exclude `topic/core` issues/PRs from Stale Bot (#7788) +* chore: `DescribeCommand` - better handling of deprecations (#7778) +* docs: docker - use gitlab reporter in GitLab integration example (#7764) +* docs: docker in CI - don't suggest command that overrides path from config file (#7763) +* DX: check deprecations exactly (#7742) +* feat: Add `ordered_types` to `@Symfony` (#7356) +* feat: introduce `PhpdocListTypeFixer` (#7796) +* feat: introduce `string_implicit_backslashes` as `escape_implicit_backslashes` replacement (#7669) +* feat: update `Symfony.nullable_type_declaration_for_default_null_value` config (#7773) +* feat: `@PhpCsFixer` ruleset - enable `php_unit_data_provider_static` (#7685) +* fix: Allow using cache when running in Docker distribution (#7769) +* fix: ClassDefinitionFixer for anonymous class with phpdoc/attribute on separate line (#7546) +* fix: `ClassKeywordFixer` must run before `FullyQualifiedStrictTypesFixer` (#7767) +* fix: `function_to_constant` `get_class()` replacement (#7770) +* fix: `LowercaseStaticReferenceFixer` - do not change typed constants (#7775) +* fix: `PhpdocTypesFixer` - handle more complex types (#7791) +* fix: `TypeExpression` - do not break type using `walkTypes` method (#7785) + +Changelog for v3.48.0 +--------------------- + +* chore: `FullyQualifiedStrictTypesFixer` must run before `OrderedInterfacesFixer` (#7762) +* docs: Add PHP-CS-Fixer integration in a GitHub Action step (#7757) +* feat: `PhpdocTypesOrderFixer` Support DNF types (#7732) +* fix: Support shebang in fixers operating on PHP opening tag (#7687) +* fix: work correctly for a switch/case with ternary operator (#7756) +* fix: `NoUselessConcatOperatorFixer` - do not remove new line (#7759) + +Changelog for v3.47.1 +--------------------- + +* fix: Do not override short name with relative reference (#7752) +* fix: make `BinaryOperatorSpacesFixer` work as pre-v3.47 (#7751) +* fix: Proper Docker image name suffix (#7739) +* fix: `FullyQualifiedStrictTypesFixer` - do not change case of the symbol when there's name collision between imported class and imported function (#7750) +* fix: `FullyQualifiedStrictTypesFixer` - do not modify statements with property fetch and `::` (#7749) + +Changelog for v3.47.0 +--------------------- + +* chore: better identify EXPERIMENTAL rules (#7729) +* chore: fix issue detected by unlocked PHPStan + upgrade dev-tools (#7678) +* chore: handle extract() (#7684) +* chore: Mention contributors in app info (#7668) +* chore: no need to mark private methods as internal (#7715) +* chore: ProjectCodeTests - dry for function usage extractions (#7690) +* chore: reduce PHPStan baseline (#7644) +* chore: use numeric literal separator for PHP version IDs (#7712) +* chore: use numeric_literal_separator for project (#7713) +* chore: Utils::sortElements - better typing (#7646) +* CI: Allow running Stale Bot on demand (#7711) +* CI: Fix PHP 8.4 (#7702) +* CI: Give write permissions to Stale Bot (#7716) +* CI: Use `actions/stale` v9 (#7710) +* docs: Add information about allowing maintainers to update PRs (#7683) +* docs: CONTRIBUTING.md - update Opening a PR (#7691) +* docs: Display/include tool info/version by default in commands and reports (#7733) +* DX: fix deprecation tests warnings for PHP 7.4 (#7725) +* DX: update `host.docker.internal` in Compose override template (#7661) +* DX: `NumericLiteralSeparatorFixer` - change default strategy to `use_separator` (#7730) +* feat: Add support for official Docker images of Fixer (#7555) +* feat: Add `spacing` option to `PhpdocAlignFixer` (#6505) +* feat: Add `union_types` option to `phpdoc_to_param_type`, `phpdoc_to_property_type`, and `phpdoc_to_return_type` fixers (#7672) +* feat: Introduce `heredoc_closing_marker` fixer (#7660) +* feat: Introduce `multiline_string_to_heredoc` fixer (#7665) +* feat: Introduce `NumericLiteralSeparatorFixer` (#6761) +* feat: no_superfluous_phpdoc_tags - support for arrow function (#7666) +* feat: Simplify closing marker when possible in `heredoc_closing_marker` fixer (#7676) +* feat: Support typed properties and attributes in `fully_qualified_strict_types` (#7659) +* feat: `@PhpCsFixer` ruleset - enable no_whitespace_before_comma_in_array.after_heredoc (#7670) +* fix: Improve progress bar visual layer (#7708) +* fix: indentation of control structure body without braces (#7663) +* fix: make sure all PHP extensions required by PHPUnit are installed (#7727) +* fix: PhpdocToReturnTypeFixerTest - support for arrow functions (#7645) +* fix: Several improvements for `fully_qualified_strict_types` (respect declared symbols, relative imports, leading backslash in global namespace) (#7679) +* fix: SimplifiedNullReturnFixer - support array return typehint (#7728) +* fix: Support numeric values without leading zero in `numeric_literal_separator` (#7735) +* fix: `BinaryOperatorSpacesFixer` - align correctly when multiple shifts occurs in single line (#7593) +* fix: `ClassReferenceNameCasingFixer` capitalizes the property name after the nullsafe operator (#7696) +* fix: `fully_qualified_strict_types` with `leading_backslash_in_global_namespace` enabled - handle reserved types in phpDoc (#7648) +* fix: `NoSpaceAroundDoubleColonFixer` must run before `MethodChainingIndentationFixer` (#7723) +* fix: `no_superfluous_phpdoc_tags` must honor multiline docs (#7697) +* fix: `numeric_literal_separator` - Handle zero-leading floats properly (#7737) +* refactor: increase performance by ~7% thanks to `Tokens::block*Cache` hit increased by ~12% (#6176) +* refactor: Tokens - fast check for non-block in 'detectBlockType', evaluate definitions only once in 'getBlockEdgeDefinitions' (#7655) +* refactor: `Tokens::clearEmptyTokens` - play defensive with cache clearing (#7658) +* test: ensure we do not forget to test any short_open_tag test (#7638) + +Changelog for v3.46.0 +--------------------- + +* chore: fix internal typehints in Tokens (#7656) +* chore: reduce PHPStan baseline (#7643) +* docs: Show class with unit tests and BC promise info (#7667) +* feat: change default ruleset to `@PER-CS` (only behind PHP_CS_FIXER_FUTURE_MODE=1) (#7650) +* feat: Support new/instanceof/use trait in `fully_qualified_strict_types` (#7653) +* fix: FQCN parse phpdoc using full grammar regex (#7649) +* fix: Handle FQCN properly with `leading_backslash_in_global_namespace` option enabled (#7654) +* fix: PhpdocToParamTypeFixerTest - support for arrow functions (#7647) +* fix: PHP_CS_FIXER_FUTURE_MODE - proper boolean validation (#7651) + +Changelog for v3.45.0 +--------------------- + +* feat: Enable symbol importing in `@PhpCsFixer` ruleset (#7629) +* fix: NoUnneededBracesFixer - improve handling of global namespace (#7639) +* test: run tests with "short_open_tag" enabled (#7637) + +Changelog for v3.44.0 +--------------------- + +* feat: Introduce percentage bar as new default progress output (#7603) + +Changelog for v3.43.1 +--------------------- + +* fix: Import only unique symbols' short names (#7635) + +Changelog for v3.43.0 +--------------------- + +* chore: change base of `@Symfony` set to `@PER-CS2.0` (#7627) +* chore: PHPUnit - allow for v10 (#7606) +* chore: Preg - rework catching the error (#7616) +* chore: Revert unneeded peer-dep-pin and re-gen lock file (#7618) +* docs: drop extra note about 8.0.0 bug in README.md (#7614) +* feat: add cast_spaces into `@PER-CS2.0` (#7625) +* feat: Configurable phpDoc tags for FQCN processing (#7628) +* feat: StatementIndentationFixer - introduce stick_comment_to_next_continuous_control_statement config (#7624) +* feat: UnaryOperatorSpacesFixer - introduce only_dec_inc config (#7626) +* fix: FullyQualifiedStrictTypesFixer - better support annotations in inline {} (#7633) +* fix: Improve how FQCN is handled in phpDoc (#7622) +* fix: phpdoc_align - fix multiline tag alignment issue (#7630) + +Changelog for v3.42.0 +--------------------- + +* chore: aim to not rely on internal array pointer but use array_key_first (#7613) +* chore: deprecate Token::isKeyCaseSensitive (#7599) +* chore: deprecate Token::isKeyCaseSensitive, 2nd part (#7601) +* chore: do not check PHP_VERSION_ID (#7602) +* chore: FileFilterIteratorTest - more accurate type in docs (#7542) +* chore: minor code cleanup (#7607) +* chore: more types (#7598) +* chore: PHPDoc key-value spacing (#7592) +* chore: PHPUnit - run defects first (#7570) +* chore: ProjectCodeTest - DRY on Tokens creation (#7574) +* chore: ProjectCodeTest - prepare for symfony/console v7 (#7605) +* chore: ProjectCodeTest::provide*ClassCases to return iterable with key for better tests execution log (#7572) +* chore: ProjectCodeTest::testDataProvidersDeclaredReturnType - use better DataProvider to simplify test logic (#7573) +* chore: TokensAnalyzer - string-enum for better typehinting (#7571) +* chore: unify tests not agnostic of PHP version (#7581) +* chore: use ::class more (#7545) +* CI: Introduce `composer-unused` (#7536) +* DX: add types to anonymous functions (#7561) +* DX: Allow running smoke tests within Docker runtime (#7608) +* DX: check fixer's options for wording (#7543) +* DX: cleanup deprecation message (#7576) +* DX: do not allow overriding constructor of `PHPUnit\Framework\TestCase` (#7563) +* DX: do not import ExpectDeprecationTrait in UtilsTest (#7562) +* DX: Enforce consistent naming in tests (#7556) +* DX: fix checking test class extends `PhpCsFixer\Tests\TestCase` (#7567) +* DX: make sure that exceptions in `AbstractFixerTestCase::testProperMethodNaming` are not already fixed (#7588) +* DX: remove recursion from AbstractIntegrationTestCase::testIntegration (#7577) +* DX: remove `PhpUnitNamespacedFixerTest::testClassIsFixed` (#7564) +* DX: remove `symfony/phpunit-bridge` (#7578) +* DX: replace fixture classes with anonymous ones (#7533) +* DX: Unify Docker mount points and paths (#7549) +* DX: unify fixer's test method names - quick wins (#7584) +* DX: unify tests for casing fixers (#7558) +* DX: use anonymous function over concrete classes (#7553) +* feat(EXPERIMENTAL): ClassKeywordFixer (#2918) +* feat(EXPERIMENTAL): ClassKeywordFixer, part 2 (#7550) +* feat(PhpdocToCommentFixer): Add option to handle return as valid docblock usage (#7401) (#7402) +* feat: Ability to import FQCNs found during analysis (#7597) +* feat: add phpDoc support for `fully_qualified_strict_types` fixer (#5620) +* feat: Handle deprecated rule sets similarly to deprecated fixers (#7288) +* feat: PhpUnitTestCaseStaticMethodCallsFixer - cover PHPUnit v10 methods (#7604) +* feat: Support more FQCNs cases in `fully_qualified_strict_types` (#7459) +* fix: AbstractFixerTestCase - fix checking for correct casing (#7540) +* fix: Better OS detection in integration tests (#7547) +* fix: NativeTypeDeclarationCasingFixe - handle static property without type (#7589) +* test: AutoReview - unify data provider returns (#7544) +* test: check to have DataProviders code agnostic of PHP version (#7575) + +Changelog for v3.41.1 +--------------------- + +* DX: Change `@testWith` to `@dataProvider` (#7535) +* DX: Introduce Markdownlint (#7534) +* fix: NativeTypeDeclarationCasingFixer - do not crash on `var` keyword (#7538) + +Changelog for v3.41.0 +--------------------- + +* chore: Move `mb_str_functions` PHP 8.3 cases to separate test (#7505) +* chore: Symfony v7 is now stable (#7469) +* CI: drop PHP 8.3 hacks (#7519) +* docs: Improve docs for `no_spaces_after_function_name` (#7520) +* DX: Ability to run Sphinx linter locally (#7481) +* DX: AbstractFixerTest - use anonymous classes (#7527) +* DX: Add progress output for `cs:check` script (#7514) +* DX: align doubles naming (#7525) +* DX: remove AbstractFixerTestCase::getTestFile() (#7495) +* DX: remove jangregor/phpstan-prophecy (#7524) +* DX: remove Prophecy (#7509) +* DX: replace Prophecy with anonymous classes in CacheTest (#7503) +* DX: replace Prophecy with anonymous classes in ProcessLintingResultTest (#7501) +* DX: Utilise auto-discovery for PHPStan formatter (#7490) +* feat: Support `mb_str_pad` function in `mb_str_functions` rule (#7499) +* fix: BinaryOperatorSpacesFixer - do not add whitespace inside short function (#7523) +* fix: Downgrade PDepend to version not supporting Symfony 7 (#7513) +* fix: GlobalNamespaceImportFixer - key in PHPDoc's array shape matching class name (#7522) +* fix: SpacesInsideParenthesesFixer - handle class instantiation parentheses (#7531) +* Update PHPstan to 1.10.48 (#7532) + +Changelog for v3.40.2 +--------------------- + +* docs: fix link to source classes (#7493) + +Changelog for v3.40.1 +--------------------- + +* chore: Delete stray file x (#7473) +* chore: Fix editorconfig (#7478) +* chore: Fix typos (#7474) +* chore: Fix YAML line length (#7476) +* chore: Indent JSON files with 4 spaces (#7480) +* chore: Make YAML workflow git-based (#7477) +* chore: Use stable XDebug (#7489) +* CI: Lint docs (#7479) +* CI: Use PHPStan's native Github error formatter (#7487) +* DX: fix PHPStan error (#7488) +* DX: PsrAutoloadingFixerTest - do not build mock in data provider (#7491) +* DX: PsrAutoloadingFixerTest - merge all data providers into one (#7492) +* DX: Update PHPStan to 1.10.46 (#7486) +* fix: `NoSpacesAfterFunctionNameFixer` - do not remove space if the opening parenthesis part of an expression (#7430) + +Changelog for v3.40.0 +--------------------- + +* chore: officially support PHP 8.3 (#7466) +* chore: update deps (#7471) +* CI: add --no-update while dropping non-compat `facile-it/paraunit` (#7470) +* CI: automate --ignore-platform-req=PHP (#7467) +* CI: bump actions/github-script to v7 (#7468) +* CI: move humbug/box out of dev-tools/composer.json (#7472) + +Changelog for v3.39.1 +--------------------- + +* DX: introduce SwitchAnalyzer (#7456) +* fix: NoExtraBlankLinesFixer - do not remove blank line after `? : throw` (#7457) +* fix: OrderedInterfacesFixer - do not comment out interface (#7464) +* test: Improve `ExplicitIndirectVariableFixerTest` (#7451) + +Changelog for v3.39.0 +--------------------- + +* chore: Add support for Symfony 7 (#7453) +* chore: IntegrationTest - move support of php< requirement to main Integration classes (#7448) +* CI: drop Symfony ^7 incompat exceptions of php-coveralls and cli-executor (#7455) +* CI: early compatibility checks with Symfony 7 (#7431) +* docs: drop list.rst and code behind it (#7436) +* docs: remove Gitter mentions (#7441) +* DX: Ability to run Fixer on PHP8.3 for development (#7449) +* DX: describe command - for rules, list also sets that are including them (#7419) +* DX: Docker clean up (#7450) +* DX: more usage of spaceship operator (#7438) +* DX: Put `Preg`'s last error message in exception message (#7443) +* feat: Introduce `@PHP83Migration` ruleset and PHP 8.3 integration test (#7439) +* test: Improve `AbstractIntegrationTestCase` description (#7452) + Changelog for v3.38.2 --------------------- @@ -216,7 +1142,7 @@ Changelog for v3.23.0 --------------------- * bug: BlankLineBeforeStatementFixer - do not enforce/add a blank line when there is a blank line between the comment and the statement already (#7190) -* bug: Fix detecting classy invokation in catch (#7191) +* bug: Fix detecting classy invocation in catch (#7191) * bug: Fix names resolving in `no_superfluous_phpdoc_tags` fixer (#7189) * bug: Fix various bugs in `FullyQualifiedStrictTypesFixer` fixer (#7188) * bug: Fixed line between general script documentation and require (#7177) @@ -645,7 +1571,7 @@ Changelog for v3.11.0 * bug: Fix MethodChainingIndentationFixer with arrow functions and class instantiation (#5587) * bug: MethodChainingIndentationFixer - Fix bug with attribute access (#6573) * bug: NoMultilineWhitespaceAroundDoubleArrowFixer - fix for single line comment (#6589) -* bug: TypeAlternationTransformer - TypeIntersectionTransforme - Bug: handle attributes (#6579) +* bug: TypeAlternationTransformer - TypeIntersectionTransformer - Bug: handle attributes (#6579) * bug: [BinaryOperatorFixer] Fix more issues with scoped operators (#6559) * docs: Remove `$` from console command snippets (#6600) * docs: Remove `$` from console command snippets in documentation (#6599) @@ -704,7 +1630,7 @@ Changelog for v3.9.5 * DX: Narrow docblock types in Runner and Report (#6465) * DX: Narrow docblock types in Tokenizer (#6293) * minor: extract NoMultipleStatementsPerLineFixer from BracesFixer (#6458) -* minor: Let PhpdocLineSpan fixer detect docblocks when seperator from token with attribute (#6343) +* minor: Let PhpdocLineSpan fixer detect docblocks when separator from token with attribute (#6343) Changelog for v3.9.4 -------------------- @@ -786,7 +1712,7 @@ Changelog for v3.7.0 * bug #6112 [BinaryOperatorSpacesFixer] Fix align of `=` inside calls of methods (VincentLanglet) * bug #6279 ClassReferenceNameCasingFixer - Fix for double arrow (SpacePossum) -* bug #6280 Fix bunch of enum issus (SpacePossum) +* bug #6280 Fix bunch of enum issues (SpacePossum) * bug #6283 ClassReferenceNameCasingFixer - detect imports (SpacePossum) * feature #5892 NewWithBracesFixer - option to remove braces (jrmajor) * feature #6081 Allow multiline constructor arguments in an anonymous classes (jrmajor, SpacePossum) @@ -816,7 +1742,7 @@ Changelog for v3.6.0 * bug #6241 NoSuperfluousPhpdocTagsFixer - fix for reference and splat operator (kubawerlos) * bug #6243 PhpdocTypesOrderFixer - fix for intersection types (kubawerlos) * bug #6254 PhpUnitDedicateAssertFixer - remove `is_resource`. (drupol) -* bug #6264 TokensAnalyzer - fix isConstantInvocation detection for mulitple exce… (SpacePossum) +* bug #6264 TokensAnalyzer - fix isConstantInvocation detection for multiple exce… (SpacePossum) * bug #6265 NullableTypeDeclarationForDefaultNullValueFixer - handle "readonly" a… (SpacePossum) * bug #6266 SimplifiedIfReturnFixer - handle statement in loop without braces (SpacePossum) * feature #6262 ClassReferenceNameCasingFixer - introduction (SpacePossum) @@ -838,7 +1764,7 @@ Changelog for v3.5.0 * bug #6165 DeclareEqualNormalizeFixer - fix for declare having multiple directives (kubawerlos) * bug #6170 NonPrintableCharacterFixer - fix for string in single quotes, having non-breaking space, linebreak, and single quote inside (kubawerlos) * bug #6181 UseTransformer - Trait import in enum fix (PHP8.1) (SpacePossum) -* bug #6188 PhpdocTo(Param|Property|Return)TypeFixer - fix for type intersections (kubawerlos) +* bug #6188 `PhpdocTo(Param|Property|Return)TypeFixer` - fix for type intersections (kubawerlos) * bug #6202 SquareBraceTransformer - fix for destructing square brace after double arrow (kubawerlos) * bug #6209 OrderedClassElementsFixer - PHP8.0 support abstract private methods in traits (SpacePossum) * bug #6224 ArgumentsAnalyzer - support PHP8.1 readonly (SpacePossum) @@ -894,7 +1820,7 @@ Changelog for v3.4.0 * minor #6109 Add return type to `DummyTestSplFileInfo::getRealPath()` (derrabus) * minor #6115 Remove PHP 7.2 polyfill (derrabus) * minor #6116 CI: remove installation of mbstring polyfill in build script, it's required dependency now (keradus) -* minor #6119 OrderedClassElementsFixer - PHPUnit assert(Pre|Post)Conditions methods support (meyerbaptiste) +* minor #6119 OrderedClassElementsFixer - PHPUnit `assert(Pre|Post)Conditions` methods support (meyerbaptiste) * minor #6121 Use Tokens::ensureWhitespaceAtIndex to simplify code (kubawerlos) * minor #6127 Remove 2nd parameter to XdebugHandler constructor (phil-davis) * minor #6129 clean ups (SpacePossum) @@ -1017,7 +1943,7 @@ Changelog for v3.2.0 * minor #6029 PhpUnitDedicateAssertFixer - add "assertStringContainsString" and "as… (SpacePossum) * minor #6030 SingleSpaceAfterConstructFixer - Add `switch` support (SpacePossum) * minor #6033 ArgumentsAnalyzerTest - add more tests (SpacePossum) -* minor #6034 7.0|7.1 - cleanup tests (SpacePossum) +* minor #6034 Cleanup tests for PHP 7.0 and 7.1 (SpacePossum) * minor #6035 Documentation generation split up and add list. (SpacePossum) * minor #6048 Fix "can not" spelling (mvorisek) @@ -1476,7 +2402,7 @@ Changelog for v2.17.3 Changelog for v2.17.2 --------------------- -* bug #5345 CleanNamespaceFixer - preserve traling comments (SpacePossum) +* bug #5345 CleanNamespaceFixer - preserve trailing comments (SpacePossum) * bug #5348 PsrAutoloadingFixer - fix for class without namespace (kubawerlos) * bug #5362 SingleSpaceAfterConstructFixer: Do not adjust whitespace before multiple multi-line extends (localheinz, SpacePossum) * minor #5314 Enable testing with PHPUnit 9.x (sanmai) @@ -1574,7 +2500,6 @@ Changelog for v2.17.0 * minor #5323 NoUselessSprintfFixer - Fix test on PHP5.6 (SpacePossum) * minor #5326 DX: relax composer requirements to not block installation under PHP v8, support for PHP v8 is not yet ready (keradus) - Changelog for v2.16.10 ---------------------- @@ -2198,7 +3123,7 @@ Changelog for v2.15.4 * minor #4564 Move readme-update command to Section 3 (iwasherefirst2) * minor #4566 Update symfony ruleset (gharlan) * minor #4570 Command::execute() should always return an integer (derrabus) -* minor #4580 Add suport for true/false return type hints. (SpacePossum) +* minor #4580 Add support for true/false return type hints. (SpacePossum) * minor #4584 Increase PHPStan level to 1 (julienfalque) * minor #4585 Fix deprecation notices (julienfalque) * minor #4587 Output details - Explain why a file was skipped (SpacePossum) @@ -2359,8 +3284,8 @@ Changelog for v2.14.3 * minor #4340 Travis: build against 7.4snapshot instead of nightly (Slamdunk) * minor #4351 code grooming (SpacePossum) * minor #4353 Add more priority tests (SpacePossum) -* minor #4364 DX: MethodChainingIndentationFixer - remove unneccesary loop (Sijun Zhu) -* minor #4366 Unset the auxillary variable $a (GrahamCampbell) +* minor #4364 DX: MethodChainingIndentationFixer - remove unnecessary loop (Sijun Zhu) +* minor #4366 Unset the auxiliary variable $a (GrahamCampbell) * minor #4368 Fixed TypeShortNameResolverTest::testResolver (GrahamCampbell) * minor #4380 PHP7.4 - Add "str_split" => "mb_str_split" mapping. (SpacePossum) * minor #4381 PHP7.4 - Add support for magic methods (un)serialize. (SpacePossum) @@ -2534,7 +3459,7 @@ Changelog for v2.13.0 * feature #3812 Add FopenFlagOrderFixer & FopenFlagsFixer (SpacePossum) * feature #3826 Add CombineNestedDirnameFixer (gharlan) * feature #3833 BinaryOperatorSpacesFixer - Add "no space" fix strategy (SpacePossum) -* feature #3841 NoAliasFunctionsFixer - add opt in option for ext-mbstring aliasses (SpacePossum) +* feature #3841 NoAliasFunctionsFixer - add opt in option for ext-mbstring aliases (SpacePossum) * feature #3876 NativeConstantInvocationFixer - add the scope option (stof, keradus) * feature #3886 Add PhpUnitMethodCasingFixer (Slamdunk) * feature #3907 Add ImplodeCallFixer (kubawerlos) @@ -2615,8 +3540,8 @@ Changelog for v2.12.9 * minor #4340 Travis: build against 7.4snapshot instead of nightly (Slamdunk) * minor #4351 code grooming (SpacePossum) * minor #4353 Add more priority tests (SpacePossum) -* minor #4364 DX: MethodChainingIndentationFixer - remove unneccesary loop (Sijun Zhu) -* minor #4366 Unset the auxillary variable $a (GrahamCampbell) +* minor #4364 DX: MethodChainingIndentationFixer - remove unnecessary loop (Sijun Zhu) +* minor #4366 Unset the auxiliary variable $a (GrahamCampbell) * minor #4368 Fixed TypeShortNameResolverTest::testResolver (GrahamCampbell) * minor #4380 PHP7.4 - Add "str_split" => "mb_str_split" mapping. (SpacePossum) * minor #4393 DX: add missing explicit return types (kubawerlos) @@ -2871,7 +3796,7 @@ Changelog for v2.11.2 * bug #3673 PhpdocScalarFixer - Add "types" option (julienfalque, keradus) * bug #3674 YodaStyleFixer - Fix variable detection for multidimensional arrays (julienfalque, SpacePossum) * bug #3684 PhpUnitStrictFixer - Do not fix if not correct # of arguments are used (SpacePossum) -* bug #3708 EspaceImplicitBackslashesFixer - Fix escaping multiple backslashes (julienfalque) +* bug #3708 EscapeImplicitBackslashesFixer - Fix escaping multiple backslashes (julienfalque) * bug #3715 SingleImportPerStatementFixer - Fix handling whitespace before opening brace (julienfalque) * bug #3731 PhpdocIndentFixer - crash fix (SpacePossum) * bug #3755 YodaStyleFixer - handle space between var name and index (SpacePossum) @@ -3005,7 +3930,7 @@ Changelog for v2.10.3 * minor #3484 Create Tokens::findBlockStart (ntzm) * minor #3512 Add missing array typehints (ntzm) * minor #3513 Making AppVeyor happy (kubawerlos) -* minor #3516 Use null|type instead of ?type in PHPDocs (ntzm) +* minor #3516 Use `null|type` instead of `?type` in PHPDocs (ntzm) * minor #3518 FixerFactoryTest - Test each priority test file is listed as test (SpacePossum) * minor #3519 Fix typo (SpacePossum) * minor #3520 Fix typos: ran vs. run (SpacePossum) @@ -3190,7 +4115,7 @@ Changelog for v2.8.1 * bug #3199 TokensAnalyzer - getClassyElements (SpacePossum) * bug #3208 BracesFixer - Fix for instantiation in control structures (julienfalque, SpacePossum) -* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (|) (ntzm) +* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (ntzm) * bug #3216 AbstractLinesBeforeNamespaceFixer - add min. and max. option, not only single target count (SpacePossum) * bug #3217 TokenizerLinter - fix lack of linting when code is cached (SpacePossum, keradus) * minor #3200 Skip slow test when Xdebug is loaded (julienfalque) @@ -3237,7 +4162,7 @@ Changelog for v2.7.4 * bug #3199 TokensAnalyzer - getClassyElements (SpacePossum) * bug #3208 BracesFixer - Fix for instantiation in control structures (julienfalque, SpacePossum) -* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (|) (ntzm) +* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (ntzm) * bug #3216 AbstractLinesBeforeNamespaceFixer - add min. and max. option, not only single target count (SpacePossum) * bug #3217 TokenizerLinter - fix lack of linting when code is cached (SpacePossum, keradus) * minor #3200 Skip slow test when Xdebug is loaded (julienfalque) @@ -3259,7 +4184,7 @@ Changelog for v2.7.2 * bug #3062 BraceClassInstantiationTransformer - Fix instantiation inside method call braces case (julienfalque, keradus) * bug #3083 SingleBlankLineBeforeNamespaceFixer - Fix handling namespace right after opening tag (mlocati) * bug #3109 SwitchCaseSemicolonToColonFixer - Fix bug with nested constructs (SpacePossum) -* bug #3117 Multibyte character in array key makes alignment incorect (kubawerlos) +* bug #3117 Multibyte character in array key makes alignment incorrect (kubawerlos) * bug #3123 Cache - File permissions (SpacePossum) * bug #3138 NoHomoglyphNamesFixer - fix crash on non-ascii but not mapped either (SpacePossum) * bug #3172 IndentationTypeFixer - do not touch whitespace that is not indentation (SpacePossum) @@ -3459,7 +4384,7 @@ Changelog for v2.3.3 * bug #2807 NoUselessElseFixer - Fix detection of conditional block (SpacePossum) * bug #2809 Phar release - fix readme generation (SpacePossum, keradus) * bug #2827 MethodArgumentSpaceFixer - Always remove trailing spaces (julienfalque) -* bug #2835 SelfAcessorFixer - class property fix (mnabialek) +* bug #2835 SelfAccessorFixer - class property fix (mnabialek) * bug #2848 PhpdocIndentFixer - fix edge case with inline phpdoc (keradus) * bug #2849 BracesFixer - Fix indentation issues with comments (julienfalque) * bug #2851 Tokens - ensureWhitespaceAtIndex (GrahamCampbell, SpacePossum) @@ -3648,7 +4573,7 @@ Changelog for v2.2.17 * minor #3435 Add tests for general_phpdoc_annotation_remove (BackEndTea) * minor #3484 Create Tokens::findBlockStart (ntzm) * minor #3512 Add missing array typehints (ntzm) -* minor #3516 Use null|type instead of ?type in PHPDocs (ntzm) +* minor #3516 Use `null|type` instead of `?type` in PHPDocs (ntzm) * minor #3518 FixerFactoryTest - Test each priority test file is listed as test (SpacePossum) * minor #3520 Fix typos: ran vs. run (SpacePossum) * minor #3521 Use HTTPS (carusogabriel) @@ -3741,7 +4666,7 @@ Changelog for v2.2.10 * bug #3199 TokensAnalyzer - getClassyElements (SpacePossum) * bug #3208 BracesFixer - Fix for instantiation in control structures (julienfalque, SpacePossum) -* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (|) (ntzm) +* bug #3215 BinaryOperatorSpacesFixer - Fix spaces around multiple exception catching (ntzm) * bug #3216 AbstractLinesBeforeNamespaceFixer - add min. and max. option, not only single target count (SpacePossum) * bug #3217 TokenizerLinter - fix lack of linting when code is cached (SpacePossum, keradus) * minor #3200 Skip slow test when Xdebug is loaded (julienfalque) @@ -3847,7 +4772,7 @@ Changelog for v2.2.5 * bug #2807 NoUselessElseFixer - Fix detection of conditional block (SpacePossum) * bug #2809 Phar release - fix readme generation (SpacePossum, keradus) * bug #2827 MethodArgumentSpaceFixer - Always remove trailing spaces (julienfalque) -* bug #2835 SelfAcessorFixer - class property fix (mnabialek) +* bug #2835 SelfAccessorFixer - class property fix (mnabialek) * bug #2848 PhpdocIndentFixer - fix edge case with inline phpdoc (keradus) * bug #2849 BracesFixer - Fix indentation issues with comments (julienfalque) * bug #2851 Tokens - ensureWhitespaceAtIndex (GrahamCampbell, SpacePossum) @@ -3936,7 +4861,9 @@ Changelog for v2.2.2 -------------------- Warning, this release breaks BC due to introduction of: + * minor #2554 Add short diff. output format (SpacePossum, keradus) + That PR was reverted in v2.2.3, which should be used instead of v2.2.2. * bug #2545 RuleSet - change resolvement (SpacePossum) @@ -4135,7 +5062,7 @@ Changelog for v2.0.1 * minor #2499 FileSpecificCodeSample - Specify class name relative to root namespace (localheinz, keradus) * minor #2506 SCA (SpacePossum) * minor #2515 Fix code indentation (keradus) -* minor #2521 SCA trailing spces check - ouput lines with trailing white space (SpacePossum) +* minor #2521 SCA trailing spces check - output lines with trailing white space (SpacePossum) * minor #2522 Fix docs and small code issues (keradus) Changelog for v2.0.0 @@ -4186,7 +5113,7 @@ Changelog for v2.0.0 * feature #1628 Added OrderedClassElementsFixer (gharlan) * feature #1742 path argument is used to create an intersection with existing finder (keradus, gharlan) * feature #1779 Added GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocAnnotationRenameFixer (keradus) -* feature #1811 Added NoSpacesInsideOfssetFixer (phansys) +* feature #1811 Added NoSpacesInsideOffsetFixer (phansys) * feature #1819 Added DirConstantFixer, ModernizeTypesCastingFixer, RandomApiMigrationFixer (kalessil, SpacePossum, keradus) * feature #1825 Added junit format (ekho) * feature #1862 FixerFactory - Do not allow conflicting fixers (SpacePossum) @@ -4303,7 +5230,7 @@ Changelog for v2.0.0 * minor #1846 FileFilterIterator - Corrected an iterator typehint (GrahamCampbell) * minor #1848 DocBlock - Remove some old unused phpdoc tags (GrahamCampbell) * minor #1856 NoDuplicateSemicolonsFixer - Remove overcomplete fixer (SpacePossum) -* minor #1861 Fix: Ofsset should be Offset (localheinz) +* minor #1861 Fix: Offset should be Offset (localheinz) * minor #1867 Print non-report output to stdErr (SpacePossum, keradus) * minor #1873 Enhancement: Show path to cache file if it exists (localheinz) * minor #1875 renamed Composer package (fabpot) @@ -4366,7 +5293,7 @@ Changelog for v2.0.0 * minor #2318 *TestCase - Reduce visibility of setUp() (localheinz) * minor #2319 Code grooming (keradus) * minor #2322 DX: use whitemessy aware assertion (keradus) -* minor #2324 Echo|Print*Fixer - unify printing fixers (SpacePossum, keradus) +* minor #2324 `Echo|Print*Fixer` - unify printing fixers (SpacePossum, keradus) * minor #2337 Normalize rule naming (keradus) * minor #2338 Drop hacks for unsupported HHVM (keradus) * minor #2339 Add some Fixer descriptions (SpacePossum, keradus) @@ -4444,7 +5371,7 @@ Changelog for v1.12.3 * bug #2209 LinefeedFixer - Fix in a safe way (SpacePossum) * bug #2228 NoEmptyLinesAfterPhpdocs, SingleBlankLineBeforeNamespace - Fix priority (SpacePossum) * bug #2230 FunctionDeclarationFixer - Fix T_USE case (SpacePossum) -* bug #2232 Add a test for style of varaible decalration : var (daiglej) +* bug #2232 Add a test for style of variable declaration : var (daiglej) * bug #2246 Fix itest requirements (keradus) * minor #2238 .gitattributes - specified line endings (keradus) * minor #2239 IntegrationCase - no longer internal (keradus) @@ -4733,7 +5660,7 @@ Changelog for v1.10.1 * bug #1444 OrderedUseFixer - fix next case (keradus) * bug #1441 BracesFixer - fix next case (keradus) * bug #1422 AlignDoubleArrowFixer - fix handling of nested array (SpacePossum) -* bug #1425 PhpdocInlineTagFixerTest - fix case when met inalid PHPDoc (keradus) +* bug #1425 PhpdocInlineTagFixerTest - fix case when met invalid PHPDoc (keradus) * bug #1419 AlignDoubleArrowFixer, AlignEqualsFixer - fix priorities (keradus) * bug #1415 BlanklineAfterOpenTagFixer - Do not add a line break if there is one already. (SpacePossum) * bug #1410 PhpdocIndentFixer - Fix for open tag (SpacePossum) @@ -4881,7 +5808,7 @@ Changelog for v1.5.1 -------------------- * bug #1054 VisibilityFixer - fix var with array value assigned (localheinz, keradus) -* bug #1048 MultilineArrayTrailingCommaFixer, SingleArrayNoTrailingCommaFixer - using heredoc inside array not cousing to treat it as multiline array (keradus) +* bug #1048 MultilineArrayTrailingCommaFixer, SingleArrayNoTrailingCommaFixer - using heredoc inside array not causing to treat it as multiline array (keradus) * bug #1043 PhpdocToCommentFixer - also check other control structures, besides foreach (ceeram) * bug #1045 OrderedUseFixer - fix namespace order for trailing digits (rusitschka) * bug #1035 PhpdocToCommentFixer - Add static as valid keyword for structural element (ceeram) @@ -4915,7 +5842,7 @@ Changelog for v1.5 * minor #957 Fix Fixers methods order (GrahamCampbell) * minor #944 Enable caching of composer downloads on Travis (stof) * minor #941 EncodingFixer - enhance tests (keradus) -* minor #938 Psr0Fixer - remove unneded assignment (keradus) +* minor #938 Psr0Fixer - remove unneeded assignment (keradus) * minor #936 FixerTest - test description consistency (keradus) * minor #933 NoEmptyLinesAfterPhpdocsFixer - remove unneeded code, clarify description (ceeram) * minor #934 StdinFileInfo::getFilename - Replace phpdoc with normal comment and add back empty line before return (ceeram) @@ -4958,7 +5885,7 @@ Changelog for v1.4 * bug #945 Skip files containing __halt_compiler() on PHP 5.3 (stof) * bug #946 BracesFixer - fix typo in exception name (keradus) * bug #940 Tokens::setCode - apply missing transformation (keradus) -* bug #908 BracesFixer - fix invalide inserting brace for control structure without brace and lambda inside of it (keradus) +* bug #908 BracesFixer - fix invalid inserting brace for control structure without brace and lambda inside of it (keradus) * bug #903 NoEmptyLinesAfterPhpdocsFixer - fix bug with Windows style lines (GrahamCampbell) * bug #895 [PSR-2] Preserve blank line after control structure opening brace (marcaube) * bug #892 Fixed the double arrow multiline whitespace fixer (GrahamCampbell) @@ -5022,7 +5949,7 @@ Changelog for v1.2 * minor #779 Fixed a docblock type (GrahamCampbell) * minor #765 Typehinting in FileCacheManager, remove unused variable in Tokens (keradus) * minor #764 SelfUpdateCommand - get local version only if remote version was successfully obtained (keradus) -* minor #761 aling => (keradus) +* minor #761 align => (keradus) * minor #757 Some minor code simplify and extra test (keradus) * minor #713 Download php-cs-fixer.phar without sudo (michaelsauter) * minor #742 Various Minor Improvements (GrahamCampbell) diff --git a/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md b/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md index 8dc5ba173..f0f5a429d 100644 --- a/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md +++ b/vendor/friendsofphp/php-cs-fixer/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributions Are Welcome! -If you need any help, don't hesitate to ask the community using [GitHub Discussions](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/discussions/categories/q-a) or [Gitter](https://gitter.im/PHP-CS-Fixer/Lobby). +If you need any help, don't hesitate to ask the community using [GitHub Discussions](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/discussions/categories/q-a). ## Glossary @@ -18,7 +18,10 @@ A *config* knows about the code style rules and the files and directories that m ## How to contribute -ℹ️ **IMPORTANT**: before contributing with really significant changes that require a lot of effort or are crucial from this tool's architecture perspective, please open [RFC on GitHub Discussion](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/discussions/categories/rfc). The development effort should start only after the proposal is discussed and the approach aligned. +> [!IMPORTANT] +> Before contributing with _really_ significant changes that require a lot of effort or are crucial from this tool's +> architecture perspective, please open [RFC on GitHub Discussion](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/discussions/categories/rfc). +> The development effort should start only after the proposal is discussed and the approach aligned. ### Development @@ -26,9 +29,9 @@ A *config* knows about the code style rules and the files and directories that m * Create new branch on top of the latest revision of `master` branch (if you already had project locally, then make sure to update this branch before going to next steps). It's good when branch's name reflects intent of the changes, but this is not strict requirement since pull request provides description of the change. However, with good branch naming it's easier to work on multiple changes simultaneously. * Install dependencies by running `composer update` (since project does not contain `composer.lock` it's better to ensure latest versions of packages by running `update` command instead of `install`). * Make changes. Please remember that **all** changes have to be covered by tests. - * if you work on a bug fix, please start with reproducing the problem by adding failing test case(s). When you have failing test case(s), you can [create pull request](#opening-a-pull-request) just to reproduce fail in the CI. Then you can provide fix _in the subsequent commits_, it will make code review easier. It's allowed to modify existing test cases in bug fix pull request, but *only if* current behavior is proved to be invalid. - * if you work on existing fixers then don't change existing test cases, because these are contract between the maintainers and users (they ensure how tool works). Add new test cases that cover provided changes - preferred way of defining test cases is with [data provider](https://docs.phpunit.de/en/10.0/writing-tests-for-phpunit.html#data-providers) which uses `yield` with proper case description as a key (e.g. `yield 'Some specific scenario' => ['some', 'example', 'data'];`). Codebase may still contain test cases in different format, and it's totally acceptable to use `yield` approach next to existing `return` usages. -* Update documentation: `composer docs`. This requires the highest version of PHP supported by PHP CS Fixer. If it is not installed on your system, you can run it in a Docker container instead: `docker-compose run php-8.2 php dev-tools/doc.php`. + * if you work on a bug fix, please start with reproducing the problem by adding failing test case(s). When you have failing test case(s), you can [create pull request](#opening-a-pull-request) just to reproduce fail in the CI. Then you can provide fix _in the subsequent commits_, it will make code review easier. It's allowed to modify existing test cases in bug fix pull request, but *only if* current behavior is proved to be invalid. + * if you work on existing fixers then don't change existing test cases, because these are contract between the maintainers and users (they ensure how tool works). Add new test cases that cover provided changes - preferred way of defining test cases is with [data provider](https://docs.phpunit.de/en/10.0/writing-tests-for-phpunit.html#data-providers) which uses `yield` with proper case description as a key (e.g. `yield 'Some specific scenario' => ['some', 'example', 'data'];`). Codebase may still contain test cases in different format, and it's totally acceptable to use `yield` approach next to existing `return` usages. +* Update documentation: `composer docs`. This requires the highest version of PHP supported by PHP CS Fixer. If it is not installed on your system, you can run it in a Docker container instead: `docker compose run php-8.2 php dev-tools/doc.php`. * Run QA suite: `composer qa`. * Fix project itself (if needed): `composer cs:fix`. @@ -37,43 +40,50 @@ A *config* knows about the code style rules and the files and directories that m You can do some things to increase the chance that your pull request is accepted without communication ping-pong between you and the reviewers: * Submit [single](https://en.wikipedia.org/wiki/Single-responsibility_principle) pull request per fix or feature. -* Don't amend commits because it makes review rounds harder - all commits from your branch will be squashed (without commit messages) during merge, so you can treat pull request as a playground, without keeping everything tidy at any point. -* If your changes are not up-to-date, [rebase](https://git-scm.com/docs/git-rebase) your branch onto the parent branch. Do it regularly whenever your branch is behind `master` branch, that will eliminate risk of problems after the merge. +* Keep meaningful commit logs, don't use meaningless messages (e.g. `foo`, `more work`, `more work`, `more work`) and don't push complex PR as a single commit. +* Don't [amend](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---amend) commits because it makes review rounds harder - all commits from your branch will be squashed (without commit messages) during the merge. * Follow the conventions used in the project. * Remember about tests and documentation. * Don't bump `PhpCsFixer\Console\Application::VERSION`, it's done during release. +> [!IMPORTANT] +> Your pull request will have much higher chance of getting merged if you allow maintainers to push changes to your +> branch. You can do it by ticking "Allow edits and access to secrets by maintainers" checkbox, but please keep in mind +> this option is available only if your PR is created from a user's fork. If your fork is a part of organisation, then +> you can add [Fixer maintainers](https://github.com/orgs/PHP-CS-Fixer/people) as members of that repository. This way +> maintainers will be able to provide required changes or rebase your branch (only up-to-date PRs can be merged). + ## Working With Docker This project provides a Docker setup that allows working on it using any of the PHP versions supported by the tool. To use it, you first need to install [Docker](https://docs.docker.com/get-docker/) ([Docker Compose](https://docs.docker.com/compose/) is a built-in plugin of the main tool). -Next, copy [`docker-compose.override.yaml.dist`](./docker-compose.override.yaml.dist) to `docker-compose.override.yaml` and edit it to your needs. The relevant parameters that might require some tweaking have comments to help you. +Next, copy [`compose.override.dist.yaml`](./compose.override.dist.yaml) to `compose.override.yaml` and edit it to your needs. The relevant parameters that might require some tweaking have comments to help you. You can then build the images: ```console -docker-compose build --parallel +docker compose build --parallel ``` -Now you can run commands needed to work on the project. For example, say you want to run PHPUnit tests on PHP 7.4: +Now you can run commands needed to work on the project. For example, say you want to run PHPUnit tests on PHP 8.2: ```console -docker-compose run php-7.4 vendor/bin/phpunit +docker compose run php-8.2 vendor/bin/phpunit ``` Sometimes it can be more convenient to have a shell inside the container: ```console -docker-compose run php-7.4 sh -/app vendor/bin/phpunit +docker compose run php-7.4 sh +/fixer vendor/bin/phpunit ``` The images come with an [`xdebug` script](github.com/julienfalque/xdebug/) that allows running any PHP command with Xdebug enabled to help debug problems. ```console -docker-compose run php-7.4 xdebug vendor/bin/phpunit +docker compose run php-8.2 xdebug vendor/bin/phpunit ``` If you're using PhpStorm, you need to create a [server](https://www.jetbrains.com/help/phpstorm/servers.html) with a name that matches the `PHP_IDE_CONFIG` environment variable defined in the Docker Compose configuration files, which is `php-cs-fixer` by default. diff --git a/vendor/friendsofphp/php-cs-fixer/README.md b/vendor/friendsofphp/php-cs-fixer/README.md index fb7f6a781..bee2b94e6 100644 --- a/vendor/friendsofphp/php-cs-fixer/README.md +++ b/vendor/friendsofphp/php-cs-fixer/README.md @@ -4,8 +4,7 @@

-PHP Coding Standards Fixer -========================== +# PHP Coding Standards Fixer The PHP Coding Standards Fixer (PHP CS Fixer) tool fixes your code to follow standards; whether you want to follow PHP coding standards as defined in the PSR-1, PSR-2, etc., @@ -22,9 +21,10 @@ projects. This tool does not only detect them, but also fixes them for you. ## Supported PHP Versions * PHP 7.4 -* PHP 8.0 (except PHP 8.0.0 due to [bug in PHP tokenizer](https://bugs.php.net/bug.php?id=80462)) +* PHP 8.0 * PHP 8.1 * PHP 8.2 +* PHP 8.3 > **Note** > Each new PHP version requires a huge effort to support the new syntax. @@ -38,30 +38,24 @@ projects. This tool does not only detect them, but also fixes them for you. ### Installation -The recommended way to install PHP CS Fixer is to use [Composer](https://getcomposer.org/download/) -in a dedicated `composer.json` file in your project, for example in the -`tools/php-cs-fixer` directory: +The recommended way to install PHP CS Fixer is to use [Composer](https://getcomposer.org/download/): -```console -mkdir -p tools/php-cs-fixer -composer require --working-dir=tools/php-cs-fixer friendsofphp/php-cs-fixer -``` - -Or using the main `composer.json`: ```console composer require --dev friendsofphp/php-cs-fixer +## or when facing conflicts in dependencies: +composer require --dev php-cs-fixer/shim ``` -For more details and other installation methods, see +For more details and other installation methods (also with Docker or behind CI), see [installation instructions](./doc/installation.rst). ### Usage Assuming you installed PHP CS Fixer as instructed above, you can run the -following command to fix the files PHP files in the `src` directory: +following command to fix the PHP files in the `src` directory: ```console -tools/php-cs-fixer/vendor/bin/php-cs-fixer fix src +./vendor/bin/php-cs-fixer fix src ``` See [usage](./doc/usage.rst), list of [built-in rules](./doc/rules/index.rst), list of [rule sets](./doc/ruleSets/index.rst) @@ -82,11 +76,11 @@ Dedicated plugins exist for: ## Community -The PHP CS Fixer is maintained on GitHub at https://github.com/PHP-CS-Fixer/PHP-CS-Fixer. +The PHP CS Fixer is maintained on GitHub at . Bug reports and ideas about new features are welcome there. -You can reach us at https://gitter.im/PHP-CS-Fixer/Lobby about the project, -configuration, possible improvements, ideas and questions, please visit us! +You can reach us in the [GitHub Discussions](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/discussions/) regarding the +project, configuration, possible improvements, ideas and questions. Please visit us there! ## Contribute diff --git a/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md b/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md index 00e0a9c5d..bea1ff4fb 100644 --- a/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md +++ b/vendor/friendsofphp/php-cs-fixer/UPGRADE-v3.md @@ -1,21 +1,18 @@ -UPGRADE GUIDE FROM 2.x to 3.0 -============================= +# UPGRADE GUIDE FROM 2.x to 3.0 This is guide for upgrade from version 2.x to 3.0 for using the CLI tool. *Before following this guide, install [v2.19](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/releases/tag/v2.19.0) and run in verbose mode (`php-cs-fixer fix -v`) or in future mode (`PHP_CS_FIXER_FUTURE_MODE=1 php-cs-fixer fix`) to identify deprecations and fix them first.* -Rename of files ---------------- +## Rename of files | 2.x | 3.0 | Description | -| ---------------- | ------------------------ | -------------------------------------- | +|------------------|--------------------------|----------------------------------------| | `.php_cs` | `.php-cs-fixer.php` | Configuration file (local) | | `.php_cs.dist` | `.php-cs-fixer.dist.php` | Configuration file (to be distributed) | | `.php_cs.cache` | `.php-cs-fixer.cache` | Cache file | -CLI options ------------ +## CLI options | 2.x | 3.0 | Description | Note | | ---------------- | --------------- | ----------------------------------------------- | -------------------------------------- | @@ -27,94 +24,93 @@ CLI options | --rules | --rules | Default value changed from @PSR2 to @PSR12 | | | --config --rules | | | No longer allowed to pass both | -Changes to rules ----------------- +## Changes to rules ### Renamed rules -Old name | New name | Note --------- | -------- | ---- -`blank_line_before_return` | `blank_line_before_statement` | use configuration `['statements' => ['return']]` -`final_static_access` | `self_static_accessor` | -`hash_to_slash_comment` | `single_line_comment_style` | use configuration `['comment_types' => ['hash']]` -`lowercase_constants` | `constant_case` | use configuration `['case' => 'lower']` -`method_separation` | `class_attributes_separation` | use configuration `['elements' => ['method']]` -`no_extra_consecutive_blank_lines` | `no_extra_blank_lines` | -`no_multiline_whitespace_before_semicolons` | `multiline_whitespace_before_semicolons` | -`no_short_echo_tag` | `echo_tag_syntax` | use configuration `['format' => 'long']` -`php_unit_ordered_covers` | `phpdoc_order_by_value` | use configuration `['annotations' => [ 'covers' ]]` -`phpdoc_inline_tag` | `general_phpdoc_tag_rename`, `phpdoc_inline_tag_normalizer` and `phpdoc_tag_type` | -`pre_increment` | `increment_style` | use configuration `['style' => 'pre']` -`psr0` | `psr_autoloading` | use configuration `['dir' => x ]` -`psr4` | `psr_autoloading` | -`silenced_deprecation_error` | `error_suppression` | -`trailing_comma_in_multiline_array` | `trailing_comma_in_multiline` | use configuration `['elements' => ['arrays']]` +| Old name | New name | Note | +|--------------------------------------------|-----------------------------------------------------------------------------------|------------------------------------------------------| +|`blank_line_before_return` | `blank_line_before_statement` | use configuration `['statements' => ['return']]` | +|`final_static_access` | `self_static_accessor` | | +|`hash_to_slash_comment` | `single_line_comment_style` | use configuration `['comment_types' => ['hash']]` | +|`lowercase_constants` | `constant_case` | use configuration `['case' => 'lower']` | +|`method_separation` | `class_attributes_separation` | use configuration `['elements' => ['method']]` | +|`no_extra_consecutive_blank_lines` | `no_extra_blank_lines` | | +|`no_multiline_whitespace_before_semicolons` | `multiline_whitespace_before_semicolons` | | +|`no_short_echo_tag` | `echo_tag_syntax` | use configuration `['format' => 'long']` | +|`php_unit_ordered_covers` | `phpdoc_order_by_value` | use configuration `['annotations' => [ 'covers' ]]` | +|`phpdoc_inline_tag` | `general_phpdoc_tag_rename`, `phpdoc_inline_tag_normalizer` and `phpdoc_tag_type` | | +|`pre_increment` | `increment_style` | use configuration `['style' => 'pre']` | +|`psr0` | `psr_autoloading` | use configuration `['dir' => x ]` | +|`psr4` | `psr_autoloading` | | +|`silenced_deprecation_error` | `error_suppression` | | +|`trailing_comma_in_multiline_array` | `trailing_comma_in_multiline` | use configuration `['elements' => ['arrays']]` | ### Removed rootless configuration -Rule | Root option | Note ------------------------------------- | -------------- | ---- -`general_phpdoc_annotation_remove` | `annotations` -`no_extra_consecutive_blank_lines` | `tokens` -`no_spaces_around_offset` | `positions` -`no_unneeded_control_parentheses` | `statements` -`ordered_class_elements` | `order` -`php_unit_construct` | `assertions` -`php_unit_dedicate_assert` | `target` | root option works differently than rootless configuration -`php_unit_strict` | `assertions` -`phpdoc_no_alias_tag` | `replacements` -`phpdoc_return_self_reference` | `replacements` -`random_api_migration` | `replacements` -`single_class_element_per_statement` | `elements` -`visibility_required` | `elements` +| Rule | Root option | Note | +|--------------------------------------| -------------- |-----------------------------------------------------------| +| `general_phpdoc_annotation_remove` | `annotations` | | +| `no_extra_consecutive_blank_lines` | `tokens` | | +| `no_spaces_around_offset` | `positions` | | +| `no_unneeded_control_parentheses` | `statements` | | +| `ordered_class_elements` | `order` | | +| `php_unit_construct` | `assertions` | | +| `php_unit_dedicate_assert` | `target` | root option works differently than rootless configuration | +| `php_unit_strict` | `assertions` | | +| `phpdoc_no_alias_tag` | `replacements` | | +| `phpdoc_return_self_reference` | `replacements` | | +| `random_api_migration` | `replacements` | | +| `single_class_element_per_statement` | `elements` | | +| `visibility_required` | `elements` | | ### Changed options -Rule | Option | Change ----- | ------ | ------ -`binary_operator_spaces` | `align_double_arrow` | option was removed, use `operators` instead -`binary_operator_spaces` | `align_equals` | option was removed use `operators` instead -`blank_line_before_statement` | `statements: die` | option `die` was removed from `statements`, use `exit` instead -`class_attributes_separation` | `elements` | option does no longer accept flat array as a value, use map instead -`class_definition` | `multiLineExtendsEachSingleLine` | option was renamed to `multi_line_extends_each_single_line` -`class_definition` | `singleItemSingleLine` | option was renamed to `single_item_single_line` -`class_definition` | `singleLine` | option was renamed to `single_line` -`doctrine_annotation_spaces` | `around_argument_assignments` | option was removed, use `before_argument_assignments` and `after_argument_assignments` instead -`doctrine_annotation_spaces` | `around_array_assignments` | option was removed, use `after_array_assignments_colon`, `after_array_assignments_equals`, `before_array_assignments_colon` and `before_array_assignments_equals` instead -`final_internal_class` | `annotation-black-list` | option was renamed, use `annotation_exclude` -`final_internal_class` | `annotation-white-list` | option was renamed, use `annotation_include` -`final_internal_class` | `consider-absent-docblock-as-internal-class` | option was renamed, use `consider_absent_docblock_as_internal_class` -`header_comment` | `commentType` | option was renamed to `comment_type` -`is_null` | `use_yoda_style` | option was removed, use `yoda_style` rule instead -`no_extra_consecutive_blank_lines` | `tokens` | one of possible values, `useTrait`, was renamed to `use_trait` -`ordered_class_elements` | `sortAlgorithm` | option was renamed, use `sort_algorithm` instead -`ordered_imports` | `importsOrder` | option was renamed, use `imports_order` -`ordered_imports` | `sortAlgorithm` | option was renamed, use `sort_algorithm` -`php_unit_dedicate_assert` | `functions` | option was removed, use `target` instead -`php_unit_test_annotation` | `case` | option was removed, use `php_unit_method_casing` rule instead +| Rule | Option | Change | +|------------------------------------|----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `binary_operator_spaces` | `align_double_arrow` | option was removed, use `operators` instead | +| `binary_operator_spaces` | `align_equals` | option was removed use `operators` instead | +| `blank_line_before_statement` | `statements: die` | option `die` was removed from `statements`, use `exit` instead | +| `class_attributes_separation` | `elements` | option does no longer accept flat array as a value, use map instead | +| `class_definition` | `multiLineExtendsEachSingleLine` | option was renamed to `multi_line_extends_each_single_line` | +| `class_definition` | `singleItemSingleLine` | option was renamed to `single_item_single_line` | +| `class_definition` | `singleLine` | option was renamed to `single_line` | +| `doctrine_annotation_spaces` | `around_argument_assignments` | option was removed, use `before_argument_assignments` and `after_argument_assignments` instead | +| `doctrine_annotation_spaces` | `around_array_assignments` | option was removed, use `after_array_assignments_colon`, `after_array_assignments_equals`, `before_array_assignments_colon` and `before_array_assignments_equals` instead | +| `final_internal_class` | `annotation-black-list` | option was renamed, use `annotation_exclude` | +| `final_internal_class` | `annotation-white-list` | option was renamed, use `annotation_include` | +| `final_internal_class` | `consider-absent-docblock-as-internal-class` | option was renamed, use `consider_absent_docblock_as_internal_class` | +| `header_comment` | `commentType` | option was renamed to `comment_type` | +| `is_null` | `use_yoda_style` | option was removed, use `yoda_style` rule instead | +| `no_extra_consecutive_blank_lines` | `tokens` | one of possible values, `useTrait`, was renamed to `use_trait` | +| `ordered_class_elements` | `sortAlgorithm` | option was renamed, use `sort_algorithm` instead | +| `ordered_imports` | `importsOrder` | option was renamed, use `imports_order` | +| `ordered_imports` | `sortAlgorithm` | option was renamed, use `sort_algorithm` | +| `php_unit_dedicate_assert` | `functions` | option was removed, use `target` instead | +| `php_unit_test_annotation` | `case` | option was removed, use `php_unit_method_casing` rule instead | ### Changed default values of options -Rule | Option | Old value | New value ----- | ---- | ---- | ---- -`array_syntax` | `syntax` | `'long'` | `'short'` -`function_to_constant` | `functions` | `['get_class', 'php_sapi_name', 'phpversion', 'pi']` | `['get_called_class', 'get_class', 'php_sapi_name', 'phpversion', 'pi']` -`list_syntax` | `syntax` | `'long'` | `'short'` -`method_argument_space` | `on_multiline` | `'ignore'` | `'ensure_fully_multiline'` -`native_constant_invocation` | `strict` | `false` | `true` -`native_function_casing` | `include` | `'@internal'` | `'@compiler_optimized'` -`native_function_invocation` | `include` | `'@internal'` | `'@compiler_optimized'` -`native_function_invocation` | `strict` | `false` | `true` -`non_printable_character` | `use_escape_sequences_in_strings` | `false` | `true` (when running on PHP 7.0 and up) -`php_unit_dedicate_assert` | `target` | `'5.0'` | `'newest'` -`phpdoc_align` | `tags` | `['param', 'return', 'throws', 'type', 'var']` | `['method', 'param', 'property', 'return', 'throws', 'type', 'var']` -`phpdoc_scalar` | `types` | `['boolean', 'double', 'integer', 'real', 'str']` | `['boolean', 'callback', 'double', 'integer', 'real', 'str']` +| Rule | Option | Old value | New value | +|------------------------------|-----------------------------------|------------------------------------------------------|--------------------------------------------------------------------------| +| `array_syntax` | `syntax` | `'long'` | `'short'` | +| `function_to_constant` | `functions` | `['get_class', 'php_sapi_name', 'phpversion', 'pi']` | `['get_called_class', 'get_class', 'php_sapi_name', 'phpversion', 'pi']` | +| `list_syntax` | `syntax` | `'long'` | `'short'` | +| `method_argument_space` | `on_multiline` | `'ignore'` | `'ensure_fully_multiline'` | +| `native_constant_invocation` | `strict` | `false` | `true` | +| `native_function_casing` | `include` | `'@internal'` | `'@compiler_optimized'` | +| `native_function_invocation` | `include` | `'@internal'` | `'@compiler_optimized'` | +| `native_function_invocation` | `strict` | `false` | `true` | +| `non_printable_character` | `use_escape_sequences_in_strings` | `false` | `true` (when running on PHP 7.0 and up) | +| `php_unit_dedicate_assert` | `target` | `'5.0'` | `'newest'` | +| `phpdoc_align` | `tags` | `['param', 'return', 'throws', 'type', 'var']` | `['method', 'param', 'property', 'return', 'throws', 'type', 'var']` | +| `phpdoc_scalar` | `types` | `['boolean', 'double', 'integer', 'real', 'str']` | `['boolean', 'callback', 'double', 'integer', 'real', 'str']` | ### Removed rule sets -Rule set | Note --------- | ---- -`@PHP56Migration` | was empty +| Rule set | Note | +|-------------------|------------| +| `@PHP56Migration` | was empty | ### Rule behavior changes @@ -124,8 +120,7 @@ Rule set | Note - `udiff` output now includes the file name in the output (if applicable) -Code BC changes -=============== +## Code BC changes ### Removed; various @@ -138,11 +133,11 @@ Code BC changes - `MethodArgumentSpaceFixer` deprecated methods have been removed - `NoMixedEchoPrintFixer` the property `$defaultConfig` has been removed - class `Tokens`, the following methods has been removed: - - `current()` - - `key()` - - `next()` - - `rewind()` - - `valid()` + - `current()` + - `key()` + - `next()` + - `rewind()` + - `valid()` - namespace `PhpCsFixer\Test\` and each class in it has been removed, as it served pure development purpose and should not be part of production code - reach out to community if you are willing to help building dev package ### Interface changes diff --git a/vendor/friendsofphp/php-cs-fixer/ci-integration.sh b/vendor/friendsofphp/php-cs-fixer/ci-integration.sh index 6ede4fd53..39d999559 100644 --- a/vendor/friendsofphp/php-cs-fixer/ci-integration.sh +++ b/vendor/friendsofphp/php-cs-fixer/ci-integration.sh @@ -5,4 +5,4 @@ IFS=' ' CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRTUXB "${COMMIT_RANGE}") if ! echo "${CHANGED_FILES}" | grep -qE "^(\\.php-cs-fixer(\\.dist)?\\.php|composer\\.lock)$"; then EXTRA_ARGS=$(printf -- '--path-mode=intersection\n--\n%s' "${CHANGED_FILES}"); else EXTRA_ARGS=''; fi -vendor/bin/php-cs-fixer check --config=.php-cs-fixer.dist.php -v --stop-on-violation --using-cache=no ${EXTRA_ARGS} +vendor/bin/php-cs-fixer check --config=.php-cs-fixer.dist.php -v --show-progress=dots --stop-on-violation --using-cache=no ${EXTRA_ARGS} diff --git a/vendor/friendsofphp/php-cs-fixer/composer.json b/vendor/friendsofphp/php-cs-fixer/composer.json index ec122c6e1..af53e6cf0 100644 --- a/vendor/friendsofphp/php-cs-fixer/composer.json +++ b/vendor/friendsofphp/php-cs-fixer/composer.json @@ -21,36 +21,44 @@ ], "require": { "php": "^7.4 || ^8.0", + "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", - "composer/semver": "^3.3", + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", - "sebastian/diff": "^4.0 || ^5.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.27", - "symfony/polyfill-php80": "^1.27", - "symfony/polyfill-php81": "^1.27", - "symfony/process": "^5.4 || ^6.0", - "symfony/stopwatch": "^5.4 || ^6.0" + "fidry/cpu-core-counter": "^1.2", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/polyfill-mbstring": "^1.31", + "symfony/polyfill-php80": "^1.31", + "symfony/polyfill-php81": "^1.31", + "symfony/process": "^5.4 || ^6.4 || ^7.2", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3 || ^2.0", - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^2.0", - "mikey179/vfsstream": "^1.6.11", - "php-coveralls/php-coveralls": "^2.5.3", + "facile-it/paraunit": "^1.3.1 || ^2.6", + "infection/infection": "^0.29.14", + "justinrainbow/json-schema": "^5.3 || ^6.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.16", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "symfony/phpunit-bridge": "^6.2.3", - "symfony/yaml": "^5.4 || ^6.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", + "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12", + "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3", + "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -59,12 +67,19 @@ "autoload": { "psr-4": { "PhpCsFixer\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] }, "autoload-dev": { "psr-4": { + "PhpCsFixer\\PHPStan\\": "dev-tools/phpstan/src/", "PhpCsFixer\\Tests\\": "tests/" - } + }, + "exclude-from-classmap": [ + "tests/Fixtures/" + ] }, "bin": [ "php-cs-fixer" @@ -85,16 +100,25 @@ "Composer\\Config::disableProcessTimeout", "paraunit run --testsuite auto-review" ], - "cs:check": "@php php-cs-fixer check --diff", + "cs:check": "@php php-cs-fixer check --verbose --diff", "cs:fix": "@php php-cs-fixer fix", - "cs:fix:parallel": "echo '🔍 Will run in batches of 50 files.'; if [[ -f .php-cs-fixer.php ]]; then FIXER_CONFIG=.php-cs-fixer.php; else FIXER_CONFIG=.php-cs-fixer.dist.php; fi; php php-cs-fixer list-files --config=$FIXER_CONFIG | xargs -n 50 -P 8 php php-cs-fixer fix --config=$FIXER_CONFIG --path-mode intersection 2> /dev/null", + "cs:fix:parallel": [ + "echo '⚠️ This script is deprecated! Utilise built-in parallelisation instead.';", + "@cs:fix" + ], "docs": "@php dev-tools/doc.php", + "infection": "@test:mutation", "install-tools": "@composer --working-dir=dev-tools install", "mess-detector": "@php dev-tools/vendor/bin/phpmd . ansi dev-tools/mess-detector/phpmd.xml --exclude vendor/*,dev-tools/vendor/*,dev-tools/phpstan/*,tests/Fixtures/*", "normalize": [ "@composer normalize --working-dir=dev-tools --dry-run ../composer.json", "@composer normalize --working-dir=dev-tools --dry-run composer.json" ], + "normalize:fix": [ + "@composer normalize --working-dir=dev-tools ../composer.json", + "@composer normalize --working-dir=dev-tools composer.json" + ], + "php-compatibility": "@php dev-tools/vendor/bin/phpcs -p --standard=dev-tools/php-compatibility/phpcs-php-compatibility.xml", "phpstan": "@php -d memory_limit=512M dev-tools/vendor/bin/phpstan analyse", "phpstan:baseline": "@php -d memory_limit=512M dev-tools/vendor/bin/phpstan analyse --generate-baseline=./dev-tools/phpstan/baseline.php", "qa": "@quality-assurance", @@ -110,7 +134,9 @@ "self-check": [ "./dev-tools/check_file_permissions.sh", "./dev-tools/check_trailing_spaces.sh", + "@composer dump-autoload --dry-run --optimize --strict-psr", "@normalize", + "@unused-deps", "@require-checker", "@auto-review" ], @@ -126,12 +152,20 @@ ], "test:coverage": [ "Composer\\Config::disableProcessTimeout", - "paraunit coverage --testsuite unit --exclude-group covers-nothing" + "@composer show facile-it/paraunit ^2 && (paraunit coverage --testsuite unit --pass-through=--exclude-group=covers-nothing) || (paraunit coverage --testsuite unit --exclude-group covers-nothing)" ], "test:integration": [ "Composer\\Config::disableProcessTimeout", "paraunit run --testsuite integration" ], + "test:mutation": [ + "Composer\\Config::disableProcessTimeout", + "infection --threads=max --only-covered --min-covered-msi=80" + ], + "test:short-open-tag": [ + "Composer\\Config::disableProcessTimeout", + "@php -d short_open_tag=1 ./vendor/bin/phpunit --do-not-cache-result --testsuite short-open-tag" + ], "test:smoke": [ "Composer\\Config::disableProcessTimeout", "paraunit run --testsuite smoke" @@ -139,17 +173,21 @@ "test:unit": [ "Composer\\Config::disableProcessTimeout", "paraunit run --testsuite unit" - ] + ], + "unused-deps": "@php dev-tools/vendor/bin/composer-unused --excludePackage=composer/xdebug-handler" }, "scripts-descriptions": { "auto-review": "Execute Auto-review", "cs:check": "Check coding standards", "cs:fix": "Fix coding standards", - "cs:fix:parallel": "Fix coding standards in naive parallel mode (using xargs)", + "cs:fix:parallel": "⚠️DEPRECATED! Use cs:fix with proper parallel config", "docs": "Regenerate docs", + "infection": "Alias for 'test:mutation'", "install-tools": "Install DEV tools", "mess-detector": "Analyse code with Mess Detector", - "normalize": "Run normalization for composer.json files", + "normalize": "Check normalization for composer.json files", + "normalize:fix": "Run normalization for composer.json files", + "php-compatibility": "Check compatibility with all supported PHP versions", "phpstan": "Run PHPStan analysis", "phpstan:baseline": "Dump PHPStan baseline file - use only for updating, do not add new errors when possible", "post-autoload-dump": "Run additional tasks after installing/updating main dependencies", @@ -163,7 +201,10 @@ "test:all": "Run Unit and Integration tests (but *NOT* Smoke tests)", "test:coverage": "Run tests that provide code coverage", "test:integration": "Run Integration tests", + "test:mutation": "Run mutation tests", + "test:short-open-tag": "Run tests with \"short_open_tag\" enabled", "test:smoke": "Run Smoke tests", - "test:unit": "Run Unit tests" + "test:unit": "Run Unit tests", + "unused-deps": "Verifies if app has dependencies that are not used" } } diff --git a/vendor/friendsofphp/php-cs-fixer/logo.md b/vendor/friendsofphp/php-cs-fixer/logo.md index c2877f718..68e03a582 100644 --- a/vendor/friendsofphp/php-cs-fixer/logo.md +++ b/vendor/friendsofphp/php-cs-fixer/logo.md @@ -1,3 +1,3 @@ The logo is © 2010+ Sensio Labs. -Original resolution can be found at https://github.com/PHP-CS-Fixer/logo . +Original resolution can be found at . diff --git a/vendor/friendsofphp/php-cs-fixer/php-cs-fixer b/vendor/friendsofphp/php-cs-fixer/php-cs-fixer index e29468be5..f00964cd9 100755 --- a/vendor/friendsofphp/php-cs-fixer/php-cs-fixer +++ b/vendor/friendsofphp/php-cs-fixer/php-cs-fixer @@ -1,6 +1,8 @@ #!/usr/bin/env php = 80300) { - fwrite(STDERR, "PHP needs to be a minimum version of PHP 7.4.0 and maximum version of PHP 8.2.*.\n"); + if (\PHP_VERSION_ID < (int) '70400' || \PHP_VERSION_ID >= (int) '80400') { + fwrite(STDERR, "PHP needs to be a minimum version of PHP 7.4.0 and maximum version of PHP 8.3.*.\n"); fwrite(STDERR, 'Current PHP version: '.PHP_VERSION.".\n"); - if (getenv('PHP_CS_FIXER_IGNORE_ENV')) { + if (filter_var(getenv('PHP_CS_FIXER_IGNORE_ENV'), FILTER_VALIDATE_BOOLEAN)) { fwrite(STDERR, "Ignoring environment requirements because `PHP_CS_FIXER_IGNORE_ENV` is set. Execution may be unstable.\n"); } else { fwrite(STDERR, "To ignore this requirement please set `PHP_CS_FIXER_IGNORE_ENV`.\n"); @@ -47,7 +54,7 @@ set_error_handler(static function ($severity, $message, $file, $line) { if (!extension_loaded($extension)) { fwrite(STDERR, sprintf("PHP extension ext-%s is missing from your system. Install or enable it.\n", $extension)); - if (getenv('PHP_CS_FIXER_IGNORE_ENV')) { + if (filter_var(getenv('PHP_CS_FIXER_IGNORE_ENV'), FILTER_VALIDATE_BOOLEAN)) { fwrite(STDERR, "Ignoring environment requirements because `PHP_CS_FIXER_IGNORE_ENV` is set. Execution may be unstable.\n"); } else { exit(1); @@ -57,14 +64,16 @@ set_error_handler(static function ($severity, $message, $file, $line) { })(); // load dependencies -(function () { +(static function (): void { $require = true; if (class_exists('Phar')) { // Maybe this file is used as phar-stub? Let's try! try { Phar::mapPhar('php-cs-fixer.phar'); + /** @phpstan-ignore requireOnce.fileNotFound */ require_once 'phar://php-cs-fixer.phar/vendor/autoload.php'; + $require = false; } catch (PharException $e) { } @@ -90,9 +99,6 @@ set_error_handler(static function ($severity, $message, $file, $line) { } })(); -use Composer\XdebugHandler\XdebugHandler; -use PhpCsFixer\Console\Application; - // Restart if xdebug is loaded, unless the environment variable PHP_CS_FIXER_ALLOW_XDEBUG is set. $xdebug = new XdebugHandler('PHP_CS_FIXER'); $xdebug->check(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php index 4ce212c16..8a568a524 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/AbstractDoctrineAnnotationFixer.php @@ -26,6 +26,15 @@ /** * @internal + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * ignored_tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * ignored_tags: list, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ abstract class AbstractDoctrineAnnotationFixer extends AbstractFixer implements ConfigurableFixerInterface { @@ -53,7 +62,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $doctrineAnnotationTokens = DoctrineAnnotationTokens::createFromDocComment( $docCommentToken, - $this->configuration['ignored_tags'] + $this->configuration['ignored_tags'] // @phpstan-ignore-line ); $this->fixAnnotations($doctrineAnnotationTokens); @@ -70,16 +79,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('ignored_tags', 'List of tags that must not be treated as Doctrine Annotations.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $values): bool { - foreach ($values as $value) { - if (!\is_string($value)) { - return false; - } - } - - return true; - }]) + ->setAllowedTypes(['string[]']) ->setDefault([ // PHPDocumentor 1 'abstract', @@ -222,6 +222,12 @@ private function nextElementAcceptsDoctrineAnnotations(Tokens $tokens, int $inde $modifierKinds[] = T_READONLY; } + if (\defined('T_PRIVATE_SET')) { // @TODO: drop condition when PHP 8.4+ is required + $modifierKinds[] = T_PRIVATE_SET; + $modifierKinds[] = T_PROTECTED_SET; + $modifierKinds[] = T_PUBLIC_SET; + } + while ($tokens[$index]->isGivenKind($modifierKinds)) { $index = $tokens->getNextMeaningfulToken($index); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php index 7b9ac1a08..878ac3d62 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/AbstractFixer.php @@ -14,19 +14,11 @@ namespace PhpCsFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; -use PhpCsFixer\ConfigurationException\InvalidForEnvFixerConfigurationException; use PhpCsFixer\ConfigurationException\RequiredFixerConfigurationException; -use PhpCsFixer\Console\Application; use PhpCsFixer\Fixer\ConfigurableFixerInterface; use PhpCsFixer\Fixer\FixerInterface; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; -use PhpCsFixer\FixerConfiguration\DeprecatedFixerOption; -use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; -use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; use PhpCsFixer\Tokenizer\Tokens; -use Symfony\Component\OptionsResolver\Exception\ExceptionInterface; -use Symfony\Component\OptionsResolver\Exception\MissingOptionsException; /** * @author Dariusz Rumiński @@ -35,20 +27,7 @@ */ abstract class AbstractFixer implements FixerInterface { - /** - * @var null|array - */ - protected $configuration; - - /** - * @var WhitespacesFixerConfig - */ - protected $whitespacesConfig; - - /** - * @var null|FixerConfigurationResolverInterface - */ - private $configurationDefinition; + protected WhitespacesFixerConfig $whitespacesConfig; public function __construct() { @@ -67,7 +46,7 @@ public function __construct() final public function fix(\SplFileInfo $file, Tokens $tokens): void { - if ($this instanceof ConfigurableFixerInterface && null === $this->configuration) { + if ($this instanceof ConfigurableFixerInterface && property_exists($this, 'configuration') && null === $this->configuration) { throw new RequiredFixerConfigurationException($this->getName(), 'Configuration is required.'); } @@ -99,68 +78,6 @@ public function supports(\SplFileInfo $file): bool return true; } - /** - * @param array $configuration - */ - public function configure(array $configuration): void - { - if (!$this instanceof ConfigurableFixerInterface) { - throw new \LogicException('Cannot configure using Abstract parent, child not implementing "PhpCsFixer\Fixer\ConfigurableFixerInterface".'); - } - - foreach ($this->getConfigurationDefinition()->getOptions() as $option) { - if (!$option instanceof DeprecatedFixerOption) { - continue; - } - - $name = $option->getName(); - if (\array_key_exists($name, $configuration)) { - Utils::triggerDeprecation(new \InvalidArgumentException(sprintf( - 'Option "%s" for rule "%s" is deprecated and will be removed in version %d.0. %s', - $name, - $this->getName(), - Application::getMajorVersion() + 1, - str_replace('`', '"', $option->getDeprecationMessage()) - ))); - } - } - - try { - $this->configuration = $this->getConfigurationDefinition()->resolve($configuration); - } catch (MissingOptionsException $exception) { - throw new RequiredFixerConfigurationException( - $this->getName(), - sprintf('Missing required configuration: %s', $exception->getMessage()), - $exception - ); - } catch (InvalidOptionsForEnvException $exception) { - throw new InvalidForEnvFixerConfigurationException( - $this->getName(), - sprintf('Invalid configuration for env: %s', $exception->getMessage()), - $exception - ); - } catch (ExceptionInterface $exception) { - throw new InvalidFixerConfigurationException( - $this->getName(), - sprintf('Invalid configuration: %s', $exception->getMessage()), - $exception - ); - } - } - - public function getConfigurationDefinition(): FixerConfigurationResolverInterface - { - if (!$this instanceof ConfigurableFixerInterface) { - throw new \LogicException(sprintf('Cannot get configuration definition using Abstract parent, child "%s" not implementing "PhpCsFixer\Fixer\ConfigurableFixerInterface".', static::class)); - } - - if (null === $this->configurationDefinition) { - $this->configurationDefinition = $this->createConfigurationDefinition(); - } - - return $this->configurationDefinition; - } - public function setWhitespacesConfig(WhitespacesFixerConfig $config): void { if (!$this instanceof WhitespacesAwareFixerInterface) { @@ -172,15 +89,6 @@ public function setWhitespacesConfig(WhitespacesFixerConfig $config): void abstract protected function applyFix(\SplFileInfo $file, Tokens $tokens): void; - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - if (!$this instanceof ConfigurableFixerInterface) { - throw new \LogicException('Cannot create configuration definition using Abstract parent, child not implementing "PhpCsFixer\Fixer\ConfigurableFixerInterface".'); - } - - throw new \LogicException('Not implemented.'); - } - private function getDefaultWhitespacesFixerConfig(): WhitespacesFixerConfig { static $defaultWhitespacesFixerConfig = null; diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php index 97a92deff..b919b217e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/AbstractFunctionReferenceFixer.php @@ -24,10 +24,7 @@ */ abstract class AbstractFunctionReferenceFixer extends AbstractFixer { - /** - * @var null|FunctionsAnalyzer - */ - private $functionsAnalyzer; + private ?FunctionsAnalyzer $functionsAnalyzer = null; public function isCandidate(Tokens $tokens): bool { @@ -43,7 +40,7 @@ public function isRisky(): bool * Looks up Tokens sequence for suitable candidates and delivers boundaries information, * which can be supplied by other methods in this abstract class. * - * @return null|int[] returns $functionName, $openParenthesis, $closeParenthesis packed into array + * @return ?array{int, int, int} returns $functionName, $openParenthesis, $closeParenthesis packed into array */ protected function find(string $functionNameToSearch, Tokens $tokens, int $start = 0, ?int $end = null): ?array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php index 48cd7763e..b45be5acd 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/AbstractNoUselessElseFixer.php @@ -93,7 +93,7 @@ protected function isSuperfluousElse(Tokens $tokens, int $index): bool * * @param int $index T_IF, T_ELSE, T_ELSEIF * - * @return int[] + * @return array{int, int} */ private function getPreviousBlock(Tokens $tokens, int $index): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php index e9d706393..9589a0e95 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocToTypeDeclarationFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,10 +30,27 @@ /** * @internal + * + * @phpstan-type _CommonTypeInfo array{commonType: string, isNullable: bool} + * @phpstan-type _AutogeneratedInputConfiguration array{ + * scalar_types?: bool, + * types_map?: array, + * union_types?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * scalar_types: bool, + * types_map: array, + * union_types: bool, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ abstract class AbstractPhpdocToTypeDeclarationFixer extends AbstractFixer implements ConfigurableFixerInterface { - private const REGEX_CLASS = '(?:\\\\?+'.TypeExpression::REGEX_IDENTIFIER + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + private const REGEX_CLASS = '(?:\\\?+'.TypeExpression::REGEX_IDENTIFIER .'(\\\\'.TypeExpression::REGEX_IDENTIFIER.')*+)'; /** @@ -75,6 +93,14 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setAllowedTypes(['bool']) ->setDefault(true) ->getOption(), + (new FixerOptionBuilder('union_types', 'Fix also union types; turned on by default on PHP >= 8.0.0.')) + ->setAllowedTypes(['bool']) + ->setDefault(\PHP_VERSION_ID >= 8_00_00) + ->getOption(), + (new FixerOptionBuilder('types_map', 'Map of custom types, e.g. template types from PHPStan.')) + ->setAllowedTypes(['array']) + ->setDefault([]) + ->getOption(), ]); } @@ -103,7 +129,7 @@ protected function findFunctionDocComment(Tokens $tokens, int $index): ?int } /** - * @return Annotation[] + * @return list */ protected function getAnnotationsFromDocComment(string $name, Tokens $tokens, int $docCommentIndex): array { @@ -123,7 +149,7 @@ protected function getAnnotationsFromDocComment(string $name, Tokens $tokens, in } /** - * @return Token[] + * @return list */ protected function createTypeDeclarationTokens(string $type, bool $isNullable): array { @@ -166,7 +192,7 @@ protected function createTypeDeclarationTokens(string $type, bool $isNullable): abstract protected function createTokensFromRawType(string $type): Tokens; /** - * @return null|array{string, bool} + * @return ?_CommonTypeInfo */ protected function getCommonTypeInfo(TypeExpression $typesExpression, bool $isReturnType): ?array { @@ -193,6 +219,10 @@ protected function getCommonTypeInfo(TypeExpression $typesExpression, bool $isRe return null; } + if (\array_key_exists($commonType, $this->configuration['types_map'])) { + $commonType = $this->configuration['types_map'][$commonType]; + } + if (isset($this->scalarTypes[$commonType])) { if (false === $this->configuration['scalar_types']) { return null; @@ -201,7 +231,7 @@ protected function getCommonTypeInfo(TypeExpression $typesExpression, bool $isRe return null; } - return [$commonType, $isNullable]; + return ['commonType' => $commonType, 'isNullable' => $isNullable]; } protected function getUnionTypes(TypeExpression $typesExpression, bool $isReturnType): ?string @@ -210,7 +240,11 @@ protected function getUnionTypes(TypeExpression $typesExpression, bool $isReturn return null; } - if (!$typesExpression->isUnionType() || '|' !== $typesExpression->getTypesGlue()) { + if (!$typesExpression->isUnionType()) { + return null; + } + + if (false === $this->configuration['union_types']) { return null; } @@ -236,7 +270,7 @@ protected function getUnionTypes(TypeExpression $typesExpression, bool $isReturn $typeExpression = new TypeExpression($type, null, []); $commonType = $typeExpression->getCommonType(); - if (!$containsOtherThanIterableType && !\in_array($commonType, ['array', 'Traversable', 'iterable'], true)) { + if (!$containsOtherThanIterableType && !\in_array($commonType, ['array', \Traversable::class, 'iterable'], true)) { $containsOtherThanIterableType = true; } if ($isReturnType && !$containsOtherThanEmptyType && !\in_array($commonType, ['null', 'void', 'never'], true)) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php index c7266c6d2..fe9ff4e6d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/AbstractPhpdocTypesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\DocBlock\Annotation; use PhpCsFixer\DocBlock\DocBlock; +use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; @@ -31,7 +32,7 @@ abstract class AbstractPhpdocTypesFixer extends AbstractFixer /** * The annotation tags search inside. * - * @var string[] + * @var list */ protected array $tags; @@ -62,7 +63,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } foreach ($annotations as $annotation) { - $this->fixTypes($annotation); + $this->fixType($annotation); } $tokens[$index] = new Token([T_DOC_COMMENT, $doc->getContent()]); @@ -75,44 +76,30 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void abstract protected function normalize(string $type): string; /** - * Fix the types at the given line. + * Fix the type at the given line. * * We must be super careful not to modify parts of words. * * This will be nicely handled behind the scenes for us by the annotation class. */ - private function fixTypes(Annotation $annotation): void + private function fixType(Annotation $annotation): void { - $types = $annotation->getTypes(); + $typeExpression = $annotation->getTypeExpression(); - $new = $this->normalizeTypes($types); - - if ($types !== $new) { - $annotation->setTypes($new); + if (null === $typeExpression) { + return; } - } - /** - * @param string[] $types - * - * @return string[] - */ - private function normalizeTypes(array $types): array - { - foreach ($types as $index => $type) { - $types[$index] = $this->normalizeType($type); - } + $newTypeExpression = $typeExpression->mapTypes(function (TypeExpression $type) { + if (!$type->isCompositeType()) { + $value = $this->normalize($type->toString()); - return $types; - } + return new TypeExpression($value, null, []); + } - /** - * Prepare the type and normalize it. - */ - private function normalizeType(string $type): string - { - return str_ends_with($type, '[]') - ? $this->normalizeType(substr($type, 0, -2)).'[]' - : $this->normalize($type); + return $type; + }); + + $annotation->setTypes([$newTypeExpression->toString()]); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php b/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php index d312bae9f..96eab156a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/AbstractProxyFixer.php @@ -100,7 +100,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @return FixerInterface[] + * @return list */ abstract protected function createProxyFixers(): array; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php index dfa70634a..29976749c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Cache/Cache.php @@ -75,8 +75,8 @@ public function toJson(): string 'hashes' => $this->hashes, ]); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new \UnexpectedValueException(sprintf( + if (JSON_ERROR_NONE !== json_last_error() || false === $json) { + throw new \UnexpectedValueException(\sprintf( 'Cannot encode cache signature to JSON, error: "%s". If you have non-UTF8 chars in your signature, like in license for `header_comment`, consider enabling `ext-mbstring` or install `symfony/polyfill-mbstring`.', json_last_error_msg() )); @@ -93,7 +93,7 @@ public static function fromJson(string $json): self $data = json_decode($json, true); if (null === $data && JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(sprintf( + throw new \InvalidArgumentException(\sprintf( 'Value needs to be a valid JSON string, got "%s", error: "%s".', $json, json_last_error_msg() @@ -112,7 +112,7 @@ public static function fromJson(string $json): self $missingKeys = array_diff_key(array_flip($requiredKeys), $data); if (\count($missingKeys) > 0) { - throw new \InvalidArgumentException(sprintf( + throw new \InvalidArgumentException(\sprintf( 'JSON data is missing keys %s', Utils::naturalLanguageJoin(array_keys($missingKeys)) )); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php index 4e82d0c9c..b9fb2ff63 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Cache/CacheManagerInterface.php @@ -24,4 +24,6 @@ interface CacheManagerInterface public function needFixing(string $file, string $fileContent): bool; public function setFile(string $file, string $fileContent): void; + + public function setFileHash(string $file, string $hash): void; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php index 265738965..396137d9a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Cache/Directory.php @@ -17,6 +17,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class Directory implements DirectoryInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php index 1e3f64dc1..2665e8404 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Cache/FileCacheManager.php @@ -14,6 +14,8 @@ namespace PhpCsFixer\Cache; +use PhpCsFixer\Hasher; + /** * Class supports caching information about state of fixing files. * @@ -46,10 +48,7 @@ final class FileCacheManager implements CacheManagerInterface private bool $signatureWasUpdated = false; - /** - * @var CacheInterface - */ - private $cache; + private CacheInterface $cache; public function __construct( FileHandlerInterface $handler, @@ -101,9 +100,12 @@ public function needFixing(string $file, string $fileContent): bool public function setFile(string $file, string $fileContent): void { - $file = $this->cacheDirectory->getRelativePathTo($file); + $this->setFileHash($file, $this->calcHash($fileContent)); + } - $hash = $this->calcHash($fileContent); + public function setFileHash(string $file, string $hash): void + { + $file = $this->cacheDirectory->getRelativePathTo($file); if ($this->isDryRun && $this->cache->has($file) && $this->cache->get($file) !== $hash) { $this->cache->clear($file); @@ -136,6 +138,6 @@ private function writeCache(): void private function calcHash(string $content): string { - return md5($content); + return Hasher::calculate($content); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php index 51b4ca586..a1b83ed78 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Cache/FileHandler.php @@ -140,7 +140,7 @@ private function ensureFileIsWriteable(): void if ($this->fileInfo->isDir()) { throw new IOException( - sprintf('Cannot write cache file "%s" as the location exists as directory.', $this->fileInfo->getRealPath()), + \sprintf('Cannot write cache file "%s" as the location exists as directory.', $this->fileInfo->getRealPath()), 0, null, $this->fileInfo->getPathname() @@ -149,7 +149,7 @@ private function ensureFileIsWriteable(): void if ($this->fileInfo->isFile() && !$this->fileInfo->isWritable()) { throw new IOException( - sprintf('Cannot write to file "%s" as it is not writable.', $this->fileInfo->getRealPath()), + \sprintf('Cannot write to file "%s" as it is not writable.', $this->fileInfo->getRealPath()), 0, null, $this->fileInfo->getPathname() @@ -171,7 +171,7 @@ private function createFile(string $file): void if (!@is_dir($dir)) { throw new IOException( - sprintf('Directory of cache file "%s" does not exists and couldn\'t be created.', $file), + \sprintf('Directory of cache file "%s" does not exists and couldn\'t be created.', $file), 0, null, $file diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php index ff0b6fed7..3a5fe9914 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Cache/NullCacheManager.php @@ -16,6 +16,7 @@ /** * @author Andreas Möller + * @author Dariusz Rumiński * * @internal */ @@ -27,4 +28,6 @@ public function needFixing(string $file, string $fileContent): bool } public function setFile(string $file, string $fileContent): void {} + + public function setFileHash(string $file, string $hash): void {} } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php b/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php index 48c962898..17be5de09 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Cache/Signature.php @@ -17,6 +17,8 @@ /** * @author Andreas Möller * + * @readonly + * * @internal */ final class Signature implements SignatureInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/Config.php b/vendor/friendsofphp/php-cs-fixer/src/Config.php index 6ed9f5cb0..1cbd03237 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Config.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Config.php @@ -15,18 +15,23 @@ namespace PhpCsFixer; use PhpCsFixer\Fixer\FixerInterface; +use PhpCsFixer\Runner\Parallel\ParallelConfig; +use PhpCsFixer\Runner\Parallel\ParallelConfigFactory; /** * @author Fabien Potencier * @author Katsuhiro Ogawa * @author Dariusz Rumiński */ -class Config implements ConfigInterface +class Config implements ConfigInterface, ParallelAwareConfigInterface { + /** + * @var non-empty-string + */ private string $cacheFile = '.php-cs-fixer.cache'; /** - * @var FixerInterface[] + * @var list */ private array $customFixers = []; @@ -35,37 +40,61 @@ class Config implements ConfigInterface */ private ?iterable $finder = null; - private string $format = 'txt'; + private string $format; private bool $hideProgress = false; + /** + * @var non-empty-string + */ private string $indent = ' '; private bool $isRiskyAllowed = false; + /** + * @var non-empty-string + */ private string $lineEnding = "\n"; private string $name; - /** - * @var null|string - */ - private $phpExecutable; + private ParallelConfig $parallelConfig; + + private ?string $phpExecutable = null; /** * @TODO: 4.0 - update to @PER * * @var array|bool> */ - private array $rules = ['@PSR12' => true]; + private array $rules; private bool $usingCache = true; public function __construct(string $name = 'default') { - $this->name = $name; + // @TODO 4.0 cleanup + if (Utils::isFutureModeEnabled()) { + $this->name = $name.' (future mode)'; + $this->rules = ['@PER-CS' => true]; + $this->format = '@auto'; + } else { + $this->name = $name; + $this->rules = ['@PSR12' => true]; + $this->format = 'txt'; + } + + // @TODO 4.0 cleanup + if (Utils::isFutureModeEnabled() || filter_var(getenv('PHP_CS_FIXER_PARALLEL'), FILTER_VALIDATE_BOOL)) { + $this->parallelConfig = ParallelConfigFactory::detect(); + } else { + $this->parallelConfig = ParallelConfigFactory::sequential(); + } } + /** + * @return non-empty-string + */ public function getCacheFile(): string { return $this->cacheFile; @@ -81,9 +110,7 @@ public function getCustomFixers(): array */ public function getFinder(): iterable { - if (null === $this->finder) { - $this->finder = new Finder(); - } + $this->finder ??= new Finder(); return $this->finder; } @@ -113,6 +140,11 @@ public function getName(): string return $this->name; } + public function getParallelConfig(): ParallelConfig + { + return $this->parallelConfig; + } + public function getPhpExecutable(): ?string { return $this->phpExecutable; @@ -142,6 +174,9 @@ public function registerCustomFixers(iterable $fixers): ConfigInterface return $this; } + /** + * @param non-empty-string $cacheFile + */ public function setCacheFile(string $cacheFile): ConfigInterface { $this->cacheFile = $cacheFile; @@ -170,6 +205,9 @@ public function setHideProgress(bool $hideProgress): ConfigInterface return $this; } + /** + * @param non-empty-string $indent + */ public function setIndent(string $indent): ConfigInterface { $this->indent = $indent; @@ -177,6 +215,9 @@ public function setIndent(string $indent): ConfigInterface return $this; } + /** + * @param non-empty-string $lineEnding + */ public function setLineEnding(string $lineEnding): ConfigInterface { $this->lineEnding = $lineEnding; @@ -184,6 +225,13 @@ public function setLineEnding(string $lineEnding): ConfigInterface return $this; } + public function setParallelConfig(ParallelConfig $config): ConfigInterface + { + $this->parallelConfig = $config; + + return $this; + } + public function setPhpExecutable(?string $phpExecutable): ConfigInterface { $this->phpExecutable = $phpExecutable; diff --git a/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php b/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php index b46b191b0..c097a582d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/ConfigInterface.php @@ -25,14 +25,14 @@ interface ConfigInterface /** * Returns the path to the cache file. * - * @return null|string Returns null if not using cache + * @return null|non-empty-string Returns null if not using cache */ public function getCacheFile(): ?string; /** * Returns the custom fixers to use. * - * @return FixerInterface[] + * @return list */ public function getCustomFixers(): array; @@ -50,8 +50,14 @@ public function getFormat(): string; */ public function getHideProgress(): bool; + /** + * @return non-empty-string + */ public function getIndent(): string; + /** + * @return non-empty-string + */ public function getLineEnding(): string; /** @@ -65,6 +71,10 @@ public function getName(): string; /** * Get configured PHP executable, if any. + * + * @deprecated + * + * @TODO 4.0 remove me */ public function getPhpExecutable(): ?string; @@ -92,12 +102,14 @@ public function getUsingCache(): bool; * * Name of custom fixer should follow `VendorName/rule_name` convention. * - * @param FixerInterface[]|iterable|\Traversable $fixers + * @param iterable $fixers */ public function registerCustomFixers(iterable $fixers): self; /** * Sets the path to the cache file. + * + * @param non-empty-string $cacheFile */ public function setCacheFile(string $cacheFile): self; @@ -110,12 +122,22 @@ public function setFormat(string $format): self; public function setHideProgress(bool $hideProgress): self; + /** + * @param non-empty-string $indent + */ public function setIndent(string $indent): self; + /** + * @param non-empty-string $lineEnding + */ public function setLineEnding(string $lineEnding): self; /** * Set PHP executable. + * + * @deprecated + * + * @TODO 4.0 remove me */ public function setPhpExecutable(?string $phpExecutable): self; diff --git a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php b/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php index 140385c38..8607bbfa4 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php +++ b/vendor/friendsofphp/php-cs-fixer/src/ConfigurationException/InvalidFixerConfigurationException.php @@ -30,7 +30,7 @@ class InvalidFixerConfigurationException extends InvalidConfigurationException public function __construct(string $fixerName, string $message, ?\Throwable $previous = null) { parent::__construct( - sprintf('[%s] %s', $fixerName, $message), + \sprintf('[%s] %s', $fixerName, $message), FixCommandExitStatusCalculator::EXIT_STATUS_FLAG_HAS_INVALID_FIXER_CONFIG, $previous ); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php index 39fcc5879..e12c53bad 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Application.php @@ -21,12 +21,15 @@ use PhpCsFixer\Console\Command\ListFilesCommand; use PhpCsFixer\Console\Command\ListSetsCommand; use PhpCsFixer\Console\Command\SelfUpdateCommand; +use PhpCsFixer\Console\Command\WorkerCommand; use PhpCsFixer\Console\SelfUpdate\GithubClient; use PhpCsFixer\Console\SelfUpdate\NewVersionChecker; use PhpCsFixer\PharChecker; +use PhpCsFixer\Runner\Parallel\WorkerException; use PhpCsFixer\ToolInfo; use PhpCsFixer\Utils; use Symfony\Component\Console\Application as BaseApplication; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\ListCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\ConsoleOutputInterface; @@ -40,14 +43,19 @@ */ final class Application extends BaseApplication { - public const VERSION = '3.38.2'; - public const VERSION_CODENAME = 'CI Marathon'; + public const NAME = 'PHP CS Fixer'; + public const VERSION = '3.75.0'; + public const VERSION_CODENAME = 'Persian Successor'; + /** + * @readonly + */ private ToolInfo $toolInfo; + private ?Command $executedCommand = null; public function __construct() { - parent::__construct('PHP CS Fixer', self::VERSION); + parent::__construct(self::NAME, self::VERSION); $this->toolInfo = new ToolInfo(); @@ -62,6 +70,7 @@ public function __construct() $this->toolInfo, new PharChecker() )); + $this->add(new WorkerCommand($this->toolInfo)); } public static function getMajorVersion(): int @@ -83,7 +92,7 @@ public function doRun(InputInterface $input, OutputInterface $output): int if (\count($warnings) > 0) { foreach ($warnings as $warning) { - $stdErr->writeln(sprintf($stdErr->isDecorated() ? '%s' : '%s', $warning)); + $stdErr->writeln(\sprintf($stdErr->isDecorated() ? '%s' : '%s', $warning)); } $stdErr->writeln(''); } @@ -101,7 +110,7 @@ public function doRun(InputInterface $input, OutputInterface $output): int $stdErr->writeln(''); $stdErr->writeln($stdErr->isDecorated() ? 'Detected deprecations in use:' : 'Detected deprecations in use:'); foreach ($triggeredDeprecations as $deprecation) { - $stdErr->writeln(sprintf('- %s', $deprecation)); + $stdErr->writeln(\sprintf('- %s', $deprecation)); } } } @@ -109,8 +118,13 @@ public function doRun(InputInterface $input, OutputInterface $output): int return $result; } - public function getLongVersion(): string + /** + * @internal + */ + public static function getAbout(bool $decorated = false): string { + $longVersion = \sprintf('%s %s', self::NAME, self::VERSION); + $commit = '@git-commit@'; $versionCommit = ''; @@ -118,17 +132,81 @@ public function getLongVersion(): string $versionCommit = substr($commit, 0, 7); } - return implode('', [ - parent::getLongVersion(), - $versionCommit ? sprintf(' (%s)', $versionCommit) : '', // @phpstan-ignore-line to avoid `Ternary operator condition is always true|false.` - self::VERSION_CODENAME ? sprintf(' %s', self::VERSION_CODENAME) : '', // @phpstan-ignore-line to avoid `Ternary operator condition is always true|false.` - ' by Fabien Potencier and Dariusz Ruminski.', - "\nPHP runtime: ".PHP_VERSION.'', + $about = implode('', [ + $longVersion, + $versionCommit ? \sprintf(' (%s)', $versionCommit) : '', // @phpstan-ignore-line to avoid `Ternary operator condition is always true|false.` + self::VERSION_CODENAME ? \sprintf(' %s', self::VERSION_CODENAME) : '', // @phpstan-ignore-line to avoid `Ternary operator condition is always true|false.` + ' by Fabien Potencier, Dariusz Ruminski and contributors.', ]); + + if (false === $decorated) { + return strip_tags($about); + } + + return $about; + } + + /** + * @internal + */ + public static function getAboutWithRuntime(bool $decorated = false): string + { + $about = self::getAbout(true)."\nPHP runtime: ".PHP_VERSION.''; + if (false === $decorated) { + return strip_tags($about); + } + + return $about; + } + + public function getLongVersion(): string + { + return self::getAboutWithRuntime(true); } protected function getDefaultCommands(): array { return [new HelpCommand(), new ListCommand()]; } + + /** + * @throws \Throwable + */ + protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output): int + { + $this->executedCommand = $command; + + return parent::doRunCommand($command, $input, $output); + } + + protected function doRenderThrowable(\Throwable $e, OutputInterface $output): void + { + // Since parallel analysis utilises child processes, and they have their own output, + // we need to capture the output of the child process to determine it there was an exception. + // Default render format is not machine-friendly, so we need to override it for `worker` command, + // in order to be able to easily parse exception data for further displaying on main process' side. + if ($this->executedCommand instanceof WorkerCommand) { + $output->writeln(WorkerCommand::ERROR_PREFIX.json_encode( + [ + 'class' => \get_class($e), + 'message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'code' => $e->getCode(), + 'trace' => $e->getTraceAsString(), + ] + )); + + return; + } + + parent::doRenderThrowable($e, $output); + + if ($output->isVeryVerbose() && $e instanceof WorkerException) { + $output->writeln('Original trace from worker:'); + $output->writeln(''); + $output->writeln($e->getOriginalTraceAsString()); + $output->writeln(''); + } + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/CheckCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/CheckCommand.php index d5c83b72c..cb261916b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/CheckCommand.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/CheckCommand.php @@ -28,6 +28,7 @@ final class CheckCommand extends FixCommand { protected static $defaultName = 'check'; + protected static $defaultDescription = 'Checks if configured files/directories comply with configured rules.'; public function __construct(ToolInfoInterface $toolInfo) diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php index 2b5f9c3b5..f3ae65690 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DescribeCommand.php @@ -15,12 +15,16 @@ namespace PhpCsFixer\Console\Command; use PhpCsFixer\Config; +use PhpCsFixer\Console\Application; use PhpCsFixer\Console\ConfigurationResolver; use PhpCsFixer\Differ\DiffConsoleFormatter; use PhpCsFixer\Differ\FullDiffer; +use PhpCsFixer\Documentation\FixerDocumentGenerator; use PhpCsFixer\Fixer\ConfigurableFixerInterface; use PhpCsFixer\Fixer\DeprecatedFixerInterface; +use PhpCsFixer\Fixer\ExperimentalFixerInterface; use PhpCsFixer\Fixer\FixerInterface; +use PhpCsFixer\Fixer\InternalFixerInterface; use PhpCsFixer\FixerConfiguration\AliasedFixerOption; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\DeprecatedFixerOption; @@ -55,16 +59,16 @@ final class DescribeCommand extends Command protected static $defaultName = 'describe'; /** - * @var string[] + * @var ?list */ - private $setNames; + private ?array $setNames = null; private FixerFactory $fixerFactory; /** - * @var array + * @var null|array */ - private $fixers; + private ?array $fixers = null; public function __construct(?FixerFactory $fixerFactory = null) { @@ -93,9 +97,9 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity() && $output instanceof ConsoleOutputInterface) { + if ($output instanceof ConsoleOutputInterface) { $stdErr = $output->getErrorOutput(); - $stdErr->writeln($this->getApplication()->getLongVersion()); + $stdErr->writeln(Application::getAboutWithRuntime(true)); } $resolver = new ConfigurationResolver( @@ -126,7 +130,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->describeList($output, $e->getType()); - throw new \InvalidArgumentException(sprintf( + throw new \InvalidArgumentException(\sprintf( '%s "%s" not found.%s', ucfirst($e->getType()), $name, @@ -150,24 +154,28 @@ private function describeRule(OutputInterface $output, string $name): void $definition = $fixer->getDefinition(); - $summary = $definition->getSummary(); + $output->writeln(\sprintf('Description of the `%s` rule.', $name)); + $output->writeln(''); + + if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { + $output->writeln(\sprintf('Fixer class: %s.', \get_class($fixer))); + $output->writeln(''); + } if ($fixer instanceof DeprecatedFixerInterface) { $successors = $fixer->getSuccessorsNames(); $message = [] === $successors - ? 'will be removed in the next major version' - : sprintf('use %s instead', Utils::naturalLanguageJoinWithBackticks($successors)); - $message = Preg::replace('/(`.+?`)/', '$1', $message); - $summary .= sprintf(' DEPRECATED: %s.', $message); - } - - $output->writeln(sprintf('Description of %s rule.', $name)); + ? \sprintf('it will be removed in version %d.0', Application::getMajorVersion() + 1) + : \sprintf('use %s instead', Utils::naturalLanguageJoinWithBackticks($successors)); - if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { - $output->writeln(sprintf('Fixer class: %s.', \get_class($fixer))); + $endMessage = '. '.ucfirst($message); + Utils::triggerDeprecation(new \RuntimeException(str_replace('`', '"', "Rule \"{$name}\" is deprecated{$endMessage}."))); + $message = Preg::replace('/(`[^`]+`)/', '$1', $message); + $output->writeln(\sprintf('DEPRECATED: %s.', $message)); + $output->writeln(''); } - $output->writeln($summary); + $output->writeln($definition->getSummary()); $description = $definition->getDescription(); @@ -177,8 +185,22 @@ private function describeRule(OutputInterface $output, string $name): void $output->writeln(''); + if ($fixer instanceof ExperimentalFixerInterface) { + $output->writeln('Fixer applying this rule is EXPERIMENTAL..'); + $output->writeln('It is not covered with backward compatibility promise and may produce unstable or unexpected results.'); + + $output->writeln(''); + } + + if ($fixer instanceof InternalFixerInterface) { + $output->writeln('Fixer applying this rule is INTERNAL..'); + $output->writeln('It is expected to be used only on PHP CS Fixer project itself.'); + + $output->writeln(''); + } + if ($fixer->isRisky()) { - $output->writeln('Fixer applying this rule is risky.'); + $output->writeln('Fixer applying this rule is RISKY.'); $riskyDescription = $definition->getRiskyDescription(); @@ -193,7 +215,7 @@ private function describeRule(OutputInterface $output, string $name): void $configurationDefinition = $fixer->getConfigurationDefinition(); $options = $configurationDefinition->getOptions(); - $output->writeln(sprintf('Fixer is configurable using following option%s:', 1 === \count($options) ? '' : 's')); + $output->writeln(\sprintf('Fixer is configurable using following option%s:', 1 === \count($options) ? '' : 's')); foreach ($options as $option) { $line = '* '.OutputFormatter::escape($option->getName()).''; @@ -216,7 +238,7 @@ private function describeRule(OutputInterface $output, string $name): void $line .= ': '.lcfirst(Preg::replace('/\.$/', '', $description)).'; '; if ($option->hasDefault()) { - $line .= sprintf( + $line .= \sprintf( 'defaults to %s', Utils::toString($option->getDefault()) ); @@ -242,7 +264,7 @@ private function describeRule(OutputInterface $output, string $name): void $output->writeln(''); } - /** @var CodeSampleInterface[] $codeSamples */ + /** @var list $codeSamples */ $codeSamples = array_filter($definition->getCodeSamples(), static function (CodeSampleInterface $codeSample): bool { if ($codeSample instanceof VersionSpecificCodeSampleInterface) { return $codeSample->isSuitableFor(\PHP_VERSION_ID); @@ -251,9 +273,14 @@ private function describeRule(OutputInterface $output, string $name): void return true; }); - if (0 === \count($codeSamples)) { + if (0 === \count($definition->getCodeSamples())) { + $output->writeln([ + 'Fixing examples are not available for this rule.', + '', + ]); + } elseif (0 === \count($codeSamples)) { $output->writeln([ - 'Fixing examples cannot be demonstrated on the current PHP version.', + 'Fixing examples cannot be demonstrated on the current PHP version.', '', ]); } else { @@ -262,7 +289,7 @@ private function describeRule(OutputInterface $output, string $name): void $differ = new FullDiffer(); $diffFormatter = new DiffConsoleFormatter( $output->isDecorated(), - sprintf( + \sprintf( ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', PHP_EOL, PHP_EOL @@ -289,17 +316,35 @@ private function describeRule(OutputInterface $output, string $name): void if ($fixer instanceof ConfigurableFixerInterface) { if (null === $configuration) { - $output->writeln(sprintf(' * Example #%d. Fixing with the default configuration.', $index + 1)); + $output->writeln(\sprintf(' * Example #%d. Fixing with the default configuration.', $index + 1)); } else { - $output->writeln(sprintf(' * Example #%d. Fixing with configuration: %s.', $index + 1, Utils::toString($codeSample->getConfiguration()))); + $output->writeln(\sprintf(' * Example #%d. Fixing with configuration: %s.', $index + 1, Utils::toString($codeSample->getConfiguration()))); } } else { - $output->writeln(sprintf(' * Example #%d.', $index + 1)); + $output->writeln(\sprintf(' * Example #%d.', $index + 1)); } $output->writeln([$diffFormatter->format($diff, ' %s'), '']); } } + + $ruleSetConfigs = FixerDocumentGenerator::getSetsOfRule($name); + + if ([] !== $ruleSetConfigs) { + ksort($ruleSetConfigs); + $plural = 1 !== \count($ruleSetConfigs) ? 's' : ''; + $output->writeln("Fixer is part of the following rule set{$plural}:"); + + foreach ($ruleSetConfigs as $set => $config) { + if (null !== $config) { + $output->writeln(\sprintf('* %s with config: %s', $set, Utils::toString($config))); + } else { + $output->writeln(\sprintf('* %s with default config', $set)); + } + } + + $output->writeln(''); + } } private function describeSet(OutputInterface $output, string $name): void @@ -311,21 +356,23 @@ private function describeSet(OutputInterface $output, string $name): void $ruleSetDefinitions = RuleSets::getSetDefinitions(); $fixers = $this->getFixers(); - $output->writeln(sprintf('Description of the %s set.', $ruleSetDefinitions[$name]->getName())); + $output->writeln(\sprintf('Description of the `%s` set.', $ruleSetDefinitions[$name]->getName())); + $output->writeln(''); + $output->writeln($this->replaceRstLinks($ruleSetDefinitions[$name]->getDescription())); + $output->writeln(''); if ($ruleSetDefinitions[$name]->isRisky()) { - $output->writeln('This set contains risky rules.'); + $output->writeln('This set contains risky rules.'); + $output->writeln(''); } - $output->writeln(''); - $help = ''; foreach ($ruleSetDefinitions[$name]->getRules() as $rule => $config) { if (str_starts_with($rule, '@')) { $set = $ruleSetDefinitions[$rule]; - $help .= sprintf( + $help .= \sprintf( " * %s%s\n | %s\n\n", $rule, $set->isRisky() ? ' risky' : '', @@ -339,12 +386,12 @@ private function describeSet(OutputInterface $output, string $name): void $fixer = $fixers[$rule]; $definition = $fixer->getDefinition(); - $help .= sprintf( + $help .= \sprintf( " * %s%s\n | %s\n%s\n", $rule, $fixer->isRisky() ? ' risky' : '', $definition->getSummary(), - true !== $config ? sprintf(" | Configuration: %s\n", Utils::toString($config)) : '' + true !== $config ? \sprintf(" | Configuration: %s\n", Utils::toString($config)) : '' ); } @@ -373,7 +420,7 @@ private function getFixers(): array } /** - * @return string[] + * @return list */ private function getSetNames(): array { @@ -391,23 +438,25 @@ private function getSetNames(): array */ private function describeList(OutputInterface $output, string $type): void { - if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE) { - $describe = [ - 'sets' => $this->getSetNames(), - 'rules' => $this->getFixers(), - ]; - } elseif ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { - $describe = 'set' === $type ? ['sets' => $this->getSetNames()] : ['rules' => $this->getFixers()]; - } else { + if ($output->getVerbosity() < OutputInterface::VERBOSITY_VERBOSE) { return; } - /** @var string[] $items */ - foreach ($describe as $list => $items) { - $output->writeln(sprintf('Defined %s:', $list)); + if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE || 'set' === $type) { + $output->writeln('Defined sets:'); + + $items = $this->getSetNames(); + foreach ($items as $item) { + $output->writeln(\sprintf('* %s', $item)); + } + } + + if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE || 'rule' === $type) { + $output->writeln('Defined rules:'); - foreach ($items as $name => $item) { - $output->writeln(sprintf('* %s', \is_string($name) ? $name : $item)); + $items = array_keys($this->getFixers()); + foreach ($items as $item) { + $output->writeln(\sprintf('* %s', $item)); } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php index 18c5c317b..a2e34695b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/DocumentationCommand.php @@ -16,7 +16,6 @@ use PhpCsFixer\Documentation\DocumentationLocator; use PhpCsFixer\Documentation\FixerDocumentGenerator; -use PhpCsFixer\Documentation\ListDocumentGenerator; use PhpCsFixer\Documentation\RuleSetDocumentationGenerator; use PhpCsFixer\FixerFactory; use PhpCsFixer\RuleSet\RuleSets; @@ -36,6 +35,14 @@ final class DocumentationCommand extends Command { protected static $defaultName = 'documentation'; + private Filesystem $filesystem; + + public function __construct(Filesystem $filesystem) + { + parent::__construct(); + $this->filesystem = $filesystem; + } + protected function configure(): void { $this @@ -46,7 +53,6 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - $filesystem = new Filesystem(); $locator = new DocumentationLocator(); $fixerFactory = new FixerFactory(); @@ -57,7 +63,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int $fixerDocumentGenerator = new FixerDocumentGenerator($locator); $ruleSetDocumentationGenerator = new RuleSetDocumentationGenerator($locator); - $listDocumentGenerator = new ListDocumentGenerator($locator); // Array of existing fixer docs. // We first override existing files, and then we will delete files that are no longer needed. @@ -67,7 +72,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int foreach ($fixers as $fixer) { $docForFixerRelativePaths[] = $locator->getFixerDocumentationFileRelativePath($fixer); - $filesystem->dumpFile( + $this->filesystem->dumpFile( $locator->getFixerDocumentationFilePath($fixer), $fixerDocumentGenerator->generateFixerDocumentation($fixer) ); @@ -79,12 +84,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int ->in($locator->getFixersDocumentationDirectoryPath()) ->notPath($docForFixerRelativePaths) as $file ) { - $filesystem->remove($file->getPathname()); + $this->filesystem->remove($file->getPathname()); } // Fixer doc. index - $filesystem->dumpFile( + $this->filesystem->dumpFile( $locator->getFixersDocumentationIndexFilePath(), $fixerDocumentGenerator->generateFixersDocumentationIndex($fixers) ); @@ -93,31 +98,24 @@ protected function execute(InputInterface $input, OutputInterface $output): int /** @var SplFileInfo $file */ foreach ((new Finder())->files()->in($locator->getRuleSetsDocumentationDirectoryPath()) as $file) { - $filesystem->remove($file->getPathname()); + $this->filesystem->remove($file->getPathname()); } $paths = []; foreach ($setDefinitions as $name => $definition) { $path = $locator->getRuleSetsDocumentationFilePath($name); - $paths[$name] = $path; - $filesystem->dumpFile($path, $ruleSetDocumentationGenerator->generateRuleSetsDocumentation($definition, $fixers)); + $paths[$path] = $definition; + $this->filesystem->dumpFile($path, $ruleSetDocumentationGenerator->generateRuleSetsDocumentation($definition, $fixers)); } // RuleSet doc. index - $filesystem->dumpFile( + $this->filesystem->dumpFile( $locator->getRuleSetsDocumentationIndexFilePath(), $ruleSetDocumentationGenerator->generateRuleSetsDocumentationIndex($paths) ); - // List file / Appendix - - $filesystem->dumpFile( - $locator->getListingFilePath(), - $listDocumentGenerator->generateListingDocumentation($fixers) - ); - $output->writeln('Docs updated.'); return 0; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php index 65c408fde..7d4474c17 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommand.php @@ -17,6 +17,7 @@ use PhpCsFixer\Config; use PhpCsFixer\ConfigInterface; use PhpCsFixer\ConfigurationException\InvalidConfigurationException; +use PhpCsFixer\Console\Application; use PhpCsFixer\Console\ConfigurationResolver; use PhpCsFixer\Console\Output\ErrorOutput; use PhpCsFixer\Console\Output\OutputContext; @@ -24,11 +25,12 @@ use PhpCsFixer\Console\Output\Progress\ProgressOutputType; use PhpCsFixer\Console\Report\FixReport\ReportSummary; use PhpCsFixer\Error\ErrorsManager; -use PhpCsFixer\FixerFileProcessedEvent; +use PhpCsFixer\Runner\Event\FileProcessed; use PhpCsFixer\Runner\Runner; use PhpCsFixer\ToolInfoInterface; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -51,6 +53,7 @@ /* final */ class FixCommand extends Command { protected static $defaultName = 'fix'; + protected static $defaultDescription = 'Fixes a directory or a file.'; private EventDispatcherInterface $eventDispatcher; @@ -97,7 +100,11 @@ public function getHelp(): string $ php %command.full_name% --path-mode=intersection /path/to/dir - The --format option for the output format. Supported formats are `txt` (default one), `json`, `xml`, `checkstyle`, `junit` and `gitlab`. + The --format option for the output format. Supported formats are `@auto` (default one on v4+), `txt` (default one on v3), `json`, `xml`, `checkstyle`, `junit` and `gitlab`. + + * `@auto` aims to auto-select best reporter for given CI or local execution (resolution into best format is outside of BC promise and is future-ready) + * `gitlab` for GitLab + * `@auto,{format}` takes `@auto` under CI, and {format} otherwise NOTE: the output for the following formats are generated in accordance with schemas @@ -146,6 +153,8 @@ public function getHelp(): string The --dry-run flag will run the fixer without making changes to your files. + The --sequential flag will enforce sequential analysis even if parallel config is provided. + The --diff flag can be used to let the fixer output all the changes it makes. The --allow-risky option (pass `yes` or `no`) allows you to set whether risky rules may run. Default value is taken from config file. @@ -157,8 +166,9 @@ public function getHelp(): string * none: disables progress output; * dots: multiline progress output with number of files and percentage on each line. + * bar: single line progress output with number of files and calculated percentage. - If the option is not provided, it defaults to dots unless a config file that disables output is used, in which case it defaults to none. This option has no effect if the verbosity of the command is less than verbose. + If the option is not provided, it defaults to bar unless a config file that disables output is used, in which case it defaults to none. This option has no effect if the verbosity of the command is less than verbose. $ php %command.full_name% --verbose --show-progress=dots @@ -201,12 +211,13 @@ protected function configure(): void new InputOption('config', '', InputOption::VALUE_REQUIRED, 'The path to a config file.'), new InputOption('dry-run', '', InputOption::VALUE_NONE, 'Only shows which files would have been modified.'), new InputOption('rules', '', InputOption::VALUE_REQUIRED, 'List of rules that should be run against configured paths.'), - new InputOption('using-cache', '', InputOption::VALUE_REQUIRED, 'Does cache should be used (can be `yes` or `no`).'), + new InputOption('using-cache', '', InputOption::VALUE_REQUIRED, 'Should cache be used (can be `yes` or `no`).'), new InputOption('cache-file', '', InputOption::VALUE_REQUIRED, 'The path to the cache file.'), new InputOption('diff', '', InputOption::VALUE_NONE, 'Prints diff for each file.'), new InputOption('format', '', InputOption::VALUE_REQUIRED, 'To output results in other formats.'), new InputOption('stop-on-violation', '', InputOption::VALUE_NONE, 'Stop execution on first violation.'), new InputOption('show-progress', '', InputOption::VALUE_REQUIRED, 'Type of progress indicator (none, dots).'), + new InputOption('sequential', '', InputOption::VALUE_NONE, 'Enforce sequential analysis.'), ] ); } @@ -238,6 +249,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int 'stop-on-violation' => $input->getOption('stop-on-violation'), 'verbosity' => $verbosity, 'show-progress' => $input->getOption('show-progress'), + 'sequential' => $input->getOption('sequential'), ], getcwd(), $this->toolInfo @@ -250,18 +262,41 @@ protected function execute(InputInterface $input, OutputInterface $output): int : ('txt' === $reporter->getFormat() ? $output : null); if (null !== $stdErr) { - if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { - $stdErr->writeln($this->getApplication()->getLongVersion()); - } + $stdErr->writeln(Application::getAboutWithRuntime(true)); + $isParallel = $resolver->getParallelConfig()->getMaxProcesses() > 1; + + $stdErr->writeln(\sprintf( + 'Running analysis on %d core%s.', + $resolver->getParallelConfig()->getMaxProcesses(), + $isParallel ? \sprintf( + 's with %d file%s per process', + $resolver->getParallelConfig()->getFilesPerProcess(), + $resolver->getParallelConfig()->getFilesPerProcess() > 1 ? 's' : '' + ) : ' sequentially' + )); + + /** @TODO v4 remove warnings related to parallel runner */ + $usageDocs = 'https://cs.symfony.com/doc/usage.html'; + $stdErr->writeln(\sprintf( + $stdErr->isDecorated() ? '%s' : '%s', + $isParallel + ? 'Parallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!' + : \sprintf( + 'You can enable parallel runner and speed up the analysis! Please see %s for more information.', + $stdErr->isDecorated() + ? \sprintf('usage docs', OutputFormatter::escape($usageDocs)) + : $usageDocs + ) + )); $configFile = $resolver->getConfigFile(); - $stdErr->writeln(sprintf('Loaded config %s%s.', $resolver->getConfig()->getName(), null === $configFile ? '' : ' from "'.$configFile.'"')); + $stdErr->writeln(\sprintf('Loaded config %s%s.', $resolver->getConfig()->getName(), null === $configFile ? '' : ' from "'.$configFile.'"')); if ($resolver->getUsingCache()) { $cacheFile = $resolver->getCacheFile(); if (is_file($cacheFile)) { - $stdErr->writeln(sprintf('Using cache file "%s".', $cacheFile)); + $stdErr->writeln(\sprintf('Using cache file "%s".', $cacheFile)); } } } @@ -270,7 +305,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (null !== $stdErr && $resolver->configFinderIsOverridden()) { $stdErr->writeln( - sprintf($stdErr->isDecorated() ? '%s' : '%s', 'Paths from configuration file have been overridden by paths provided as command arguments.') + \sprintf($stdErr->isDecorated() ? '%s' : '%s', 'Paths from configuration file have been overridden by paths provided as command arguments.') ); } @@ -294,14 +329,17 @@ protected function execute(InputInterface $input, OutputInterface $output): int $resolver->isDryRun(), $resolver->getCacheManager(), $resolver->getDirectory(), - $resolver->shouldStopOnViolation() + $resolver->shouldStopOnViolation(), + $resolver->getParallelConfig(), + $input, + $resolver->getConfigFile() ); - $this->eventDispatcher->addListener(FixerFileProcessedEvent::NAME, [$progressOutput, 'onFixerFileProcessed']); + $this->eventDispatcher->addListener(FileProcessed::NAME, [$progressOutput, 'onFixerFileProcessed']); $this->stopwatch->start('fixFiles'); $changed = $runner->fix(); $this->stopwatch->stop('fixFiles'); - $this->eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, [$progressOutput, 'onFixerFileProcessed']); + $this->eventDispatcher->removeListener(FileProcessed::NAME, [$progressOutput, 'onFixerFileProcessed']); $progressOutput->printLegend(); @@ -354,6 +392,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int protected function isDryRun(InputInterface $input): bool { - return $input->getOption('dry-run'); + return $input->getOption('dry-run'); // @phpstan-ignore symfonyConsole.optionNotFound (Because PHPStan doesn't recognise the method is overridden in the child class and this parameter is _not_ used in the child class.) } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php index 727dfff52..28d6b258f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/FixCommandExitStatusCalculator.php @@ -28,8 +28,13 @@ final class FixCommandExitStatusCalculator public const EXIT_STATUS_FLAG_HAS_INVALID_FIXER_CONFIG = 32; public const EXIT_STATUS_FLAG_EXCEPTION_IN_APP = 64; - public function calculate(bool $isDryRun, bool $hasChangedFiles, bool $hasInvalidErrors, bool $hasExceptionErrors, bool $hasLintErrorsAfterFixing): int - { + public function calculate( + bool $isDryRun, + bool $hasChangedFiles, + bool $hasInvalidErrors, + bool $hasExceptionErrors, + bool $hasLintErrorsAfterFixing + ): int { $exitStatus = 0; if ($isDryRun) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php index 4279c59ac..97737a799 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/ListSetsCommand.php @@ -79,7 +79,7 @@ private function resolveReporterWithFactory(string $format, ReporterFactory $fac $formats = $factory->getFormats(); sort($formats); - throw new InvalidConfigurationException(sprintf('The format "%s" is not defined, supported are %s.', $format, Utils::naturalLanguageJoin($formats))); + throw new InvalidConfigurationException(\sprintf('The format "%s" is not defined, supported are %s.', $format, Utils::naturalLanguageJoin($formats))); } return $reporter; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php index 5e4bddc9d..ab2b90492 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/SelfUpdateCommand.php @@ -14,6 +14,7 @@ namespace PhpCsFixer\Console\Command; +use PhpCsFixer\Console\Application; use PhpCsFixer\Console\SelfUpdate\NewVersionCheckerInterface; use PhpCsFixer\PharCheckerInterface; use PhpCsFixer\Preg; @@ -81,9 +82,9 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity() && $output instanceof ConsoleOutputInterface) { + if ($output instanceof ConsoleOutputInterface) { $stdErr = $output->getErrorOutput(); - $stdErr->writeln($this->getApplication()->getLongVersion()); + $stdErr->writeln(Application::getAboutWithRuntime(true)); } if (!$this->toolInfo->isInstalledAsPhar()) { @@ -100,7 +101,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $latestVersion = $this->versionChecker->getLatestVersion(); $latestVersionOfCurrentMajor = $this->versionChecker->getLatestVersionOfMajor($currentMajor); } catch (\Exception $exception) { - $output->writeln(sprintf( + $output->writeln(\sprintf( 'Unable to determine newest version: %s', $exception->getMessage() )); @@ -120,8 +121,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int 0 !== $this->versionChecker->compareVersions($latestVersionOfCurrentMajor, $latestVersion) && true !== $input->getOption('force') ) { - $output->writeln(sprintf('A new major version of PHP CS Fixer is available (%s)', $latestVersion)); - $output->writeln(sprintf('Before upgrading please read https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/%s/UPGRADE-v%s.md', $latestVersion, $currentMajor + 1)); + $output->writeln(\sprintf('A new major version of PHP CS Fixer is available (%s)', $latestVersion)); + $output->writeln(\sprintf('Before upgrading please read https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/%s/UPGRADE-v%s.md', $latestVersion, $currentMajor + 1)); $output->writeln('If you are ready to upgrade run this command with -f'); $output->writeln('Checking for new minor/patch version...'); @@ -134,10 +135,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $remoteTag = $latestVersionOfCurrentMajor; } - $localFilename = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0]; + $localFilename = $_SERVER['argv'][0]; + $realPath = realpath($localFilename); + if (false !== $realPath) { + $localFilename = $realPath; + } if (!is_writable($localFilename)) { - $output->writeln(sprintf('No permission to update "%s" file.', $localFilename)); + $output->writeln(\sprintf('No permission to update "%s" file.', $localFilename)); return 1; } @@ -146,7 +151,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $remoteFilename = $this->toolInfo->getPharDownloadUri($remoteTag); if (false === @copy($remoteFilename, $tempFilename)) { - $output->writeln(sprintf('Unable to download new version %s from the server.', $remoteTag)); + $output->writeln(\sprintf('Unable to download new version %s from the server.', $remoteTag)); return 1; } @@ -156,7 +161,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $pharInvalidityReason = $this->pharChecker->checkFileValidity($tempFilename); if (null !== $pharInvalidityReason) { unlink($tempFilename); - $output->writeln(sprintf('The download of %s is corrupt (%s).', $remoteTag, $pharInvalidityReason)); + $output->writeln(\sprintf('The download of %s is corrupt (%s).', $remoteTag, $pharInvalidityReason)); $output->writeln('Please re-run the "self-update" command to try again.'); return 1; @@ -164,7 +169,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int rename($tempFilename, $localFilename); - $output->writeln(sprintf('PHP CS Fixer updated (%s -> %s)', $currentVersion, $remoteTag)); + $output->writeln(\sprintf('PHP CS Fixer updated (%s -> %s)', $currentVersion, $remoteTag)); return 0; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Command/WorkerCommand.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/WorkerCommand.php new file mode 100644 index 000000000..9c1151e2d --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Command/WorkerCommand.php @@ -0,0 +1,243 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Console\Command; + +use Clue\React\NDJson\Decoder; +use Clue\React\NDJson\Encoder; +use PhpCsFixer\Cache\NullCacheManager; +use PhpCsFixer\Config; +use PhpCsFixer\Console\ConfigurationResolver; +use PhpCsFixer\Error\ErrorsManager; +use PhpCsFixer\Runner\Event\FileProcessed; +use PhpCsFixer\Runner\Parallel\ParallelAction; +use PhpCsFixer\Runner\Parallel\ParallelConfigFactory; +use PhpCsFixer\Runner\Parallel\ParallelisationException; +use PhpCsFixer\Runner\Runner; +use PhpCsFixer\ToolInfoInterface; +use React\EventLoop\StreamSelectLoop; +use React\Socket\ConnectionInterface; +use React\Socket\TcpConnector; +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\EventDispatcher\EventDispatcher; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; + +/** + * @author Greg Korba + * + * @internal + */ +#[AsCommand(name: 'worker', description: 'Internal command for running fixers in parallel', hidden: true)] +final class WorkerCommand extends Command +{ + /** @var string Prefix used before JSON-encoded error printed in the worker's process */ + public const ERROR_PREFIX = 'WORKER_ERROR::'; + + protected static $defaultName = 'worker'; + + protected static $defaultDescription = 'Internal command for running fixers in parallel'; + + private ToolInfoInterface $toolInfo; + private ConfigurationResolver $configurationResolver; + private ErrorsManager $errorsManager; + private EventDispatcherInterface $eventDispatcher; + + /** @var list */ + private array $events; + + public function __construct(ToolInfoInterface $toolInfo) + { + parent::__construct(); + + $this->setHidden(true); + $this->toolInfo = $toolInfo; + $this->errorsManager = new ErrorsManager(); + $this->eventDispatcher = new EventDispatcher(); + } + + protected function configure(): void + { + $this->setDefinition( + [ + new InputOption('port', null, InputOption::VALUE_REQUIRED, 'Specifies parallelisation server\'s port.'), + new InputOption('identifier', null, InputOption::VALUE_REQUIRED, 'Specifies parallelisation process\' identifier.'), + new InputOption('allow-risky', '', InputOption::VALUE_REQUIRED, 'Are risky fixers allowed (can be `yes` or `no`).'), + new InputOption('config', '', InputOption::VALUE_REQUIRED, 'The path to a config file.'), + new InputOption('dry-run', '', InputOption::VALUE_NONE, 'Only shows which files would have been modified.'), + new InputOption('rules', '', InputOption::VALUE_REQUIRED, 'List of rules that should be run against configured paths.'), + new InputOption('using-cache', '', InputOption::VALUE_REQUIRED, 'Should cache be used (can be `yes` or `no`).'), + new InputOption('cache-file', '', InputOption::VALUE_REQUIRED, 'The path to the cache file.'), + new InputOption('diff', '', InputOption::VALUE_NONE, 'Prints diff for each file.'), + new InputOption('stop-on-violation', '', InputOption::VALUE_NONE, 'Stop execution on first violation.'), + ] + ); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $errorOutput = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output; + $identifier = $input->getOption('identifier'); + $port = $input->getOption('port'); + + if (null === $identifier || !is_numeric($port)) { + throw new ParallelisationException('Missing parallelisation options'); + } + + try { + $runner = $this->createRunner($input); + } catch (\Throwable $e) { + throw new ParallelisationException('Unable to create runner: '.$e->getMessage(), 0, $e); + } + + $loop = new StreamSelectLoop(); + $tcpConnector = new TcpConnector($loop); + $tcpConnector + ->connect(\sprintf('127.0.0.1:%d', $port)) + ->then( + /** @codeCoverageIgnore */ + function (ConnectionInterface $connection) use ($loop, $runner, $identifier): void { + $jsonInvalidUtf8Ignore = \defined('JSON_INVALID_UTF8_IGNORE') ? JSON_INVALID_UTF8_IGNORE : 0; + $out = new Encoder($connection, $jsonInvalidUtf8Ignore); + $in = new Decoder($connection, true, 512, $jsonInvalidUtf8Ignore); + + // [REACT] Initialise connection with the parallelisation operator + $out->write(['action' => ParallelAction::WORKER_HELLO, 'identifier' => $identifier]); + + $handleError = static function (\Throwable $error) use ($out): void { + $out->write([ + 'action' => ParallelAction::WORKER_ERROR_REPORT, + 'class' => \get_class($error), + 'message' => $error->getMessage(), + 'file' => $error->getFile(), + 'line' => $error->getLine(), + 'code' => $error->getCode(), + 'trace' => $error->getTraceAsString(), + ]); + }; + $out->on('error', $handleError); + $in->on('error', $handleError); + + // [REACT] Listen for messages from the parallelisation operator (analysis requests) + $in->on('data', function (array $json) use ($loop, $runner, $out): void { + $action = $json['action'] ?? null; + + // Parallelisation operator does not have more to do, let's close the connection + if (ParallelAction::RUNNER_THANK_YOU === $action) { + $loop->stop(); + + return; + } + + if (ParallelAction::RUNNER_REQUEST_ANALYSIS !== $action) { + // At this point we only expect analysis requests, if any other action happen, we need to fix the code. + throw new \LogicException(\sprintf('Unexpected action ParallelAction::%s.', $action)); + } + + /** @var iterable $files */ + $files = $json['files']; + + foreach ($files as $path) { + // Reset events because we want to collect only those coming from analysed files chunk + $this->events = []; + $runner->setFileIterator(new \ArrayIterator([new \SplFileInfo($path)])); + $analysisResult = $runner->fix(); + + if (1 !== \count($this->events)) { + throw new ParallelisationException('Runner did not report a fixing event or reported too many.'); + } + + if (1 < \count($analysisResult)) { + throw new ParallelisationException('Runner returned more analysis results than expected.'); + } + + $out->write([ + 'action' => ParallelAction::WORKER_RESULT, + 'file' => $path, + 'fileHash' => $this->events[0]->getFileHash(), + 'status' => $this->events[0]->getStatus(), + 'fixInfo' => array_pop($analysisResult), + 'errors' => $this->errorsManager->forPath($path), + ]); + } + + // Request another file chunk (if available, the parallelisation operator will request new "run" action) + $out->write(['action' => ParallelAction::WORKER_GET_FILE_CHUNK]); + }); + }, + static function (\Throwable $error) use ($errorOutput): void { + // @TODO Verify onRejected behaviour → https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/pull/7777#discussion_r1590399285 + $errorOutput->writeln($error->getMessage()); + } + ) + ; + + $loop->run(); + + return Command::SUCCESS; + } + + private function createRunner(InputInterface $input): Runner + { + $passedConfig = $input->getOption('config'); + $passedRules = $input->getOption('rules'); + + if (null !== $passedConfig && null !== $passedRules) { + throw new \RuntimeException('Passing both `--config` and `--rules` options is not allowed'); + } + + // There's no one single source of truth when it comes to fixing single file, we need to collect statuses from events. + $this->eventDispatcher->addListener(FileProcessed::NAME, function (FileProcessed $event): void { + $this->events[] = $event; + }); + + $this->configurationResolver = new ConfigurationResolver( + new Config(), + [ + 'allow-risky' => $input->getOption('allow-risky'), + 'config' => $passedConfig, + 'dry-run' => $input->getOption('dry-run'), + 'rules' => $passedRules, + 'path' => [], + 'path-mode' => ConfigurationResolver::PATH_MODE_OVERRIDE, // IMPORTANT! WorkerCommand is called with file that already passed filtering, so here we can rely on PATH_MODE_OVERRIDE. + 'using-cache' => $input->getOption('using-cache'), + 'cache-file' => $input->getOption('cache-file'), + 'diff' => $input->getOption('diff'), + 'stop-on-violation' => $input->getOption('stop-on-violation'), + ], + getcwd(), // @phpstan-ignore-line + $this->toolInfo + ); + + return new Runner( + null, // Paths are known when parallelisation server requests new chunk, not now + $this->configurationResolver->getFixers(), + $this->configurationResolver->getDiffer(), + $this->eventDispatcher, + $this->errorsManager, + $this->configurationResolver->getLinter(), + $this->configurationResolver->isDryRun(), + new NullCacheManager(), // IMPORTANT! We pass null cache, as cache is read&write in main process and we do not need to do it again. + $this->configurationResolver->getDirectory(), + $this->configurationResolver->shouldStopOnViolation(), + ParallelConfigFactory::sequential(), // IMPORTANT! Worker must run in sequential mode. + null, + $this->configurationResolver->getConfigFile() + ); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php b/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php index 5b2a398f8..e0d7ded64 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/ConfigurationResolver.php @@ -35,14 +35,16 @@ use PhpCsFixer\FixerFactory; use PhpCsFixer\Linter\Linter; use PhpCsFixer\Linter\LinterInterface; +use PhpCsFixer\ParallelAwareConfigInterface; use PhpCsFixer\RuleSet\RuleSet; use PhpCsFixer\RuleSet\RuleSetInterface; +use PhpCsFixer\Runner\Parallel\ParallelConfig; +use PhpCsFixer\Runner\Parallel\ParallelConfigFactory; use PhpCsFixer\StdinFileInfo; use PhpCsFixer\ToolInfoInterface; use PhpCsFixer\Utils; use PhpCsFixer\WhitespacesFixerConfig; use PhpCsFixer\WordMatcher; -use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder as SymfonyFinder; @@ -54,60 +56,56 @@ * @author Dariusz Rumiński * * @internal + * + * @phpstan-type _Options array{ + * allow-risky: null|string, + * cache-file: null|string, + * config: null|string, + * diff: null|string, + * dry-run: null|bool, + * format: null|string, + * path: list, + * path-mode: self::PATH_MODE_*, + * rules: null|string, + * sequential: null|string, + * show-progress: null|string, + * stop-on-violation: null|bool, + * using-cache: null|string, + * verbosity: null|string, + * } */ final class ConfigurationResolver { public const PATH_MODE_OVERRIDE = 'override'; public const PATH_MODE_INTERSECTION = 'intersection'; - /** - * @var null|bool - */ - private $allowRisky; + private ?bool $allowRisky = null; - /** - * @var null|ConfigInterface - */ - private $config; + private ?ConfigInterface $config = null; - /** - * @var null|string - */ - private $configFile; + private ?string $configFile = null; private string $cwd; private ConfigInterface $defaultConfig; - /** - * @var null|ReporterInterface - */ - private $reporter; + private ?ReporterInterface $reporter = null; - /** - * @var null|bool - */ - private $isStdIn; + private ?bool $isStdIn = null; - /** - * @var null|bool - */ - private $isDryRun; + private ?bool $isDryRun = null; /** - * @var null|FixerInterface[] + * @var null|list */ - private $fixers; + private ?array $fixers = null; - /** - * @var null|bool - */ - private $configFinderIsOverridden; + private ?bool $configFinderIsOverridden = null; private ToolInfoInterface $toolInfo; /** - * @var array + * @var _Options */ private array $options = [ 'allow-risky' => null, @@ -119,31 +117,20 @@ final class ConfigurationResolver 'path' => [], 'path-mode' => self::PATH_MODE_OVERRIDE, 'rules' => null, + 'sequential' => null, 'show-progress' => null, 'stop-on-violation' => null, 'using-cache' => null, 'verbosity' => null, ]; - /** - * @var null|string - */ - private $cacheFile; + private ?string $cacheFile = null; - /** - * @var null|CacheManagerInterface - */ - private $cacheManager; + private ?CacheManagerInterface $cacheManager = null; - /** - * @var null|DifferInterface - */ - private $differ; + private ?DifferInterface $differ = null; - /** - * @var null|Directory - */ - private $directory; + private ?Directory $directory = null; /** * @var null|iterable<\SplFileInfo> @@ -152,10 +139,7 @@ final class ConfigurationResolver private ?string $format = null; - /** - * @var null|Linter - */ - private $linter; + private ?Linter $linter = null; /** * @var null|list @@ -163,24 +147,15 @@ final class ConfigurationResolver private ?array $path = null; /** - * @var null|string + * @var null|ProgressOutputType::* */ private $progress; - /** - * @var null|RuleSet - */ - private $ruleSet; + private ?RuleSet $ruleSet = null; - /** - * @var null|bool - */ - private $usingCache; + private ?bool $usingCache = null; - /** - * @var FixerFactory - */ - private $fixerFactory; + private ?FixerFactory $fixerFactory = null; /** * @param array $options @@ -275,6 +250,15 @@ public function getConfig(): ConfigInterface return $this->config; } + public function getParallelConfig(): ParallelConfig + { + $config = $this->getConfig(); + + return true !== $this->options['sequential'] && $config instanceof ParallelAwareConfigInterface + ? $config->getParallelConfig() + : ParallelConfigFactory::sequential(); + } + public function getConfigFile(): ?string { if (null === $this->configFile) { @@ -315,7 +299,7 @@ public function getDirectory(): DirectoryInterface } /** - * @return FixerInterface[] An array of FixerInterface + * @return list */ public function getFixers(): array { @@ -336,7 +320,7 @@ public function getFixers(): array ); if (\count($riskyFixers) > 0) { - throw new InvalidConfigurationException(sprintf('The rules contain risky fixers (%s), but they are not allowed to run. Perhaps you forget to use --allow-risky=yes option?', Utils::naturalLanguageJoin($riskyFixers))); + throw new InvalidConfigurationException(\sprintf('The rules contain risky fixers (%s), but they are not allowed to run. Perhaps you forget to use --allow-risky=yes option?', Utils::naturalLanguageJoin($riskyFixers))); } } } @@ -356,7 +340,7 @@ public function getLinter(): LinterInterface /** * Returns path. * - * @return string[] + * @return list */ public function getPath(): array { @@ -380,7 +364,7 @@ static function (string $rawPath) use ($cwd, $filesystem): string { : $cwd.\DIRECTORY_SEPARATOR.$path; if (!file_exists($absolutePath)) { - throw new InvalidConfigurationException(sprintf( + throw new InvalidConfigurationException(\sprintf( 'The path "%s" is not readable.', $path )); @@ -397,23 +381,25 @@ static function (string $rawPath) use ($cwd, $filesystem): string { } /** + * @return ProgressOutputType::* + * * @throws InvalidConfigurationException */ public function getProgressType(): string { if (null === $this->progress) { - if (OutputInterface::VERBOSITY_VERBOSE <= $this->options['verbosity'] && 'txt' === $this->getFormat()) { + if ('txt' === $this->resolveFormat()) { $progressType = $this->options['show-progress']; if (null === $progressType) { $progressType = $this->getConfig()->getHideProgress() ? ProgressOutputType::NONE - : ProgressOutputType::DOTS; - } elseif (!\in_array($progressType, ProgressOutputType::AVAILABLE, true)) { - throw new InvalidConfigurationException(sprintf( + : ProgressOutputType::BAR; + } elseif (!\in_array($progressType, ProgressOutputType::all(), true)) { + throw new InvalidConfigurationException(\sprintf( 'The progress type "%s" is not defined, supported are %s.', $progressType, - Utils::naturalLanguageJoin(ProgressOutputType::AVAILABLE) + Utils::naturalLanguageJoin(ProgressOutputType::all()) )); } @@ -432,7 +418,7 @@ public function getReporter(): ReporterInterface $reporterFactory = new ReporterFactory(); $reporterFactory->registerBuiltInReporters(); - $format = $this->getFormat(); + $format = $this->resolveFormat(); try { $this->reporter = $reporterFactory->getReporter($format); @@ -440,7 +426,7 @@ public function getReporter(): ReporterInterface $formats = $reporterFactory->getFormats(); sort($formats); - throw new InvalidConfigurationException(sprintf('The format "%s" is not defined, supported are %s.', $format, Utils::naturalLanguageJoin($formats))); + throw new InvalidConfigurationException(\sprintf('The format "%s" is not defined, supported are %s.', $format, Utils::naturalLanguageJoin($formats))); } } @@ -480,7 +466,7 @@ public function getUsingCache(): bool } } - $this->usingCache = $this->usingCache && ($this->toolInfo->isInstalledAsPhar() || $this->toolInfo->isInstalledByComposer()); + $this->usingCache = $this->usingCache && $this->isCachingAllowedForRuntime(); return $this->usingCache; } @@ -531,7 +517,7 @@ public function configFinderIsOverridden(): bool /** * Compute file candidates for config file. * - * @return string[] + * @return list */ private function computeConfigFiles(): array { @@ -539,7 +525,7 @@ private function computeConfigFiles(): array if (null !== $configFile) { if (false === file_exists($configFile) || false === is_readable($configFile)) { - throw new InvalidConfigurationException(sprintf('Cannot read config file "%s".', $configFile)); + throw new InvalidConfigurationException(\sprintf('Cannot read config file "%s".', $configFile)); } return [$configFile]; @@ -555,7 +541,7 @@ private function computeConfigFiles(): array $configDir = $path[0]; } else { $dirName = pathinfo($path[0], PATHINFO_DIRNAME); - $configDir = $dirName ?: $path[0]; + $configDir = is_dir($dirName) ? $dirName : $path[0]; } $candidates = [ @@ -588,10 +574,25 @@ private function createFixerFactory(): FixerFactory return $this->fixerFactory; } - private function getFormat(): string + private function resolveFormat(): string { if (null === $this->format) { - $this->format = $this->options['format'] ?? $this->getConfig()->getFormat(); + $formatCandidate = $this->options['format'] ?? $this->getConfig()->getFormat(); + $parts = explode(',', $formatCandidate); + + if (\count($parts) > 2) { + throw new InvalidConfigurationException(\sprintf('The format "%s" is invalid.', $formatCandidate)); + } + + $this->format = $parts[0]; + + if ('@auto' === $this->format) { + $this->format = $parts[1] ?? 'txt'; + + if (filter_var(getenv('GITLAB_CI'), FILTER_VALIDATE_BOOL)) { + $this->format = 'gitlab'; + } + } } return $this->format; @@ -631,7 +632,7 @@ private function iterableToTraversable(iterable $iterable): \Traversable } /** - * @return array + * @return array */ private function parseRules(): array { @@ -648,7 +649,7 @@ private function parseRules(): array $rules = json_decode($rules, true); if (JSON_ERROR_NONE !== json_last_error()) { - throw new InvalidConfigurationException(sprintf('Invalid JSON rules input: "%s".', json_last_error_msg())); + throw new InvalidConfigurationException(\sprintf('Invalid JSON rules input: "%s".', json_last_error_msg())); } return $rules; @@ -674,7 +675,7 @@ private function parseRules(): array } /** - * @param array $rules + * @param array $rules * * @throws InvalidConfigurationException */ @@ -689,7 +690,7 @@ private function validateRules(array $rules): void foreach ($rules as $key => $value) { if (\is_int($key)) { - throw new InvalidConfigurationException(sprintf('Missing value for "%s" rule/set.', $value)); + throw new InvalidConfigurationException(\sprintf('Missing value for "%s" rule/set.', $value)); } $ruleSet[$key] = true; @@ -765,7 +766,7 @@ private function validateRules(array $rules): void foreach ($unknownFixers as $unknownFixer) { if (isset($renamedRules[$unknownFixer])) { // Check if present as old renamed rule $hasOldRule = true; - $message .= sprintf( + $message .= \sprintf( '"%s" is renamed (did you mean "%s"?%s), ', $unknownFixer, $renamedRules[$unknownFixer]['new_name'], @@ -774,7 +775,7 @@ private function validateRules(array $rules): void } else { // Go to normal matcher if it is not a renamed rule $matcher = new WordMatcher($availableFixers); $alternative = $matcher->match($unknownFixer); - $message .= sprintf( + $message .= \sprintf( '"%s"%s, ', $unknownFixer, null === $alternative ? '' : ' (did you mean "'.$alternative.'"?)' @@ -796,8 +797,8 @@ private function validateRules(array $rules): void if (isset($rules[$fixerName]) && $fixer instanceof DeprecatedFixerInterface) { $successors = $fixer->getSuccessorsNames(); $messageEnd = [] === $successors - ? sprintf(' and will be removed in version %d.0.', Application::getMajorVersion() + 1) - : sprintf('. Use %s instead.', str_replace('`', '"', Utils::naturalLanguageJoinWithBackticks($successors))); + ? \sprintf(' and will be removed in version %d.0.', Application::getMajorVersion() + 1) + : \sprintf('. Use %s instead.', str_replace('`', '"', Utils::naturalLanguageJoinWithBackticks($successors))); Utils::triggerDeprecation(new \RuntimeException("Rule \"{$fixerName}\" is deprecated{$messageEnd}")); } @@ -824,7 +825,7 @@ private function resolveFinder(): iterable $modes, true )) { - throw new InvalidConfigurationException(sprintf( + throw new InvalidConfigurationException(\sprintf( 'The path-mode "%s" is not defined, supported are %s.', $this->options['path-mode'], Utils::naturalLanguageJoin($modes) @@ -833,10 +834,10 @@ private function resolveFinder(): iterable $isIntersectionPathMode = self::PATH_MODE_INTERSECTION === $this->options['path-mode']; - $paths = array_filter(array_map( + $paths = array_map( static fn (string $path) => realpath($path), $this->getPath() - )); + ); if (0 === \count($paths)) { if ($isIntersectionPathMode) { @@ -914,20 +915,19 @@ static function (\SplFileInfo $current) use ($pathsByType): bool { private function setOption(string $name, $value): void { if (!\array_key_exists($name, $this->options)) { - throw new InvalidConfigurationException(sprintf('Unknown option name: "%s".', $name)); + throw new InvalidConfigurationException(\sprintf('Unknown option name: "%s".', $name)); } $this->options[$name] = $value; } + /** + * @param key-of<_Options> $optionName + */ private function resolveOptionBooleanValue(string $optionName): bool { $value = $this->options[$optionName]; - if (!\is_string($value)) { - throw new InvalidConfigurationException(sprintf('Expected boolean or string value for option "%s".', $optionName)); - } - if ('yes' === $value) { return true; } @@ -936,7 +936,7 @@ private function resolveOptionBooleanValue(string $optionName): bool return false; } - throw new InvalidConfigurationException(sprintf('Expected "yes" or "no" for option "%s", got "%s".', $optionName, $value)); + throw new InvalidConfigurationException(\sprintf('Expected "yes" or "no" for option "%s", got "%s".', $optionName, \is_object($value) ? \get_class($value) : (\is_scalar($value) ? $value : \gettype($value)))); } private static function separatedContextLessInclude(string $path): ConfigInterface @@ -945,9 +945,17 @@ private static function separatedContextLessInclude(string $path): ConfigInterfa // verify that the config has an instance of Config if (!$config instanceof ConfigInterface) { - throw new InvalidConfigurationException(sprintf('The config file: "%s" does not return a "PhpCsFixer\ConfigInterface" instance. Got: "%s".', $path, \is_object($config) ? \get_class($config) : \gettype($config))); + throw new InvalidConfigurationException(\sprintf('The config file: "%s" does not return a "PhpCsFixer\ConfigInterface" instance. Got: "%s".', $path, \is_object($config) ? \get_class($config) : \gettype($config))); } return $config; } + + private function isCachingAllowedForRuntime(): bool + { + return $this->toolInfo->isInstalledAsPhar() + || $this->toolInfo->isInstalledByComposer() + || $this->toolInfo->isRunInsideDocker() + || filter_var(getenv('PHP_CS_FIXER_ENFORCE_CACHE'), FILTER_VALIDATE_BOOL); + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php index 5cb8adb3c..b51c8ae58 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/ErrorOutput.php @@ -17,20 +17,20 @@ use PhpCsFixer\Differ\DiffConsoleFormatter; use PhpCsFixer\Error\Error; use PhpCsFixer\Linter\LintingException; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Output\OutputInterface; /** + * @readonly + * * @internal */ final class ErrorOutput { private OutputInterface $output; - /** - * @var bool - */ - private $isDecorated; + private bool $isDecorated; public function __construct(OutputInterface $output) { @@ -39,11 +39,11 @@ public function __construct(OutputInterface $output) } /** - * @param Error[] $errors + * @param list $errors */ public function listErrors(string $process, array $errors): void { - $this->output->writeln(['', sprintf( + $this->output->writeln(['', \sprintf( 'Files that were not fixed due to errors reported during %s:', $process )]); @@ -51,13 +51,13 @@ public function listErrors(string $process, array $errors): void $showDetails = $this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE; $showTrace = $this->output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG; foreach ($errors as $i => $error) { - $this->output->writeln(sprintf('%4d) %s', $i + 1, $error->getFilePath())); + $this->output->writeln(\sprintf('%4d) %s', $i + 1, $error->getFilePath())); $e = $error->getSource(); if (!$showDetails || null === $e) { continue; } - $class = sprintf('[%s]', \get_class($e)); + $class = \sprintf('[%s]', \get_class($e)); $message = $e->getMessage(); $code = $e->getCode(); if (0 !== $code) { @@ -79,14 +79,14 @@ public function listErrors(string $process, array $errors): void $line .= str_repeat(' ', $length - \strlen($line)); } - $this->output->writeln(sprintf(' %s ', $this->prepareOutput($line))); + $this->output->writeln(\sprintf(' %s ', $this->prepareOutput($line))); } if ($showTrace && !$e instanceof LintingException) { // stack trace of lint exception is of no interest $this->output->writeln(''); $stackTrace = $e->getTrace(); foreach ($stackTrace as $trace) { - if (isset($trace['class']) && \Symfony\Component\Console\Command\Command::class === $trace['class'] && 'run' === $trace['function']) { + if (isset($trace['class']) && Command::class === $trace['class'] && 'run' === $trace['function']) { $this->output->writeln(' [ ... ]'); break; @@ -98,13 +98,13 @@ public function listErrors(string $process, array $errors): void if (Error::TYPE_LINT === $error->getType() && 0 < \count($error->getAppliedFixers())) { $this->output->writeln(''); - $this->output->writeln(sprintf(' Applied fixers: %s', implode(', ', $error->getAppliedFixers()))); + $this->output->writeln(\sprintf(' Applied fixers: %s', implode(', ', $error->getAppliedFixers()))); $diff = $error->getDiff(); if (null !== $diff) { $diffFormatter = new DiffConsoleFormatter( $this->isDecorated, - sprintf( + \sprintf( ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', PHP_EOL, PHP_EOL @@ -131,18 +131,18 @@ public function listErrors(string $process, array $errors): void private function outputTrace(array $trace): void { if (isset($trace['class'], $trace['type'], $trace['function'])) { - $this->output->writeln(sprintf( + $this->output->writeln(\sprintf( ' %s%s%s()', $this->prepareOutput($trace['class']), $this->prepareOutput($trace['type']), $this->prepareOutput($trace['function']) )); } elseif (isset($trace['function'])) { - $this->output->writeln(sprintf(' %s()', $this->prepareOutput($trace['function']))); + $this->output->writeln(\sprintf(' %s()', $this->prepareOutput($trace['function']))); } if (isset($trace['file'])) { - $this->output->writeln(sprintf(' in %s at line %d', $this->prepareOutput($trace['file']), $trace['line'])); + $this->output->writeln(\sprintf(' in %s at line %d', $this->prepareOutput($trace['file']), $trace['line'])); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/OutputContext.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/OutputContext.php index 84a0ea6f8..60ff26116 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/OutputContext.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/OutputContext.php @@ -17,6 +17,8 @@ use Symfony\Component\Console\Output\OutputInterface; /** + * @readonly + * * @internal */ final class OutputContext diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/DotsOutput.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/DotsOutput.php index 4df85f819..e2821146c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/DotsOutput.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/DotsOutput.php @@ -15,7 +15,7 @@ namespace PhpCsFixer\Console\Output\Progress; use PhpCsFixer\Console\Output\OutputContext; -use PhpCsFixer\FixerFileProcessedEvent; +use PhpCsFixer\Runner\Event\FileProcessed; use Symfony\Component\Console\Output\OutputInterface; /** @@ -28,15 +28,15 @@ final class DotsOutput implements ProgressOutputInterface /** * File statuses map. * - * @var array + * @var array */ - private static array $eventStatusMap = [ - FixerFileProcessedEvent::STATUS_NO_CHANGES => ['symbol' => '.', 'format' => '%s', 'description' => 'no changes'], - FixerFileProcessedEvent::STATUS_FIXED => ['symbol' => 'F', 'format' => '%s', 'description' => 'fixed'], - FixerFileProcessedEvent::STATUS_SKIPPED => ['symbol' => 'S', 'format' => '%s', 'description' => 'skipped (cached or empty file)'], - FixerFileProcessedEvent::STATUS_INVALID => ['symbol' => 'I', 'format' => '%s', 'description' => 'invalid file syntax (file ignored)'], - FixerFileProcessedEvent::STATUS_EXCEPTION => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], - FixerFileProcessedEvent::STATUS_LINT => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], + private const EVENT_STATUS_MAP = [ + FileProcessed::STATUS_NO_CHANGES => ['symbol' => '.', 'format' => '%s', 'description' => 'no changes'], + FileProcessed::STATUS_FIXED => ['symbol' => 'F', 'format' => '%s', 'description' => 'fixed'], + FileProcessed::STATUS_SKIPPED => ['symbol' => 'S', 'format' => '%s', 'description' => 'skipped (cached or empty file)'], + FileProcessed::STATUS_INVALID => ['symbol' => 'I', 'format' => '%s', 'description' => 'invalid file syntax (file ignored)'], + FileProcessed::STATUS_EXCEPTION => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], + FileProcessed::STATUS_LINT => ['symbol' => 'E', 'format' => '%s', 'description' => 'error'], ]; /** @readonly */ @@ -44,10 +44,7 @@ final class DotsOutput implements ProgressOutputInterface private int $processedFiles = 0; - /** - * @var int - */ - private $symbolsPerLine; + private int $symbolsPerLine; public function __construct(OutputContext $context) { @@ -65,7 +62,7 @@ public function __construct(OutputContext $context) */ public function __sleep(): array { - throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + throw new \BadMethodCallException('Cannot serialize '.self::class); } /** @@ -76,13 +73,13 @@ public function __sleep(): array */ public function __wakeup(): void { - throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + throw new \BadMethodCallException('Cannot unserialize '.self::class); } - public function onFixerFileProcessed(FixerFileProcessedEvent $event): void + public function onFixerFileProcessed(FileProcessed $event): void { - $status = self::$eventStatusMap[$event->getStatus()]; - $this->getOutput()->write($this->getOutput()->isDecorated() ? sprintf($status['format'], $status['symbol']) : $status['symbol']); + $status = self::EVENT_STATUS_MAP[$event->getStatus()]; + $this->getOutput()->write($this->getOutput()->isDecorated() ? \sprintf($status['format'], $status['symbol']) : $status['symbol']); ++$this->processedFiles; @@ -90,7 +87,7 @@ public function onFixerFileProcessed(FixerFileProcessedEvent $event): void $isLast = $this->processedFiles === $this->context->getFilesCount(); if (0 === $symbolsOnCurrentLine || $isLast) { - $this->getOutput()->write(sprintf( + $this->getOutput()->write(\sprintf( '%s %'.\strlen((string) $this->context->getFilesCount()).'d / %d (%3d%%)', $isLast && 0 !== $symbolsOnCurrentLine ? str_repeat(' ', $this->symbolsPerLine - $symbolsOnCurrentLine) : '', $this->processedFiles, @@ -108,16 +105,16 @@ public function printLegend(): void { $symbols = []; - foreach (self::$eventStatusMap as $status) { + foreach (self::EVENT_STATUS_MAP as $status) { $symbol = $status['symbol']; - if ('' === $symbol || isset($symbols[$symbol])) { + if (isset($symbols[$symbol])) { continue; } - $symbols[$symbol] = sprintf('%s-%s', $this->getOutput()->isDecorated() ? sprintf($status['format'], $symbol) : $symbol, $status['description']); + $symbols[$symbol] = \sprintf('%s-%s', $this->getOutput()->isDecorated() ? \sprintf($status['format'], $symbol) : $symbol, $status['description']); } - $this->getOutput()->write(sprintf("\nLegend: %s\n", implode(', ', $symbols))); + $this->getOutput()->write(\sprintf("\nLegend: %s\n", implode(', ', $symbols))); } private function getOutput(): OutputInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/NullOutput.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/NullOutput.php index 3af7ee443..497ea8b02 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/NullOutput.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/NullOutput.php @@ -14,14 +14,16 @@ namespace PhpCsFixer\Console\Output\Progress; -use PhpCsFixer\FixerFileProcessedEvent; +use PhpCsFixer\Runner\Event\FileProcessed; /** + * @readonly + * * @internal */ final class NullOutput implements ProgressOutputInterface { public function printLegend(): void {} - public function onFixerFileProcessed(FixerFileProcessedEvent $event): void {} + public function onFixerFileProcessed(FileProcessed $event): void {} } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/PercentageBarOutput.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/PercentageBarOutput.php new file mode 100644 index 000000000..fc320fa2b --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/PercentageBarOutput.php @@ -0,0 +1,78 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Console\Output\Progress; + +use PhpCsFixer\Console\Output\OutputContext; +use PhpCsFixer\Runner\Event\FileProcessed; +use Symfony\Component\Console\Helper\ProgressBar; + +/** + * Output writer to show the progress of a FixCommand using progress bar (percentage). + * + * @readonly + * + * @internal + */ +final class PercentageBarOutput implements ProgressOutputInterface +{ + /** @readonly */ + private OutputContext $context; + + private ProgressBar $progressBar; + + public function __construct(OutputContext $context) + { + $this->context = $context; + + $this->progressBar = new ProgressBar($context->getOutput(), $this->context->getFilesCount()); + $this->progressBar->setBarCharacter('▓'); // dark shade character \u2593 + $this->progressBar->setEmptyBarCharacter('░'); // light shade character \u2591 + $this->progressBar->setProgressCharacter(''); + $this->progressBar->setFormat('normal'); + + $this->progressBar->start(); + } + + /** + * This class is not intended to be serialized, + * and cannot be deserialized (see __wakeup method). + */ + public function __sleep(): array + { + throw new \BadMethodCallException('Cannot serialize '.self::class); + } + + /** + * Disable the deserialization of the class to prevent attacker executing + * code by leveraging the __destruct method. + * + * @see https://owasp.org/www-community/vulnerabilities/PHP_Object_Injection + */ + public function __wakeup(): void + { + throw new \BadMethodCallException('Cannot unserialize '.self::class); + } + + public function onFixerFileProcessed(FileProcessed $event): void + { + $this->progressBar->advance(1); + + if ($this->progressBar->getProgress() === $this->progressBar->getMaxSteps()) { + $this->context->getOutput()->write("\n\n"); + } + } + + public function printLegend(): void {} +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputFactory.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputFactory.php index 703170fd0..a1474aea3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputFactory.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputFactory.php @@ -17,10 +17,24 @@ use PhpCsFixer\Console\Output\OutputContext; /** + * @readonly + * * @internal */ final class ProgressOutputFactory { + /** + * @var array> + */ + private const OUTPUT_TYPE_MAP = [ + ProgressOutputType::NONE => NullOutput::class, + ProgressOutputType::DOTS => DotsOutput::class, + ProgressOutputType::BAR => PercentageBarOutput::class, + ]; + + /** + * @param ProgressOutputType::* $outputType + */ public function create(string $outputType, OutputContext $context): ProgressOutputInterface { if (null === $context->getOutput()) { @@ -29,23 +43,21 @@ public function create(string $outputType, OutputContext $context): ProgressOutp if (!$this->isBuiltInType($outputType)) { throw new \InvalidArgumentException( - sprintf( + \sprintf( 'Something went wrong, "%s" output type is not supported', $outputType ) ); } - return ProgressOutputType::NONE === $outputType - ? new NullOutput() - : new DotsOutput($context); + $outputClass = self::OUTPUT_TYPE_MAP[$outputType]; + + // @phpstan-ignore-next-line new.noConstructor + return new $outputClass($context); } private function isBuiltInType(string $outputType): bool { - return \in_array($outputType, [ - ProgressOutputType::NONE, - ProgressOutputType::DOTS, - ], true); + return \in_array($outputType, ProgressOutputType::all(), true); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputInterface.php index b5ab95173..48881e655 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputInterface.php @@ -14,7 +14,7 @@ namespace PhpCsFixer\Console\Output\Progress; -use PhpCsFixer\FixerFileProcessedEvent; +use PhpCsFixer\Runner\Event\FileProcessed; /** * @internal @@ -23,5 +23,5 @@ interface ProgressOutputInterface { public function printLegend(): void; - public function onFixerFileProcessed(FixerFileProcessedEvent $event): void; + public function onFixerFileProcessed(FileProcessed $event): void; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputType.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputType.php index 4c005f89d..6f427a46d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputType.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Output/Progress/ProgressOutputType.php @@ -21,9 +21,17 @@ final class ProgressOutputType { public const NONE = 'none'; public const DOTS = 'dots'; + public const BAR = 'bar'; - public const AVAILABLE = [ - self::NONE, - self::DOTS, - ]; + /** + * @return list + */ + public static function all(): array + { + return [ + self::BAR, + self::DOTS, + self::NONE, + ]; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php index a6770f600..79806d1ff 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/CheckstyleReporter.php @@ -14,11 +14,14 @@ namespace PhpCsFixer\Console\Report\FixReport; +use PhpCsFixer\Console\Application; use Symfony\Component\Console\Formatter\OutputFormatter; /** * @author Kévin Gomez * + * @readonly + * * @internal */ final class CheckstyleReporter implements ReporterInterface @@ -35,7 +38,10 @@ public function generate(ReportSummary $reportSummary): string } $dom = new \DOMDocument('1.0', 'UTF-8'); + + /** @var \DOMElement $checkstyles */ $checkstyles = $dom->appendChild($dom->createElement('checkstyle')); + $checkstyles->setAttribute('version', Application::getAbout()); foreach ($reportSummary->getChanged() as $filePath => $fixResult) { /** @var \DOMElement $file */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php index 0e6c18813..3061b6fc2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/GitlabReporter.php @@ -14,7 +14,9 @@ namespace PhpCsFixer\Console\Report\FixReport; +use PhpCsFixer\Console\Application; use SebastianBergmann\Diff\Chunk; +use SebastianBergmann\Diff\Diff; use SebastianBergmann\Diff\Parser; use Symfony\Component\Console\Formatter\OutputFormatter; @@ -25,6 +27,8 @@ * * @author Hans-Christian Otto * + * @readonly + * * @internal */ final class GitlabReporter implements ReporterInterface @@ -46,24 +50,20 @@ public function getFormat(): string */ public function generate(ReportSummary $reportSummary): string { + $about = Application::getAbout(); + $report = []; foreach ($reportSummary->getChanged() as $fileName => $change) { - $diffs = $this->diffParser->parse($change['diff']); - $firstChunk = isset($diffs[0]) ? $diffs[0]->getChunks() : []; - $firstChunk = array_shift($firstChunk); foreach ($change['appliedFixers'] as $fixerName) { $report[] = [ - 'check_name' => $fixerName, - 'description' => $fixerName, + 'check_name' => 'PHP-CS-Fixer.'.$fixerName, + 'description' => 'PHP-CS-Fixer.'.$fixerName.' by '.$about, 'categories' => ['Style'], 'fingerprint' => md5($fileName.$fixerName), 'severity' => 'minor', 'location' => [ 'path' => $fileName, - 'lines' => [ - 'begin' => $firstChunk instanceof Chunk ? $firstChunk->getStart() : 0, - 'end' => $firstChunk instanceof Chunk ? $firstChunk->getStartRange() : 0, - ], + 'lines' => self::getLines($this->diffParser->parse($change['diff'])), ], ]; } @@ -73,4 +73,24 @@ public function generate(ReportSummary $reportSummary): string return $reportSummary->isDecoratedOutput() ? OutputFormatter::escape($jsonString) : $jsonString; } + + /** + * @param list $diffs + * + * @return array{begin: int, end: int} + */ + private static function getLines(array $diffs): array + { + if (isset($diffs[0])) { + $firstDiff = $diffs[0]; + + $firstChunk = \Closure::bind(static fn (Diff $diff) => array_shift($diff->chunks), null, $firstDiff)($firstDiff); + + if ($firstChunk instanceof Chunk) { + return \Closure::bind(static fn (Chunk $chunk): array => ['begin' => $chunk->start, 'end' => $chunk->startRange], null, $firstChunk)($firstChunk); + } + } + + return ['begin' => 0, 'end' => 0]; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php index 2bb5b95a6..49ea9e30b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JsonReporter.php @@ -14,11 +14,14 @@ namespace PhpCsFixer\Console\Report\FixReport; +use PhpCsFixer\Console\Application; use Symfony\Component\Console\Formatter\OutputFormatter; /** * @author Boris Gorbylev * + * @readonly + * * @internal */ final class JsonReporter implements ReporterInterface @@ -47,11 +50,12 @@ public function generate(ReportSummary $reportSummary): string } $json = [ + 'about' => Application::getAbout(), 'files' => $jsonFiles, 'time' => [ - 'total' => round($reportSummary->getTime() / 1000, 3), + 'total' => round($reportSummary->getTime() / 1_000, 3), ], - 'memory' => round($reportSummary->getMemory() / 1024 / 1024, 3), + 'memory' => round($reportSummary->getMemory() / 1_024 / 1_024, 3), ]; $json = json_encode($json, JSON_THROW_ON_ERROR); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php index 631b28e97..2017a0d7f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/JunitReporter.php @@ -14,12 +14,15 @@ namespace PhpCsFixer\Console\Report\FixReport; +use PhpCsFixer\Console\Application; use PhpCsFixer\Preg; use Symfony\Component\Console\Formatter\OutputFormatter; /** * @author Boris Gorbylev * + * @readonly + * * @internal */ final class JunitReporter implements ReporterInterface @@ -42,6 +45,13 @@ public function generate(ReportSummary $reportSummary): string $testsuite = $testsuites->appendChild($dom->createElement('testsuite')); $testsuite->setAttribute('name', 'PHP CS Fixer'); + $properties = $dom->createElement('properties'); + $property = $dom->createElement('property'); + $property->setAttribute('name', 'about'); + $property->setAttribute('value', Application::getAbout()); + $properties->appendChild($property); + $testsuite->appendChild($properties); + if (\count($reportSummary->getChanged()) > 0) { $this->createFailedTestCases($dom, $testsuite, $reportSummary); } else { @@ -51,9 +61,9 @@ public function generate(ReportSummary $reportSummary): string if ($reportSummary->getTime() > 0) { $testsuite->setAttribute( 'time', - sprintf( + \sprintf( '%.3f', - $reportSummary->getTime() / 1000 + $reportSummary->getTime() / 1_000 ) ); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php index ccdfefb32..231ddeae7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReportSummary.php @@ -17,6 +17,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class ReportSummary diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php index e4efd9907..1b2d81229 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/ReporterFactory.php @@ -36,8 +36,8 @@ public function registerBuiltInReporters(): self foreach (SymfonyFinder::create()->files()->name('*Reporter.php')->in(__DIR__) as $file) { $relativeNamespace = $file->getRelativePath(); - $builtInReporters[] = sprintf( - '%s\\%s%s', + $builtInReporters[] = \sprintf( + '%s\%s%s', __NAMESPACE__, '' !== $relativeNamespace ? $relativeNamespace.'\\' : '', $file->getBasename('.php') @@ -60,7 +60,7 @@ public function registerReporter(ReporterInterface $reporter): self $format = $reporter->getFormat(); if (isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is already registered.', $format)); + throw new \UnexpectedValueException(\sprintf('Reporter for format "%s" is already registered.', $format)); } $this->reporters[$format] = $reporter; @@ -82,7 +82,7 @@ public function getFormats(): array public function getReporter(string $format): ReporterInterface { if (!isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is not registered.', $format)); + throw new \UnexpectedValueException(\sprintf('Reporter for format "%s" is not registered.', $format)); } return $this->reporters[$format]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php index f53947427..ccdeeabbb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/TextReporter.php @@ -19,6 +19,8 @@ /** * @author Boris Gorbylev * + * @readonly + * * @internal */ final class TextReporter implements ReporterInterface @@ -35,7 +37,7 @@ public function generate(ReportSummary $reportSummary): string $identifiedFiles = 0; foreach ($reportSummary->getChanged() as $file => $fixResult) { ++$identifiedFiles; - $output .= sprintf('%4d) %s', $identifiedFiles, $file); + $output .= \sprintf('%4d) %s', $identifiedFiles, $file); if ($reportSummary->shouldAddAppliedFixers()) { $output .= $this->getAppliedFixers( @@ -62,7 +64,7 @@ public function generate(ReportSummary $reportSummary): string */ private function getAppliedFixers(bool $isDecoratedOutput, array $appliedFixers): string { - return sprintf( + return \sprintf( $isDecoratedOutput ? ' (%s)' : ' (%s)', implode(', ', $appliedFixers) ); @@ -74,7 +76,7 @@ private function getDiff(bool $isDecoratedOutput, string $diff): string return ''; } - $diffFormatter = new DiffConsoleFormatter($isDecoratedOutput, sprintf( + $diffFormatter = new DiffConsoleFormatter($isDecoratedOutput, \sprintf( ' ---------- begin diff ----------%s%%s%s ----------- end diff -----------', PHP_EOL, PHP_EOL @@ -89,14 +91,14 @@ private function getFooter(int $time, int $identifiedFiles, int $files, int $mem return ''; } - return PHP_EOL.sprintf( - '%s %d of %d %s in %.3f seconds, %.3f MB memory used'.PHP_EOL, + return PHP_EOL.\sprintf( + '%s %d of %d %s in %.3f seconds, %.2f MB memory used'.PHP_EOL, $isDryRun ? 'Found' : 'Fixed', $identifiedFiles, $files, $isDryRun ? 'files that can be fixed' : 'files', - $time / 1000, - $memory / 1024 / 1024 + $time / 1_000, + $memory / 1_024 / 1_024 ); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php index 28236827b..3914377d1 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/FixReport/XmlReporter.php @@ -14,11 +14,14 @@ namespace PhpCsFixer\Console\Report\FixReport; +use PhpCsFixer\Console\Application; use Symfony\Component\Console\Formatter\OutputFormatter; /** * @author Boris Gorbylev * + * @readonly + * * @internal */ final class XmlReporter implements ReporterInterface @@ -39,6 +42,8 @@ public function generate(ReportSummary $reportSummary): string $root = $dom->createElement('report'); $dom->appendChild($root); + $root->appendChild($this->createAboutElement($dom, Application::getAbout())); + $filesXML = $dom->createElement('files'); $root->appendChild($filesXML); @@ -99,7 +104,7 @@ private function createDiffElement(\DOMDocument $dom, string $diff): \DOMElement private function createTimeElement(float $time, \DOMDocument $dom): \DOMElement { - $time = round($time / 1000, 3); + $time = round($time / 1_000, 3); $timeXML = $dom->createElement('time'); $timeXML->setAttribute('unit', 's'); @@ -112,7 +117,7 @@ private function createTimeElement(float $time, \DOMDocument $dom): \DOMElement private function createMemoryElement(float $memory, \DOMDocument $dom): \DOMElement { - $memory = round($memory / 1024 / 1024, 3); + $memory = round($memory / 1_024 / 1_024, 3); $memoryXML = $dom->createElement('memory'); $memoryXML->setAttribute('value', (string) $memory); @@ -120,4 +125,12 @@ private function createMemoryElement(float $memory, \DOMDocument $dom): \DOMElem return $memoryXML; } + + private function createAboutElement(\DOMDocument $dom, string $about): \DOMElement + { + $xml = $dom->createElement('about'); + $xml->setAttribute('value', $about); + + return $xml; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php index 956fb1312..9cc1602ef 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/JsonReporter.php @@ -19,6 +19,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class JsonReporter implements ReporterInterface @@ -32,7 +34,7 @@ public function generate(ReportSummary $reportSummary): string { $sets = $reportSummary->getSets(); - usort($sets, static fn (RuleSetDescriptionInterface $a, RuleSetDescriptionInterface $b): int => strcmp($a->getName(), $b->getName())); + usort($sets, static fn (RuleSetDescriptionInterface $a, RuleSetDescriptionInterface $b): int => $a->getName() <=> $b->getName()); $json = ['sets' => []]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php index c7d66e715..e6ced136e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReportSummary.php @@ -19,6 +19,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class ReportSummary diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php index 45f2a26f2..ad963f6d4 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/ReporterFactory.php @@ -38,8 +38,8 @@ public function registerBuiltInReporters(): self foreach (SymfonyFinder::create()->files()->name('*Reporter.php')->in(__DIR__) as $file) { $relativeNamespace = $file->getRelativePath(); - $builtInReporters[] = sprintf( - '%s\\%s%s', + $builtInReporters[] = \sprintf( + '%s\%s%s', __NAMESPACE__, '' !== $relativeNamespace ? $relativeNamespace.'\\' : '', $file->getBasename('.php') @@ -59,7 +59,7 @@ public function registerReporter(ReporterInterface $reporter): self $format = $reporter->getFormat(); if (isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is already registered.', $format)); + throw new \UnexpectedValueException(\sprintf('Reporter for format "%s" is already registered.', $format)); } $this->reporters[$format] = $reporter; @@ -81,7 +81,7 @@ public function getFormats(): array public function getReporter(string $format): ReporterInterface { if (!isset($this->reporters[$format])) { - throw new \UnexpectedValueException(sprintf('Reporter for format "%s" is not registered.', $format)); + throw new \UnexpectedValueException(\sprintf('Reporter for format "%s" is not registered.', $format)); } return $this->reporters[$format]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php index 7804b93b2..62b338df8 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/Report/ListSetsReport/TextReporter.php @@ -19,6 +19,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class TextReporter implements ReporterInterface @@ -32,12 +34,12 @@ public function generate(ReportSummary $reportSummary): string { $sets = $reportSummary->getSets(); - usort($sets, static fn (RuleSetDescriptionInterface $a, RuleSetDescriptionInterface $b): int => strcmp($a->getName(), $b->getName())); + usort($sets, static fn (RuleSetDescriptionInterface $a, RuleSetDescriptionInterface $b): int => $a->getName() <=> $b->getName()); $output = ''; foreach ($sets as $i => $set) { - $output .= sprintf('%2d) %s', $i + 1, $set->getName()).PHP_EOL.' '.$set->getDescription().PHP_EOL; + $output .= \sprintf('%2d) %s', $i + 1, $set->getName()).PHP_EOL.' '.$set->getDescription().PHP_EOL; if ($set->isRisky()) { $output .= ' Set contains risky rules.'.PHP_EOL; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php index e2268d7f6..b6a0a279b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClient.php @@ -15,16 +15,23 @@ namespace PhpCsFixer\Console\SelfUpdate; /** + * @readonly + * * @internal */ final class GithubClient implements GithubClientInterface { - public function getTags(): array + private string $url; + + public function __construct(string $url = 'https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/tags') { - $url = 'https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/tags'; + $this->url = $url; + } + public function getTags(): array + { $result = @file_get_contents( - $url, + $this->url, false, stream_context_create([ 'http' => [ @@ -34,18 +41,29 @@ public function getTags(): array ); if (false === $result) { - throw new \RuntimeException(sprintf('Failed to load tags at "%s".', $url)); + throw new \RuntimeException(\sprintf('Failed to load tags at "%s".', $this->url)); } + /** + * @var list + */ $result = json_decode($result, true); if (JSON_ERROR_NONE !== json_last_error()) { - throw new \RuntimeException(sprintf( + throw new \RuntimeException(\sprintf( 'Failed to read response from "%s" as JSON: %s.', - $url, + $this->url, json_last_error_msg() )); } - return $result; + return array_map( + static fn (array $tagData): string => $tagData['name'], + $result + ); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php index 38178a22f..27728327f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/GithubClientInterface.php @@ -20,12 +20,7 @@ interface GithubClientInterface { /** - * @return list + * @return list */ public function getTags(): array; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php index 06bd1229b..67ed6e660 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/SelfUpdate/NewVersionChecker.php @@ -28,9 +28,9 @@ final class NewVersionChecker implements NewVersionCheckerInterface private VersionParser $versionParser; /** - * @var null|string[] + * @var null|list */ - private $availableVersions; + private ?array $availableVersions = null; public function __construct(GithubClientInterface $githubClient) { @@ -82,9 +82,7 @@ private function retrieveAvailableVersions(): void return; } - foreach ($this->githubClient->getTags() as $tag) { - $version = $tag['name']; - + foreach ($this->githubClient->getTags() as $version) { try { $this->versionParser->normalize($version); @@ -96,6 +94,9 @@ private function retrieveAvailableVersions(): void } } - $this->availableVersions = Semver::rsort($this->availableVersions); + $versions = Semver::rsort($this->availableVersions); + \assert(array_is_list($versions)); // Semver::rsort provides soft `array` type, let's validate and ensure proper type for SCA + + $this->availableVersions = $versions; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php b/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php index dac182b8f..7465c2a47 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Console/WarningsDetector.php @@ -27,7 +27,7 @@ final class WarningsDetector private ToolInfoInterface $toolInfo; /** - * @var string[] + * @var list */ private array $warnings = []; @@ -50,7 +50,7 @@ public function detectOldVendor(): void if ($this->toolInfo->isInstalledByComposer()) { $details = $this->toolInfo->getComposerInstallationDetails(); if (ToolInfo::COMPOSER_LEGACY_PACKAGE_NAME === $details['name']) { - $this->warnings[] = sprintf( + $this->warnings[] = \sprintf( 'You are running PHP CS Fixer installed with old vendor `%s`. Please update to `%s`.', ToolInfo::COMPOSER_LEGACY_PACKAGE_NAME, ToolInfo::COMPOSER_PACKAGE_NAME @@ -60,7 +60,7 @@ public function detectOldVendor(): void } /** - * @return string[] + * @return list */ public function getWarnings(): array { @@ -68,9 +68,9 @@ public function getWarnings(): array return []; } - return array_unique(array_merge( + return array_values(array_unique(array_merge( $this->warnings, - ['If you need help while solving warnings, ask at https://gitter.im/PHP-CS-Fixer, we will help you!'] - )); + ['If you need help while solving warnings, ask at https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/discussions/, we will help you!'] + ))); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php index f28962536..79385bc38 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Differ/DiffConsoleFormatter.php @@ -20,6 +20,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class DiffConsoleFormatter @@ -42,7 +44,7 @@ public function format(string $diff, string $lineTemplate = '%s'): string ? $this->template : Preg::replace('/<[^<>]+>/', '', $this->template); - return sprintf( + return \sprintf( $template, implode( PHP_EOL, @@ -61,7 +63,7 @@ static function (array $matches): string { $colour = 'cyan'; } - return sprintf('%s', $colour, OutputFormatter::escape($matches[0]), $colour); + return \sprintf('%s', $colour, OutputFormatter::escape($matches[0]), $colour); }, $line, 1, @@ -73,7 +75,7 @@ static function (array $matches): string { } } - return sprintf($lineTemplate, $line); + return \sprintf($lineTemplate, $line); }, Preg::split('#\R#u', $diff) ) diff --git a/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php b/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php index a927ede40..7749866cf 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Differ/FullDiffer.php @@ -20,6 +20,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class FullDiffer implements DifferInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php index c4a0444c7..c3af8adf3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php +++ b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Annotation.php @@ -29,9 +29,9 @@ final class Annotation /** * All the annotation tag names with types. * - * @var string[] + * @var list */ - private static array $tags = [ + private const TAGS = [ 'method', 'param', 'property', @@ -46,61 +46,50 @@ final class Annotation /** * The lines that make up the annotation. * - * @var Line[] + * @var array */ private array $lines; /** * The position of the first line of the annotation in the docblock. - * - * @var int */ - private $start; + private int $start; /** * The position of the last line of the annotation in the docblock. - * - * @var int */ - private $end; + private int $end; /** * The associated tag. - * - * @var null|Tag */ - private $tag; + private ?Tag $tag = null; /** * Lazy loaded, cached types content. - * - * @var null|string */ - private $typesContent; + private ?string $typesContent = null; /** * The cached types. * - * @var null|string[] + * @var null|list */ - private $types; + private ?array $types = null; - /** - * @var null|NamespaceAnalysis - */ - private $namespace; + private ?NamespaceAnalysis $namespace = null; /** - * @var NamespaceUseAnalysis[] + * @var list */ private array $namespaceUses; /** * Create a new line instance. * - * @param Line[] $lines - * @param null|NamespaceAnalysis $namespace - * @param NamespaceUseAnalysis[] $namespaceUses + * @param array $lines + * @param null|NamespaceAnalysis $namespace + * @param list $namespaceUses */ public function __construct(array $lines, $namespace = null, array $namespaceUses = []) { @@ -108,10 +97,8 @@ public function __construct(array $lines, $namespace = null, array $namespaceUse $this->namespace = $namespace; $this->namespaceUses = $namespaceUses; - $keys = array_keys($lines); - - $this->start = $keys[0]; - $this->end = end($keys); + $this->start = array_key_first($lines); + $this->end = array_key_last($lines); } /** @@ -125,11 +112,11 @@ public function __toString(): string /** * Get all the annotation tag names with types. * - * @return string[] + * @return list */ public static function getTagsWithTypes(): array { - return self::$tags; + return self::TAGS; } /** @@ -173,14 +160,17 @@ public function getTypeExpression(): ?TypeExpression } /** - * @return null|string - * * @internal */ - public function getVariableName() + public function getVariableName(): ?string { $type = preg_quote($this->getTypesContent() ?? '', '/'); - $regex = "/@{$this->tag->getName()}\\s+({$type}\\s*)?(&\\s*)?(\\.{3}\\s*)?(?\\$.+?)(?:[\\s*]|$)/"; + $regex = \sprintf( + '/@%s\s+(%s\s*)?(&\s*)?(\.{3}\s*)?(?\$%s)(?:.*|$)/', + $this->tag->getName(), + $type, + TypeExpression::REGEX_IDENTIFIER + ); if (Preg::match($regex, $this->lines[0]->getContent(), $matches)) { return $matches['variable']; @@ -192,7 +182,7 @@ public function getVariableName() /** * Get the types associated with this annotation. * - * @return string[] + * @return list */ public function getTypes(): array { @@ -209,13 +199,25 @@ public function getTypes(): array /** * Set the types associated with this annotation. * - * @param string[] $types + * @param list $types */ public function setTypes(array $types): void { - $pattern = '/'.preg_quote($this->getTypesContent(), '/').'/'; + $origTypesContent = $this->getTypesContent(); + $newTypesContent = implode( + // Fallback to union type is provided for backward compatibility (previously glue was set to `|` by default even when type was not composite) + // @TODO Better handling for cases where type is fixed (original type is not composite, but was made composite during fix) + $this->getTypeExpression()->getTypesGlue() ?? '|', + $types + ); + + if ($origTypesContent === $newTypesContent) { + return; + } - $this->lines[0]->setContent(Preg::replace($pattern, implode($this->getTypeExpression()->getTypesGlue(), $types), $this->lines[0]->getContent(), 1)); + $pattern = '/'.preg_quote($origTypesContent, '/').'/'; + + $this->lines[0]->setContent(Preg::replace($pattern, $newTypesContent, $this->lines[0]->getContent(), 1)); $this->clearCache(); } @@ -223,15 +225,21 @@ public function setTypes(array $types): void /** * Get the normalized types associated with this annotation, so they can easily be compared. * - * @return string[] + * @return list */ public function getNormalizedTypes(): array { - $normalized = array_map(static fn (string $type): string => strtolower($type), $this->getTypes()); + $typeExpression = $this->getTypeExpression(); + if (null === $typeExpression) { + return []; + } - sort($normalized); + $normalizedTypeExpression = $typeExpression + ->mapTypes(static fn (TypeExpression $v) => new TypeExpression(strtolower($v->toString()), null, [])) + ->sortTypes(static fn (TypeExpression $a, TypeExpression $b) => $a->toString() <=> $b->toString()) + ; - return $normalized; + return $normalizedTypeExpression->getTypes(); } /** @@ -272,7 +280,7 @@ public function getContent(): string public function supportTypes(): bool { - return \in_array($this->getTag()->getName(), self::$tags, true); + return \in_array($this->getTag()->getName(), self::TAGS, true); } /** @@ -290,7 +298,7 @@ private function getTypesContent(): ?string } $matchingResult = Preg::match( - '{^(?:\s*\*|/\*\*)[\s\*]*@'.$name.'\s+'.TypeExpression::REGEX_TYPES.'(?:(?:[*\h\v]|\&?[\.\$]).*)?\r?$}is', + '{^(?:\h*\*|/\*\*)[\h*]*@'.$name.'\h+'.TypeExpression::REGEX_TYPES.'(?:(?:[*\h\v]|\&?[\.\$]).*)?\r?$}is', $this->lines[0]->getContent(), $matches ); diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php index b4ae53e22..a477cccc2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php +++ b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php @@ -209,7 +209,7 @@ private function findAnnotationLength(int $start): int { $index = $start; - while ($line = $this->getLine(++$index)) { + while (($line = $this->getLine(++$index)) !== null) { if ($line->containsATag()) { // we've 100% reached the end of the description if we get here break; diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php index 1e6fa5b94..9ef4a0874 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php +++ b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/Line.php @@ -59,7 +59,7 @@ public function getContent(): string */ public function containsUsefulContent(): bool { - return Preg::match('/\\*\s*\S+/', $this->content) && '' !== trim(str_replace(['/', '*'], ' ', $this->content)); + return Preg::match('/\*\s*\S+/', $this->content) && '' !== trim(str_replace(['/', '*'], ' ', $this->content)); } /** @@ -69,7 +69,7 @@ public function containsUsefulContent(): bool */ public function containsATag(): bool { - return Preg::match('/\\*\s*@/', $this->content); + return Preg::match('/\*\s*@/', $this->content); } /** diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php index dbd9e5dad..d053bc44e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php +++ b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/ShortDescription.php @@ -17,6 +17,8 @@ /** * This class represents a short description (aka summary) of a docblock. * + * @readonly + * * @internal */ final class ShortDescription diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php index 578fd3a76..c5a3a8963 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TagComparator.php @@ -28,6 +28,8 @@ final class TagComparator /** * Groups of tags that should be allowed to immediately follow each other. * + * @var list> + * * @internal */ public const DEFAULT_GROUPS = [ @@ -40,7 +42,7 @@ final class TagComparator /** * Should the given tags be kept together, or kept apart? * - * @param string[][] $groups + * @param list> $groups */ public static function shouldBeTogether(Tag $first, Tag $second, array $groups = self::DEFAULT_GROUPS): bool { diff --git a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php index 505e0b3d3..48f68f866 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php +++ b/vendor/friendsofphp/php-cs-fixer/src/DocBlock/TypeExpression.php @@ -20,6 +20,8 @@ use PhpCsFixer\Utils; /** + * @author Michael Vorisek + * * @internal */ final class TypeExpression @@ -44,27 +46,70 @@ final class TypeExpression )*+ )'; + /** + * Based on: + * - https://github.com/phpstan/phpdoc-parser/blob/1.26.0/doc/grammars/type.abnf fuzzing grammar + * - and https://github.com/phpstan/phpdoc-parser/blob/1.26.0/src/Parser/PhpDocParser.php parser impl. + */ private const REGEX_TYPE = '(?(?x) # single type (?\??\h*) (?: (? - (?(?i)(?:array|list|object)(?-i)\h*\{\h*) + (?(?i)(?:array|list|object)(?-i)) + (?\h*\{\h*) (? (? - (?(?:(?&constant)|(?&identifier))\h*\??\h*:\h*|) + (?(?:(?&constant)|(?&identifier)|(?&name))\h*\??\h*:\h*|) (?(?&types_inner)) ) (?: \h*,\h* (?&array_shape_inner) - )* - (?:\h*,\h*)? + )*+ + (?:\h*,|(?!(?&array_shape_unsealed_variadic))) + |) + (? # unsealed array shape, e.g. `...`. `...` + (?\h*\.\.\.) + (? + (?\h*<\h*) + (?(?&types_inner)) + (?: + (?\h*,\h*) + (?(?&array_shape_unsealed_type_a)) + |) + \h*> + |) |) \h*\} ) | - (? # callable syntax, e.g. `callable(string, int...): bool` - (?(?&name)\h*\(\h*) + (? # callable syntax, e.g. `callable(string, int...): bool`, `\Closure(T, int): T` + (?(?&name)) + (? + (?\h*<\h*) + (? + (? + (? + (?&identifier) + ) + (? # template bound + \h+(?i)(?of|as)(?-i)\h+ + (?(?&types_inner)) + |) + (? # template default + \h*=\h* + (?(?&types_inner)) + |) + ) + (?: + \h*,\h* + (?&callable_template_inner) + )*+ + ) + \h*> + (?=\h*\() + |) + (?\h*\(\h*) (? (? (?(?&types_inner)) @@ -76,8 +121,8 @@ final class TypeExpression (?: \h*,\h* (?&callable_argument) - )* - (?:\h*,\h*)? + )*+ + (?:\h*,)? |) \h*\) (?: @@ -87,20 +132,22 @@ final class TypeExpression ) | (? # generic syntax, e.g.: `array` - (?(?&name)\h*<\h*) + (?(?&name)) + (?\h*<\h*) (? (?&types_inner) (?: \h*,\h* (?&types_inner) - )* - (?:\h*,\h*)? + )*+ + (?:\h*,)? ) \h*> ) | (? # class constants with optional wildcard, e.g.: `Foo::*`, `Foo::CONST_A`, `FOO::CONST_*` - (?&name)::\*?(?:(?&identifier)\*?)* + (?(?&name)) + ::\*?(?:(?&identifier)\*?)* ) | (? # single constant value (case insensitive), e.g.: 1, -1.8E+6, `\'a\'` @@ -115,8 +162,8 @@ final class TypeExpression (?:\.(?&constant_digits)|(?<=\d)\.)?+ (?:e[+-]?(?&constant_digits))?+ ) - | \'(?:[^\'\\\\]|\\\\.)*+\' - | "(?:[^"\\\\]|\\\\.)*+" + | \'(?:[^\'\\\]|\\\.)*+\' + | "(?:[^"\\\]|\\\.)*+" (?-i) ) | @@ -127,7 +174,7 @@ final class TypeExpression ) | (? # full name, e.g.: `int`, `\DateTime`, `\Foo\Bar`, `positive-int` - \\\\?+ + \\\?+ (?'.self::REGEX_IDENTIFIER.') (?:[\\\\\-](?&identifier))*+ ) @@ -164,36 +211,33 @@ final class TypeExpression (\h*\[\h*\])* ) (?:(?=1)0 - (? + (?(?> (?&type) (?: \h*[|&]\h* (?&type) )*+ - ) + )) |) )'; private string $value; - private bool $isUnionType = false; + private bool $isCompositeType; - private string $typesGlue = '|'; + /** @var null|'&'|'|' */ + private ?string $typesGlue = null; - /** - * @var list - */ + /** @var list */ private array $innerTypeExpressions = []; private ?NamespaceAnalysis $namespace; - /** - * @var NamespaceUseAnalysis[] - */ + /** @var list */ private array $namespaceUses; /** - * @param NamespaceUseAnalysis[] $namespaceUses + * @param list $namespaceUses */ public function __construct(string $value, ?NamespaceAnalysis $namespace, array $namespaceUses) { @@ -210,11 +254,11 @@ public function toString(): string } /** - * @return string[] + * @return list */ public function getTypes(): array { - if ($this->isUnionType) { + if ($this->isCompositeType) { return array_map( static fn (array $type) => $type['expression']->toString(), $this->innerTypeExpressions, @@ -224,55 +268,105 @@ public function getTypes(): array return [$this->value]; } + /** + * Determines if type expression is a composite type (union or intersection). + */ + public function isCompositeType(): bool + { + return $this->isCompositeType; + } + public function isUnionType(): bool { - return $this->isUnionType; + return $this->isCompositeType && '|' === $this->typesGlue; } - public function getTypesGlue(): string + public function isIntersectionType(): bool + { + return $this->isCompositeType && '&' === $this->typesGlue; + } + + /** + * @return null|'&'|'|' + */ + public function getTypesGlue(): ?string { return $this->typesGlue; } /** - * @param \Closure(self): void $callback + * @param \Closure(self): self $callback */ - public function walkTypes(\Closure $callback): void + public function mapTypes(\Closure $callback): self { + $value = $this->value; + $startIndexOffset = 0; + foreach ($this->innerTypeExpressions as [ - 'start_index' => $startIndex, + 'start_index' => $startIndexOrig, 'expression' => $inner, ]) { - $initialValueLength = \strlen($inner->toString()); + $innerValueOrig = $inner->value; - $inner->walkTypes($callback); + $inner = $inner->mapTypes($callback); - $this->value = substr_replace( - $this->value, - $inner->toString(), - $startIndex, - $initialValueLength - ); + if ($inner->value !== $innerValueOrig) { + $value = substr_replace( + $value, + $inner->value, + $startIndexOrig + $startIndexOffset, + \strlen($innerValueOrig) + ); + + $startIndexOffset += \strlen($inner->value) - \strlen($innerValueOrig); + } } - $callback($this); + $type = $value === $this->value + ? $this + : $this->inner($value); + + return $callback($type); + } + + /** + * @param \Closure(self): void $callback + */ + public function walkTypes(\Closure $callback): void + { + $this->mapTypes(static function (self $type) use ($callback) { + $valueOrig = $type->value; + $callback($type); + \assert($type->value === $valueOrig); + + return $type; + }); } /** * @param \Closure(self, self): (-1|0|1) $compareCallback */ - public function sortTypes(\Closure $compareCallback): void + public function sortTypes(\Closure $compareCallback): self { - $this->walkTypes(static function (self $type) use ($compareCallback): void { - if ($type->isUnionType) { - $type->innerTypeExpressions = Utils::stableSort( + return $this->mapTypes(function (self $type) use ($compareCallback): self { + if ($type->isCompositeType) { + $innerTypeExpressions = Utils::stableSort( $type->innerTypeExpressions, - static fn (array $type): self => $type['expression'], + static fn (array $v): self => $v['expression'], $compareCallback, ); - $type->value = implode($type->getTypesGlue(), $type->getTypes()); + if ($innerTypeExpressions !== $type->innerTypeExpressions) { + $value = implode( + $type->getTypesGlue(), + array_map(static fn (array $v): string => $v['expression']->toString(), $innerTypeExpressions) + ); + + return $this->inner($value); + } } + + return $type; }); } @@ -330,10 +424,13 @@ public function allowsNull(): bool private function parse(): void { + $seenGlues = null; + $innerValues = []; + $index = 0; while (true) { Preg::match( - '{\G'.self::REGEX_TYPE.'(?:\h*(?[|&])\h*|$)}', + '{\G'.self::REGEX_TYPE.'(?\h*(?[|&])\h*(?!$)|$)}', $this->value, $matches, PREG_OFFSET_CAPTURE, @@ -344,39 +441,110 @@ private function parse(): void throw new \Exception('Unable to parse phpdoc type '.var_export($this->value, true)); } - if (!$this->isUnionType) { + if (null === $seenGlues) { if (($matches['glue'][0] ?? '') === '') { break; } - $this->isUnionType = true; - $this->typesGlue = $matches['glue'][0]; + $seenGlues = ['|' => false, '&' => false]; } - $this->innerTypeExpressions[] = [ + if (($matches['glue'][0] ?? '') !== '') { + \assert(isset($seenGlues[$matches['glue'][0]])); + $seenGlues[$matches['glue'][0]] = true; + } + + $innerValues[] = [ 'start_index' => $index, - 'expression' => $this->inner($matches['type'][0]), + 'value' => $matches['type'][0], + 'next_glue' => $matches['glue'][0] ?? null, + 'next_glue_raw' => $matches['glue_raw'][0] ?? null, ]; $consumedValueLength = \strlen($matches[0][0]); $index += $consumedValueLength; - if (\strlen($this->value) === $index) { + if (\strlen($this->value) <= $index) { + \assert(\strlen($this->value) === $index); + + $seenGlues = array_filter($seenGlues); + \assert([] !== $seenGlues); + + $this->isCompositeType = true; + $this->typesGlue = array_key_first($seenGlues); + + if (1 === \count($seenGlues)) { + foreach ($innerValues as $innerValue) { + $this->innerTypeExpressions[] = [ + 'start_index' => $innerValue['start_index'], + 'expression' => $this->inner($innerValue['value']), + ]; + } + } else { + for ($i = 0; $i < \count($innerValues); ++$i) { + $innerStartIndex = $innerValues[$i]['start_index']; + $innerValue = ''; + while (true) { + $innerValue .= $innerValues[$i]['value']; + + if (($innerValues[$i]['next_glue'] ?? $this->typesGlue) === $this->typesGlue) { + break; + } + + $innerValue .= $innerValues[$i]['next_glue_raw']; + + ++$i; + } + + $this->innerTypeExpressions[] = [ + 'start_index' => $innerStartIndex, + 'expression' => $this->inner($innerValue), + ]; + } + } + return; } } - $nullableLength = \strlen($matches['nullable'][0]); - $index = $nullableLength; + $this->isCompositeType = false; + + if ('' !== $matches['nullable'][0]) { + $this->innerTypeExpressions[] = [ + 'start_index' => \strlen($matches['nullable'][0]), + 'expression' => $this->inner(substr($matches['type'][0], \strlen($matches['nullable'][0]))), + ]; + } elseif ('' !== $matches['array'][0]) { + $this->innerTypeExpressions[] = [ + 'start_index' => 0, + 'expression' => $this->inner(substr($matches['type'][0], 0, -\strlen($matches['array'][0]))), + ]; + } elseif ('' !== ($matches['generic'][0] ?? '') && 0 === $matches['generic'][1]) { + $this->innerTypeExpressions[] = [ + 'start_index' => 0, + 'expression' => $this->inner($matches['generic_name'][0]), + ]; - if ('' !== ($matches['generic'][0] ?? '') && $matches['generic'][1] === $nullableLength) { $this->parseCommaSeparatedInnerTypes( - $index + \strlen($matches['generic_start'][0]), + \strlen($matches['generic_name'][0]) + \strlen($matches['generic_start'][0]), $matches['generic_types'][0] ); - } elseif ('' !== ($matches['callable'][0] ?? '') && $matches['callable'][1] === $nullableLength) { + } elseif ('' !== ($matches['callable'][0] ?? '') && 0 === $matches['callable'][1]) { + $this->innerTypeExpressions[] = [ + 'start_index' => 0, + 'expression' => $this->inner($matches['callable_name'][0]), + ]; + + $this->parseCallableTemplateInnerTypes( + \strlen($matches['callable_name'][0]) + + \strlen($matches['callable_template_start'][0]), + $matches['callable_template_inners'][0] + ); + $this->parseCallableArgumentTypes( - $index + \strlen($matches['callable_start'][0]), + \strlen($matches['callable_name'][0]) + + \strlen($matches['callable_template'][0]) + + \strlen($matches['callable_start'][0]), $matches['callable_arguments'][0] ); @@ -386,13 +554,41 @@ private function parse(): void 'expression' => $this->inner($matches['callable_return'][0]), ]; } - } elseif ('' !== ($matches['array_shape'][0] ?? '') && $matches['array_shape'][1] === $nullableLength) { + } elseif ('' !== ($matches['array_shape'][0] ?? '') && 0 === $matches['array_shape'][1]) { + $this->innerTypeExpressions[] = [ + 'start_index' => 0, + 'expression' => $this->inner($matches['array_shape_name'][0]), + ]; + + $nextIndex = \strlen($matches['array_shape_name'][0]) + \strlen($matches['array_shape_start'][0]); + $this->parseArrayShapeInnerTypes( - $index + \strlen($matches['array_shape_start'][0]), + $nextIndex, $matches['array_shape_inners'][0] ); - } elseif ('' !== ($matches['parenthesized'][0] ?? '') && $matches['parenthesized'][1] === $nullableLength) { - $index += \strlen($matches['parenthesized_start'][0]); + + if ('' !== ($matches['array_shape_unsealed_type'][0] ?? '')) { + $nextIndex += \strlen($matches['array_shape_inners'][0]) + + \strlen($matches['array_shape_unsealed_variadic'][0]) + + \strlen($matches['array_shape_unsealed_type_start'][0]); + + $this->innerTypeExpressions[] = [ + 'start_index' => $nextIndex, + 'expression' => $this->inner($matches['array_shape_unsealed_type_a'][0]), + ]; + + if ('' !== ($matches['array_shape_unsealed_type_b'][0] ?? '')) { + $nextIndex += \strlen($matches['array_shape_unsealed_type_a'][0]) + + \strlen($matches['array_shape_unsealed_type_comma'][0]); + + $this->innerTypeExpressions[] = [ + 'start_index' => $nextIndex, + 'expression' => $this->inner($matches['array_shape_unsealed_type_b'][0]), + ]; + } + } + } elseif ('' !== ($matches['parenthesized'][0] ?? '') && 0 === $matches['parenthesized'][1]) { + $index = \strlen($matches['parenthesized_start'][0]); if ('' !== ($matches['conditional'][0] ?? '')) { if ('' !== ($matches['conditional_cond_left_types'][0] ?? '')) { @@ -428,6 +624,11 @@ private function parse(): void 'expression' => $this->inner($matches['parenthesized_types'][0]), ]; } + } elseif ('' !== $matches['class_constant'][0]) { + $this->innerTypeExpressions[] = [ + 'start_index' => 0, + 'expression' => $this->inner($matches['class_constant_name'][0]), + ]; } } @@ -452,6 +653,49 @@ private function parseCommaSeparatedInnerTypes(int $startIndex, string $value): } } + private function parseCallableTemplateInnerTypes(int $startIndex, string $value): void + { + $index = 0; + while (\strlen($value) !== $index) { + Preg::match( + '{\G(?:(?=1)0'.self::REGEX_TYPES.'|(?<_callable_template_inner>(?&callable_template_inner))(?:\h*,\h*|$))}', + $value, + $prematches, + 0, + $index + ); + $consumedValue = $prematches['_callable_template_inner']; + $consumedValueLength = \strlen($consumedValue); + $consumedCommaLength = \strlen($prematches[0]) - $consumedValueLength; + + $addedPrefix = 'Closure<'; + Preg::match( + '{^'.self::REGEX_TYPES.'$}', + $addedPrefix.$consumedValue.'>(): void', + $matches, + PREG_OFFSET_CAPTURE + ); + + if ('' !== $matches['callable_template_inner_b'][0]) { + $this->innerTypeExpressions[] = [ + 'start_index' => $startIndex + $index + $matches['callable_template_inner_b_types'][1] + - \strlen($addedPrefix), + 'expression' => $this->inner($matches['callable_template_inner_b_types'][0]), + ]; + } + + if ('' !== $matches['callable_template_inner_d'][0]) { + $this->innerTypeExpressions[] = [ + 'start_index' => $startIndex + $index + $matches['callable_template_inner_d_types'][1] + - \strlen($addedPrefix), + 'expression' => $this->inner($matches['callable_template_inner_d_types'][0]), + ]; + } + + $index += $consumedValueLength + $consumedCommaLength; + } + } + private function parseCallableArgumentTypes(int $startIndex, string $value): void { $index = 0; @@ -508,7 +752,8 @@ private function parseArrayShapeInnerTypes(int $startIndex, string $value): void ); $this->innerTypeExpressions[] = [ - 'start_index' => $startIndex + $index + $matches['array_shape_inner_value'][1] - \strlen($addedPrefix), + 'start_index' => $startIndex + $index + $matches['array_shape_inner_value'][1] + - \strlen($addedPrefix), 'expression' => $this->inner($matches['array_shape_inner_value'][0]), ]; @@ -594,7 +839,7 @@ private function normalize(string $type): string } /** - * @return array + * @return array */ private function getAliases(): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/DocLexer.php b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/DocLexer.php index b451d00bf..af64205bb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/DocLexer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/DocLexer.php @@ -75,7 +75,7 @@ final class DocLexer private int $peek = 0; - private ?string $regex; + private ?string $regex = null; public function setInput(string $input): void { @@ -150,14 +150,12 @@ private function getType(string &$value): int private function scan(string $input): void { - if (!isset($this->regex)) { - $this->regex = sprintf( - '/(%s)|%s/%s', - implode(')|(', $this->getCatchablePatterns()), - implode('|', $this->getNonCatchablePatterns()), - 'iu' - ); - } + $this->regex ??= \sprintf( + '/(%s)|%s/%s', + implode(')|(', $this->getCatchablePatterns()), + implode('|', $this->getNonCatchablePatterns()), + 'iu' + ); $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; $matches = Preg::split($this->regex, $input, -1, $flags); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php index 314df6b24..56cb83e47 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Token.php @@ -66,7 +66,7 @@ public function getPosition(): int /** * Returns whether the token type is one of the given types. * - * @param int|int[] $types + * @param int|list $types */ public function isType($types): bool { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php index a388cf4c6..b73d14a4d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Doctrine/Annotation/Tokens.php @@ -14,7 +14,6 @@ namespace PhpCsFixer\Doctrine\Annotation; -use PhpCsFixer\Doctrine\Annotation\Token as AnnotationToken; use PhpCsFixer\Preg; use PhpCsFixer\Tokenizer\Token as PhpToken; @@ -28,7 +27,7 @@ final class Tokens extends \SplFixedArray { /** - * @param string[] $ignoredTags + * @param list $ignoredTags * * @throws \InvalidArgumentException */ @@ -101,14 +100,14 @@ public static function createFromDocComment(PhpToken $input, array $ignoredTags } $lastTokenEndIndex = 0; - foreach (\array_slice($scannedTokens, 0, $nbScannedTokensToUse) as $token) { - if ($token->isType(DocLexer::T_STRING)) { - $token = new AnnotationToken( - $token->getType(), - '"'.str_replace('"', '""', $token->getContent()).'"', - $token->getPosition() - ); - } + foreach (\array_slice($scannedTokens, 0, $nbScannedTokensToUse) as $scannedToken) { + $token = $scannedToken->isType(DocLexer::T_STRING) + ? new Token( + $scannedToken->getType(), + '"'.str_replace('"', '""', $scannedToken->getContent()).'"', + $scannedToken->getPosition() + ) + : $scannedToken; $missingTextLength = $token->getPosition() - $lastTokenEndIndex; if ($missingTextLength > 0) { @@ -139,8 +138,8 @@ public static function createFromDocComment(PhpToken $input, array $ignoredTags /** * Create token collection from array. * - * @param Token[] $array the array to import - * @param ?bool $saveIndices save the numeric indices used in the original array, default is yes + * @param array $array the array to import + * @param ?bool $saveIndices save the numeric indices used in the original array, default is yes */ public static function fromArray($array, $saveIndices = null): self { @@ -247,7 +246,7 @@ public function insertAt(int $index, Token $token): void public function offsetSet($index, $token): void { if (null === $token) { - throw new \InvalidArgumentException('Token must be an instance of PhpCsFixer\\Doctrine\\Annotation\\Token, "null" given.'); + throw new \InvalidArgumentException('Token must be an instance of PhpCsFixer\Doctrine\Annotation\Token, "null" given.'); } if (!$token instanceof Token) { @@ -257,7 +256,7 @@ public function offsetSet($index, $token): void $type = \get_class($token); } - throw new \InvalidArgumentException(sprintf('Token must be an instance of PhpCsFixer\\Doctrine\\Annotation\\Token, "%s" given.', $type)); + throw new \InvalidArgumentException(\sprintf('Token must be an instance of PhpCsFixer\Doctrine\Annotation\Token, "%s" given.', $type)); } parent::offsetSet($index, $token); @@ -271,7 +270,7 @@ public function offsetSet($index, $token): void public function offsetUnset($index): void { if (!isset($this[$index])) { - throw new \OutOfBoundsException(sprintf('Index "%s" is invalid or does not exist.', $index)); + throw new \OutOfBoundsException(\sprintf('Index "%s" is invalid or does not exist.', $index)); } $max = \count($this) - 1; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationLocator.php b/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationLocator.php index f384e48cd..5da0e31c2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationLocator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Documentation/DocumentationLocator.php @@ -19,6 +19,8 @@ use PhpCsFixer\Utils; /** + * @readonly + * * @internal */ final class DocumentationLocator @@ -43,7 +45,7 @@ public function getFixersDocumentationIndexFilePath(): string public function getFixerDocumentationFilePath(FixerInterface $fixer): string { return $this->getFixersDocumentationDirectoryPath().'/'.Preg::replaceCallback( - '/^.*\\\\(.+)\\\\(.+)Fixer$/', + '/^.*\\\(.+)\\\(.+)Fixer$/', static fn (array $matches): string => Utils::camelCaseToUnderscore($matches[1]).'/'.Utils::camelCaseToUnderscore($matches[2]), \get_class($fixer) ).'.rst'; @@ -73,11 +75,6 @@ public function getRuleSetsDocumentationFilePath(string $name): string return $this->getRuleSetsDocumentationDirectoryPath().'/'.str_replace(':risky', 'Risky', ucfirst(substr($name, 1))).'.rst'; } - public function getListingFilePath(): string - { - return $this->path.'/list.rst'; - } - public function getUsageFilePath(): string { return $this->path.'/usage.rst'; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Documentation/FixerDocumentGenerator.php b/vendor/friendsofphp/php-cs-fixer/src/Documentation/FixerDocumentGenerator.php index f5540d462..34ae74a7d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Documentation/FixerDocumentGenerator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Documentation/FixerDocumentGenerator.php @@ -18,6 +18,7 @@ use PhpCsFixer\Differ\FullDiffer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; use PhpCsFixer\Fixer\DeprecatedFixerInterface; +use PhpCsFixer\Fixer\ExperimentalFixerInterface; use PhpCsFixer\Fixer\FixerInterface; use PhpCsFixer\FixerConfiguration\AliasedFixerOption; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; @@ -33,6 +34,8 @@ use PhpCsFixer\Utils; /** + * @readonly + * * @internal */ final class FixerDocumentGenerator @@ -82,13 +85,26 @@ public function generateFixerDocumentation(FixerInterface $fixer): string $alternatives = $fixer->getSuccessorsNames(); if (0 !== \count($alternatives)) { - $deprecationDescription .= RstUtils::toRst(sprintf( + $deprecationDescription .= RstUtils::toRst(\sprintf( "\n\nYou should use %s instead.", Utils::naturalLanguageJoinWithBackticks($alternatives) ), 0); } } + $experimentalDescription = ''; + + if ($fixer instanceof ExperimentalFixerInterface) { + $experimentalDescriptionRaw = RstUtils::toRst('Rule is not covered with backward compatibility promise, use it at your own risk. Rule\'s behaviour may be changed at any point, including rule\'s name; its options\' names, availability and allowed values; its default configuration. Rule may be even removed without prior notice. Feel free to provide feedback and help with determining final state of the rule.', 0); + $experimentalDescription = <<getRiskyDescription(); @@ -111,12 +127,16 @@ public function generateFixerDocumentation(FixerInterface $fixer): string } $warningsHeaderLine = str_repeat('-', \strlen($warningsHeader)); - $doc .= "\n\n".implode("\n", array_filter([ - $warningsHeader, - $warningsHeaderLine, - $deprecationDescription, - $riskyDescription, - ])); + $doc .= "\n\n".implode("\n", array_filter( + [ + $warningsHeader, + $warningsHeaderLine, + $deprecationDescription, + $experimentalDescription, + $riskyDescription, + ], + static fn (string $text): bool => '' !== $text + )); } if ($fixer instanceof ConfigurableFixerInterface) { @@ -149,7 +169,7 @@ public function generateFixerDocumentation(FixerInterface $fixer): string if (null === $allowed) { $allowedKind = 'Allowed types'; $allowed = array_map( - static fn ($value): string => '``'.$value.'``', + static fn (string $value): string => '``'.Utils::convertArrayTypeToList($value).'``', $option->getAllowedTypes(), ); } else { @@ -184,7 +204,7 @@ public function generateFixerDocumentation(FixerInterface $fixer): string RST; foreach ($samples as $index => $sample) { - $title = sprintf('Example #%d', $index + 1); + $title = \sprintf('Example #%d', $index + 1); $titleLine = str_repeat('~', \strlen($title)); $doc .= "\n\n{$title}\n{$titleLine}"; @@ -192,7 +212,7 @@ public function generateFixerDocumentation(FixerInterface $fixer): string if (null === $sample->getConfiguration()) { $doc .= "\n\n*Default* configuration."; } else { - $doc .= sprintf( + $doc .= \sprintf( "\n\nWith configuration: ``%s``.", Utils::toString($sample->getConfiguration()) ); @@ -203,15 +223,7 @@ public function generateFixerDocumentation(FixerInterface $fixer): string } } - $ruleSetConfigs = []; - - foreach (RuleSets::getSetDefinitionNames() as $set) { - $ruleSet = new RuleSet([$set => true]); - - if ($ruleSet->hasRule($name)) { - $ruleSetConfigs[$set] = $ruleSet->getRuleConfiguration($name); - } - } + $ruleSetConfigs = self::getSetsOfRule($name); if ([] !== $ruleSetConfigs) { $plural = 1 !== \count($ruleSetConfigs) ? 's' : ''; @@ -243,21 +255,50 @@ public function generateFixerDocumentation(FixerInterface $fixer): string $fileName = $reflectionObject->getFileName(); $fileName = str_replace('\\', '/', $fileName); $fileName = substr($fileName, strrpos($fileName, '/src/Fixer/') + 1); - $fileName = "`{$className} <./../{$fileName}>`_"; + $fileName = "`{$className} <./../../../{$fileName}>`_"; + + $testFileName = Preg::replace('~.*\K/src/(?=Fixer/)~', '/tests/', $fileName); + $testFileName = Preg::replace('~PhpCsFixer\\\\\\\\\K(?=Fixer\\\\\\\)~', 'Tests\\\\\\\\', $testFileName); + $testFileName = Preg::replace('~(?= <|\.php>)~', 'Test', $testFileName); $doc .= <<', $doc); + return "{$doc}\n"; } /** - * @param FixerInterface[] $fixers + * @internal + * + * @return array> + */ + public static function getSetsOfRule(string $ruleName): array + { + $ruleSetConfigs = []; + + foreach (RuleSets::getSetDefinitionNames() as $set) { + $ruleSet = new RuleSet([$set => true]); + + if ($ruleSet->hasRule($ruleName)) { + $ruleSetConfigs[$set] = $ruleSet->getRuleConfiguration($ruleName); + } + } + + return $ruleSetConfigs; + } + + /** + * @param list $fixers */ public function generateFixersDocumentationIndex(array $fixers): string { @@ -267,7 +308,7 @@ public function generateFixersDocumentationIndex(array $fixers): string 'Phpdoc' => 'PHPDoc', ]; - usort($fixers, static fn (FixerInterface $a, FixerInterface $b): int => strcmp(\get_class($a), \get_class($b))); + usort($fixers, static fn (FixerInterface $a, FixerInterface $b): int => \get_class($a) <=> \get_class($b)); $documentation = <<<'RST' ======================= @@ -278,7 +319,7 @@ public function generateFixersDocumentationIndex(array $fixers): string $currentGroup = null; foreach ($fixers as $fixer) { - $namespace = Preg::replace('/^.*\\\\(.+)\\\\.+Fixer$/', '$1', \get_class($fixer)); + $namespace = Preg::replace('/^.*\\\(.+)\\\.+Fixer$/', '$1', \get_class($fixer)); $group = $overrideGroups[$namespace] ?? Preg::replace('/(?<=[[:lower:]])(?=[[:upper:]])/', ' ', $namespace); if ($group !== $currentGroup) { @@ -296,6 +337,10 @@ public function generateFixersDocumentationIndex(array $fixers): string $attributes[] = 'deprecated'; } + if ($fixer instanceof ExperimentalFixerInterface) { + $attributes[] = 'experimental'; + } + if ($fixer->isRisky()) { $attributes[] = 'risky'; } @@ -337,7 +382,7 @@ private function generateSampleDiff(FixerInterface $fixer, CodeSampleInterface $ the sample is not suitable for current version of PHP (%s). RST; - return sprintf($error, PHP_VERSION); + return \sprintf($error, PHP_VERSION); } $old = $sample->getCode(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Documentation/ListDocumentGenerator.php b/vendor/friendsofphp/php-cs-fixer/src/Documentation/ListDocumentGenerator.php deleted file mode 100644 index 51637ecb3..000000000 --- a/vendor/friendsofphp/php-cs-fixer/src/Documentation/ListDocumentGenerator.php +++ /dev/null @@ -1,170 +0,0 @@ - - * Dariusz Rumiński - * - * This source file is subject to the MIT license that is bundled - * with this source code in the file LICENSE. - */ - -namespace PhpCsFixer\Documentation; - -use PhpCsFixer\Console\Command\HelpCommand; -use PhpCsFixer\Fixer\ConfigurableFixerInterface; -use PhpCsFixer\Fixer\DeprecatedFixerInterface; -use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerConfiguration\AliasedFixerOption; -use PhpCsFixer\FixerConfiguration\AllowedValueSubset; -use PhpCsFixer\FixerConfiguration\DeprecatedFixerOptionInterface; -use PhpCsFixer\RuleSet\RuleSet; -use PhpCsFixer\RuleSet\RuleSets; -use PhpCsFixer\Utils; - -/** - * @internal - */ -final class ListDocumentGenerator -{ - private DocumentationLocator $locator; - - public function __construct(DocumentationLocator $locator) - { - $this->locator = $locator; - } - - /** - * @param FixerInterface[] $fixers - */ - public function generateListingDocumentation(array $fixers): string - { - usort( - $fixers, - static fn (FixerInterface $fixer1, FixerInterface $fixer2): int => strnatcasecmp($fixer1->getName(), $fixer2->getName()) - ); - - $documentation = <<<'RST' - ======================= - List of Available Rules - ======================= - - RST; - foreach ($fixers as $fixer) { - $name = $fixer->getName(); - $definition = $fixer->getDefinition(); - $path = './rules/'.$this->locator->getFixerDocumentationFileRelativePath($fixer); - - $documentation .= "\n- `{$name} <{$path}>`_\n"; - $documentation .= "\n ".str_replace('`', '``', $definition->getSummary())."\n"; - - $description = $definition->getDescription(); - - if (null !== $description) { - $documentation .= "\n ".RstUtils::toRst($description, 3)."\n"; - } - - if ($fixer instanceof DeprecatedFixerInterface) { - $documentation .= "\n *warning deprecated*"; - $alternatives = $fixer->getSuccessorsNames(); - - if (0 !== \count($alternatives)) { - $documentation .= RstUtils::toRst(sprintf( - ' Use %s instead.', - Utils::naturalLanguageJoinWithBackticks($alternatives) - ), 3); - } - - $documentation .= "\n"; - } - - if ($fixer->isRisky()) { - $documentation .= "\n *warning risky* ".RstUtils::toRst($definition->getRiskyDescription(), 3)."\n"; - } - - if ($fixer instanceof ConfigurableFixerInterface) { - $documentation .= "\n Configuration options:\n"; - $configurationDefinition = $fixer->getConfigurationDefinition(); - - foreach ($configurationDefinition->getOptions() as $option) { - $documentation .= "\n - | ``{$option->getName()}``"; - $documentation .= "\n | ".RstUtils::ensureProperInlineCode($option->getDescription()); - - if ($option instanceof DeprecatedFixerOptionInterface) { - $deprecationMessage = RstUtils::toRst($option->getDeprecationMessage(), 3); - $documentation .= "\n | warning:: This option is deprecated and will be removed in the next major version. {$deprecationMessage}"; - } - - if ($option instanceof AliasedFixerOption) { - $documentation .= "\n | note:: The previous name of this option was ``{$option->getAlias()}`` but it is now deprecated and will be removed in the next major version."; - } - - $allowed = HelpCommand::getDisplayableAllowedValues($option); - - if (null === $allowed) { - $allowedKind = 'Allowed types'; - $allowed = array_map( - static fn ($value): string => '``'.$value.'``', - $option->getAllowedTypes(), - ); - } else { - $allowedKind = 'Allowed values'; - $allowed = array_map(static fn ($value): string => $value instanceof AllowedValueSubset - ? 'a subset of ``'.Utils::toString($value->getAllowedValues()).'``' - : '``'.Utils::toString($value).'``', $allowed); - } - - $allowed = Utils::naturalLanguageJoin($allowed, ''); - $documentation .= "\n | {$allowedKind}: {$allowed}"; - - if ($option->hasDefault()) { - $default = Utils::toString($option->getDefault()); - $documentation .= "\n | Default value: ``{$default}``"; - } else { - $documentation .= "\n | This option is required."; - } - } - - $documentation .= "\n\n"; - } - - $ruleSetConfigs = []; - - foreach (RuleSets::getSetDefinitionNames() as $set) { - $ruleSet = new RuleSet([$set => true]); - - if ($ruleSet->hasRule($name)) { - $ruleSetConfigs[$set] = $ruleSet->getRuleConfiguration($name); - } - } - - if ([] !== $ruleSetConfigs) { - $plural = 1 !== \count($ruleSetConfigs) ? 's' : ''; - - $documentation .= "\n Part of rule set{$plural} "; - - foreach ($ruleSetConfigs as $set => $config) { - $ruleSetPath = $this->locator->getRuleSetsDocumentationFilePath($set); - $ruleSetPath = substr($ruleSetPath, strrpos($ruleSetPath, '/')); - - $documentation .= "`{$set} <./ruleSets{$ruleSetPath}>`_ "; - } - - $documentation = rtrim($documentation)."\n"; - } - - $reflectionObject = new \ReflectionObject($fixer); - $className = str_replace('\\', '\\\\', $reflectionObject->getName()); - $fileName = $reflectionObject->getFileName(); - $fileName = str_replace('\\', '/', $fileName); - $fileName = substr($fileName, strrpos($fileName, '/src/Fixer/') + 1); - $fileName = "Source: `{$className} <./../{$fileName}>`_"; - $documentation .= "\n ".$fileName; - } - - return $documentation."\n"; - } -} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Documentation/RuleSetDocumentationGenerator.php b/vendor/friendsofphp/php-cs-fixer/src/Documentation/RuleSetDocumentationGenerator.php index f74a1a93b..068c5855f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Documentation/RuleSetDocumentationGenerator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Documentation/RuleSetDocumentationGenerator.php @@ -16,10 +16,13 @@ use PhpCsFixer\Fixer\FixerInterface; use PhpCsFixer\Preg; +use PhpCsFixer\RuleSet\DeprecatedRuleSetDescriptionInterface; use PhpCsFixer\RuleSet\RuleSetDescriptionInterface; use PhpCsFixer\Utils; /** + * @readonly + * * @internal */ final class RuleSetDocumentationGenerator @@ -32,7 +35,7 @@ public function __construct(DocumentationLocator $locator) } /** - * @param FixerInterface[] $fixers + * @param list $fixers */ public function generateRuleSetsDocumentation(RuleSetDescriptionInterface $definition, array $fixers): string { @@ -46,8 +49,52 @@ public function generateRuleSetsDocumentation(RuleSetDescriptionInterface $defin $titleLine = str_repeat('=', \strlen($title)); $doc = "{$titleLine}\n{$title}\n{$titleLine}\n\n".$definition->getDescription(); + $warnings = []; + if ($definition instanceof DeprecatedRuleSetDescriptionInterface) { + $deprecationDescription = <<<'RST' + + This rule set is deprecated and will be removed in the next major version + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + RST; + $alternatives = $definition->getSuccessorsNames(); + + if (0 !== \count($alternatives)) { + $deprecationDescription .= RstUtils::toRst( + \sprintf( + "\n\nYou should use %s instead.", + Utils::naturalLanguageJoinWithBackticks($alternatives) + ), + 0 + ); + } else { + $deprecationDescription .= 'No replacement available.'; + } + + $warnings[] = $deprecationDescription; + } + if ($definition->isRisky()) { - $doc .= ' This set contains rules that are risky.'; + $warnings[] = <<<'RST' + + This set contains rules that are risky + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Using this rule set may lead to changes in your code's logic and behaviour. Use it with caution and review changes before incorporating them into your code base. + RST; + } + + if ([] !== $warnings) { + $warningsHeader = 1 === \count($warnings) ? 'Warning' : 'Warnings'; + + $warningsHeaderLine = str_repeat('-', \strlen($warningsHeader)); + $doc .= "\n\n".implode( + "\n", + [ + $warningsHeader, + $warningsHeaderLine, + ...$warnings, + ] + ); } $rules = $definition->getRules(); @@ -96,7 +143,7 @@ public function generateRuleSetsDocumentation(RuleSetDescriptionInterface $defin } /** - * @param array $setDefinitions + * @param array $setDefinitions */ public function generateRuleSetsDocumentationIndex(array $setDefinitions): string { @@ -105,9 +152,21 @@ public function generateRuleSetsDocumentationIndex(array $setDefinitions): strin List of Available Rule sets =========================== RST; - foreach ($setDefinitions as $name => $path) { + + foreach ($setDefinitions as $path => $definition) { $path = substr($path, strrpos($path, '/')); - $documentation .= "\n- `{$name} <.{$path}>`_"; + + $attributes = []; + + if ($definition instanceof DeprecatedRuleSetDescriptionInterface) { + $attributes[] = 'deprecated'; + } + + $attributes = 0 === \count($attributes) + ? '' + : ' *('.implode(', ', $attributes).')*'; + + $documentation .= "\n- `{$definition->getName()} <.{$path}>`_{$attributes}"; } return $documentation."\n"; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php b/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php index 1f14ed9f0..e20ff2f7a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Error/Error.php @@ -19,9 +19,11 @@ * * @author Andreas Möller * + * @readonly + * * @internal */ -final class Error +final class Error implements \JsonSerializable { /** * Error which has occurred in linting phase, before applying any fixers. @@ -38,6 +40,7 @@ final class Error */ public const TYPE_LINT = 3; + /** @var self::TYPE_* */ private int $type; private string $filePath; @@ -52,6 +55,7 @@ final class Error private ?string $diff; /** + * @param self::TYPE_* $type * @param list $appliedFixers */ public function __construct(int $type, string $filePath, ?\Throwable $source = null, array $appliedFixers = [], ?string $diff = null) @@ -90,4 +94,32 @@ public function getDiff(): ?string { return $this->diff; } + + /** + * @return array{ + * type: self::TYPE_*, + * filePath: string, + * source: null|array{class: class-string, message: string, code: int, file: string, line: int}, + * appliedFixers: list, + * diff: null|string + * } + */ + public function jsonSerialize(): array + { + return [ + 'type' => $this->type, + 'filePath' => $this->filePath, + 'source' => null !== $this->source + ? [ + 'class' => \get_class($this->source), + 'message' => $this->source->getMessage(), + 'code' => $this->source->getCode(), + 'file' => $this->source->getFile(), + 'line' => $this->source->getLine(), + ] + : null, + 'appliedFixers' => $this->appliedFixers, + 'diff' => $this->diff, + ]; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php b/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php index 3d787a3f4..e6333db80 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Error/ErrorsManager.php @@ -24,14 +24,14 @@ final class ErrorsManager { /** - * @var Error[] + * @var list */ private array $errors = []; /** * Returns errors reported during linting before fixing. * - * @return Error[] + * @return list */ public function getInvalidErrors(): array { @@ -41,7 +41,7 @@ public function getInvalidErrors(): array /** * Returns errors reported during fixing. * - * @return Error[] + * @return list */ public function getExceptionErrors(): array { @@ -51,13 +51,23 @@ public function getExceptionErrors(): array /** * Returns errors reported during linting after fixing. * - * @return Error[] + * @return list */ public function getLintErrors(): array { return array_filter($this->errors, static fn (Error $error): bool => Error::TYPE_LINT === $error->getType()); } + /** + * Returns errors reported for specified path. + * + * @return list + */ + public function forPath(string $path): array + { + return array_values(array_filter($this->errors, static fn (Error $error): bool => $path === $error->getFilePath())); + } + /** * Returns true if no errors were reported. */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Error/SourceExceptionFactory.php b/vendor/friendsofphp/php-cs-fixer/src/Error/SourceExceptionFactory.php new file mode 100644 index 000000000..03773861a --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Error/SourceExceptionFactory.php @@ -0,0 +1,62 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Error; + +/** + * @readonly + * + * @internal + */ +final class SourceExceptionFactory +{ + /** + * @param array{class: class-string<\Throwable>, message: string, code: int, file: string, line: int} $error + */ + public static function fromArray(array $error): \Throwable + { + $exceptionClass = $error['class']; + + try { + $exception = new $exceptionClass($error['message'], $error['code']); + + if ( + $exception->getMessage() !== $error['message'] + || $exception->getCode() !== $error['code'] + ) { + throw new \RuntimeException('Failed to create exception from array. Message and code are not the same.'); + } + } catch (\Throwable $e) { + $exception = new \RuntimeException( + \sprintf('[%s] %s', $exceptionClass, $error['message']), + $error['code'] + ); + } + + try { + $exceptionReflection = new \ReflectionClass($exception); + foreach (['file', 'line'] as $property) { + $propertyReflection = $exceptionReflection->getProperty($property); + $propertyReflection->setAccessible(true); + $propertyReflection->setValue($exception, $error[$property]); + $propertyReflection->setAccessible(false); + } + } catch (\Throwable $reflectionException) { + // Ignore if we were not able to set file/line properties. In most cases it should be fine, + // we just need to make sure nothing is broken when we recreate errors from raw data passed from worker. + } + + return $exception; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandler.php b/vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandler.php new file mode 100644 index 000000000..003398e49 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandler.php @@ -0,0 +1,58 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer; + +/** + * @author Dariusz Rumiński + * + * @internal + */ +final class ExecutorWithoutErrorHandler +{ + private function __construct() {} + + /** + * @template T + * + * @param callable(): T $callback + * + * @return T + * + * @throws ExecutorWithoutErrorHandlerException + */ + public static function execute(callable $callback) + { + /** @var ?string */ + $error = null; + + set_error_handler(static function (int $errorNumber, string $errorString, string $errorFile, int $errorLine) use (&$error): bool { + $error = $errorString; + + return true; + }); + + try { + $result = $callback(); + } finally { + restore_error_handler(); + } + + if (null !== $error) { + throw new ExecutorWithoutErrorHandlerException($error); + } + + return $result; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandlerException.php b/vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandlerException.php new file mode 100644 index 000000000..750352a26 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/ExecutorWithoutErrorHandlerException.php @@ -0,0 +1,22 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer; + +/** + * @author Dariusz Rumiński + * + * @internal + */ +final class ExecutorWithoutErrorHandlerException extends \RuntimeException {} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FileReader.php b/vendor/friendsofphp/php-cs-fixer/src/FileReader.php index d4fb752cb..30eeabef9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FileReader.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FileReader.php @@ -25,10 +25,7 @@ */ final class FileReader { - /** - * @var null|string - */ - private $stdinContent; + private ?string $stdinContent = null; public static function createSingleton(): self { @@ -61,7 +58,7 @@ private function readRaw(string $realPath): string if (false === $content) { $error = error_get_last(); - throw new \RuntimeException(sprintf( + throw new \RuntimeException(\sprintf( 'Failed to read content from "%s".%s', $realPath, null !== $error ? ' '.$error['message'] : '' diff --git a/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php b/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php index dce4d9246..148a4c5e1 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FileRemoval.php @@ -47,7 +47,7 @@ public function __destruct() */ public function __sleep(): array { - throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + throw new \BadMethodCallException('Cannot serialize '.self::class); } /** @@ -58,7 +58,7 @@ public function __sleep(): array */ public function __wakeup(): void { - throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + throw new \BadMethodCallException('Cannot unserialize '.self::class); } /** diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php index 9d90aba13..2ccad7148 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractPhpUnitFixer.php @@ -18,6 +18,10 @@ use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\DocBlock\Line; use PhpCsFixer\Indicator\PhpUnitTestCaseIndicator; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\AttributeAnalyzer; +use PhpCsFixer\Tokenizer\Analyzer\FullyQualifiedNameAnalyzer; +use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; use PhpCsFixer\Tokenizer\Analyzer\WhitespacesAnalyzer; use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; @@ -28,7 +32,7 @@ */ abstract class AbstractPhpUnitFixer extends AbstractFixer { - final public function isCandidate(Tokens $tokens): bool + public function isCandidate(Tokens $tokens): bool { return $tokens->isAllTokenKindsFound([T_CLASS, T_STRING]); } @@ -68,16 +72,22 @@ final protected function getDocBlockIndex(Tokens $tokens, int $index): int } /** - * @param array $preventingAnnotations + * @param list $preventingAnnotations + * @param list $preventingAttributes */ - final protected function ensureIsDockBlockWithAnnotation( + final protected function ensureIsDocBlockWithAnnotation( Tokens $tokens, int $index, string $annotation, - array $preventingAnnotations + array $preventingAnnotations, + array $preventingAttributes ): void { $docBlockIndex = $this->getDocBlockIndex($tokens, $index); + if (self::isPreventedByAttribute($tokens, $index, $preventingAttributes)) { + return; + } + if ($this->isPHPDoc($tokens, $docBlockIndex)) { $this->updateDocBlockIfNeeded($tokens, $docBlockIndex, $annotation, $preventingAnnotations); } else { @@ -90,6 +100,73 @@ final protected function isPHPDoc(Tokens $tokens, int $index): bool return $tokens[$index]->isGivenKind(T_DOC_COMMENT); } + /** + * @return iterable + */ + protected function getPreviousAssertCall(Tokens $tokens, int $startIndex, int $endIndex): iterable + { + $functionsAnalyzer = new FunctionsAnalyzer(); + + for ($index = $endIndex; $index > $startIndex; --$index) { + $index = $tokens->getPrevTokenOfKind($index, [[T_STRING]]); + + if (null === $index) { + return; + } + + // test if "assert" something call + $loweredContent = strtolower($tokens[$index]->getContent()); + + if (!str_starts_with($loweredContent, 'assert')) { + continue; + } + + // test candidate for simple calls like: ([\]+'some fixable call'(...)) + $openBraceIndex = $tokens->getNextMeaningfulToken($index); + + if (!$tokens[$openBraceIndex]->equals('(')) { + continue; + } + + if (!$functionsAnalyzer->isTheSameClassCall($tokens, $index)) { + continue; + } + + yield [ + 'index' => $index, + 'loweredName' => $loweredContent, + 'openBraceIndex' => $openBraceIndex, + 'closeBraceIndex' => $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openBraceIndex), + ]; + } + } + + final protected function isTestAttributePresent(Tokens $tokens, int $index): bool + { + $attributeIndex = $tokens->getPrevTokenOfKind($index, ['{', [T_ATTRIBUTE]]); + if (!$tokens[$attributeIndex]->isGivenKind(T_ATTRIBUTE)) { + return false; + } + + $fullyQualifiedNameAnalyzer = new FullyQualifiedNameAnalyzer($tokens); + + foreach (AttributeAnalyzer::collect($tokens, $attributeIndex) as $attributeAnalysis) { + foreach ($attributeAnalysis->getAttributes() as $attribute) { + $attributeName = strtolower($fullyQualifiedNameAnalyzer->getFullyQualifiedName($attribute['name'], $attribute['start'], NamespaceUseAnalysis::TYPE_CLASS)); + if ('phpunit\framework\attributes\test' === $attributeName) { + return true; + } + } + } + + return false; + } + private function createDocBlock(Tokens $tokens, int $docBlockIndex, string $annotation): void { $lineEnd = $this->whitespacesConfig->getLineEnding(); @@ -115,7 +192,7 @@ private function createDocBlock(Tokens $tokens, int $docBlockIndex, string $anno } /** - * @param array $preventingAnnotations + * @param list $preventingAnnotations */ private function updateDocBlockIfNeeded( Tokens $tokens, @@ -130,14 +207,51 @@ private function updateDocBlockIfNeeded( } } $doc = $this->makeDocBlockMultiLineIfNeeded($doc, $tokens, $docBlockIndex, $annotation); + $lines = $this->addInternalAnnotation($doc, $tokens, $docBlockIndex, $annotation); $lines = implode('', $lines); + $tokens->getNamespaceDeclarations(); $tokens[$docBlockIndex] = new Token([T_DOC_COMMENT, $lines]); } /** - * @return array + * @param list $preventingAttributes + */ + private static function isPreventedByAttribute(Tokens $tokens, int $index, array $preventingAttributes): bool + { + if ([] === $preventingAttributes) { + return false; + } + + $modifiers = [T_FINAL]; + if (\defined('T_READONLY')) { // @TODO: drop condition when PHP 8.2+ is required + $modifiers[] = T_READONLY; + } + + do { + $index = $tokens->getPrevMeaningfulToken($index); + } while ($tokens[$index]->isGivenKind($modifiers)); + if (!$tokens[$index]->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { + return false; + } + $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ATTRIBUTE, $index); + + $fullyQualifiedNameAnalyzer = new FullyQualifiedNameAnalyzer($tokens); + + foreach (AttributeAnalyzer::collect($tokens, $index) as $attributeAnalysis) { + foreach ($attributeAnalysis->getAttributes() as $attribute) { + if (\in_array(strtolower($fullyQualifiedNameAnalyzer->getFullyQualifiedName($attribute['name'], $attribute['start'], NamespaceUseAnalysis::TYPE_CLASS)), $preventingAttributes, true)) { + return true; + } + } + } + + return false; + } + + /** + * @return list */ private function addInternalAnnotation(DocBlock $docBlock, Tokens $tokens, int $docBlockIndex, string $annotation): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractShortOperatorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractShortOperatorFixer.php index 0653e1950..1897e0424 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractShortOperatorFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AbstractShortOperatorFixer.php @@ -241,7 +241,7 @@ private function isOperatorCommutative(Token $operatorToken): bool return false; } - throw new \InvalidArgumentException(sprintf('Not supported operator "%s".', $operatorToken->toJson())); + throw new \InvalidArgumentException(\sprintf('Not supported operator "%s".', $operatorToken->toJson())); } private function belongsToSwitchOrAlternativeSyntax(AlternativeSyntaxAnalyzer $alternativeSyntaxAnalyzer, Tokens $tokens, int $index): bool diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php index 351cdad72..70865e6c9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/BacktickToShellExecFixer.php @@ -53,7 +53,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run before EscapeImplicitBackslashesFixer, ExplicitStringVariableFixer, NativeFunctionInvocationFixer, SingleQuoteFixer. + * Must run before ExplicitStringVariableFixer, NativeFunctionInvocationFixer, SingleQuoteFixer. */ public function getPriority(): int { @@ -95,9 +95,8 @@ private function fixBackticks(Tokens $tokens, array $backtickTokens): void { // Track indices for final override ksort($backtickTokens); - $openingBacktickIndex = key($backtickTokens); - end($backtickTokens); - $closingBacktickIndex = key($backtickTokens); + $openingBacktickIndex = array_key_first($backtickTokens); + $closingBacktickIndex = array_key_last($backtickTokens); // Strip enclosing backticks array_shift($backtickTokens); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php index c93662942..f75798611 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/EregToPregFixer.php @@ -33,7 +33,7 @@ final class EregToPregFixer extends AbstractFixer * @var list> the list of the ext/ereg function names, their preg equivalent and the preg modifier(s), if any * all condensed in an array of arrays */ - private static array $functions = [ + private const FUNCTIONS = [ ['ereg', 'preg_match', ''], ['eregi', 'preg_match', 'i'], ['ereg_replace', 'preg_replace', ''], @@ -82,7 +82,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $end = $tokens->count() - 1; $functionsAnalyzer = new FunctionsAnalyzer(); - foreach (self::$functions as $map) { + foreach (self::FUNCTIONS as $map) { // the sequence is the function name, followed by "(" and a quoted string $seq = [[T_STRING, $map[0]], '(', [T_CONSTANT_ENCAPSED_STRING]]; $currIndex = 0; @@ -188,6 +188,6 @@ private function getBestDelimiter(string $pattern): string return $a[0] <=> $b[0]; }); - return key($delimiters); + return array_key_first($delimiters); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php index 6dd62f498..f6e7037fb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/MbStrFunctionsFixer.php @@ -14,18 +14,20 @@ namespace PhpCsFixer\Fixer\Alias; -use PhpCsFixer\AbstractFunctionReferenceFixer; +use PhpCsFixer\AbstractFixer; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; +use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; +use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; /** * @author Filippo Tessarotto */ -final class MbStrFunctionsFixer extends AbstractFunctionReferenceFixer +final class MbStrFunctionsFixer extends AbstractFixer { /** * list of the string-related function names and their mb_ equivalent. @@ -69,12 +71,42 @@ public function __construct() { parent::__construct(); + if (\PHP_VERSION_ID >= 8_03_00) { + self::$functionsMap['str_pad'] = ['alternativeName' => 'mb_str_pad', 'argumentCount' => [1, 2, 3, 4]]; + } + + if (\PHP_VERSION_ID >= 8_04_00) { + self::$functionsMap['trim'] = ['alternativeName' => 'mb_trim', 'argumentCount' => [1, 2]]; + self::$functionsMap['ltrim'] = ['alternativeName' => 'mb_ltrim', 'argumentCount' => [1, 2]]; + self::$functionsMap['rtrim'] = ['alternativeName' => 'mb_rtrim', 'argumentCount' => [1, 2]]; + } + $this->functions = array_filter( self::$functionsMap, static fn (array $mapping): bool => (new \ReflectionFunction($mapping['alternativeName']))->isInternal() ); } + public function isCandidate(Tokens $tokens): bool + { + return $tokens->isTokenKindFound(T_STRING); + } + + public function isRisky(): bool + { + return true; + } + + /** + * {@inheritdoc} + * + * Must run before NativeFunctionInvocationFixer. + */ + public function getPriority(): int + { + return 2; + } + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -105,27 +137,44 @@ public function getDefinition(): FixerDefinitionInterface protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $argumentsAnalyzer = new ArgumentsAnalyzer(); - foreach ($this->functions as $functionIdentity => $functionReplacement) { - $currIndex = 0; - do { - // try getting function reference and translate boundaries for humans - $boundaries = $this->find($functionIdentity, $tokens, $currIndex, $tokens->count() - 1); - if (null === $boundaries) { - // next function search, as current one not found - continue 2; - } + $functionsAnalyzer = new FunctionsAnalyzer(); + + for ($index = $tokens->count() - 1; $index > 0; --$index) { + if (!$tokens[$index]->isGivenKind(T_STRING)) { + continue; + } + + $lowercasedContent = strtolower($tokens[$index]->getContent()); + if (!isset($this->functions[$lowercasedContent])) { + continue; + } - [$functionName, $openParenthesis, $closeParenthesis] = $boundaries; - $count = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis); - if (!\in_array($count, $functionReplacement['argumentCount'], true)) { - continue 2; + // is it a global function call? + if ($functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { + $openParenthesis = $tokens->getNextMeaningfulToken($index); + $closeParenthesis = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis); + $numberOfArguments = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis); + if (!\in_array($numberOfArguments, $this->functions[$lowercasedContent]['argumentCount'], true)) { + continue; } + $tokens[$index] = new Token([T_STRING, $this->functions[$lowercasedContent]['alternativeName']]); - // analysing cursor shift, so nested calls could be processed - $currIndex = $openParenthesis; + continue; + } - $tokens[$functionName] = new Token([T_STRING, $functionReplacement['alternativeName']]); - } while (null !== $currIndex); + // is it a global function import? + $functionIndex = $tokens->getPrevMeaningfulToken($index); + if ($tokens[$functionIndex]->isGivenKind(T_NS_SEPARATOR)) { + $functionIndex = $tokens->getPrevMeaningfulToken($functionIndex); + } + if (!$tokens[$functionIndex]->isGivenKind(CT::T_FUNCTION_IMPORT)) { + continue; + } + $useIndex = $tokens->getPrevMeaningfulToken($functionIndex); + if (!$tokens[$useIndex]->isGivenKind(T_USE)) { + continue; + } + $tokens[$index] = new Token([T_STRING, $this->functions[$lowercasedContent]['alternativeName']]); } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ModernizeStrposFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ModernizeStrposFixer.php index b060b4e63..a77eff2fc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ModernizeStrposFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/ModernizeStrposFixer.php @@ -15,6 +15,11 @@ namespace PhpCsFixer\Fixer\Alias; use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; @@ -25,9 +30,21 @@ /** * @author Alexander M. Turek + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * modernize_stripos?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * modernize_stripos: bool, + * } */ -final class ModernizeStrposFixer extends AbstractFixer +final class ModernizeStrposFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const REPLACEMENTS = [ [ 'operator' => [T_IS_IDENTICAL, '==='], @@ -55,10 +72,12 @@ final class ModernizeStrposFixer extends AbstractFixer ], ]; + private bool $modernizeStripos = false; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Replace `strpos()` calls with `str_starts_with()` or `str_contains()` if possible.', + 'Replace `strpos()` and `stripos()` calls with `str_starts_with()` or `str_contains()` if possible.', [ new CodeSample( ' true] ), ], null, - 'Risky if `strpos`, `str_starts_with` or `str_contains` functions are overridden.' + 'Risky if `strpos`, `stripos`, `str_starts_with`, `str_contains` or `strtolower` functions are overridden.' ); } @@ -95,14 +127,36 @@ public function isRisky(): bool return true; } + protected function configurePostNormalisation(): void + { + if (isset($this->configuration['modernize_stripos']) && true === $this->configuration['modernize_stripos']) { + $this->modernizeStripos = true; + } + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('modernize_stripos', 'Whether to modernize `stripos` calls as well.')) + ->setAllowedTypes(['bool']) + ->setDefault(false) // @TODO change to "true" on next major 4.0 + ->getOption(), + ]); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $functionsAnalyzer = new FunctionsAnalyzer(); $argumentsAnalyzer = new ArgumentsAnalyzer(); + $modernizeCandidates = [[T_STRING, 'strpos']]; + if ($this->modernizeStripos) { + $modernizeCandidates[] = [T_STRING, 'stripos']; + } + for ($index = \count($tokens) - 1; $index > 0; --$index) { // find candidate function call - if (!$tokens[$index]->equals([T_STRING, 'strpos'], false) || !$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { + if (!$tokens[$index]->equalsAny($modernizeCandidates, false) || !$functionsAnalyzer->isGlobalFunctionCall($tokens, $index)) { continue; } @@ -123,7 +177,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } if (null !== $compareTokens) { - $this->fixCall($tokens, $index, $compareTokens); + $isCaseInsensitive = $tokens[$index]->equals([T_STRING, 'stripos'], false); + $this->fixCall($tokens, $index, $compareTokens, $isCaseInsensitive); } } } @@ -131,7 +186,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void /** * @param array{operator_index: int, operand_index: int} $operatorIndices */ - private function fixCall(Tokens $tokens, int $functionIndex, array $operatorIndices): void + private function fixCall(Tokens $tokens, int $functionIndex, array $operatorIndices, bool $isCaseInsensitive): void { foreach (self::REPLACEMENTS as $replacement) { if (!$tokens[$operatorIndices['operator_index']]->equals($replacement['operator'])) { @@ -160,10 +215,60 @@ private function fixCall(Tokens $tokens, int $functionIndex, array $operatorIndi $tokens->insertAt($functionIndex, new Token($replacement['replacement'])); + if ($isCaseInsensitive) { + $this->wrapArgumentsWithStrToLower($tokens, $functionIndex); + } + break; } } + private function wrapArgumentsWithStrToLower(Tokens $tokens, int $functionIndex): void + { + $argumentsAnalyzer = new ArgumentsAnalyzer(); + $shouldAddNamespace = $tokens[$functionIndex - 1]->isGivenKind(T_NS_SEPARATOR); + + $openIndex = $tokens->getNextMeaningfulToken($functionIndex); + $closeIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openIndex); + $arguments = $argumentsAnalyzer->getArguments($tokens, $openIndex, $closeIndex); + + $firstArgumentIndexStart = array_key_first($arguments); + if (!isset($arguments[$firstArgumentIndexStart])) { + return; + } + $firstArgumentIndexEnd = $arguments[$firstArgumentIndexStart] + 3 + ($shouldAddNamespace ? 1 : 0); + + $isSecondArgumentTokenWhiteSpace = $tokens[array_key_last($arguments)]->isGivenKind(T_WHITESPACE); + + if ($isSecondArgumentTokenWhiteSpace) { + $secondArgumentIndexStart = $tokens->getNextMeaningfulToken(array_key_last($arguments)); + } else { + $secondArgumentIndexStart = array_key_last($arguments); + } + + $secondArgumentIndexStart += 3 + ($shouldAddNamespace ? 1 : 0); + if (!isset($arguments[array_key_last($arguments)])) { + return; + } + $secondArgumentIndexEnd = $arguments[array_key_last($arguments)] + 6 + ($shouldAddNamespace ? 1 : 0) + ($isSecondArgumentTokenWhiteSpace ? 1 : 0); + + if ($shouldAddNamespace) { + $tokens->insertAt($firstArgumentIndexStart, new Token([T_NS_SEPARATOR, '\\'])); + ++$firstArgumentIndexStart; + } + + $tokens->insertAt($firstArgumentIndexStart, [new Token([T_STRING, 'strtolower']), new Token('(')]); + $tokens->insertAt($firstArgumentIndexEnd, new Token(')')); + + if ($shouldAddNamespace) { + $tokens->insertAt($secondArgumentIndexStart, new Token([T_NS_SEPARATOR, '\\'])); + ++$secondArgumentIndexStart; + } + + $tokens->insertAt($secondArgumentIndexStart, [new Token([T_STRING, 'strtolower']), new Token('(')]); + $tokens->insertAt($secondArgumentIndexEnd, new Token(')')); + } + /** * @param -1|1 $direction * diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php index b56d0c405..59ee1353e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoAliasFunctionsFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -31,9 +32,21 @@ /** * @author Vladimir Reznichenko * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * sets?: list<'@all'|'@exif'|'@ftp'|'@IMAP'|'@internal'|'@ldap'|'@mbreg'|'@mysqli'|'@oci'|'@odbc'|'@openssl'|'@pcntl'|'@pg'|'@posix'|'@snmp'|'@sodium'|'@time'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * sets: list<'@all'|'@exif'|'@ftp'|'@IMAP'|'@internal'|'@ldap'|'@mbreg'|'@mysqli'|'@oci'|'@odbc'|'@openssl'|'@pcntl'|'@pg'|'@posix'|'@snmp'|'@sodium'|'@time'>, + * } */ final class NoAliasFunctionsFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const SETS = [ '@internal' => [ 'diskfreespace' => 'disk_free_space', @@ -156,27 +169,10 @@ final class NoAliasFunctionsFixer extends AbstractFixer implements ConfigurableF ]; /** - * @var array|string> stores alias (key) - master (value) functions mapping + * @var array stores alias (key) - master (value) functions mapping */ private array $aliases = []; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->aliases = []; - - foreach ($this->configuration['sets'] as $set) { - if ('@all' === $set) { - $this->aliases = array_merge(...array_values(self::SETS)); - - break; - } - - $this->aliases = array_merge($this->aliases, self::SETS[$set]); - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -240,6 +236,25 @@ public function isRisky(): bool return true; } + protected function configurePostNormalisation(): void + { + $this->aliases = []; + + foreach ($this->configuration['sets'] as $set) { + if ('@all' === $set) { + $this->aliases = array_merge(...array_values(self::SETS)); + + break; + } + + if (!isset(self::SETS[$set])) { + throw new \LogicException(\sprintf('Set %s passed option validation, but not part of ::SETS.', $set)); + } + + $this->aliases = array_merge($this->aliases, self::SETS[$set]); + } + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $functionsAnalyzer = new FunctionsAnalyzer(); @@ -306,14 +321,14 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn $list = "List of sets to fix. Defined sets are:\n\n"; foreach ($sets as $set => $description) { - $list .= sprintf("* `%s` (%s);\n", $set, $description); + $list .= \sprintf("* `%s` (%s);\n", $set, $description); } $list = rtrim($list, ";\n").'.'; return new FixerConfigurationResolver([ (new FixerOptionBuilder('sets', $list)) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset(array_keys($sets))]) ->setDefault(['@internal', '@IMAP', '@pg']) ->getOption(), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php index ff5e666c7..836efea53 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/NoMixedEchoPrintFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,31 +29,25 @@ /** * @author Sullivan Senechal + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * use?: 'echo'|'print', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * use: 'echo'|'print', + * } */ final class NoMixedEchoPrintFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var string - */ - private $callBack; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; /** - * @var int T_ECHO or T_PRINT + * @var T_ECHO|T_PRINT */ - private $candidateTokenType; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - if ('echo' === $this->configuration['use']) { - $this->candidateTokenType = T_PRINT; - $this->callBack = 'fixPrintToEcho'; - } else { - $this->candidateTokenType = T_ECHO; - $this->callBack = 'fixEchoToPrint'; - } - } + private int $candidateTokenType; public function getDefinition(): FixerDefinitionInterface { @@ -80,12 +75,20 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound($this->candidateTokenType); } + protected function configurePostNormalisation(): void + { + $this->candidateTokenType = 'echo' === $this->configuration['use'] ? T_PRINT : T_ECHO; + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $callBack = $this->callBack; foreach ($tokens as $index => $token) { if ($token->isGivenKind($this->candidateTokenType)) { - $this->{$callBack}($tokens, $index); + if (T_PRINT === $this->candidateTokenType) { + $this->fixPrintToEcho($tokens, $index); + } else { + $this->fixEchoToPrint($tokens, $index); + } } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php index a56385e68..84e680906 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/PowToExponentiationFixer.php @@ -97,7 +97,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @return array + * @return list */ private function findPowCalls(Tokens $tokens): array { @@ -205,7 +205,7 @@ private function isParenthesisNeeded(Tokens $tokens, int $argumentStartIndex, in } /** - * @return int[] + * @return list */ private function getAllowedKinds(): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php index c65f6932b..4ccdc8457 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/RandomApiMigrationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFunctionReferenceFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,13 +30,25 @@ /** * @author Vladimir Reznichenko + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * replacements?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * replacements: array, + * } */ final class RandomApiMigrationFixer extends AbstractFunctionReferenceFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array> */ - private static array $argumentCounts = [ + private const ARGUMENT_COUNTS = [ 'getrandmax' => [0], 'mt_rand' => [1, 2], 'rand' => [0, 2], @@ -43,18 +56,6 @@ final class RandomApiMigrationFixer extends AbstractFunctionReferenceFixer imple 'random_int' => [0, 2], ]; - public function configure(array $configuration): void - { - parent::configure($configuration); - - foreach ($this->configuration['replacements'] as $functionName => $replacement) { - $this->configuration['replacements'][$functionName] = [ - 'alternativeName' => $replacement, - 'argumentCount' => self::$argumentCounts[$functionName], - ]; - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -80,7 +81,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $argumentsAnalyzer = new ArgumentsAnalyzer(); foreach ($this->configuration['replacements'] as $functionIdentity => $functionReplacement) { - if ($functionIdentity === $functionReplacement['alternativeName']) { + if ($functionIdentity === $functionReplacement) { continue; } @@ -98,15 +99,17 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void [$functionName, $openParenthesis, $closeParenthesis] = $boundaries; $count = $argumentsAnalyzer->countArguments($tokens, $openParenthesis, $closeParenthesis); - if (!\in_array($count, $functionReplacement['argumentCount'], true)) { + \assert(isset(self::ARGUMENT_COUNTS[$functionIdentity])); // for PHPStan + + if (!\in_array($count, self::ARGUMENT_COUNTS[$functionIdentity], true)) { continue 2; } // analysing cursor shift, so nested calls could be processed $currIndex = $openParenthesis; - $tokens[$functionName] = new Token([T_STRING, $functionReplacement['alternativeName']]); + $tokens[$functionName] = new Token([T_STRING, $functionReplacement]); - if (0 === $count && 'random_int' === $functionReplacement['alternativeName']) { + if (0 === $count && 'random_int' === $functionReplacement) { $tokens->insertAt($currIndex + 1, [ new Token([T_LNUMBER, '0']), new Token(','), @@ -126,23 +129,15 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('replacements', 'Mapping between replaced functions with the new ones.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['array']) ->setAllowedValues([static function (array $value): bool { foreach ($value as $functionName => $replacement) { - if (!\array_key_exists($functionName, self::$argumentCounts)) { - throw new InvalidOptionsException(sprintf( + if (!\array_key_exists($functionName, self::ARGUMENT_COUNTS)) { + throw new InvalidOptionsException(\sprintf( 'Function "%s" is not handled by the fixer.', $functionName )); } - - if (!\is_string($replacement)) { - throw new InvalidOptionsException(sprintf( - 'Replacement for function "%s" must be a string, "%s" given.', - $functionName, - get_debug_type($replacement) - )); - } } return true; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php index 2c807eb52..2127e33dd 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Alias/SetTypeToCastFixer.php @@ -126,7 +126,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // --- Test type ------------------------------ - $type = strtolower(trim($tokens[$secondArgumentStart]->getContent(), '"\'"')); + $type = strtolower(trim($tokens[$secondArgumentStart]->getContent(), '"\'')); if ('null' !== $type && !isset($map[$type])) { continue; // we don't know how to map diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php index a7b0b20f6..9fb86164e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/ArraySyntaxFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,26 +31,25 @@ * @author Gregor Harlan * @author Sebastiaan Stok * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * syntax?: 'long'|'short', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * syntax: 'long'|'short', + * } */ final class ArraySyntaxFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var null|int - */ - private $candidateTokenKind; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; /** - * @var null|string + * @var CT::T_ARRAY_SQUARE_BRACE_OPEN|T_ARRAY */ - private $fixCallback; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->resolveCandidateTokenKind(); - $this->resolveFixCallback(); - } + private $candidateTokenKind; public function getDefinition(): FixerDefinitionInterface { @@ -82,13 +82,20 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound($this->candidateTokenKind); } - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + protected function configurePostNormalisation(): void { - $callback = $this->fixCallback; + $this->resolveCandidateTokenKind(); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + { for ($index = $tokens->count() - 1; 0 <= $index; --$index) { if ($tokens[$index]->isGivenKind($this->candidateTokenKind)) { - $this->{$callback}($tokens, $index); + if ('short' === $this->configuration['syntax']) { + $this->fixToShortArraySyntax($tokens, $index); + } else { + $this->fixToLongArraySyntax($tokens, $index); + } } } } @@ -124,11 +131,6 @@ private function fixToShortArraySyntax(Tokens $tokens, int $index): void $tokens->clearTokenAndMergeSurroundingWhitespace($index); } - private function resolveFixCallback(): void - { - $this->fixCallback = sprintf('fixTo%sArraySyntax', ucfirst($this->configuration['syntax'])); - } - private function resolveCandidateTokenKind(): void { $this->candidateTokenKind = 'long' === $this->configuration['syntax'] ? CT::T_ARRAY_SQUARE_BRACE_OPEN : T_ARRAY; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php index f2ff389df..a1867a698 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NoWhitespaceBeforeCommaInArrayFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,9 +28,21 @@ /** * @author Adam Marczuk + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * after_heredoc?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * after_heredoc: bool, + * } */ final class NoWhitespaceBeforeCommaInArrayFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php index f7e2b060a..3d5f56160 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/NormalizeIndexBraceFixer.php @@ -15,9 +15,10 @@ namespace PhpCsFixer\Fixer\ArrayNotation; use PhpCsFixer\AbstractFixer; -use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\FixerDefinition\VersionSpecification; +use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; @@ -31,7 +32,10 @@ public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( 'Array index should always be written by using square braces.', - [new CodeSample(" + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * ensure_single_space?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * ensure_single_space: bool, + * } */ final class WhitespaceAfterCommaInArrayFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -83,7 +96,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void if (!$tokens[$i + 1]->isWhitespace()) { $tokensToInsert[$i + 1] = new Token([T_WHITESPACE, ' ']); } elseif ( - $this->configuration['ensure_single_space'] + true === $this->configuration['ensure_single_space'] && ' ' !== $tokens[$i + 1]->getContent() && Preg::match('/^\h+$/', $tokens[$i + 1]->getContent()) && (!$tokens[$i + 2]->isComment() || Preg::match('/^\h+$/', $tokens[$i + 3]->getContent())) diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/YieldFromArrayToYieldsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/YieldFromArrayToYieldsFixer.php index 7df614fcd..021d1cd16 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/YieldFromArrayToYieldsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ArrayNotation/YieldFromArrayToYieldsFixer.php @@ -118,7 +118,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @return iterable> + * @return iterable */ private function getYieldsFromToUnpack(Tokens $tokens): iterable { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/AttributeEmptyParenthesesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/AttributeEmptyParenthesesFixer.php index cba060464..33f2d6c53 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/AttributeEmptyParenthesesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/AttributeEmptyParenthesesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,9 +29,21 @@ /** * @author HypeMC + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * use_parentheses?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * use_parentheses: bool, + * } */ final class AttributeEmptyParenthesesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/GeneralAttributeRemoveFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/GeneralAttributeRemoveFixer.php new file mode 100644 index 000000000..dae3ff18b --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/GeneralAttributeRemoveFixer.php @@ -0,0 +1,142 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\AttributeNotation; + +use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\AttributeAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\AttributeAnalyzer; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @author Raffaele Carelle + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-import-type _AttributeItems from AttributeAnalysis + * @phpstan-import-type _AttributeItem from AttributeAnalysis + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * attributes?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * attributes: list, + * } + */ +final class GeneralAttributeRemoveFixer extends AbstractFixer implements ConfigurableFixerInterface +{ + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Removes configured attributes by their respective FQN.', + [ + new CodeSample( + ' ['\A\B\Foo']] + ), + new CodeSample( + ' ['\A\B\Foo', 'A\B\Bar']] + ), + ] + ); + } + + public function getPriority(): int + { + return 0; + } + + public function isCandidate(Tokens $tokens): bool + { + return \defined('T_ATTRIBUTE') && $tokens->isTokenKindFound(T_ATTRIBUTE); + } + + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + { + if (0 === \count($this->configuration['attributes'])) { + return; + } + + $index = 0; + + while (null !== $index = $tokens->getNextTokenOfKind($index, [[T_ATTRIBUTE]])) { + $attributeAnalysis = AttributeAnalyzer::collectOne($tokens, $index); + + $endIndex = $attributeAnalysis->getEndIndex(); + + $removedCount = 0; + foreach ($attributeAnalysis->getAttributes() as $element) { + $fullname = AttributeAnalyzer::determineAttributeFullyQualifiedName($tokens, $element['name'], $element['start']); + + if (!\in_array($fullname, $this->configuration['attributes'], true)) { + continue; + } + + $tokens->clearRange($element['start'], $element['end']); + ++$removedCount; + + $siblingIndex = $tokens->getNonEmptySibling($element['end'], 1); + + // Clear element comma + if (',' === $tokens[$siblingIndex]->getContent()) { + $tokens->clearAt($siblingIndex); + } + } + + // Clear whole attribute if all are removed (multiline attribute case) + if (\count($attributeAnalysis->getAttributes()) === $removedCount) { + $tokens->clearRange($attributeAnalysis->getStartIndex(), $attributeAnalysis->getEndIndex()); + } + + // Clear trailing comma + $tokenIndex = $tokens->getMeaningfulTokenSibling($attributeAnalysis->getClosingBracketIndex(), -1); + if (',' === $tokens[$tokenIndex]->getContent()) { + $tokens->clearAt($tokenIndex); + } + + $index = $endIndex; + } + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('attributes', 'List of FQNs of attributes for removal.')) + ->setAllowedTypes(['class-string[]']) + ->setDefault([]) + ->getOption(), + ]); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/OrderedAttributesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/OrderedAttributesFixer.php new file mode 100644 index 000000000..d82443da9 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/AttributeNotation/OrderedAttributesFixer.php @@ -0,0 +1,274 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\AttributeNotation; + +use PhpCsFixer\AbstractFixer; +use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\FixerDefinition\VersionSpecification; +use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\AttributeAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\AttributeAnalyzer; +use PhpCsFixer\Tokenizer\Analyzer\FullyQualifiedNameAnalyzer; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; +use Symfony\Component\OptionsResolver\Options; + +/** + * @author HypeMC + * + * @phpstan-import-type _AttributeItems from AttributeAnalysis + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * order?: list, + * sort_algorithm?: 'alpha'|'custom', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * order: array, + * sort_algorithm: 'alpha'|'custom', + * } + */ +final class OrderedAttributesFixer extends AbstractFixer implements ConfigurableFixerInterface +{ + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + public const ORDER_ALPHA = 'alpha'; + public const ORDER_CUSTOM = 'custom'; + + private const SUPPORTED_SORT_ALGORITHMS = [ + self::ORDER_ALPHA, + self::ORDER_CUSTOM, + ]; + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Sorts attributes using the configured sort algorithm.', + [ + new VersionSpecificCodeSample( + <<<'EOL' + self::ORDER_CUSTOM, 'order' => ['A\B\Qux', 'A\B\Bar', 'A\B\Corge']], + ), + ], + ); + } + + /** + * {@inheritdoc} + * + * Must run after FullyQualifiedStrictTypesFixer. + */ + public function getPriority(): int + { + return 0; + } + + public function isCandidate(Tokens $tokens): bool + { + return \defined('T_ATTRIBUTE') && $tokens->isTokenKindFound(T_ATTRIBUTE); + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + $fixerName = $this->getName(); + + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('sort_algorithm', 'How the attributes should be sorted.')) + ->setAllowedValues(self::SUPPORTED_SORT_ALGORITHMS) + ->setDefault(self::ORDER_ALPHA) + ->setNormalizer(static function (Options $options, string $value) use ($fixerName): string { + if (self::ORDER_CUSTOM === $value && [] === $options['order']) { + throw new InvalidFixerConfigurationException( + $fixerName, + 'The custom order strategy requires providing `order` option with a list of attributes\'s FQNs.' + ); + } + + return $value; + }) + ->getOption(), + (new FixerOptionBuilder('order', 'A list of FQCNs of attributes defining the desired order used when custom sorting algorithm is configured.')) + ->setAllowedTypes(['string[]']) + ->setDefault([]) + ->setNormalizer(static function (Options $options, array $value) use ($fixerName): array { + if ($value !== array_unique($value)) { + throw new InvalidFixerConfigurationException($fixerName, 'The list includes attributes that are not unique.'); + } + + return array_flip(array_values( + array_map(static fn (string $attribute): string => ltrim($attribute, '\\'), $value), + )); + }) + ->getOption(), + ]); + } + + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + { + $fullyQualifiedNameAnalyzer = new FullyQualifiedNameAnalyzer($tokens); + + $index = 0; + + while (null !== $index = $tokens->getNextTokenOfKind($index, [[T_ATTRIBUTE]])) { + /** @var _AttributeItems $elements */ + $elements = array_map(fn (AttributeAnalysis $attributeAnalysis): array => [ + 'name' => $this->sortAttributes($fullyQualifiedNameAnalyzer, $tokens, $attributeAnalysis->getStartIndex(), $attributeAnalysis->getAttributes()), + 'start' => $attributeAnalysis->getStartIndex(), + 'end' => $attributeAnalysis->getEndIndex(), + ], AttributeAnalyzer::collect($tokens, $index)); + + $endIndex = end($elements)['end']; + + try { + if (1 === \count($elements)) { + continue; + } + + $sortedElements = $this->sortElements($elements); + + if ($elements === $sortedElements) { + continue; + } + + $this->sortTokens($tokens, $index, $endIndex, $sortedElements); + } finally { + $index = $endIndex; + } + } + } + + /** + * @param _AttributeItems $attributes + */ + private function sortAttributes(FullyQualifiedNameAnalyzer $fullyQualifiedNameAnalyzer, Tokens $tokens, int $index, array $attributes): string + { + if (1 === \count($attributes)) { + return $this->getAttributeName($fullyQualifiedNameAnalyzer, $attributes[0]['name'], $attributes[0]['start']); + } + + foreach ($attributes as &$attribute) { + $attribute['name'] = $this->getAttributeName($fullyQualifiedNameAnalyzer, $attribute['name'], $attribute['start']); + } + + $sortedElements = $this->sortElements($attributes); + + if ($attributes === $sortedElements) { + return $attributes[0]['name']; + } + + $this->sortTokens($tokens, $index + 1, end($attributes)['end'], $sortedElements, new Token(',')); + + return $sortedElements[0]['name']; + } + + private function getAttributeName(FullyQualifiedNameAnalyzer $fullyQualifiedNameAnalyzer, string $name, int $index): string + { + if (self::ORDER_CUSTOM === $this->configuration['sort_algorithm']) { + return $fullyQualifiedNameAnalyzer->getFullyQualifiedName($name, $index, NamespaceUseAnalysis::TYPE_CLASS); + } + + return ltrim($name, '\\'); + } + + /** + * @param _AttributeItems $elements + * + * @return _AttributeItems + */ + private function sortElements(array $elements): array + { + usort($elements, function (array $a, array $b): int { + $sortAlgorithm = $this->configuration['sort_algorithm']; + + if (self::ORDER_ALPHA === $sortAlgorithm) { + return $a['name'] <=> $b['name']; + } + + if (self::ORDER_CUSTOM === $sortAlgorithm) { + return + ($this->configuration['order'][$a['name']] ?? PHP_INT_MAX) + <=> ($this->configuration['order'][$b['name']] ?? PHP_INT_MAX); + } + + throw new \InvalidArgumentException(\sprintf('Invalid sort algorithm "%s" provided.', $sortAlgorithm)); + }); + + return $elements; + } + + /** + * @param _AttributeItems $elements + */ + private function sortTokens(Tokens $tokens, int $startIndex, int $endIndex, array $elements, ?Token $delimiter = null): void + { + $replaceTokens = []; + + foreach ($elements as $pos => $element) { + for ($i = $element['start']; $i <= $element['end']; ++$i) { + $replaceTokens[] = clone $tokens[$i]; + } + if (null !== $delimiter && $pos !== \count($elements) - 1) { + $replaceTokens[] = clone $delimiter; + } + } + + $tokens->overrideRange($startIndex, $endIndex, $replaceTokens); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php index a5b3916be..8011842ed 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractProxyFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\ControlStructure\ControlStructureBracesFixer; use PhpCsFixer\Fixer\ControlStructure\ControlStructureContinuationPositionFixer; use PhpCsFixer\Fixer\DeprecatedFixerInterface; @@ -37,9 +38,29 @@ * @author Dariusz Rumiński * * @deprecated + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * allow_single_line_anonymous_class_with_empty_body?: bool, + * allow_single_line_closure?: bool, + * position_after_anonymous_constructs?: 'next'|'same', + * position_after_control_structures?: 'next'|'same', + * position_after_functions_and_oop_constructs?: 'next'|'same', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * allow_single_line_anonymous_class_with_empty_body: bool, + * allow_single_line_closure: bool, + * position_after_anonymous_constructs: 'next'|'same', + * position_after_control_structures: 'next'|'same', + * position_after_functions_and_oop_constructs: 'next'|'same', + * } */ final class BracesFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface, DeprecatedFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -50,15 +71,9 @@ final class BracesFixer extends AbstractProxyFixer implements ConfigurableFixerI */ public const LINE_SAME = 'same'; - /** - * @var null|CurlyBracesPositionFixer - */ - private $curlyBracesPositionFixer; + private ?BracesPositionFixer $bracesPositionFixer = null; - /** - * @var null|ControlStructureContinuationPositionFixer - */ - private $controlStructureContinuationPositionFixer; + private ?ControlStructureContinuationPositionFixer $controlStructureContinuationPositionFixer = null; public function getDefinition(): FixerDefinitionInterface { @@ -152,11 +167,9 @@ public function getSuccessorsNames(): array return array_keys($this->proxyFixers); } - public function configure(array $configuration = null): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - - $this->getCurlyBracesPositionFixer()->configure([ + $this->getBracesPositionFixer()->configure([ 'control_structures_opening_brace' => $this->translatePositionOption($this->configuration['position_after_control_structures']), 'functions_opening_brace' => $this->translatePositionOption($this->configuration['position_after_functions_and_oop_constructs']), 'anonymous_functions_opening_brace' => $this->translatePositionOption($this->configuration['position_after_anonymous_constructs']), @@ -217,7 +230,7 @@ protected function createProxyFixers(): array $singleSpaceAroundConstructFixer, new ControlStructureBracesFixer(), $noExtraBlankLinesFixer, - $this->getCurlyBracesPositionFixer(), + $this->getBracesPositionFixer(), $this->getControlStructureContinuationPositionFixer(), new DeclareParenthesesFixer(), new NoMultipleStatementsPerLineFixer(), @@ -225,13 +238,13 @@ protected function createProxyFixers(): array ]; } - private function getCurlyBracesPositionFixer(): CurlyBracesPositionFixer + private function getBracesPositionFixer(): BracesPositionFixer { - if (null === $this->curlyBracesPositionFixer) { - $this->curlyBracesPositionFixer = new CurlyBracesPositionFixer(); + if (null === $this->bracesPositionFixer) { + $this->bracesPositionFixer = new BracesPositionFixer(); } - return $this->curlyBracesPositionFixer; + return $this->bracesPositionFixer; } private function getControlStructureContinuationPositionFixer(): ControlStructureContinuationPositionFixer @@ -243,10 +256,13 @@ private function getControlStructureContinuationPositionFixer(): ControlStructur return $this->controlStructureContinuationPositionFixer; } + /** + * @return BracesPositionFixer::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END|BracesPositionFixer::SAME_LINE + */ private function translatePositionOption(string $option): string { return self::LINE_NEXT === $option - ? CurlyBracesPositionFixer::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END - : CurlyBracesPositionFixer::SAME_LINE; + ? BracesPositionFixer::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END + : BracesPositionFixer::SAME_LINE; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesPositionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesPositionFixer.php index 4812308a8..6d13fc5c4 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesPositionFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/BracesPositionFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\Indentation; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; @@ -30,8 +31,33 @@ use PhpCsFixer\Tokenizer\Tokens; use PhpCsFixer\Tokenizer\TokensAnalyzer; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * allow_single_line_anonymous_functions?: bool, + * allow_single_line_empty_anonymous_classes?: bool, + * anonymous_classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * anonymous_functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * control_structures_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * allow_single_line_anonymous_functions: bool, + * allow_single_line_empty_anonymous_classes: bool, + * anonymous_classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * anonymous_functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * control_structures_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * } + */ final class BracesPositionFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + use Indentation; /** @@ -144,6 +170,41 @@ public function getPriority(): int return -2; } + /** @protected */ + public function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('control_structures_opening_brace', 'The position of the opening brace of control structures‘ body.')) + ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) + ->setDefault(self::SAME_LINE) + ->getOption(), + (new FixerOptionBuilder('functions_opening_brace', 'The position of the opening brace of functions‘ body.')) + ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) + ->setDefault(self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END) + ->getOption(), + (new FixerOptionBuilder('anonymous_functions_opening_brace', 'The position of the opening brace of anonymous functions‘ body.')) + ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) + ->setDefault(self::SAME_LINE) + ->getOption(), + (new FixerOptionBuilder('classes_opening_brace', 'The position of the opening brace of classes‘ body.')) + ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) + ->setDefault(self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END) + ->getOption(), + (new FixerOptionBuilder('anonymous_classes_opening_brace', 'The position of the opening brace of anonymous classes‘ body.')) + ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) + ->setDefault(self::SAME_LINE) + ->getOption(), + (new FixerOptionBuilder('allow_single_line_empty_anonymous_classes', 'Allow anonymous classes to have opening and closing braces on the same line.')) + ->setAllowedTypes(['bool']) + ->setDefault(true) + ->getOption(), + (new FixerOptionBuilder('allow_single_line_anonymous_functions', 'Allow anonymous functions to have opening and closing braces on the same line.')) + ->setAllowedTypes(['bool']) + ->setDefault(true) + ->getOption(), + ]); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $classyTokens = Token::getClassyTokenKinds(); @@ -165,7 +226,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $openBraceIndex = $tokens->getNextTokenOfKind($index, ['{']); if ($tokensAnalyzer->isAnonymousClass($index)) { - $allowSingleLineIfEmpty = $this->configuration['allow_single_line_empty_anonymous_classes']; + $allowSingleLineIfEmpty = true === $this->configuration['allow_single_line_empty_anonymous_classes']; $positionOption = 'anonymous_classes_opening_brace'; } else { $positionOption = 'classes_opening_brace'; @@ -178,7 +239,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } if ($tokensAnalyzer->isLambda($index)) { - $allowSingleLine = $this->configuration['allow_single_line_anonymous_functions']; + $allowSingleLine = true === $this->configuration['allow_single_line_anonymous_functions']; $positionOption = 'anonymous_functions_opening_brace'; } else { $positionOption = 'functions_opening_brace'; @@ -301,13 +362,21 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } } - for (; $openBraceIndex !== $moveBraceToIndex; $openBraceIndex += $delta) { + for ($i = $openBraceIndex; $i !== $moveBraceToIndex; $i += $delta) { /** @var Token $siblingToken */ - $siblingToken = $tokens[$openBraceIndex + $delta]; - $tokens[$openBraceIndex] = $siblingToken; + $siblingToken = $tokens[$i + $delta]; + $tokens[$i] = $siblingToken; } - $tokens[$openBraceIndex] = $movedToken; + $tokens[$i] = $movedToken; + + if ($tokens[$openBraceIndex]->isWhitespace() && $tokens[$openBraceIndex + 1]->isWhitespace()) { + $tokens[$openBraceIndex] = new Token([ + T_WHITESPACE, + $tokens[$openBraceIndex]->getContent().$tokens[$openBraceIndex + 1]->getContent(), + ]); + $tokens->clearAt($openBraceIndex + 1); + } $openBraceIndex = $moveBraceToIndex; } @@ -326,9 +395,13 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - for ($prevIndex = $closeBraceIndex - 1; $tokens->isEmptyAt($prevIndex); --$prevIndex); + $prevIndex = $closeBraceIndex - 1; + while ($tokens->isEmptyAt($prevIndex)) { + --$prevIndex; + } $prevToken = $tokens[$prevIndex]; + if ($prevToken->isWhitespace() && Preg::match('/\R/', $prevToken->getContent())) { continue; } @@ -338,40 +411,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } } - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('control_structures_opening_brace', 'The position of the opening brace of control structures‘ body.')) - ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) - ->setDefault(self::SAME_LINE) - ->getOption(), - (new FixerOptionBuilder('functions_opening_brace', 'The position of the opening brace of functions‘ body.')) - ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) - ->setDefault(self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END) - ->getOption(), - (new FixerOptionBuilder('anonymous_functions_opening_brace', 'The position of the opening brace of anonymous functions‘ body.')) - ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) - ->setDefault(self::SAME_LINE) - ->getOption(), - (new FixerOptionBuilder('classes_opening_brace', 'The position of the opening brace of classes‘ body.')) - ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) - ->setDefault(self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END) - ->getOption(), - (new FixerOptionBuilder('anonymous_classes_opening_brace', 'The position of the opening brace of anonymous classes‘ body.')) - ->setAllowedValues([self::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END, self::SAME_LINE]) - ->setDefault(self::SAME_LINE) - ->getOption(), - (new FixerOptionBuilder('allow_single_line_empty_anonymous_classes', 'Allow anonymous classes to have opening and closing braces on the same line.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('allow_single_line_anonymous_functions', 'Allow anonymous functions to have opening and closing braces on the same line.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - private function findParenthesisEnd(Tokens $tokens, int $structureTokenIndex): int { $nextIndex = $tokens->getNextMeaningfulToken($structureTokenIndex); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/CurlyBracesPositionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/CurlyBracesPositionFixer.php index 324d07538..7650682fc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/CurlyBracesPositionFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/CurlyBracesPositionFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractProxyFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\DeprecatedFixerInterface; use PhpCsFixer\Fixer\Indentation; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; @@ -25,9 +26,33 @@ /** * @deprecated + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * allow_single_line_anonymous_functions?: bool, + * allow_single_line_empty_anonymous_classes?: bool, + * anonymous_classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * anonymous_functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * control_structures_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * allow_single_line_anonymous_functions: bool, + * allow_single_line_empty_anonymous_classes: bool, + * anonymous_classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * anonymous_functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * control_structures_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line', + * } */ final class CurlyBracesPositionFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, DeprecatedFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + use Indentation; /** @@ -61,13 +86,6 @@ public function getDefinition(): FixerDefinitionInterface ); } - public function configure(array $configuration): void - { - $this->bracesPositionFixer->configure($configuration); - - parent::configure($configuration); - } - /** * {@inheritdoc} * @@ -86,6 +104,14 @@ public function getSuccessorsNames(): array ]; } + /** + * @param _AutogeneratedInputConfiguration $configuration + */ + protected function configurePreNormalisation(array $configuration): void + { + $this->bracesPositionFixer->configure($configuration); + } + protected function createProxyFixers(): array { return [ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php index fcd9d2925..e499d2604 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoMultipleStatementsPerLineFixer.php @@ -21,6 +21,7 @@ use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Tokens; /** @@ -66,6 +67,15 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } + if ($tokens[$index]->isGivenKind(CT::T_PROPERTY_HOOK_BRACE_OPEN)) { + $index = $tokens->findBlockEnd( + Tokens::BLOCK_TYPE_PROPERTY_HOOK, + $index + ); + + continue; + } + if (!$tokens[$index]->equals(';')) { continue; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoTrailingCommaInSinglelineFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoTrailingCommaInSinglelineFixer.php index 610299b3f..de1dd2db7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoTrailingCommaInSinglelineFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NoTrailingCommaInSinglelineFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -27,8 +28,21 @@ use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * elements?: list<'arguments'|'array'|'array_destructuring'|'group_import'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * elements: list<'arguments'|'array'|'array_destructuring'|'group_import'>, + * } + */ final class NoTrailingCommaInSinglelineFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -49,11 +63,11 @@ public function isCandidate(Tokens $tokens): bool protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { - $elements = ['arguments', 'array_destructuring', 'array', 'group_import']; + $elements = ['arguments', 'array', 'array_destructuring', 'group_import']; return new FixerConfigurationResolver([ (new FixerOptionBuilder('elements', 'Which elements to fix.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($elements)]) ->setDefault($elements) ->getOption(), @@ -95,7 +109,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void private function shouldBeCleared(Tokens $tokens, int $openIndex): bool { - /** @var string[] $elements */ $elements = $this->configuration['elements']; if ($tokens[$openIndex]->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php index 318c9fa67..c3a765ef9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NonPrintableCharacterFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,18 +31,25 @@ * Removes Zero-width space (ZWSP), Non-breaking space (NBSP) and other invisible unicode symbols. * * @author Ivan Boprzenkov + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * use_escape_sequences_in_strings?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * use_escape_sequences_in_strings: bool, + * } */ final class NonPrintableCharacterFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var array - */ - private array $symbolsReplace; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; /** - * @var int[] + * @var list */ - private static array $tokens = [ + private const TOKENS = [ T_STRING_VARNAME, T_INLINE_HTML, T_VARIABLE, @@ -51,6 +59,11 @@ final class NonPrintableCharacterFixer extends AbstractFixer implements Configur T_DOC_COMMENT, ]; + /** + * @var array + */ + private array $symbolsReplace; + public function __construct() { parent::__construct(); @@ -89,7 +102,7 @@ public function isRisky(): bool public function isCandidate(Tokens $tokens): bool { - return $tokens->isAnyTokenKindsFound(self::$tokens); + return $tokens->isAnyTokenKindsFound(self::TOKENS); } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface @@ -116,7 +129,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $content = $token->getContent(); if ( - $this->configuration['use_escape_sequences_in_strings'] + true === $this->configuration['use_escape_sequences_in_strings'] && $token->isGivenKind([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE]) ) { if (!Preg::match('/'.implode('|', array_keys($escapeSequences)).'/', $content)) { @@ -144,7 +157,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } if ($stringTypeChanged) { - $content = Preg::replace('/(\\\\{1,2})/', '\\\\\\\\', $content); + $content = Preg::replace('/(\\\{1,2})/', '\\\\\\\\', $content); $content = str_replace('$', '\$', $content); } @@ -158,7 +171,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - if ($token->isGivenKind(self::$tokens)) { + if ($token->isGivenKind(self::TOKENS)) { $newContent = strtr($content, $replacements); // variable name cannot contain space diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NumericLiteralSeparatorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NumericLiteralSeparatorFixer.php new file mode 100644 index 000000000..3bd9b939d --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/NumericLiteralSeparatorFixer.php @@ -0,0 +1,232 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\Basic; + +use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * Let's you add underscores to numeric literals. + * + * Inspired by: + * - {@link https://github.com/kubawerlos/php-cs-fixer-custom-fixers/blob/main/src/Fixer/NumericLiteralSeparatorFixer.php} + * - {@link https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/rules/numeric-separators-style.js} + * + * @author Marvin Heilemann + * @author Greg Korba + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * override_existing?: bool, + * strategy?: 'no_separator'|'use_separator', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * override_existing: bool, + * strategy: 'no_separator'|'use_separator', + * } + */ +final class NumericLiteralSeparatorFixer extends AbstractFixer implements ConfigurableFixerInterface +{ + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + public const STRATEGY_USE_SEPARATOR = 'use_separator'; + public const STRATEGY_NO_SEPARATOR = 'no_separator'; + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Adds separators to numeric literals of any kind.', + [ + new CodeSample( + <<<'PHP' + self::STRATEGY_NO_SEPARATOR], + ), + new CodeSample( + <<<'PHP' + self::STRATEGY_USE_SEPARATOR], + ), + new CodeSample( + " true] + ), + ] + ); + } + + public function isCandidate(Tokens $tokens): bool + { + return $tokens->isAnyTokenKindsFound([T_DNUMBER, T_LNUMBER]); + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder( + 'override_existing', + 'Whether literals already containing underscores should be reformatted.' + )) + ->setAllowedTypes(['bool']) + ->setDefault(false) + ->getOption(), + (new FixerOptionBuilder( + 'strategy', + 'Whether numeric literal should be separated by underscores or not.' + )) + ->setAllowedValues([self::STRATEGY_USE_SEPARATOR, self::STRATEGY_NO_SEPARATOR]) + ->setDefault(self::STRATEGY_USE_SEPARATOR) + ->getOption(), + ]); + } + + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + { + foreach ($tokens as $index => $token) { + if (!$token->isGivenKind([T_DNUMBER, T_LNUMBER])) { + continue; + } + + $content = $token->getContent(); + + $newContent = $this->formatValue($content); + + if ($content === $newContent) { + // Skip Token override if its the same content, like when it + // already got a valid literal separator structure. + continue; + } + + $tokens[$index] = new Token([$token->getId(), $newContent]); + } + } + + private function formatValue(string $value): string + { + if (self::STRATEGY_NO_SEPARATOR === $this->configuration['strategy']) { + return str_contains($value, '_') ? str_replace('_', '', $value) : $value; + } + + if (true === $this->configuration['override_existing']) { + $value = str_replace('_', '', $value); + } elseif (str_contains($value, '_')) { + // Keep already underscored literals untouched. + return $value; + } + + $lowerValue = strtolower($value); + + if (str_starts_with($lowerValue, '0b')) { + // Binary + return $this->insertEveryRight($value, 8, 2); + } + + if (str_starts_with($lowerValue, '0x')) { + // Hexadecimal + return $this->insertEveryRight($value, 2, 2); + } + + if (str_starts_with($lowerValue, '0o')) { + // Octal + return $this->insertEveryRight($value, 3, 2); + } + if (str_starts_with($lowerValue, '0') && !str_contains($lowerValue, '.')) { + // Octal notation prior PHP 8.1 but still valid + return $this->insertEveryRight($value, 3, 1); + } + + // All other types + + /** If its a negative value we need an offset */ + $negativeOffset = static fn ($v) => str_contains($v, '-') ? 1 : 0; + + Preg::matchAll('/([0-9-_]+)?((\.)([0-9_]*))?((e)([0-9-_]+))?/i', $value, $result); + + $integer = $result[1][0]; + $joinedValue = $this->insertEveryRight($integer, 3, $negativeOffset($integer)); + + $dot = $result[3][0]; + if ('' !== $dot) { + $integer = $result[4][0]; + $decimal = $this->insertEveryLeft($integer, 3, $negativeOffset($integer)); + $joinedValue = $joinedValue.$dot.$decimal; + } + + $tim = $result[6][0]; + if ('' !== $tim) { + $integer = $result[7][0]; + $times = $this->insertEveryRight($integer, 3, $negativeOffset($integer)); + $joinedValue = $joinedValue.$tim.$times; + } + + return $joinedValue; + } + + private function insertEveryRight(string $value, int $length, int $offset = 0): string + { + $position = $length * -1; + while ($position > -(\strlen($value) - $offset)) { + $value = substr_replace($value, '_', $position, 0); + $position -= $length + 1; + } + + return $value; + } + + private function insertEveryLeft(string $value, int $length, int $offset = 0): string + { + $position = $length; + while ($position < \strlen($value)) { + $value = substr_replace($value, '_', $position, $offset); + $position += $length + 1; + } + + return $value; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php index 2f31f540f..bc4310c6b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Basic/PsrAutoloadingFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -35,9 +36,21 @@ * @author Bram Gotink * @author Graham Campbell * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * dir?: null|string, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * dir: null|string, + * } */ final class PsrAutoloadingFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -64,21 +77,6 @@ class InvalidName {} ); } - public function configure(array $configuration): void - { - parent::configure($configuration); - - if (null !== $this->configuration['dir']) { - $realpath = realpath($this->configuration['dir']); - - if (false === $realpath) { - throw new \InvalidArgumentException(sprintf('Failed to resolve configured directory "%s".', $this->configuration['dir'])); - } - - $this->configuration['dir'] = $realpath; - } - } - public function isCandidate(Tokens $tokens): bool { return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); @@ -115,7 +113,7 @@ public function supports(\SplFileInfo $file): bool } try { - $tokens = Tokens::fromCode(sprintf('getBasename('.php'))); + $tokens = Tokens::fromCode(\sprintf('getBasename('.php'))); if ($tokens[3]->isKeyword() || $tokens[3]->isMagicConstant()) { // name cannot be a class name - detected by PHP 5.x @@ -127,7 +125,20 @@ public function supports(\SplFileInfo $file): bool } // ignore stubs/fixtures, since they typically contain invalid files for various reasons - return !Preg::match('{[/\\\\](stub|fixture)s?[/\\\\]}i', $file->getRealPath()); + return !Preg::match('{[/\\\](stub|fixture)s?[/\\\]}i', $file->getRealPath()); + } + + protected function configurePostNormalisation(): void + { + if (null !== $this->configuration['dir']) { + $realpath = realpath($this->configuration['dir']); + + if (false === $realpath) { + throw new \InvalidArgumentException(\sprintf('Failed to resolve configured directory "%s".', $this->configuration['dir'])); + } + + $this->configuration['dir'] = $realpath; + } } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface @@ -230,7 +241,7 @@ private function calculateClassyName(\SplFileInfo $file, ?string $namespace, str $namespaceParts = array_reverse(explode('\\', $maxNamespace)); foreach ($namespaceParts as $namespacePart) { - $nameCandidate = sprintf('%s_%s', $namespacePart, $name); + $nameCandidate = \sprintf('%s_%s', $namespacePart, $name); if (strtolower($nameCandidate) !== strtolower(substr($currentName, -\strlen($nameCandidate)))) { break; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ClassReferenceNameCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ClassReferenceNameCasingFixer.php index 83b0f979f..20b951d11 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ClassReferenceNameCasingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ClassReferenceNameCasingFixer.php @@ -84,6 +84,10 @@ private function getClassReference(Tokens $tokens, NamespaceAnalysis $namespace) T_TRAIT, ]; + if (\defined('T_NULLSAFE_OBJECT_OPERATOR')) { // @TODO: drop condition when PHP 8.0+ is required + $notBeforeKinds[] = T_NULLSAFE_OBJECT_OPERATOR; + } + if (\defined('T_ENUM')) { // @TODO: drop condition when PHP 8.1+ is required $notBeforeKinds[] = T_ENUM; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php index 14501aaf4..9c1968aee 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/ConstantCaseFixer.php @@ -16,13 +16,13 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; @@ -30,9 +30,21 @@ * Fixer for constants case. * * @author Pol Dellaiera + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case?: 'lower'|'upper', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case: 'lower'|'upper', + * } */ final class ConstantCaseFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * Hold the function that will be used to convert the constants. * @@ -40,19 +52,6 @@ final class ConstantCaseFixer extends AbstractFixer implements ConfigurableFixer */ private $fixFunction; - public function configure(array $configuration): void - { - parent::configure($configuration); - - if ('lower' === $this->configuration['case']) { - $this->fixFunction = static fn (string $content): string => strtolower($content); - } - - if ('upper' === $this->configuration['case']) { - $this->fixFunction = static fn (string $content): string => strtoupper($content); - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -69,6 +68,17 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound(T_STRING); } + protected function configurePostNormalisation(): void + { + if ('lower' === $this->configuration['case']) { + $this->fixFunction = static fn (string $content): string => strtolower($content); + } + + if ('upper' === $this->configuration['case']) { + $this->fixFunction = static fn (string $content): string => strtoupper($content); + } + } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ @@ -81,75 +91,40 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $fixFunction = $this->fixFunction; - - foreach ($tokens as $index => $token) { - if (!$token->isNativeConstant()) { - continue; - } - - if ( - $this->isNeighbourAccepted($tokens, $tokens->getPrevMeaningfulToken($index)) - && $this->isNeighbourAccepted($tokens, $tokens->getNextMeaningfulToken($index)) - && !$this->isEnumCaseName($tokens, $index) - ) { - $tokens[$index] = new Token([$token->getId(), $fixFunction($token->getContent())]); - } - } - } - - private function isNeighbourAccepted(Tokens $tokens, int $index): bool - { - static $forbiddenTokens = null; - - if (null === $forbiddenTokens) { - $forbiddenTokens = [ - T_AS, - T_CLASS, - T_CONST, + static $forbiddenPrevKinds = null; + if (null === $forbiddenPrevKinds) { + $forbiddenPrevKinds = [ + T_DOUBLE_COLON, T_EXTENDS, T_IMPLEMENTS, T_INSTANCEOF, - T_INSTEADOF, - T_INTERFACE, + T_NAMESPACE, T_NEW, T_NS_SEPARATOR, - T_PAAMAYIM_NEKUDOTAYIM, - T_TRAIT, - T_USE, - CT::T_USE_TRAIT, - CT::T_USE_LAMBDA, ...Token::getObjectOperatorKinds(), ]; } - $token = $tokens[$index]; - - if ($token->equalsAny(['{', '}'])) { - return false; - } - - return !$token->isGivenKind($forbiddenTokens); - } + foreach ($tokens as $index => $token) { + if (!$token->equalsAny([[T_STRING, 'true'], [T_STRING, 'false'], [T_STRING, 'null']], false)) { + continue; + } - private function isEnumCaseName(Tokens $tokens, int $index): bool - { - if (!\defined('T_ENUM') || !$tokens->isTokenKindFound(T_ENUM)) { // @TODO: drop condition when PHP 8.1+ is required - return false; - } + $prevIndex = $tokens->getPrevMeaningfulToken($index); + if ($tokens[$prevIndex]->isGivenKind($forbiddenPrevKinds)) { + continue; + } - $prevIndex = $tokens->getPrevMeaningfulToken($index); + $nextIndex = $tokens->getNextMeaningfulToken($index); + if ($tokens[$nextIndex]->isGivenKind(T_PAAMAYIM_NEKUDOTAYIM) || $tokens[$nextIndex]->equalsAny(['='], false)) { + continue; + } - if (null === $prevIndex || !$tokens[$prevIndex]->isGivenKind(T_CASE)) { - return false; - } + if ($tokens[$prevIndex]->isGivenKind(T_CASE) && $tokens[$nextIndex]->equals(';')) { + continue; + } - if (!$tokens->isTokenKindFound(T_SWITCH)) { - return true; + $tokens[$index] = new Token([$token->getId(), ($this->fixFunction)($token->getContent())]); } - - $prevIndex = $tokens->getPrevTokenOfKind($prevIndex, [[T_ENUM], [T_SWITCH]]); - - return null !== $prevIndex && $tokens[$prevIndex]->isGivenKind(T_ENUM); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php index 120e4cde9..53f98d15e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseKeywordsFixer.php @@ -28,11 +28,6 @@ */ final class LowercaseKeywordsFixer extends AbstractFixer { - /** - * @var int[] - */ - private static array $excludedTokens = [T_HALT_COMPILER]; - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -64,7 +59,7 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { foreach ($tokens as $index => $token) { - if ($token->isKeyword() && !$token->isGivenKind(self::$excludedTokens)) { + if ($token->isKeyword() && !$token->isGivenKind([T_HALT_COMPILER])) { $tokens[$index] = new Token([$token->getId(), strtolower($token->getContent())]); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php index 325264b22..7615b296b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/LowercaseStaticReferenceFixer.php @@ -84,7 +84,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } $prevIndex = $tokens->getPrevMeaningfulToken($index); - if ($tokens[$prevIndex]->isGivenKind([T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_NAMESPACE, T_NS_SEPARATOR]) || $tokens[$prevIndex]->isObjectOperator()) { + if ($tokens[$prevIndex]->isGivenKind([T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_NAMESPACE, T_NS_SEPARATOR, T_STATIC, T_STRING, CT::T_ARRAY_TYPEHINT, CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE]) || $tokens[$prevIndex]->isObjectOperator()) { continue; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php index f4902b777..b8de332eb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicConstantCasingFixer.php @@ -77,7 +77,7 @@ private function getMagicConstants(): array } /** - * @return array + * @return list */ private function getMagicConstantTokens(): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php index 4a2039064..d8eaa3d0a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/MagicMethodCasingFixer.php @@ -24,9 +24,9 @@ final class MagicMethodCasingFixer extends AbstractFixer { /** - * @var array + * @var array */ - private static array $magicNames = [ + private const MAGIC_NAMES = [ '__call' => '__call', '__callstatic' => '__callStatic', '__clone' => '__clone', @@ -177,17 +177,22 @@ private function isStaticMethodCall(Tokens $tokens, int $index): bool return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); } + /** + * @phpstan-assert-if-true key-of $name + */ private function isMagicMethodName(string $name): bool { - return isset(self::$magicNames[$name]); + return isset(self::MAGIC_NAMES[$name]); } /** - * @param string $name name of a magic method + * @param key-of $name name of a magic method + * + * @return value-of */ private function getMagicMethodNameInCorrectCasing(string $name): string { - return self::$magicNames[$name]; + return self::MAGIC_NAMES[$name]; } private function setTokenToCorrectCasing(Tokens $tokens, int $index, string $nameInCorrectCasing): void diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeTypeDeclarationCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeTypeDeclarationCasingFixer.php index c0e8aa321..a154dfae7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeTypeDeclarationCasingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Casing/NativeTypeDeclarationCasingFixer.php @@ -20,76 +20,12 @@ use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\FixerDefinition\VersionSpecification; use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; -use PhpCsFixer\Tokenizer\TokensAnalyzer; final class NativeTypeDeclarationCasingFixer extends AbstractFixer { - /* - * https://wiki.php.net/rfc/typed_class_constants - * Supported types - * Class constant type declarations support all type declarations supported by PHP, - * except `void`, `callable`, `never`. - * - * array - * bool - * callable - * float - * int - * iterable - * object - * mixed - * parent - * self - * string - * any class or interface name -> not native, so not applicable for this Fixer - * ?type -> not native, `?` has no casing, so not applicable for this Fixer - * - * Not in the list referenced but supported: - * null - * static - */ - private const CLASS_CONST_SUPPORTED_HINTS = [ - 'array' => true, - 'bool' => true, - 'float' => true, - 'int' => true, - 'iterable' => true, - 'mixed' => true, - 'null' => true, - 'object' => true, - 'parent' => true, - 'self' => true, - 'string' => true, - 'static' => true, - ]; - - private const CLASS_PROPERTY_SUPPORTED_HINTS = [ - 'array' => true, - 'bool' => true, - 'float' => true, - 'int' => true, - 'iterable' => true, - 'mixed' => true, - 'null' => true, - 'object' => true, - 'parent' => true, - 'self' => true, - 'static' => true, - 'string' => true, - ]; - - private const TYPE_SEPARATION_TYPES = [ - CT::T_TYPE_ALTERNATION, - CT::T_TYPE_INTERSECTION, - CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN, - CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE, - ]; - /** * https://secure.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration. * @@ -114,22 +50,13 @@ final class NativeTypeDeclarationCasingFixer extends AbstractFixer * * @var array */ - private array $functionTypeHints; - - private FunctionsAnalyzer $functionsAnalyzer; - - /** - * @var list> - */ - private array $propertyTypeModifiers; + private array $types; public function __construct() { parent::__construct(); - $this->propertyTypeModifiers = [[T_PRIVATE], [T_PROTECTED], [T_PUBLIC]]; - - $this->functionTypeHints = [ + $this->types = [ 'array' => true, 'bool' => true, 'callable' => true, @@ -137,29 +64,26 @@ public function __construct() 'int' => true, 'iterable' => true, 'object' => true, + 'parent' => true, 'self' => true, + 'static' => true, 'string' => true, 'void' => true, ]; if (\PHP_VERSION_ID >= 8_00_00) { - $this->functionTypeHints['false'] = true; - $this->functionTypeHints['mixed'] = true; - $this->functionTypeHints['null'] = true; - $this->functionTypeHints['static'] = true; + $this->types['false'] = true; + $this->types['mixed'] = true; + $this->types['null'] = true; } if (\PHP_VERSION_ID >= 8_01_00) { - $this->functionTypeHints['never'] = true; - - $this->propertyTypeModifiers[] = [T_READONLY]; + $this->types['never'] = true; } if (\PHP_VERSION_ID >= 8_02_00) { - $this->functionTypeHints['true'] = true; + $this->types['true'] = true; } - - $this->functionsAnalyzer = new FunctionsAnalyzer(); } public function getDefinition(): FixerDefinitionInterface @@ -194,167 +118,34 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $this->fixFunctions($tokens); - $this->fixClassConstantsAndProperties($tokens); - } - - private function fixFunctions(Tokens $tokens): void - { - for ($index = $tokens->count() - 1; $index >= 0; --$index) { - if ($tokens[$index]->isGivenKind([T_FUNCTION, T_FN])) { - $this->fixFunctionReturnType($tokens, $index); - $this->fixFunctionArgumentTypes($tokens, $index); - } - } - } - - private function fixFunctionArgumentTypes(Tokens $tokens, int $index): void - { - foreach ($this->functionsAnalyzer->getFunctionArguments($tokens, $index) as $argument) { - $this->fixArgumentType($tokens, $argument->getTypeAnalysis()); - } - } - - private function fixFunctionReturnType(Tokens $tokens, int $index): void - { - $this->fixArgumentType($tokens, $this->functionsAnalyzer->getFunctionReturnType($tokens, $index)); - } - - private function fixArgumentType(Tokens $tokens, ?TypeAnalysis $type = null): void - { - if (null === $type) { - return; - } - - for ($index = $type->getStartIndex(); $index <= $type->getEndIndex(); ++$index) { - if ($tokens[$tokens->getNextMeaningfulToken($index)]->isGivenKind(T_NS_SEPARATOR)) { + foreach ($tokens as $index => $token) { + $content = $token->getContent(); + $lowercaseContent = strtolower($content); + if ($content === $lowercaseContent) { continue; } - - $this->fixCasing($this->functionTypeHints, $tokens, $index); - } - } - - private function fixClassConstantsAndProperties(Tokens $tokens): void - { - $analyzer = new TokensAnalyzer($tokens); - $elements = array_reverse($analyzer->getClassyElements(), true); - - foreach ($elements as $index => $element) { - if ('const' === $element['type']) { - if (\PHP_VERSION_ID >= 8_03_00 && !$this->isConstWithoutType($tokens, $index)) { - foreach ($this->getNativeTypeHintCandidatesForConstant($tokens, $index) as $nativeTypeHintIndex) { - $this->fixCasing($this::CLASS_CONST_SUPPORTED_HINTS, $tokens, $nativeTypeHintIndex); - } - } - + if (!isset($this->types[$lowercaseContent])) { continue; } - if ('property' === $element['type']) { - foreach ($this->getNativeTypeHintCandidatesForProperty($tokens, $index) as $nativeTypeHintIndex) { - $this->fixCasing($this::CLASS_PROPERTY_SUPPORTED_HINTS, $tokens, $nativeTypeHintIndex); - } + $prevIndex = $tokens->getPrevMeaningfulToken($index); + if ($tokens[$prevIndex]->equals('=') || $tokens[$prevIndex]->isGivenKind([T_CASE, T_OBJECT_OPERATOR, T_DOUBLE_COLON, T_NS_SEPARATOR])) { + continue; } - } - } - /** @return iterable */ - private function getNativeTypeHintCandidatesForConstant(Tokens $tokens, int $index): iterable - { - $constNameIndex = $this->getConstNameIndex($tokens, $index); - $index = $this->getFirstIndexOfType($tokens, $index); - - do { - $typeEnd = $this->getTypeEnd($tokens, $index, $constNameIndex); - - if ($typeEnd === $index) { - yield $index; + $nextIndex = $tokens->getNextMeaningfulToken($index); + if ($tokens[$nextIndex]->equals('=') || $tokens[$nextIndex]->isGivenKind(T_NS_SEPARATOR)) { + continue; } - do { - $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind(self::TYPE_SEPARATION_TYPES)); - } while ($index < $constNameIndex); - } - - private function isConstWithoutType(Tokens $tokens, int $index): bool - { - $index = $tokens->getNextMeaningfulToken($index); - - return $tokens[$index]->isGivenKind(T_STRING) && $tokens[$tokens->getNextMeaningfulToken($index)]->equals('='); - } - - private function getConstNameIndex(Tokens $tokens, int $index): int - { - return $tokens->getPrevMeaningfulToken( - $tokens->getNextTokenOfKind($index, ['=']), - ); - } - - /** @return iterable */ - private function getNativeTypeHintCandidatesForProperty(Tokens $tokens, int $index): iterable - { - $propertyNameIndex = $index; - $index = $tokens->getPrevTokenOfKind($index, $this->propertyTypeModifiers); - - $index = $this->getFirstIndexOfType($tokens, $index); - - do { - $typeEnd = $this->getTypeEnd($tokens, $index, $propertyNameIndex); - - if ($typeEnd === $index) { - yield $index; + if ( + !$tokens[$prevIndex]->isGivenKind([T_CONST, CT::T_NULLABLE_TYPE, CT::T_TYPE_ALTERNATION, CT::T_TYPE_COLON]) + && !$tokens[$nextIndex]->isGivenKind([T_VARIABLE, CT::T_TYPE_ALTERNATION]) + ) { + continue; } - do { - $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind(self::TYPE_SEPARATION_TYPES)); - } while ($index < $propertyNameIndex); - - return []; - } - - private function getFirstIndexOfType(Tokens $tokens, int $index): int - { - $index = $tokens->getNextMeaningfulToken($index); - - if ($tokens[$index]->isGivenKind(CT::T_NULLABLE_TYPE)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - if ($tokens[$index]->isGivenKind(CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN)) { - $index = $tokens->getNextMeaningfulToken($index); - } - - return $index; - } - - private function getTypeEnd(Tokens $tokens, int $index, int $upperLimit): int - { - if (!$tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR])) { - return $index; // callable, array, self, static, etc. - } - - $endIndex = $index; - while ($tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR]) && $index < $upperLimit) { - $endIndex = $index; - $index = $tokens->getNextMeaningfulToken($index); - } - - return $endIndex; - } - - /** - * @param array $supportedTypeHints - */ - private function fixCasing(array $supportedTypeHints, Tokens $tokens, int $index): void - { - $typeContent = $tokens[$index]->getContent(); - $typeContentLower = strtolower($typeContent); - - if (isset($supportedTypeHints[$typeContentLower]) && $typeContent !== $typeContentLower) { - $tokens[$index] = new Token([$tokens[$index]->getId(), $typeContentLower]); + $tokens[$index] = new Token([$token->getId(), $lowercaseContent]); } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php index bf8c53c33..36ff1c9e9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/CastNotation/CastSpacesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,9 +28,21 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * space?: 'none'|'single', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * space: 'none'|'single', + * } */ final class CastSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const INSIDE_CAST_SPACE_REPLACE_MAP = [ ' ' => '', "\t" => '', diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php index aa0fe130e..2c9f0bc5a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassAttributesSeparationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -37,9 +38,29 @@ * Make sure there is one blank line above and below class elements. * * The exception is when an element is the first or last item in a 'classy'. + * + * @phpstan-type _Class array{ + * index: int, + * open: int, + * close: int, + * elements: non-empty-list<_Element> + * } + * @phpstan-type _Element array{token: Token, type: string, index: int, start?: int, end?: int} + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * elements?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * elements: array, + * } */ final class ClassAttributesSeparationFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -57,17 +78,6 @@ final class ClassAttributesSeparationFixer extends AbstractFixer implements Conf */ private array $classElementTypes = []; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->classElementTypes = []; // reset previous configuration - - foreach ($this->configuration['elements'] as $elementType => $spacing) { - $this->classElementTypes[$elementType] = $spacing; - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -152,7 +162,7 @@ class Sample * {@inheritdoc} * * Must run before BracesFixer, IndentationTypeFixer, NoExtraBlankLinesFixer, StatementIndentationFixer. - * Must run after OrderedClassElementsFixer, SingleClassElementPerStatementFixer, VisibilityRequiredFixer. + * Must run after OrderedClassElementsFixer, PhpUnitDataProviderMethodOrderFixer, SingleClassElementPerStatementFixer, VisibilityRequiredFixer. */ public function getPriority(): int { @@ -164,6 +174,15 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); } + protected function configurePostNormalisation(): void + { + $this->classElementTypes = []; // reset previous configuration + + foreach ($this->configuration['elements'] as $elementType => $spacing) { + $this->classElementTypes[$elementType] = $spacing; + } + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { foreach ($this->getElementsByClass($tokens) as $class) { @@ -191,14 +210,14 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('elements', 'Dictionary of `const|method|property|trait_import|case` => `none|one|only_if_meta` values.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['array']) ->setAllowedValues([static function (array $option): bool { foreach ($option as $type => $spacing) { $supportedTypes = ['const', 'method', 'property', 'trait_import', 'case']; if (!\in_array($type, $supportedTypes, true)) { throw new InvalidOptionsException( - sprintf( + \sprintf( 'Unexpected element type, expected any of %s, got "%s".', Utils::naturalLanguageJoin($supportedTypes), \gettype($type).'#'.$type @@ -210,7 +229,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn if (!\in_array($spacing, $supportedSpacings, true)) { throw new InvalidOptionsException( - sprintf( + \sprintf( 'Unexpected spacing for element type "%s", expected any of %s, got "%s".', $spacing, Utils::naturalLanguageJoin($supportedSpacings), @@ -239,12 +258,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn * Deals with comments, PHPDocs and spaces above the element with respect to the position of the * element within the class, interface or trait. * - * @param array{ - * index: int, - * open: int, - * close: int, - * elements: non-empty-list - * } $class + * @param _Class $class */ private function fixSpaceAboveClassElement(Tokens $tokens, array $class, int $elementIndex): void { @@ -315,6 +329,9 @@ private function fixSpaceAboveClassElement(Tokens $tokens, array $class, int $el $this->correctLineBreaks($tokens, $nonWhiteAbove, $element['start'], $this->determineRequiredLineCount($tokens, $class, $elementIndex)); } + /** + * @param _Class $class + */ private function determineRequiredLineCount(Tokens $tokens, array $class, int $elementIndex): int { $type = $class['elements'][$elementIndex]['type']; @@ -346,16 +363,11 @@ private function determineRequiredLineCount(Tokens $tokens, array $class, int $e return $tokens[$aboveElementDocCandidateIndex]->isGivenKind([T_DOC_COMMENT, CT::T_ATTRIBUTE_CLOSE]) ? 2 : 1; } - throw new \RuntimeException(sprintf('Unknown spacing "%s".', $spacing)); + throw new \RuntimeException(\sprintf('Unknown spacing "%s".', $spacing)); } /** - * @param array{ - * index: int, - * open: int, - * close: int, - * elements: non-empty-list - * } $class + * @param _Class $class */ private function fixSpaceBelowClassElement(Tokens $tokens, array $class): void { @@ -458,27 +470,14 @@ private function findCommentBlockStart(Tokens $tokens, int $start, int $elementA /** * @TODO Introduce proper DTO instead of an array * - * @return \Generator - * }> + * @return \Generator<_Class> */ private function getElementsByClass(Tokens $tokens): \Generator { $tokensAnalyzer = new TokensAnalyzer($tokens); $class = $classIndex = false; - $elements = $tokensAnalyzer->getClassyElements(); - - for (end($elements);; prev($elements)) { - $index = key($elements); - - if (null === $index) { - break; - } - $element = current($elements); + foreach (array_reverse($tokensAnalyzer->getClassyElements(), true) as $index => $element) { $element['index'] = $index; if ($element['classIndex'] !== $classIndex) { @@ -509,6 +508,12 @@ private function getElementsByClass(Tokens $tokens): \Generator } } + /** + * including trailing single line comments if belonging to the class element. + * + * @param _Class $class + * @param _Element $element + */ private function getFirstTokenIndexOfClassElement(Tokens $tokens, array $class, array $element): int { $modifierTypes = [T_PRIVATE, T_PROTECTED, T_PUBLIC, T_ABSTRACT, T_FINAL, T_STATIC, T_STRING, T_NS_SEPARATOR, T_VAR, CT::T_NULLABLE_TYPE, CT::T_ARRAY_TYPEHINT, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION, CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN, CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE]; @@ -517,6 +522,12 @@ private function getFirstTokenIndexOfClassElement(Tokens $tokens, array $class, $modifierTypes[] = T_READONLY; } + if (\defined('T_PRIVATE_SET')) { // @TODO: drop condition when PHP 8.4+ is required + $modifierTypes[] = T_PRIVATE_SET; + $modifierTypes[] = T_PROTECTED_SET; + $modifierTypes[] = T_PUBLIC_SET; + } + $firstElementAttributeIndex = $element['index']; do { @@ -532,7 +543,12 @@ private function getFirstTokenIndexOfClassElement(Tokens $tokens, array $class, return $firstElementAttributeIndex; } - // including trailing single line comments if belonging to the class element + /** + * including trailing single line comments if belonging to the class element. + * + * @param _Class $class + * @param _Element $element + */ private function getLastTokenIndexOfClassElement(Tokens $tokens, array $class, array $element, TokensAnalyzer $tokensAnalyzer): int { // find last token of the element diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php index 6be1745b1..4f125d53f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ClassDefinitionFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -23,15 +24,39 @@ use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; use PhpCsFixer\Tokenizer\TokensAnalyzer; /** * Fixer for part of the rules defined in PSR2 ¶4.1 Extends and Implements and PSR12 ¶8. Anonymous Classes. + * + * @phpstan-type _ClassExtendsInfo array{start: int, numberOfExtends: int, multiLine: bool} + * @phpstan-type _ClassImplementsInfo array{start: int, numberOfImplements: int, multiLine: bool} + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * inline_constructor_arguments?: bool, + * multi_line_extends_each_single_line?: bool, + * single_item_single_line?: bool, + * single_line?: bool, + * space_before_parenthesis?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * inline_constructor_arguments: bool, + * multi_line_extends_each_single_line: bool, + * single_item_single_line: bool, + * single_line: bool, + * space_before_parenthesis: bool, + * } */ final class ClassDefinitionFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -189,7 +214,7 @@ private function fixClassyDefinition(Tokens $tokens, int $classyIndex): void $end = $tokens->getPrevNonWhitespace($classDefInfo['open']); } - if ($classDefInfo['anonymousClass'] && !$this->configuration['inline_constructor_arguments']) { + if ($classDefInfo['anonymousClass'] && false === $this->configuration['inline_constructor_arguments']) { if (!$tokens[$end]->equals(')')) { // anonymous class with `extends` and/or `implements` $start = $tokens->getPrevMeaningfulToken($end); $this->makeClassyDefinitionSingleLine($tokens, $start, $end); @@ -207,6 +232,11 @@ private function fixClassyDefinition(Tokens $tokens, int $classyIndex): void $this->sortClassModifiers($tokens, $classDefInfo); } + /** + * @param _ClassExtendsInfo $classExtendsInfo + * + * @return _ClassExtendsInfo + */ private function fixClassyDefinitionExtends(Tokens $tokens, int $classOpenIndex, array $classExtendsInfo): array { $endIndex = $tokens->getPrevNonWhitespace($classOpenIndex); @@ -225,6 +255,11 @@ private function fixClassyDefinitionExtends(Tokens $tokens, int $classOpenIndex, return $classExtendsInfo; } + /** + * @param _ClassImplementsInfo $classImplementsInfo + * + * @return _ClassImplementsInfo + */ private function fixClassyDefinitionImplements(Tokens $tokens, int $classOpenIndex, array $classImplementsInfo): array { $endIndex = $tokens->getPrevNonWhitespace($classOpenIndex); @@ -243,6 +278,19 @@ private function fixClassyDefinitionImplements(Tokens $tokens, int $classOpenInd return $classImplementsInfo; } + /** + * @param array{ + * start: int, + * classy: int, + * open: int, + * extends: false|_ClassExtendsInfo, + * implements: false|_ClassImplementsInfo, + * anonymousClass: bool, + * final: false|int, + * abstract: false|int, + * readonly: false|int, + * } $classDefInfo + */ private function fixClassyDefinitionOpenSpacing(Tokens $tokens, array $classDefInfo): int { if ($classDefInfo['anonymousClass']) { @@ -281,8 +329,8 @@ private function fixClassyDefinitionOpenSpacing(Tokens $tokens, array $classDefI * start: int, * classy: int, * open: int, - * extends: false|array{start: int, numberOfExtends: int, multiLine: bool}, - * implements: false|array{start: int, numberOfImplements: int, multiLine: bool}, + * extends: false|_ClassExtendsInfo, + * implements: false|_ClassImplementsInfo, * anonymousClass: bool, * final: false|int, * abstract: false|int, @@ -306,11 +354,11 @@ private function getClassyDefinitionInfo(Tokens $tokens, int $classyIndex): arra if (!$tokens[$classyIndex]->isGivenKind(T_TRAIT)) { $extends = $tokens->findGivenKind(T_EXTENDS, $classyIndex, $openIndex); - $def['extends'] = [] !== $extends ? $this->getClassyInheritanceInfo($tokens, key($extends), 'numberOfExtends') : false; + $def['extends'] = [] !== $extends ? $this->getClassyInheritanceInfo($tokens, array_key_first($extends), 'numberOfExtends') : false; if (!$tokens[$classyIndex]->isGivenKind(T_INTERFACE)) { $implements = $tokens->findGivenKind(T_IMPLEMENTS, $classyIndex, $openIndex); - $def['implements'] = [] !== $implements ? $this->getClassyInheritanceInfo($tokens, key($implements), 'numberOfImplements') : false; + $def['implements'] = [] !== $implements ? $this->getClassyInheritanceInfo($tokens, array_key_first($implements), 'numberOfImplements') : false; $def['anonymousClass'] = $tokensAnalyzer->isAnonymousClass($classyIndex); } } @@ -336,6 +384,9 @@ private function getClassyDefinitionInfo(Tokens $tokens, int $classyIndex): arra return $def; } + /** + * @return array|array{start: int, multiLine: bool} + */ private function getClassyInheritanceInfo(Tokens $tokens, int $startIndex, string $label): array { $implementsInfo = ['start' => $startIndex, $label => 1, 'multiLine' => false]; @@ -362,15 +413,37 @@ private function makeClassyDefinitionSingleLine(Tokens $tokens, int $startIndex, { for ($i = $endIndex; $i >= $startIndex; --$i) { if ($tokens[$i]->isWhitespace()) { - if ($tokens[$i - 1]->isComment() || $tokens[$i + 1]->isComment()) { + if (str_contains($tokens[$i]->getContent(), "\n")) { + if (\defined('T_ATTRIBUTE')) { // @TODO: drop condition and else when PHP 8.0+ is required + if ($tokens[$i - 1]->isGivenKind(CT::T_ATTRIBUTE_CLOSE) || $tokens[$i + 1]->isGivenKind(T_ATTRIBUTE)) { + continue; + } + } else { + if (($tokens[$i - 1]->isComment() && str_ends_with($tokens[$i - 1]->getContent(), ']')) + || ($tokens[$i + 1]->isComment() && str_starts_with($tokens[$i + 1]->getContent(), '#[')) + ) { + continue; + } + } + + if ($tokens[$i - 1]->isGivenKind(T_DOC_COMMENT) || $tokens[$i + 1]->isGivenKind(T_DOC_COMMENT)) { + continue; + } + } + + if ($tokens[$i - 1]->isComment()) { $content = $tokens[$i - 1]->getContent(); + if (!str_starts_with($content, '//') && !str_starts_with($content, '#')) { + $tokens[$i] = new Token([T_WHITESPACE, ' ']); + } - if (!('#' === $content || str_starts_with($content, '//'))) { - $content = $tokens[$i + 1]->getContent(); + continue; + } - if (!('#' === $content || str_starts_with($content, '//'))) { - $tokens[$i] = new Token([T_WHITESPACE, ' ']); - } + if ($tokens[$i + 1]->isComment()) { + $content = $tokens[$i + 1]->getContent(); + if (!str_starts_with($content, '//')) { + $tokens[$i] = new Token([T_WHITESPACE, ' ']); } continue; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php index e13cc8f48..c79a10082 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalClassFixer.php @@ -39,7 +39,7 @@ class MyApp {} .'If you want to subclass a class, mark the parent class as abstract and create two child classes, one empty if necessary: you\'ll gain much more fine grained type-hinting. ' .'If you need to mock a standalone class, create an interface, or maybe it\'s a value-object that shouldn\'t be mocked at all. ' .'If you need to extend a standalone class, create an interface and use the Composite pattern. ' - .'If you aren\'t ready yet for serious OOP, go with FinalInternalClassFixer, it\'s fine.', + .'If these rules are too strict for you, you can use `FinalInternalClassFixer` instead.', 'Risky when subclassing non-abstract classes.' ); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php index 4764dcbcb..fb9e34df7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalInternalClassFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -34,9 +35,29 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * annotation_exclude?: list, + * annotation_include?: list, + * consider_absent_docblock_as_internal_class?: bool, + * exclude?: list, + * include?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * annotation_exclude: array, + * annotation_include: array, + * consider_absent_docblock_as_internal_class: bool, + * exclude: array, + * include: array, + * } */ final class FinalInternalClassFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const DEFAULTS = [ 'include' => [ 'internal', @@ -58,14 +79,7 @@ public function __construct() { parent::__construct(); - $this->checkAttributes = \PHP_VERSION_ID >= 80000; - } - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->assertConfigHasNoConflicts(); + $this->checkAttributes = \PHP_VERSION_ID >= 8_00_00; } public function getDefinition(): FixerDefinitionInterface @@ -108,6 +122,11 @@ public function isRisky(): bool return true; } + protected function configurePostNormalisation(): void + { + $this->assertConfigHasNoConflicts(); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $tokensAnalyzer = new TokensAnalyzer($tokens); @@ -131,7 +150,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { $annotationsAsserts = [static function (array $values): bool { foreach ($values as $value) { - if (!\is_string($value) || '' === $value) { + if ('' === $value) { return false; } } @@ -154,7 +173,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('annotation_include', 'Class level attribute or annotation tags that must be set in order to fix the class (case insensitive).')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues($annotationsAsserts) ->setDefault( array_map( @@ -166,7 +185,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setDeprecationMessage('Use `include` to configure PHPDoc annotations tags and attributes.') ->getOption(), (new FixerOptionBuilder('annotation_exclude', 'Class level attribute or annotation tags that must be omitted to fix the class, even if all of the white list ones are used as well (case insensitive).')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues($annotationsAsserts) ->setDefault( array_map( @@ -178,13 +197,13 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setDeprecationMessage('Use `exclude` to configure PHPDoc annotations tags and attributes.') ->getOption(), (new FixerOptionBuilder('include', 'Class level attribute or annotation tags that must be set in order to fix the class (case insensitive).')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues($annotationsAsserts) ->setDefault(self::DEFAULTS['include']) ->setNormalizer($annotationsNormalizer) ->getOption(), (new FixerOptionBuilder('exclude', 'Class level attribute or annotation tags that must be omitted to fix the class, even if all of the white list ones are used as well (case insensitive).')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues($annotationsAsserts) ->setDefault(self::DEFAULTS['exclude']) ->setNormalizer($annotationsNormalizer) @@ -225,7 +244,7 @@ private function isClassCandidate(TokensAnalyzer $tokensAnalyzer, Tokens $tokens $acceptTypes[] = T_READONLY; } - while ($currentIndex) { + while (null !== $currentIndex) { $currentIndex = $tokens->getPrevNonWhitespace($currentIndex); if (!$tokens[$currentIndex]->isGivenKind($acceptTypes)) { @@ -249,7 +268,7 @@ private function isClassCandidate(TokensAnalyzer $tokensAnalyzer, Tokens $tokens } return \in_array(true, $decisions, true) - || ([] === $decisions && $this->configuration['consider_absent_docblock_as_internal_class']); + || ([] === $decisions && true === $this->configuration['consider_absent_docblock_as_internal_class']); } private function isClassCandidateBasedOnPhpDoc(Tokens $tokens, int $index): ?bool @@ -321,8 +340,7 @@ private function isConfiguredAsInclude(array $attributes): bool private function assertConfigHasNoConflicts(): void { - foreach (['include', 'exclude'] as $newConfigKey) { - $oldConfigKey = 'annotation_'.$newConfigKey; + foreach (['include' => 'annotation_include', 'exclude' => 'annotation_exclude'] as $newConfigKey => $oldConfigKey) { $defaults = []; foreach (self::DEFAULTS[$newConfigKey] as $foo) { @@ -333,24 +351,24 @@ private function assertConfigHasNoConflicts(): void $oldConfigIsSet = $this->configuration[$oldConfigKey] !== $defaults; if ($newConfigIsSet && $oldConfigIsSet) { - throw new InvalidFixerConfigurationException($this->getName(), sprintf('Configuration cannot contain deprecated option "%s" and new option "%s".', $oldConfigKey, $newConfigKey)); + throw new InvalidFixerConfigurationException($this->getName(), \sprintf('Configuration cannot contain deprecated option "%s" and new option "%s".', $oldConfigKey, $newConfigKey)); } if ($oldConfigIsSet) { - $this->configuration[$newConfigKey] = $this->configuration[$oldConfigKey]; + $this->configuration[$newConfigKey] = $this->configuration[$oldConfigKey]; // @phpstan-ignore-line crazy mapping, to be removed while cleaning up deprecated options $this->checkAttributes = false; // run in old mode } // if ($newConfigIsSet) - only new config is set, all good // if (!$newConfigIsSet && !$oldConfigIsSet) - both are set as to default values, all good - unset($this->configuration[$oldConfigKey]); + unset($this->configuration[$oldConfigKey]); // @phpstan-ignore-line crazy mapping, to be removed while cleaning up deprecated options } $intersect = array_intersect_assoc($this->configuration['include'], $this->configuration['exclude']); if (\count($intersect) > 0) { - throw new InvalidFixerConfigurationException($this->getName(), sprintf('Annotation cannot be used in both "include" and "exclude" list, got duplicates: %s.', Utils::naturalLanguageJoin(array_keys($intersect)))); + throw new InvalidFixerConfigurationException($this->getName(), \sprintf('Annotation cannot be used in both "include" and "exclude" list, got duplicates: %s.', Utils::naturalLanguageJoin(array_keys($intersect)))); } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php index ed9a7ac7a..8b672d2d2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/FinalPublicMethodForAbstractClassFixer.php @@ -83,7 +83,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $abstracts = array_keys($tokens->findGivenKind(T_ABSTRACT)); - while ($abstractIndex = array_pop($abstracts)) { + foreach (array_reverse($abstracts) as $abstractIndex) { $classIndex = $tokens->getNextTokenOfKind($abstractIndex, [[T_CLASS], [T_FUNCTION]]); if (!$tokens[$classIndex]->isGivenKind(T_CLASS)) { continue; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php index b09c2a2b9..1a8267466 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoBlankLinesAfterClassOpeningFixer.php @@ -55,7 +55,7 @@ protected function foo() /** * {@inheritdoc} * - * Must run after OrderedClassElementsFixer. + * Must run after OrderedClassElementsFixer, PhpUnitDataProviderMethodOrderFixer. */ public function getPriority(): int { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php index be59a15ea..6547cc624 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoPhp4ConstructorFixer.php @@ -290,7 +290,7 @@ private function fixInfiniteRecursion(Tokens $tokens, int $start, int $end): voi * @param int $startIndex function/method start index * @param int $bodyIndex function/method body index * - * @return array an array containing the sequence and case sensitiveness [ 0 => $seq, 1 => $case ] + * @return array{list>, array{3: false}} */ private function getWrapperMethodSequence(Tokens $tokens, string $method, int $startIndex, int $bodyIndex): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php index 276bdabac..868d71b53 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/NoUnneededFinalMethodFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,9 +29,21 @@ /** * @author Filippo Tessarotto + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * private_methods?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * private_methods: bool, + * } */ final class NoUnneededFinalMethodFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -137,17 +150,8 @@ private function getMethods(Tokens $tokens): \Generator $enums = []; $classesAreFinal = []; - $elements = $tokensAnalyzer->getClassyElements(); - - for (end($elements);; prev($elements)) { - $index = key($elements); - - if (null === $index) { - break; - } - - $element = current($elements); + foreach ($tokensAnalyzer->getClassyElements() as $index => $element) { if ('method' !== $element['type']) { continue; // not a method } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php index 4337889c2..77bb2c867 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedClassElementsFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -25,12 +26,40 @@ use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +use PhpCsFixer\Utils; /** * @author Gregor Harlan + * + * @phpstan-type _ClassElement array{ + * start: int, + * visibility: string, + * abstract: bool, + * static: bool, + * readonly: bool, + * type: string, + * name: string, + * end: int, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case_sensitive?: bool, + * order?: list, + * sort_algorithm?: 'alpha'|'none', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case_sensitive: bool, + * order: list, + * sort_algorithm: 'alpha'|'none', + * } */ final class OrderedClassElementsFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** @internal */ public const SORT_ALPHA = 'alpha'; @@ -45,7 +74,7 @@ final class OrderedClassElementsFixer extends AbstractFixer implements Configura /** * @var array> Array containing all class element base types (keys) and their parent types (values) */ - private static array $typeHierarchy = [ + private const TYPE_HIERARCHY = [ 'use_trait' => null, 'public' => null, 'protected' => null, @@ -86,7 +115,7 @@ final class OrderedClassElementsFixer extends AbstractFixer implements Configura /** * @var array Array containing special method types */ - private static array $specialTypes = [ + private const SPECIAL_TYPES = [ 'construct' => null, 'destruct' => null, 'magic' => null, @@ -98,50 +127,6 @@ final class OrderedClassElementsFixer extends AbstractFixer implements Configura */ private array $typePosition; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->typePosition = []; - $pos = 0; - - foreach ($this->configuration['order'] as $type) { - $this->typePosition[$type] = $pos++; - } - - foreach (self::$typeHierarchy as $type => $parents) { - if (isset($this->typePosition[$type])) { - continue; - } - - if (null === $parents) { - $this->typePosition[$type] = null; - - continue; - } - - foreach ($parents as $parent) { - if (isset($this->typePosition[$parent])) { - $this->typePosition[$type] = $this->typePosition[$parent]; - - continue 2; - } - } - - $this->typePosition[$type] = null; - } - - $lastPosition = \count($this->configuration['order']); - - foreach ($this->typePosition as &$pos) { - if (null === $pos) { - $pos = $lastPosition; - } - - $pos *= 10; // last digit is used by phpunit method ordering - } - } - public function isCandidate(Tokens $tokens): bool { return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); @@ -222,9 +207,9 @@ public function AWs(){} ], 'Accepts a subset of pre-defined element types, special element groups, and custom patterns. -Element types: `[\''.implode('\', \'', array_keys(self::$typeHierarchy)).'\']` +Element types: `[\''.implode('\', \'', array_keys(self::TYPE_HIERARCHY)).'\']` -Special element types: `[\''.implode('\', \'', array_keys(self::$specialTypes)).'\']` +Special element types: `[\''.implode('\', \'', array_keys(self::SPECIAL_TYPES)).'\']` Custom values: @@ -235,7 +220,7 @@ public function AWs(){} /** * {@inheritdoc} * - * Must run before ClassAttributesSeparationFixer, NoBlankLinesAfterClassOpeningFixer, SpaceAfterSemicolonFixer. + * Must run before ClassAttributesSeparationFixer, NoBlankLinesAfterClassOpeningFixer, PhpUnitDataProviderMethodOrderFixer, SpaceAfterSemicolonFixer. * Must run after NoPhp4ConstructorFixer, ProtectedToPrivateFixer. */ public function getPriority(): int @@ -243,6 +228,48 @@ public function getPriority(): int return 65; } + protected function configurePostNormalisation(): void + { + $this->typePosition = []; + $position = 0; + + foreach ($this->configuration['order'] as $type) { + $this->typePosition[$type] = $position++; + } + + foreach (self::TYPE_HIERARCHY as $type => $parents) { + if (isset($this->typePosition[$type])) { + continue; + } + + if (null === $parents) { + $this->typePosition[$type] = null; + + continue; + } + + foreach ($parents as $parent) { + if (isset($this->typePosition[$parent])) { + $this->typePosition[$type] = $this->typePosition[$parent]; + + continue 2; + } + } + + $this->typePosition[$type] = null; + } + + $lastPosition = \count($this->configuration['order']); + + foreach ($this->typePosition as &$pos) { + if (null === $pos) { + $pos = $lastPosition; + } + + $pos *= 10; // last digit is used by phpunit method ordering + } + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { for ($i = 1, $count = $tokens->count(); $i < $count; ++$i) { @@ -257,8 +284,9 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } + $endIndex = $elements[array_key_last($elements)]['end']; + $sorted = $this->sortElements($elements); - $endIndex = $elements[\count($elements) - 1]['end']; if ($sorted !== $elements) { $this->sortTokens($tokens, $i, $endIndex, $sorted); @@ -270,11 +298,11 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { - $builtIns = array_keys(array_merge(self::$typeHierarchy, self::$specialTypes)); + $builtIns = array_keys(array_merge(self::TYPE_HIERARCHY, self::SPECIAL_TYPES)); return new FixerConfigurationResolver([ (new FixerOptionBuilder('order', 'List of strings defining order of elements.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([ static function (array $values) use ($builtIns): bool { foreach ($values as $value) { @@ -282,7 +310,7 @@ static function (array $values) use ($builtIns): bool { return true; } - if (\is_string($value) && 'method:' === substr($value, 0, 7)) { + if ('method:' === substr($value, 0, 7)) { return true; } } @@ -320,16 +348,7 @@ static function (array $values) use ($builtIns): bool { } /** - * @return list + * @return list<_ClassElement> */ private function getElements(Tokens $tokens, int $startIndex): array { @@ -392,7 +411,10 @@ private function getElements(Tokens $tokens, int $startIndex): array if ('property' === $element['type']) { $element['name'] = $tokens[$i]->getContent(); - } elseif (\in_array($element['type'], ['use_trait', 'case', 'constant', 'method', 'magic', 'construct', 'destruct'], true)) { + } elseif ('constant' === $element['type']) { + $equalsSignIndex = $tokens->getNextTokenOfKind($i, ['=']); + $element['name'] = $tokens[$tokens->getPrevMeaningfulToken($equalsSignIndex)]->getContent(); + } elseif (\in_array($element['type'], ['use_trait', 'case', 'method', 'magic', 'construct', 'destruct'], true)) { $element['name'] = $tokens[$tokens->getNextMeaningfulToken($i)]->getContent(); } @@ -407,7 +429,7 @@ private function getElements(Tokens $tokens, int $startIndex): array } /** - * @return array|string type or array of type and name + * @return list|string type or array of type and name */ private function detectElementType(Tokens $tokens, int $index) { @@ -461,7 +483,12 @@ private function detectElementType(Tokens $tokens, int $index) private function findElementEnd(Tokens $tokens, int $index): int { - $index = $tokens->getNextTokenOfKind($index, ['{', ';']); + $index = $tokens->getNextTokenOfKind($index, ['(', '{', ';']); + + if ($tokens[$index]->equals('(')) { + $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); + $index = $tokens->getNextTokenOfKind($index, ['{', ';']); + } if ($tokens[$index]->equals('{')) { $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); @@ -475,17 +502,9 @@ private function findElementEnd(Tokens $tokens, int $index): int } /** - * @return list + * @param list<_ClassElement> $elements + * + * @return list<_ClassElement> */ private function sortElements(array $elements): array { @@ -502,24 +521,22 @@ private function sortElements(array $elements): array 'doteardown' => 10, ]; - foreach ($elements as &$element) { + $getPositionType = function (array $element) use ($phpunitPositions): int { $type = $element['type']; if (\in_array($type, ['method', 'magic', 'phpunit'], true) && isset($this->typePosition["method:{$element['name']}"])) { - $element['position'] = $this->typePosition["method:{$element['name']}"]; - - continue; + return $this->typePosition["method:{$element['name']}"]; } - if (\array_key_exists($type, self::$specialTypes)) { + if (\array_key_exists($type, self::SPECIAL_TYPES)) { if (isset($this->typePosition[$type])) { - $element['position'] = $this->typePosition[$type]; + $position = $this->typePosition[$type]; if ('phpunit' === $type) { - $element['position'] += $phpunitPositions[$element['name']]; + $position += $phpunitPositions[$element['name']]; } - continue; + return $position; } $type = 'method'; @@ -541,51 +558,34 @@ private function sortElements(array $elements): array } } - $element['position'] = $this->typePosition[$type]; - } - - unset($element); - - usort($elements, function (array $a, array $b): int { - if ($a['position'] === $b['position']) { - return $this->sortGroupElements($a, $b); - } - - return $a['position'] <=> $b['position']; - }); - - return $elements; + return $this->typePosition[$type]; + }; + + return Utils::stableSort( + $elements, + /** + * @return array{element: _ClassElement, position: int} + */ + static fn (array $element): array => ['element' => $element, 'position' => $getPositionType($element)], + /** + * @param array{element: _ClassElement, position: int} $a + * @param array{element: _ClassElement, position: int} $b + * + * @return -1|0|1 + */ + fn (array $a, array $b): int => ($a['position'] === $b['position']) ? $this->sortGroupElements($a['element'], $b['element']) : $a['position'] <=> $b['position'], + ); } /** - * @param array{ - * start: int, - * visibility: string, - * abstract: bool, - * static: bool, - * readonly: bool, - * type: string, - * name: string, - * end: int, - * position: int, - * } $a - * @param array{ - * start: int, - * visibility: string, - * abstract: bool, - * static: bool, - * readonly: bool, - * type: string, - * name: string, - * end: int, - * position: int, - * } $b + * @param _ClassElement $a + * @param _ClassElement $b */ private function sortGroupElements(array $a, array $b): int { if (self::SORT_ALPHA === $this->configuration['sort_algorithm']) { - return $this->configuration['case_sensitive'] - ? strcmp($a['name'], $b['name']) + return true === $this->configuration['case_sensitive'] + ? $a['name'] <=> $b['name'] : strcasecmp($a['name'], $b['name']); } @@ -593,17 +593,7 @@ private function sortGroupElements(array $a, array $b): int } /** - * @param list $elements + * @param list<_ClassElement> $elements */ private function sortTokens(Tokens $tokens, int $startIndex, int $endIndex, array $elements): void { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php index 87647397f..573bc818d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedInterfacesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,9 +28,25 @@ /** * @author Dave van der Brugge + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case_sensitive?: bool, + * direction?: 'ascend'|'descend', + * order?: 'alpha'|'length', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case_sensitive: bool, + * direction: 'ascend'|'descend', + * order: 'alpha'|'length', + * } */ final class OrderedInterfacesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** @internal */ public const OPTION_DIRECTION = 'direction'; @@ -51,7 +68,7 @@ final class OrderedInterfacesFixer extends AbstractFixer implements Configurable /** * Array of supported directions in configuration. * - * @var string[] + * @var list */ private const SUPPORTED_DIRECTION_OPTIONS = [ self::DIRECTION_ASCEND, @@ -61,7 +78,7 @@ final class OrderedInterfacesFixer extends AbstractFixer implements Configurable /** * Array of supported orders in configuration. * - * @var string[] + * @var list */ private const SUPPORTED_ORDER_OPTIONS = [ self::ORDER_ALPHA, @@ -108,6 +125,16 @@ public function getDefinition(): FixerDefinitionInterface ); } + /** + * {@inheritdoc} + * + * Must run after FullyQualifiedStrictTypesFixer. + */ + public function getPriority(): int + { + return 0; + } + public function isCandidate(Tokens $tokens): bool { return $tokens->isTokenKindFound(T_IMPLEMENTS) @@ -132,7 +159,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } $implementsStart = $index + 1; - $implementsEnd = $tokens->getPrevNonWhitespace($tokens->getNextTokenOfKind($implementsStart, ['{'])); + $implementsEnd = $tokens->getPrevMeaningfulToken($tokens->getNextTokenOfKind($implementsStart, ['{'])); $interfaces = $this->getInterfaces($tokens, $implementsStart, $implementsEnd); @@ -141,7 +168,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } foreach ($interfaces as $interfaceIndex => $interface) { - $interfaceTokens = Tokens::fromArray($interface, false); + $interfaceTokens = Tokens::fromArray($interface); $normalized = ''; $actualInterfaceIndex = $interfaceTokens->getNextMeaningfulToken(-1); @@ -167,8 +194,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $score = self::ORDER_LENGTH === $this->configuration[self::OPTION_ORDER] ? \strlen($first['normalized']) - \strlen($second['normalized']) : ( - $this->configuration['case_sensitive'] - ? strcmp($first['normalized'], $second['normalized']) + true === $this->configuration['case_sensitive'] + ? $first['normalized'] <=> $second['normalized'] : strcasecmp($first['normalized'], $second['normalized']) ); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php index a46689b3d..381c8faa0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTraitsFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -25,8 +26,21 @@ use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case_sensitive?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case_sensitive: bool, + * } + */ final class OrderedTraitsFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -185,8 +199,8 @@ private function sort(Tokens $tokens, array $elements): void $sortedElements = $elements; uasort( $sortedElements, - fn (Tokens $useA, Tokens $useB): int => $this->configuration['case_sensitive'] - ? strcmp($toTraitName($useA), $toTraitName($useB)) + fn (Tokens $useA, Tokens $useB): int => true === $this->configuration['case_sensitive'] + ? $toTraitName($useA) <=> $toTraitName($useB) : strcasecmp($toTraitName($useA), $toTraitName($useB)) ); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTypesFixer.php index f1fe0bae9..d3d8b7032 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTypesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/OrderedTypesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -34,9 +35,25 @@ /** * @author John Paul E. Balandan, CPA + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case_sensitive?: bool, + * null_adjustment?: 'always_first'|'always_last'|'none', + * sort_algorithm?: 'alpha'|'none', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case_sensitive: bool, + * null_adjustment: 'always_first'|'always_last'|'none', + * sort_algorithm: 'alpha'|'none', + * } */ final class OrderedTypesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -74,7 +91,7 @@ public function bar(null|string|int $foo): string|int; public function foo(\Stringable&\Countable $obj): int; } ', - new VersionSpecification(80100), + new VersionSpecification(8_01_00), ['null_adjustment' => 'always_last'] ), new VersionSpecificCodeSample( @@ -84,7 +101,7 @@ interface Bar public function bar(null|string|int $foo): string|int; } ', - new VersionSpecification(80000), + new VersionSpecification(8_00_00), [ 'sort_algorithm' => 'none', 'null_adjustment' => 'always_last', @@ -304,11 +321,11 @@ private function isTypeSortable(TypeAnalysis $type): bool } /** - * @return array{0: array, 1: string} + * @return array{0: list|string>, 1: string} */ private function collectDisjunctiveNormalFormTypes(string $type): array { - $types = array_map(static function ($subType) { + $types = array_map(static function (string $subType) { if (str_starts_with($subType, '(')) { return explode('&', trim($subType, '()')); } @@ -320,7 +337,7 @@ private function collectDisjunctiveNormalFormTypes(string $type): array } /** - * @return array{0: string[], 1: string} + * @return array{0: list, 1: string} */ private function collectUnionOrIntersectionTypes(string $type): array { @@ -336,13 +353,13 @@ private function collectUnionOrIntersectionTypes(string $type): array } /** - * @param array $types + * @param list|string> $types * - * @return array + * @return ($types is list ? list : list>) */ private function runTypesThroughSortingAlgorithm(array $types): array { - $normalizeType = static fn (string $type): string => Preg::replace('/^\\\\?/', '', $type); + $normalizeType = static fn (string $type): string => Preg::replace('/^\\\?/', '', $type); usort($types, function ($a, $b) use ($normalizeType): int { if (\is_array($a)) { @@ -369,7 +386,7 @@ private function runTypesThroughSortingAlgorithm(array $types): array } if ('alpha' === $this->configuration['sort_algorithm']) { - return $this->configuration['case_sensitive'] ? strcmp($a, $b) : strcasecmp($a, $b); + return true === $this->configuration['case_sensitive'] ? $a <=> $b : strcasecmp($a, $b); } return 0; @@ -379,9 +396,9 @@ private function runTypesThroughSortingAlgorithm(array $types): array } /** - * @param array $types + * @param list|string> $types * - * @return array + * @return list */ private function createTypeDeclarationTokens(array $types, string $glue, bool $isDisjunctive = false): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php index 168bbb3b6..27cc50c48 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/ProtectedToPrivateFixer.php @@ -86,9 +86,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void foreach ($this->tokensAnalyzer->getClassyElements() as $index => $element) { $classIndex = $element['classIndex']; - if (!\array_key_exists($classIndex, $classesCandidate)) { - $classesCandidate[$classIndex] = $this->isClassCandidate($tokens, $classIndex); - } + $classesCandidate[$classIndex] ??= $this->isClassCandidate($tokens, $classIndex); if (false === $classesCandidate[$classIndex]) { continue; @@ -130,7 +128,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void * - an Enum (PHP8.1+) * - a class, which: * - is not anonymous - * - is not final + * - is final * - does not use traits * - does not extend other class. */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php index 1ad573c99..7150b6bbd 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SelfAccessorFixer.php @@ -184,7 +184,7 @@ private function getClassStart(Tokens $tokens, int $index, string $namespace): ? { $namespace = ('' !== $namespace ? '\\'.$namespace : '').'\\'; - foreach (array_reverse(Preg::split('/(\\\\)/', $namespace, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) as $piece) { + foreach (array_reverse(Preg::split('/(\\\)/', $namespace, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) as $piece) { $index = $tokens->getPrevMeaningfulToken($index); if ('\\' === $piece) { if (!$tokens[$index]->isGivenKind(T_NS_SEPARATOR)) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php index 2eed24643..24f040691 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleClassElementPerStatementFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; @@ -35,9 +36,21 @@ * * @author Javier Spagnoletti * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * elements?: list<'const'|'property'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * elements: list<'const'|'property'>, + * } */ final class SingleClassElementPerStatementFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function isCandidate(Tokens $tokens): bool { return $tokens->isAnyTokenKindsFound(Token::getClassyTokenKinds()); @@ -102,7 +115,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('elements', 'List of strings which element should be modified.')) ->setDefault($values) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($values)]) ->getOption(), ]); @@ -195,7 +208,7 @@ private function expandElement(Tokens $tokens, string $type, int $startIndex, in } /** - * @return Token[] + * @return list */ private function getModifiersSequences(Tokens $tokens, string $type, int $startIndex, int $endIndex): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php index ec20f3cad..03eb845aa 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/SingleTraitInsertPerStatementFixer.php @@ -70,7 +70,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @param int[] $candidates ',' indices to fix + * @param list $candidates ',' indices to fix */ private function fixTraitUse(Tokens $tokens, int $useTraitIndex, array $candidates): void { @@ -95,7 +95,7 @@ private function fixTraitUse(Tokens $tokens, int $useTraitIndex, array $candidat } /** - * @return int[] + * @return list */ private function getCandidates(Tokens $tokens, int $index): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php index d98168c81..96335b6ba 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ClassNotation/VisibilityRequiredFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -32,9 +33,21 @@ * Fixer for rules defined in PSR2 ¶4.3, ¶4.5. * * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * elements?: list<'const'|'method'|'property'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * elements: list<'const'|'method'|'property'>, + * } */ final class VisibilityRequiredFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -83,11 +96,13 @@ public function isCandidate(Tokens $tokens): bool protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { + $elements = ['const', 'method', 'property']; + return new FixerConfigurationResolver([ (new FixerOptionBuilder('elements', 'The structural elements to fix (PHP >= 7.1 required for `const`).')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(['property', 'method', 'const'])]) - ->setDefault(['property', 'method', 'const']) + ->setAllowedTypes(['string[]']) + ->setAllowedValues([new AllowedValueSubset($elements)]) + ->setDefault($elements) ->getOption(), ]); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php index 610260598..5ba952467 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/CommentToPhpdocFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -31,11 +32,23 @@ /** * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * ignored_tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * ignored_tags: list, + * } */ final class CommentToPhpdocFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var string[] + * @var list */ private array $ignoredTags = []; @@ -52,7 +65,7 @@ public function isRisky(): bool /** * {@inheritdoc} * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. + * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. * Must run after AlignMultilineCommentFixer. */ public function getPriority(): int @@ -74,10 +87,8 @@ public function getDefinition(): FixerDefinitionInterface ); } - public function configure(array $configuration): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - $this->ignoredTags = array_map( static fn (string $tag): string => strtolower($tag), $this->configuration['ignored_tags'] @@ -88,7 +99,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('ignored_tags', 'List of ignored tags.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault([]) ->getOption(), ]); @@ -124,7 +135,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @param int[] $indices + * @param list $indices */ private function isCommentCandidate(Tokens $tokens, array $indices): bool { @@ -134,7 +145,7 @@ function (bool $carry, int $index) use ($tokens): bool { if ($carry) { return true; } - if (!Preg::match('~(?:#|//|/\*+|\R(?:\s*\*)?)\s*\@([a-zA-Z0-9_\\\\-]+)(?=\s|\(|$)~', $tokens[$index]->getContent(), $matches)) { + if (!Preg::match('~(?:#|//|/\*+|\R(?:\s*\*)?)\s*\@([a-zA-Z0-9_\\\-]+)(?=\s|\(|$)~', $tokens[$index]->getContent(), $matches)) { return false; } @@ -145,12 +156,12 @@ function (bool $carry, int $index) use ($tokens): bool { } /** - * @param int[] $indices + * @param non-empty-list $indices */ private function fixComment(Tokens $tokens, array $indices): void { if (1 === \count($indices)) { - $this->fixCommentSingleLine($tokens, reset($indices)); + $this->fixCommentSingleLine($tokens, $indices[0]); } else { $this->fixCommentMultiLine($tokens, $indices); } @@ -172,11 +183,11 @@ private function fixCommentSingleLine(Tokens $tokens, int $index): void } /** - * @param int[] $indices + * @param non-empty-list $indices */ private function fixCommentMultiLine(Tokens $tokens, array $indices): void { - $startIndex = reset($indices); + $startIndex = $indices[0]; $indent = Utils::calculateTrailingWhitespaceIndent($tokens[$startIndex - 1]); $newContent = '/**'.$this->whitespacesConfig->getLineEnding(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php index e6da49d83..1bccd768e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/HeaderCommentFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -25,15 +26,36 @@ use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Preg; +use PhpCsFixer\PregException; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; use Symfony\Component\OptionsResolver\Options; /** * @author Antonio J. García Lagar + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * comment_type?: 'PHPDoc'|'comment', + * header: string, + * location?: 'after_declare_strict'|'after_open', + * separate?: 'both'|'bottom'|'none'|'top', + * validator?: null|string, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * comment_type: 'PHPDoc'|'comment', + * header: string, + * location: 'after_declare_strict'|'after_open', + * separate: 'both'|'bottom'|'none'|'top', + * validator: null|string, + * } */ final class HeaderCommentFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -71,7 +93,7 @@ public function getDefinition(): FixerDefinitionInterface ', [ 'header' => 'Made with love.', - 'comment_type' => 'PHPDoc', + 'comment_type' => self::HEADER_PHPDOC, 'location' => 'after_open', 'separate' => 'bottom', ] @@ -86,7 +108,26 @@ public function getDefinition(): FixerDefinitionInterface ', [ 'header' => 'Made with love.', - 'comment_type' => 'comment', + 'comment_type' => self::HEADER_COMMENT, + 'location' => 'after_declare_strict', + ] + ), + new CodeSample( + ' 'Made with love.', + 'validator' => '/Made with love(?P.*)??/s', + 'comment_type' => self::HEADER_COMMENT, 'location' => 'after_declare_strict', ] ), @@ -112,7 +153,7 @@ public function getDefinition(): FixerDefinitionInterface public function isCandidate(Tokens $tokens): bool { - return $tokens->isMonolithicPhp(); + return $tokens->isMonolithicPhp() && !$tokens->isTokenKindFound(T_OPEN_TAG_WITH_ECHO); } /** @@ -131,6 +172,7 @@ public function getPriority(): int protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { + $headerAsComment = $this->getHeaderAsComment(); $location = $this->configuration['location']; $locationIndices = []; @@ -142,24 +184,50 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } } + // pre-run to find existing comment, if dynamic content is allowed + if (null !== $this->configuration['validator']) { + foreach ($locationIndices as $possibleLocation) { + // figure out where the comment should be placed + $headerNewIndex = $this->findHeaderCommentInsertionIndex($tokens, $possibleLocation); + + // check if there is already a comment + $headerCurrentIndex = $this->findHeaderCommentCurrentIndex($tokens, $headerAsComment, $headerNewIndex - 1); + + if (null === $headerCurrentIndex) { + continue; + } + $currentHeaderComment = $tokens[$headerCurrentIndex]->getContent(); + + $lines = implode("\n", array_map( + static fn (string $line): string => ' *' === $line ? '' : (str_starts_with($line, ' * ') ? substr($line, 3) : $line), + \array_slice(explode("\n", $currentHeaderComment), 1, -1), + )); + + if ($this->doesTokenFulfillValidator($tokens[$headerCurrentIndex])) { + $headerAsComment = $currentHeaderComment; + } + } + } + foreach ($locationIndices as $possibleLocation) { // figure out where the comment should be placed $headerNewIndex = $this->findHeaderCommentInsertionIndex($tokens, $possibleLocation); // check if there is already a comment - $headerCurrentIndex = $this->findHeaderCommentCurrentIndex($tokens, $headerNewIndex - 1); + $headerCurrentIndex = $this->findHeaderCommentCurrentIndex($tokens, $headerAsComment, $headerNewIndex - 1); if (null === $headerCurrentIndex) { if ('' === $this->configuration['header'] || $possibleLocation !== $location) { continue; } - $this->insertHeader($tokens, $headerNewIndex); + $this->insertHeader($tokens, $headerAsComment, $headerNewIndex); continue; } - $sameComment = $this->getHeaderAsComment() === $tokens[$headerCurrentIndex]->getContent(); + $currentHeaderComment = $tokens[$headerCurrentIndex]->getContent(); + $sameComment = $headerAsComment === $currentHeaderComment; $expectedLocation = $possibleLocation === $location; if (!$sameComment || !$expectedLocation) { @@ -172,7 +240,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } if ($possibleLocation === $location) { - $this->insertHeader($tokens, $headerNewIndex); + $this->insertHeader($tokens, $headerAsComment, $headerNewIndex); } continue; @@ -201,6 +269,21 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return $value; }) ->getOption(), + (new FixerOptionBuilder('validator', 'RegEx validator for header content.')) + ->setAllowedTypes(['string', 'null']) + ->setNormalizer(static function (Options $options, ?string $value) use ($fixerName): ?string { + if (null !== $value) { + try { + Preg::match($value, ''); + } catch (PregException $exception) { + throw new InvalidFixerConfigurationException($fixerName, 'Provided RegEx is not valid.'); + } + } + + return $value; + }) + ->setDefault(null) + ->getOption(), (new FixerOptionBuilder('comment_type', 'Comment syntax type.')) ->setAllowedValues([self::HEADER_PHPDOC, self::HEADER_COMMENT]) ->setDefault(self::HEADER_COMMENT) @@ -216,6 +299,21 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ]); } + private function doesTokenFulfillValidator(Token $token): bool + { + if (null === $this->configuration['validator']) { + throw new \LogicException(\sprintf("Cannot call '%s' method while missing config:validator.", __METHOD__)); + } + $currentHeaderComment = $token->getContent(); + + $lines = implode("\n", array_map( + static fn (string $line): string => ' *' === $line ? '' : (str_starts_with($line, ' * ') ? substr($line, 3) : $line), + \array_slice(explode("\n", $currentHeaderComment), 1, -1), + )); + + return Preg::match($this->configuration['validator'], $lines); + } + /** * Enclose the given text in a comment block. */ @@ -232,7 +330,7 @@ private function getHeaderAsComment(): string return $comment.' */'; } - private function findHeaderCommentCurrentIndex(Tokens $tokens, int $headerNewIndex): ?int + private function findHeaderCommentCurrentIndex(Tokens $tokens, string $headerAsComment, int $headerNewIndex): ?int { $index = $tokens->getNextNonWhitespace($headerNewIndex); @@ -258,7 +356,14 @@ private function findHeaderCommentCurrentIndex(Tokens $tokens, int $headerNewInd return $index; } - return $this->getHeaderAsComment() === $tokens[$index]->getContent() ? $index : null; + if ( + $headerAsComment === $tokens[$index]->getContent() + || (null !== $this->configuration['validator'] && $this->doesTokenFulfillValidator($tokens[$index])) + ) { + return $index; + } + + return null; } /** @@ -266,11 +371,7 @@ private function findHeaderCommentCurrentIndex(Tokens $tokens, int $headerNewInd */ private function findHeaderCommentInsertionIndex(Tokens $tokens, string $location): int { - $openTagIndex = $tokens[0]->isGivenKind(T_OPEN_TAG) ? 0 : $tokens->getNextTokenOfKind(0, [[T_OPEN_TAG]]); - - if (null === $openTagIndex) { - return 1; - } + $openTagIndex = $tokens[0]->isGivenKind(T_INLINE_HTML) ? 1 : 0; if ('after_open' === $location) { return $openTagIndex + 1; @@ -434,9 +535,9 @@ private function removeHeader(Tokens $tokens, int $index): void $tokens->clearTokenAndMergeSurroundingWhitespace($index); } - private function insertHeader(Tokens $tokens, int $index): void + private function insertHeader(Tokens $tokens, string $headerAsComment, int $index): void { - $tokens->insertAt($index, new Token([self::HEADER_COMMENT === $this->configuration['comment_type'] ? T_COMMENT : T_DOC_COMMENT, $this->getHeaderAsComment()])); + $tokens->insertAt($index, new Token([self::HEADER_COMMENT === $this->configuration['comment_type'] ? T_COMMENT : T_DOC_COMMENT, $headerAsComment])); $this->fixWhiteSpaceAroundHeader($tokens, $index); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php index dc4b7dc33..055c701bb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/MultilineCommentOpeningClosingFixer.php @@ -75,11 +75,11 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // Fix opening if ($token->isGivenKind(T_COMMENT)) { - $newContent = Preg::replace('/^\\/\\*{2,}(?!\\/)/', '/*', $newContent); + $newContent = Preg::replace('/^\/\*{2,}(?!\/)/', '/*', $newContent); } // Fix closing - $newContent = Preg::replace('/(?getId(), $newContent]); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php index c2d6c7442..23f0b1a3a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/NoEmptyCommentFixer.php @@ -60,7 +60,11 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - [$blockStart, $index, $isEmpty] = $this->getCommentBlock($tokens, $index); + $blockInfo = $this->getCommentBlock($tokens, $index); + $blockStart = $blockInfo['blockStart']; + $index = $blockInfo['blockEnd']; + $isEmpty = $blockInfo['isEmpty']; + if (false === $isEmpty) { continue; } @@ -75,6 +79,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void * Return the start index, end index and a flag stating if the comment block is empty. * * @param int $index T_COMMENT index + * + * @return array{blockStart: int, blockEnd: int, isEmpty: bool} */ private function getCommentBlock(Tokens $tokens, int $index): array { @@ -82,7 +88,11 @@ private function getCommentBlock(Tokens $tokens, int $index): array $empty = $this->isEmptyComment($tokens[$index]->getContent()); if (self::TYPE_SLASH_ASTERISK === $commentType) { - return [$index, $index, $empty]; + return [ + 'blockStart' => $index, + 'blockEnd' => $index, + 'isEmpty' => $empty, + ]; } $start = $index; @@ -107,7 +117,11 @@ private function getCommentBlock(Tokens $tokens, int $index): array } } - return [$start, $index - 1, $empty]; + return [ + 'blockStart' => $start, + 'blockEnd' => $index - 1, + 'isEmpty' => $empty, + ]; } private function getCommentType(string $content): int diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentSpacingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentSpacingFixer.php index ecf09eca1..7b6931ccd 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentSpacingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentSpacingFixer.php @@ -99,7 +99,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // fix space between comment open and leading text private function fixCommentLeadingSpace(string $content, string $prefix): string { - if (Preg::match(sprintf('@^%s\h+.*$@', preg_quote($prefix, '@')), $content)) { + if (Preg::match(\sprintf('@^%s\h+.*$@', preg_quote($prefix, '@')), $content)) { return $content; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php index aaf81ed90..050c3c12d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Comment/SingleLineCommentStyleFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -29,26 +30,24 @@ /** * @author Filippo Tessarotto + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * comment_types?: list<'asterisk'|'hash'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * comment_types: list<'asterisk'|'hash'>, + * } */ final class SingleLineCommentStyleFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var bool - */ - private $asteriskEnabled; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; - /** - * @var bool - */ - private $hashEnabled; + private bool $asteriskEnabled; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->asteriskEnabled = \in_array('asterisk', $this->configuration['comment_types'], true); - $this->hashEnabled = \in_array('hash', $this->configuration['comment_types'], true); - } + private bool $hashEnabled; public function getDefinition(): FixerDefinitionInterface { @@ -111,6 +110,12 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound(T_COMMENT); } + protected function configurePostNormalisation(): void + { + $this->asteriskEnabled = \in_array('asterisk', $this->configuration['comment_types'], true); + $this->hashEnabled = \in_array('hash', $this->configuration['comment_types'], true); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { foreach ($tokens as $index => $token) { @@ -119,7 +124,9 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } $content = $token->getContent(); - $commentContent = substr($content, 2, -2) ?: ''; + + /** @TODO PHP 8.0 - no more need for `?: ''` */ + $commentContent = substr($content, 2, -2) ?: ''; // @phpstan-ignore-line if ($this->hashEnabled && str_starts_with($content, '#')) { if (isset($content[1]) && '[' === $content[1]) { @@ -162,7 +169,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('comment_types', 'List of comment types to fix.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset(['asterisk', 'hash'])]) ->setDefault(['asterisk', 'hash']) ->getOption(), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php index 24ce993ba..443141c33 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerInterface.php @@ -19,6 +19,9 @@ /** * @author Dariusz Rumiński + * + * @template TFixerInputConfig of array + * @template TFixerComputedConfig of array */ interface ConfigurableFixerInterface extends FixerInterface { @@ -34,7 +37,7 @@ interface ConfigurableFixerInterface extends FixerInterface * eg `php_unit_strict` fixer allows to configure which methods should be fixed. * Finally, some fixers need configuration to work, eg `header_comment`. * - * @param array $configuration configuration depends on Fixer + * @param TFixerInputConfig $configuration configuration depends on Fixer * * @throws InvalidFixerConfigurationException */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerTrait.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerTrait.php new file mode 100644 index 000000000..b01209946 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConfigurableFixerTrait.php @@ -0,0 +1,124 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer; + +use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; +use PhpCsFixer\ConfigurationException\InvalidForEnvFixerConfigurationException; +use PhpCsFixer\ConfigurationException\RequiredFixerConfigurationException; +use PhpCsFixer\Console\Application; +use PhpCsFixer\FixerConfiguration\DeprecatedFixerOption; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; +use PhpCsFixer\Utils; +use Symfony\Component\OptionsResolver\Exception\ExceptionInterface; +use Symfony\Component\OptionsResolver\Exception\MissingOptionsException; + +/** + * @author Dariusz Rumiński + * + * @internal + * + * @template TFixerInputConfig of array + * @template TFixerComputedConfig of array + */ +trait ConfigurableFixerTrait +{ + /** + * @var null|TFixerComputedConfig + */ + protected ?array $configuration = null; + + private ?FixerConfigurationResolverInterface $configurationDefinition = null; + + /** + * @param TFixerInputConfig $configuration + */ + final public function configure(array $configuration): void + { + $this->configurePreNormalisation($configuration); + + foreach ($this->getConfigurationDefinition()->getOptions() as $option) { + if (!$option instanceof DeprecatedFixerOption) { + continue; + } + + $name = $option->getName(); + if (\array_key_exists($name, $configuration)) { + Utils::triggerDeprecation(new \InvalidArgumentException(\sprintf( + 'Option "%s" for rule "%s" is deprecated and will be removed in version %d.0. %s', + $name, + $this->getName(), + Application::getMajorVersion() + 1, + str_replace('`', '"', $option->getDeprecationMessage()) + ))); + } + } + + try { + $this->configuration = $this->getConfigurationDefinition()->resolve($configuration); // @phpstan-ignore-line ->configuration typehint is autogenerated base on ConfigurationDefinition + } catch (MissingOptionsException $exception) { + throw new RequiredFixerConfigurationException( + $this->getName(), + \sprintf('Missing required configuration: %s', $exception->getMessage()), + $exception + ); + } catch (InvalidOptionsForEnvException $exception) { + throw new InvalidForEnvFixerConfigurationException( + $this->getName(), + \sprintf('Invalid configuration for env: %s', $exception->getMessage()), + $exception + ); + } catch (ExceptionInterface $exception) { + throw new InvalidFixerConfigurationException( + $this->getName(), + \sprintf('Invalid configuration: %s', $exception->getMessage()), + $exception + ); + } + + $this->configurePostNormalisation(); + } + + final public function getConfigurationDefinition(): FixerConfigurationResolverInterface + { + if (null === $this->configurationDefinition) { + $this->configurationDefinition = $this->createConfigurationDefinition(); + } + + return $this->configurationDefinition; + } + + abstract public function getName(): string; + + /** + * One can override me. + * + * @param TFixerInputConfig $configuration + */ + protected function configurePreNormalisation(array &$configuration): void + { + // 🤔 ideally this method won't be needed, maybe we can remove it over time + } + + /** + * One can override me. + */ + protected function configurePostNormalisation(): void + { + // 🤔 ideally this method won't be needed, maybe we can remove it over time + } + + abstract protected function createConfigurationDefinition(): FixerConfigurationResolverInterface; +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php index ed767cf05..7528d5c26 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ConstantNotation/NativeConstantInvocationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -31,9 +32,29 @@ /** * @author Filippo Tessarotto + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * exclude?: list, + * fix_built_in?: bool, + * include?: list, + * scope?: 'all'|'namespaced', + * strict?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * exclude: list, + * fix_built_in: bool, + * include: list, + * scope: 'all'|'namespaced', + * strict: bool, + * } */ final class NativeConstantInvocationFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array */ @@ -113,10 +134,8 @@ public function isRisky(): bool return true; } - public function configure(array $configuration): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - $uniqueConfiguredExclude = array_unique($this->configuration['exclude']); // Case-sensitive constants handling @@ -130,6 +149,7 @@ public function configure(array $configuration): void } } + /** @var list */ $constantsToEscape = array_diff( array_unique($constantsToEscape), $uniqueConfiguredExclude @@ -188,8 +208,8 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { $constantChecker = static function (array $value): bool { foreach ($value as $constantName) { - if (!\is_string($constantName) || '' === trim($constantName) || trim($constantName) !== $constantName) { - throw new InvalidOptionsException(sprintf( + if (trim($constantName) !== $constantName) { + throw new InvalidOptionsException(\sprintf( 'Each element must be a non-empty, trimmed string, got "%s" instead.', get_debug_type($constantName) )); @@ -205,12 +225,12 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setDefault(true) ->getOption(), (new FixerOptionBuilder('include', 'List of additional constants to fix.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([$constantChecker]) ->setDefault([]) ->getOption(), (new FixerOptionBuilder('exclude', 'List of constants to ignore.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([$constantChecker]) ->setDefault(['null', 'false', 'true']) ->getOption(), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureContinuationPositionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureContinuationPositionFixer.php index a51fa779a..adbed305b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureContinuationPositionFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/ControlStructureContinuationPositionFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -26,8 +27,21 @@ use PhpCsFixer\Tokenizer\Analyzer\WhitespacesAnalyzer; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * position?: 'next_line'|'same_line', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * position: 'next_line'|'same_line', + * } + */ final class ControlStructureContinuationPositionFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -134,8 +148,8 @@ private function fixControlContinuationBraces(Tokens $tokens): void $tokens->ensureWhitespaceAtIndex( $index - 1, 1, - self::NEXT_LINE === $this->configuration['position'] ? - $this->whitespacesConfig->getLineEnding().WhitespacesAnalyzer::detectIndent($tokens, $index) + self::NEXT_LINE === $this->configuration['position'] + ? $this->whitespacesConfig->getLineEnding().WhitespacesAnalyzer::detectIndent($tokens, $index) : ' ' ); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php index 54f804fed..e5df796ba 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopBodyFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -26,8 +27,21 @@ use PhpCsFixer\Tokenizer\Tokens; use PhpCsFixer\Tokenizer\TokensAnalyzer; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * style?: 'braces'|'semicolon', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * style: 'braces'|'semicolon', + * } + */ final class EmptyLoopBodyFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const STYLE_BRACES = 'braces'; private const STYLE_SEMICOLON = 'semicolon'; @@ -43,7 +57,7 @@ public function getDefinition(): FixerDefinitionInterface new CodeSample( " 'braces', + 'style' => self::STYLE_BRACES, ] ), ] diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopConditionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopConditionFixer.php index 6e3c81fca..ef186fb39 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopConditionFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/EmptyLoopConditionFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -25,8 +26,21 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * style?: 'for'|'while', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * style: 'for'|'while', + * } + */ final class EmptyLoopConditionFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const STYLE_FOR = 'for'; private const STYLE_WHILE = 'while'; @@ -39,7 +53,7 @@ public function getDefinition(): FixerDefinitionInterface 'Empty loop-condition must be in configured style.', [ new CodeSample(" 'for']), + new CodeSample(" self::STYLE_FOR]), ] ); } @@ -131,7 +145,7 @@ private static function clearNotCommentsInRange(Tokens $tokens, int $indexStart, } /** - * @param Token[] $replacement + * @param list $replacement */ private static function cloneAndInsert(Tokens $tokens, int $index, array $replacement): void { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php index e994ad929..0502fd06e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoAlternativeSyntaxFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,9 +28,21 @@ /** * @author Eddilbert Macharia + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * fix_non_monolithic_code?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * fix_non_monolithic_code: bool, + * } */ final class NoAlternativeSyntaxFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php index b50a6c855..67d9dfc0c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoBreakCommentFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -32,9 +33,21 @@ /** * Fixer for rule defined in PSR2 ¶5.2. + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * comment_text?: string, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * comment_text: string, + * } */ final class NoBreakCommentFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -335,7 +348,7 @@ private function getStructureEnd(Tokens $tokens, int $position): int } /** - * @return array + * @return list */ private static function getParenthesisedStructureKinds(): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededBracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededBracesFixer.php index 281eca162..14b04d40c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededBracesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededBracesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -25,8 +26,21 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * namespaces?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * namespaces: bool, + * } + */ final class NoUnneededBracesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -134,9 +148,17 @@ private function clearIfIsOverCompleteNamespaceBlock(Tokens $tokens): void $index = $tokens->getNextTokenOfKind(0, [[T_NAMESPACE]]); - do { + $namespaceIsNamed = false; + + $index = $tokens->getNextMeaningfulToken($index); + while ($tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR])) { $index = $tokens->getNextMeaningfulToken($index); - } while ($tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR])); + $namespaceIsNamed = true; + } + + if (!$namespaceIsNamed) { + return; + } if (!$tokens[$index]->equals('{')) { return; // `;` diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php index b0156c27a..b3771cfbb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededControlParenthesesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -32,11 +33,23 @@ * @author Sullivan Senechal * @author Dariusz Rumiński * @author Gregor Harlan + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * statements?: list<'break'|'clone'|'continue'|'echo_print'|'negative_instanceof'|'others'|'return'|'switch_case'|'yield'|'yield_from'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * statements: list<'break'|'clone'|'continue'|'echo_print'|'negative_instanceof'|'others'|'return'|'switch_case'|'yield'|'yield_from'>, + * } */ final class NoUnneededControlParenthesesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var int[] + * @var list */ private const BLOCK_TYPES = [ Tokens::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE, @@ -102,7 +115,7 @@ final class NoUnneededControlParenthesesFixer extends AbstractFixer implements C ]; /** - * @var list|string> + * @var list */ private array $noopTypes; @@ -271,7 +284,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('statements', 'List of control statements to fix.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset(self::CONFIG_OPTIONS)]) ->setDefault(array_values($defaults)) ->getOption(), @@ -691,14 +704,12 @@ private function removeUselessParenthesisPair( return; } - $needsSpaceAfter = - !$this->isAccess($tokens, $afterCloseIndex) + $needsSpaceAfter = !$this->isAccess($tokens, $afterCloseIndex) && !$tokens[$afterCloseIndex]->equalsAny([';', ',', [T_CLOSE_TAG]]) && null === $this->getBlock($tokens, $afterCloseIndex, false) && !($tokens[$afterCloseIndex]->equalsAny([':', ';']) && $tokens[$beforeOpenIndex]->isGivenKind(T_CASE)); - $needsSpaceBefore = - !$this->isPreUnaryOperation($tokens, $beforeOpenIndex) + $needsSpaceBefore = !$this->isPreUnaryOperation($tokens, $beforeOpenIndex) && !$tokens[$beforeOpenIndex]->equalsAny(['}', [T_EXIT], [T_OPEN_TAG]]) && null === $this->getBlock($tokens, $beforeOpenIndex, true); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php index b71c524ba..cbd7a00a7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/NoUnneededCurlyBracesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractProxyFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\DeprecatedFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -25,9 +26,21 @@ /** * @deprecated + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * namespaces?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * namespaces: bool, + * } */ final class NoUnneededCurlyBracesFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, DeprecatedFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private NoUnneededBracesFixer $noUnneededBracesFixer; public function __construct() @@ -49,13 +62,6 @@ public function getDefinition(): FixerDefinitionInterface ); } - public function configure(array $configuration): void - { - $this->noUnneededBracesFixer->configure($configuration); - - parent::configure($configuration); - } - /** * {@inheritdoc} * @@ -73,6 +79,14 @@ public function getSuccessorsNames(): array ]; } + /** + * @param _AutogeneratedInputConfiguration $configuration + */ + protected function configurePreNormalisation(array $configuration): void + { + $this->noUnneededBracesFixer->configure($configuration); + } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php index 9710a9fda..a36337003 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php @@ -27,7 +27,7 @@ final class SimplifiedIfReturnFixer extends AbstractFixer { /** - * @var list|string>}> + * @var list}> */ private array $sequences = [ [ @@ -106,7 +106,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - $firstSequenceIndex = key($sequenceFound); + $firstSequenceIndex = array_key_first($sequenceFound); if ($firstSequenceIndex !== $firstCandidateIndex) { continue; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php index 23b523a8c..b42fc3a99 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/SwitchContinueToBreakFixer.php @@ -25,7 +25,7 @@ final class SwitchContinueToBreakFixer extends AbstractFixer { /** - * @var int[] + * @var list */ private array $switchLevels = []; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php index 19cfffe89..d97d6f65b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/TrailingCommaInMultilineFixer.php @@ -16,11 +16,11 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; -use PhpCsFixer\FixerConfiguration\InvalidOptionsForEnvException; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; @@ -30,15 +30,28 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; use PhpCsFixer\Tokenizer\TokensAnalyzer; -use Symfony\Component\OptionsResolver\Options; /** * @author Sebastiaan Stok * @author Dariusz Rumiński * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * after_heredoc?: bool, + * elements?: list<'arguments'|'array_destructuring'|'arrays'|'match'|'parameters'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * after_heredoc: bool, + * elements: list<'arguments'|'array_destructuring'|'arrays'|'match'|'parameters'>, + * } */ final class TrailingCommaInMultilineFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -56,10 +69,12 @@ final class TrailingCommaInMultilineFixer extends AbstractFixer implements Confi private const MATCH_EXPRESSIONS = 'match'; + private const ARRAY_DESTRUCTURING = 'array_destructuring'; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Multi-line arrays, arguments list, parameters list and `match` expressions must have a trailing comma.', + 'Arguments lists, array destructuring lists, arrays that are multi-line, `match`-lines and parameters lists must have a trailing comma.', [ new CodeSample("isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN, '(']); + return $tokens->isAnyTokenKindsFound([T_ARRAY, CT::T_ARRAY_SQUARE_BRACE_OPEN, '(', CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN]); } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface @@ -92,45 +107,46 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('after_heredoc', 'Whether a trailing comma should also be placed after heredoc end.')) ->setAllowedTypes(['bool']) - ->setDefault(false) + ->setDefault(false) // @TODO 4.0: set to `true`. ->getOption(), - (new FixerOptionBuilder('elements', sprintf('Where to fix multiline trailing comma (PHP >= 8.0 for `%s` and `%s`).', self::ELEMENTS_PARAMETERS, self::MATCH_EXPRESSIONS))) // @TODO: remove text when PHP 8.0+ is required - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset([self::ELEMENTS_ARRAYS, self::ELEMENTS_ARGUMENTS, self::ELEMENTS_PARAMETERS, self::MATCH_EXPRESSIONS])]) + (new FixerOptionBuilder('elements', \sprintf('Where to fix multiline trailing comma (PHP >= 8.0 for `%s` and `%s`).', self::ELEMENTS_PARAMETERS, self::MATCH_EXPRESSIONS))) // @TODO: remove text when PHP 8.0+ is required + ->setAllowedTypes(['string[]']) + ->setAllowedValues([ + new AllowedValueSubset([ + self::ARRAY_DESTRUCTURING, + self::ELEMENTS_ARGUMENTS, + self::ELEMENTS_ARRAYS, + self::ELEMENTS_PARAMETERS, + self::MATCH_EXPRESSIONS, + ]), + ]) ->setDefault([self::ELEMENTS_ARRAYS]) - ->setNormalizer(static function (Options $options, $value) { - if (\PHP_VERSION_ID < 8_00_00) { // @TODO: drop condition when PHP 8.0+ is required - foreach ([self::ELEMENTS_PARAMETERS, self::MATCH_EXPRESSIONS] as $option) { - if (\in_array($option, $value, true)) { - throw new InvalidOptionsForEnvException(sprintf('"%s" option can only be enabled with PHP 8.0+.', $option)); - } - } - } - - return $value; - }) ->getOption(), ]); } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $fixArrays = \in_array(self::ELEMENTS_ARRAYS, $this->configuration['elements'], true); - $fixArguments = \in_array(self::ELEMENTS_ARGUMENTS, $this->configuration['elements'], true); - $fixParameters = \PHP_VERSION_ID >= 8_00_00 && \in_array(self::ELEMENTS_PARAMETERS, $this->configuration['elements'], true); // @TODO: drop condition when PHP 8.0+ is required - $fixMatch = \PHP_VERSION_ID >= 8_00_00 && \in_array(self::MATCH_EXPRESSIONS, $this->configuration['elements'], true); // @TODO: drop condition when PHP 8.0+ is required + $configuredElements = $this->configuration['elements']; + $fixArrays = \in_array(self::ELEMENTS_ARRAYS, $configuredElements, true); + $fixArguments = \in_array(self::ELEMENTS_ARGUMENTS, $configuredElements, true); + $fixParameters = \PHP_VERSION_ID >= 8_00_00 && \in_array(self::ELEMENTS_PARAMETERS, $configuredElements, true); // @TODO: drop condition when PHP 8.0+ is required + $fixMatch = \PHP_VERSION_ID >= 8_00_00 && \in_array(self::MATCH_EXPRESSIONS, $configuredElements, true); // @TODO: drop condition when PHP 8.0+ is required + $fixDestructuring = \in_array(self::ARRAY_DESTRUCTURING, $configuredElements, true); for ($index = $tokens->count() - 1; $index >= 0; --$index) { - $prevIndex = $tokens->getPrevMeaningfulToken($index); + if ($tokens[$index]->isGivenKind(CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN)) { + if ($fixDestructuring) { // array destructing short syntax + $this->fixBlock($tokens, $index); + } - if ( - $fixArrays - && ( - $tokens[$index]->equals('(') && $tokens[$prevIndex]->isGivenKind(T_ARRAY) // long syntax - || $tokens[$index]->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN) // short syntax - ) - ) { - $this->fixBlock($tokens, $index); + continue; + } + + if ($tokens[$index]->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN)) { + if ($fixArrays) { // array short syntax + $this->fixBlock($tokens, $index); + } continue; } @@ -139,10 +155,34 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } + $prevIndex = $tokens->getPrevMeaningfulToken($index); + + if ($tokens[$prevIndex]->isGivenKind(T_ARRAY)) { + if ($fixArrays) { // array long syntax + $this->fixBlock($tokens, $index); + } + + continue; + } + + if ($tokens[$prevIndex]->isGivenKind(T_LIST)) { + if ($fixDestructuring || $fixArguments) { // array destructing long syntax + $this->fixBlock($tokens, $index); + } + + continue; + } + + if ($fixMatch && $tokens[$prevIndex]->isGivenKind(T_MATCH)) { + $this->fixBlock($tokens, $tokens->getNextTokenOfKind($index, ['{'])); + + continue; + } + $prevPrevIndex = $tokens->getPrevMeaningfulToken($prevIndex); if ($fixArguments - && $tokens[$prevIndex]->equalsAny([']', [T_CLASS], [T_STRING], [T_VARIABLE], [T_STATIC]]) + && $tokens[$prevIndex]->equalsAny([']', [T_CLASS], [T_STRING], [T_VARIABLE], [T_STATIC], [T_ISSET], [T_UNSET], [T_LIST]]) && !$tokens[$prevPrevIndex]->isGivenKind(T_FUNCTION) ) { $this->fixBlock($tokens, $index); @@ -153,16 +193,13 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void if ( $fixParameters && ( - $tokens[$prevIndex]->isGivenKind(T_STRING) && $tokens[$prevPrevIndex]->isGivenKind(T_FUNCTION) + $tokens[$prevIndex]->isGivenKind(T_STRING) + && $tokens[$prevPrevIndex]->isGivenKind(T_FUNCTION) || $tokens[$prevIndex]->isGivenKind([T_FN, T_FUNCTION]) ) ) { $this->fixBlock($tokens, $index); } - - if ($fixMatch && $tokens[$prevIndex]->isGivenKind(T_MATCH)) { - $this->fixMatch($tokens, $index); - } } } @@ -197,37 +234,4 @@ private function fixBlock(Tokens $tokens, int $startIndex): void } } } - - private function fixMatch(Tokens $tokens, int $index): void - { - $index = $tokens->getNextTokenOfKind($index, ['{']); - $closeIndex = $index; - $isMultiline = false; - $depth = 1; - - do { - ++$closeIndex; - - if ($tokens[$closeIndex]->equals('{')) { - ++$depth; - } elseif ($tokens[$closeIndex]->equals('}')) { - --$depth; - } elseif (!$isMultiline && str_contains($tokens[$closeIndex]->getContent(), "\n")) { - $isMultiline = true; - } - } while ($depth > 0); - - if (!$isMultiline) { - return; - } - - $previousIndex = $tokens->getPrevMeaningfulToken($closeIndex); - if (!$tokens->isPartialCodeMultiline($previousIndex, $closeIndex)) { - return; - } - - if (!$tokens[$previousIndex]->equals(',')) { - $tokens->insertAt($previousIndex + 1, new Token(',')); - } - } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php index 0a2674652..38bcc10b0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ControlStructure/YodaStyleFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,30 +31,41 @@ /** * @author Bram Gotink * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * always_move_variable?: bool, + * equal?: bool|null, + * identical?: bool|null, + * less_and_greater?: bool|null, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * always_move_variable: bool, + * equal: bool|null, + * identical: bool|null, + * less_and_greater: bool|null, + * } */ final class YodaStyleFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array */ - private $candidatesMap; + private array $candidatesMap; /** * @var array */ - private $candidateTypesConfiguration; + private array $candidateTypesConfiguration; /** - * @var array + * @var list */ - private $candidateTypes; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->resolveConfiguration(); - } + private array $candidateTypes; public function getDefinition(): FixerDefinitionInterface { @@ -119,6 +131,11 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isAnyTokenKindsFound($this->candidateTypes); } + protected function configurePostNormalisation(): void + { + $this->resolveConfiguration(); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $this->fixTokens($tokens); @@ -337,7 +354,7 @@ private function fixTokensCompare( private function fixTokensComparePart(Tokens $tokens, int $start, int $end): Tokens { $newTokens = $tokens->generatePartialCode($start, $end); - $newTokens = $this->fixTokens(Tokens::fromCode(sprintf('fixTokens(Tokens::fromCode(\sprintf('clearAt(\count($newTokens) - 1); $newTokens->clearAt(0); $newTokens->clearEmptyTokens(); @@ -345,6 +362,9 @@ private function fixTokensComparePart(Tokens $tokens, int $start, int $end): Tok return $newTokens; } + /** + * @return null|array{left: array{start: int, end: int}, right: array{start: int, end: int}} + */ private function getCompareFixableInfo(Tokens $tokens, int $index, bool $yoda): ?array { $right = $this->getRightSideCompareFixableInfo($tokens, $index); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php index 6d7d7e840..eded16148 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DeprecatedFixerInterface.php @@ -22,7 +22,7 @@ interface DeprecatedFixerInterface extends FixerInterface /** * Returns names of fixers to use instead, if any. * - * @return string[] + * @return list */ public function getSuccessorsNames(): array; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php index d4801c45f..da8c7eec0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationArrayAssignmentFixer.php @@ -17,6 +17,8 @@ use PhpCsFixer\AbstractDoctrineAnnotationFixer; use PhpCsFixer\Doctrine\Annotation\DocLexer; use PhpCsFixer\Doctrine\Annotation\Tokens; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -26,9 +28,23 @@ /** * Forces the configured operator for assignment in arrays in Doctrine Annotations. + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * ignored_tags?: list, + * operator?: ':'|'=', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * ignored_tags: list, + * operator: ':'|'=', + * } */ -final class DoctrineAnnotationArrayAssignmentFixer extends AbstractDoctrineAnnotationFixer +final class DoctrineAnnotationArrayAssignmentFixer extends AbstractDoctrineAnnotationFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -59,8 +75,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { $options = parent::createConfigurationDefinition()->getOptions(); - $operator = new FixerOptionBuilder('operator', 'The operator to use.'); - $options[] = $operator + $options[] = (new FixerOptionBuilder('operator', 'The operator to use.')) ->setAllowedValues(['=', ':']) ->setDefault('=') ->getOption() diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php index ead0fb690..479226ae5 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationBracesFixer.php @@ -18,6 +18,8 @@ use PhpCsFixer\Doctrine\Annotation\DocLexer; use PhpCsFixer\Doctrine\Annotation\Token; use PhpCsFixer\Doctrine\Annotation\Tokens; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,9 +29,23 @@ /** * Adds braces to Doctrine annotations when missing. + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * ignored_tags?: list, + * syntax?: 'with_braces'|'without_braces', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * ignored_tags: list, + * syntax: 'with_braces'|'without_braces', + * } */ -final class DoctrineAnnotationBracesFixer extends AbstractDoctrineAnnotationFixer +final class DoctrineAnnotationBracesFixer extends AbstractDoctrineAnnotationFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php index 1359aef06..99e37858a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationIndentationFixer.php @@ -17,6 +17,8 @@ use PhpCsFixer\AbstractDoctrineAnnotationFixer; use PhpCsFixer\Doctrine\Annotation\DocLexer; use PhpCsFixer\Doctrine\Annotation\Tokens; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -25,8 +27,23 @@ use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Preg; -final class DoctrineAnnotationIndentationFixer extends AbstractDoctrineAnnotationFixer +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * ignored_tags?: list, + * indent_mixed_lines?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * ignored_tags: list, + * indent_mixed_lines: bool, + * } + */ +final class DoctrineAnnotationIndentationFixer extends AbstractDoctrineAnnotationFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -105,7 +122,7 @@ protected function fixAnnotations(Tokens $doctrineAnnotationTokens): void } /** - * @return int[] + * @return array{int, int} */ private function getLineBracesCount(Tokens $tokens, int $index): array { @@ -157,7 +174,7 @@ private function isClosingLineWithMeaningfulContent(Tokens $tokens, int $index): } /** - * @param array> $annotationPositions Pairs of begin and end indices of main annotations + * @param list $annotationPositions Pairs of begin and end indices of main annotations */ private function indentationCanBeFixed(Tokens $tokens, int $newLineTokenIndex, array $annotationPositions): bool { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php index 0ee08482b..dc82b07bb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/DoctrineAnnotation/DoctrineAnnotationSpacesFixer.php @@ -18,6 +18,8 @@ use PhpCsFixer\Doctrine\Annotation\DocLexer; use PhpCsFixer\Doctrine\Annotation\Token; use PhpCsFixer\Doctrine\Annotation\Tokens; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,9 +30,37 @@ /** * Fixes spaces around commas and assignment operators in Doctrine annotations. + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * after_argument_assignments?: bool|null, + * after_array_assignments_colon?: bool|null, + * after_array_assignments_equals?: bool|null, + * around_commas?: bool, + * around_parentheses?: bool, + * before_argument_assignments?: bool|null, + * before_array_assignments_colon?: bool|null, + * before_array_assignments_equals?: bool|null, + * ignored_tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * after_argument_assignments: bool|null, + * after_array_assignments_colon: bool|null, + * after_array_assignments_equals: bool|null, + * around_commas: bool, + * around_parentheses: bool, + * before_argument_assignments: bool|null, + * before_array_assignments_colon: bool|null, + * before_array_assignments_equals: bool|null, + * ignored_tags: list, + * } */ -final class DoctrineAnnotationSpacesFixer extends AbstractDoctrineAnnotationFixer +final class DoctrineAnnotationSpacesFixer extends AbstractDoctrineAnnotationFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ExperimentalFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ExperimentalFixerInterface.php new file mode 100644 index 000000000..9ade1875d --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ExperimentalFixerInterface.php @@ -0,0 +1,20 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer; + +/** + * @internal + */ +interface ExperimentalFixerInterface extends FixerInterface {} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php index 7a1809989..96c0a4403 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php @@ -30,7 +30,7 @@ final class CombineNestedDirnameFixer extends AbstractFixer public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Replace multiple nested calls of `dirname` by only one call with second `$level` parameter. Requires PHP >= 7.0.', + 'Replace multiple nested calls of `dirname` by only one call with second `$level` parameter.', [ new CodeSample( "count() - 1; 0 <= $index; --$index) { $dirnameInfo = $this->getDirnameInfo($tokens, $index); - if (!$dirnameInfo) { + if (false === $dirnameInfo) { continue; } @@ -81,7 +81,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $firstArgumentEnd = $dirnameInfo['end']; $dirnameInfoArray = [$dirnameInfo]; - while ($dirnameInfo = $this->getDirnameInfo($tokens, $prev, $firstArgumentEnd)) { + while (($dirnameInfo = $this->getDirnameInfo($tokens, $prev, $firstArgumentEnd)) !== false) { $dirnameInfoArray[] = $dirnameInfo; $prev = $tokens->getPrevMeaningfulToken($dirnameInfo['indices'][0]); @@ -105,7 +105,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void * @param int $index Index of `dirname` * @param null|int $firstArgumentEndIndex Index of last token of first argument of `dirname` call * - * @return array{indices: list, secondArgument?: int, levels: int, end: int}|bool `false` when it is not a (supported) `dirname` call, an array with info about the dirname call otherwise + * @return array{indices: list, secondArgument?: int, levels: int, end: int}|false `false` when it is not a (supported) `dirname` call, an array with info about the dirname call otherwise */ private function getDirnameInfo(Tokens $tokens, int $index, ?int $firstArgumentEndIndex = null) { @@ -189,7 +189,7 @@ private function getDirnameInfo(Tokens $tokens, int $index, ?int $firstArgumentE } /** - * @param array, secondArgument?: int, levels: int, end: int}> $dirnameInfoArray + * @param non-empty-list, secondArgument?: int, levels: int, end: int}> $dirnameInfoArray */ private function combineDirnames(Tokens $tokens, array $dirnameInfoArray): void { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/DateTimeCreateFromFormatCallFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/DateTimeCreateFromFormatCallFixer.php index 5c72fcf2f..4888fe408 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/DateTimeCreateFromFormatCallFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/DateTimeCreateFromFormatCallFixer.php @@ -34,7 +34,8 @@ public function getDefinition(): FixerDefinitionInterface ], "Consider this code: `DateTime::createFromFormat('Y-m-d', '2022-02-11')`. - What value will be returned? '2022-02-11 00:00:00.0'? No, actual return value has 'H:i:s' section like '2022-02-11 16:55:37.0'. + What value will be returned? '2022-02-11 00:00:00.0'? + No, actual return value has 'H:i:s' section like '2022-02-11 16:55:37.0'. Change 'Y-m-d' to '!Y-m-d', return value will be '2022-02-11 00:00:00.0'. So, adding `!` to format string will make return value more intuitive.", 'Risky when depending on the actual timings being used even when not explicit set in format.' @@ -87,7 +88,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $classNameIndex = $tokens->getPrevMeaningfulToken($index); - if (!$tokens[$classNameIndex]->equalsAny([[T_STRING, 'DateTime'], [T_STRING, 'DateTimeImmutable']], false)) { + if (!$tokens[$classNameIndex]->equalsAny([[T_STRING, \DateTime::class], [T_STRING, \DateTimeImmutable::class]], false)) { continue; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php index edf0bf6c5..3bf72e223 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagOrderFixer.php @@ -85,9 +85,9 @@ protected function fixFopenFlagToken(Tokens $tokens, int $argumentStartIndex, in } /** - * @param string[] $flags + * @param list $flags * - * @return string[] + * @return list */ private function sortFlags(array $flags): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php index a136c7b3c..b4bc9ef6c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FopenFlagsFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFopenFlagFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -25,8 +26,21 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * b_mode?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * b_mode: bool, + * } + */ final class FopenFlagsFixer extends AbstractFopenFlagFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php index 8e63c816a..22c3215f3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/FunctionDeclarationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,9 +31,25 @@ * Fixer for rules defined in PSR2 generally (¶1 and ¶6). * * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * closure_fn_spacing?: 'none'|'one', + * closure_function_spacing?: 'none'|'one', + * trailing_comma_single_line?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * closure_fn_spacing: 'none'|'one', + * closure_function_spacing: 'none'|'one', + * trailing_comma_single_line: bool, + * } */ final class FunctionDeclarationFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php index 49d728ef0..4561c393c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ImplodeCallFixer.php @@ -78,7 +78,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $argumentsIndices = $this->getArgumentIndices($tokens, $index); if (1 === \count($argumentsIndices)) { - $firstArgumentIndex = key($argumentsIndices); + $firstArgumentIndex = array_key_first($argumentsIndices); $tokens->insertAt($firstArgumentIndex, [ new Token([T_CONSTANT_ENCAPSED_STRING, "''"]), new Token(','), @@ -103,7 +103,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // collect tokens from first argument $firstArgumentEndIndex = $argumentsIndices[key($argumentsIndices)]; $newSecondArgumentTokens = []; - for ($i = key($argumentsIndices); $i <= $firstArgumentEndIndex; ++$i) { + for ($i = array_key_first($argumentsIndices); $i <= $firstArgumentEndIndex; ++$i) { $newSecondArgumentTokens[] = clone $tokens[$i]; $tokens->clearAt($i); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php index 48155ceca..80fa74fd4 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/LambdaNotUsedImportFixer.php @@ -26,20 +26,11 @@ final class LambdaNotUsedImportFixer extends AbstractFixer { - /** - * @var ArgumentsAnalyzer - */ - private $argumentsAnalyzer; + private ArgumentsAnalyzer $argumentsAnalyzer; - /** - * @var FunctionsAnalyzer - */ - private $functionAnalyzer; + private FunctionsAnalyzer $functionAnalyzer; - /** - * @var TokensAnalyzer - */ - private $tokensAnalyzer; + private TokensAnalyzer $tokensAnalyzer; public function getDefinition(): FixerDefinitionInterface { @@ -108,6 +99,8 @@ private function fixLambda(Tokens $tokens, int $lambdaUseIndex): void } /** + * @param array $imports + * * @return array */ private function findNotUsedLambdaImports(Tokens $tokens, array $imports, int $lambdaUseCloseBraceIndex): array @@ -234,6 +227,12 @@ private function findNotUsedLambdaImports(Tokens $tokens, array $imports, int $l return $imports; } + /** + * @param array $imports + * @param array $arguments + * + * @return array + */ private function countImportsUsedAsArgument(Tokens $tokens, array $imports, array $arguments): array { foreach ($arguments as $start => $end) { @@ -277,6 +276,11 @@ private function getLambdaUseIndex(Tokens $tokens, int $index) return $lambdaUseIndex; } + /** + * @param array $arguments + * + * @return array + */ private function filterArguments(Tokens $tokens, array $arguments): array { $imports = []; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php index 5f47784e7..842d6447e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/MethodArgumentSpaceFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -30,9 +31,27 @@ /** * @author Kuanhung Chen + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * after_heredoc?: bool, + * attribute_placement?: 'ignore'|'same_line'|'standalone', + * keep_multiple_spaces_after_comma?: bool, + * on_multiline?: 'ensure_fully_multiline'|'ensure_single_line'|'ignore', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * after_heredoc: bool, + * attribute_placement: 'ignore'|'same_line'|'standalone', + * keep_multiple_spaces_after_comma: bool, + * on_multiline: 'ensure_fully_multiline'|'ensure_single_line'|'ignore', + * } */ final class MethodArgumentSpaceFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -133,7 +152,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $expectedTokens = [T_LIST, T_FUNCTION, CT::T_USE_LAMBDA, T_FN, T_CLASS]; - for ($index = $tokens->count() - 1; $index > 0; --$index) { + $tokenCount = $tokens->count(); + for ($index = 1; $index < $tokenCount; ++$index) { $token = $tokens[$index]; if (!$token->equals('(')) { @@ -301,7 +321,7 @@ private function ensureFunctionFullyMultiline(Tokens $tokens, int $startFunction do { $prevWhitespaceTokenIndex = $tokens->getPrevTokenOfKind( $searchIndex, - [[T_WHITESPACE]] + [[T_ENCAPSED_AND_WHITESPACE], [T_INLINE_HTML], [T_WHITESPACE]], ); $searchIndex = $prevWhitespaceTokenIndex; @@ -311,6 +331,8 @@ private function ensureFunctionFullyMultiline(Tokens $tokens, int $startFunction if (null === $prevWhitespaceTokenIndex) { $existingIndentation = ''; + } elseif (!$tokens[$prevWhitespaceTokenIndex]->isGivenKind(T_WHITESPACE)) { + return; } else { $existingIndentation = $tokens[$prevWhitespaceTokenIndex]->getContent(); $lastLineIndex = strrpos($existingIndentation, "\n"); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php index 06f9b6606..e2706f685 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NativeFunctionInvocationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -31,9 +32,27 @@ /** * @author Andreas Möller + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * exclude?: list, + * include?: list, + * scope?: 'all'|'namespaced', + * strict?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * exclude: list, + * include: list, + * scope: 'all'|'namespaced', + * strict: bool, + * } */ final class NativeFunctionInvocationFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -61,13 +80,6 @@ final class NativeFunctionInvocationFixer extends AbstractFixer implements Confi */ private $functionFilter; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->functionFilter = $this->getFunctionFilter(); - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -138,21 +150,21 @@ function baz($options) myGlobalFunction(); count(); ', - ['include' => ['@all']] + ['include' => [self::SET_ALL]] ), new CodeSample( ' ['@internal']] + ['include' => [self::SET_INTERNAL]] ), new CodeSample( ' ['@compiler_optimized']] + ['include' => [self::SET_COMPILER_OPTIMIZED]] ), ], null, @@ -164,7 +176,7 @@ function baz($options) * {@inheritdoc} * * Must run before GlobalNamespaceImportFixer. - * Must run after BacktickToShellExecFixer, RegularCallableCallFixer, StrictParamFixer. + * Must run after BacktickToShellExecFixer, MbStrFunctionsFixer, RegularCallableCallFixer, StrictParamFixer. */ public function getPriority(): int { @@ -181,6 +193,11 @@ public function isRisky(): bool return true; } + protected function configurePostNormalisation(): void + { + $this->functionFilter = $this->getFunctionFilter(); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { if ('all' === $this->configuration['scope']) { @@ -202,11 +219,11 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('exclude', 'List of functions to ignore.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([static function (array $value): bool { foreach ($value as $functionName) { - if (!\is_string($functionName) || '' === trim($functionName) || trim($functionName) !== $functionName) { - throw new InvalidOptionsException(sprintf( + if ('' === trim($functionName) || trim($functionName) !== $functionName) { + throw new InvalidOptionsException(\sprintf( 'Each element must be a non-empty, trimmed string, got "%s" instead.', get_debug_type($functionName) )); @@ -218,11 +235,11 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setDefault([]) ->getOption(), (new FixerOptionBuilder('include', 'List of function names or sets to fix. Defined sets are `@internal` (all native functions), `@all` (all global functions) and `@compiler_optimized` (functions that are specially optimized by Zend).')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([static function (array $value): bool { foreach ($value as $functionName) { - if (!\is_string($functionName) || '' === trim($functionName) || trim($functionName) !== $functionName) { - throw new InvalidOptionsException(sprintf( + if ('' === trim($functionName) || trim($functionName) !== $functionName) { + throw new InvalidOptionsException(\sprintf( 'Each element must be a non-empty, trimmed string, got "%s" instead.', get_debug_type($functionName) )); @@ -235,7 +252,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ]; if (str_starts_with($functionName, '@') && !\in_array($functionName, $sets, true)) { - throw new InvalidOptionsException(sprintf('Unknown set "%s", known sets are %s.', $functionName, Utils::naturalLanguageJoin($sets))); + throw new InvalidOptionsException(\sprintf('Unknown set "%s", known sets are %s.', $functionName, Utils::naturalLanguageJoin($sets))); } } @@ -361,6 +378,7 @@ private function getAllCompilerOptimizedFunctionsNormalized(): array 'is_string', 'ord', 'sizeof', + 'sprintf', 'strlen', 'strval', // @see https://github.com/php/php-src/blob/php-7.2.6/ext/opcache/Optimizer/pass1_5.c @@ -385,17 +403,18 @@ private function getAllInternalFunctionsNormalized(): array } /** - * @param string[] $functionNames + * @param list $functionNames * * @return array all function names lower cased */ private function normalizeFunctionNames(array $functionNames): array { - foreach ($functionNames as $index => $functionName) { - $functionNames[strtolower($functionName)] = true; - unset($functionNames[$index]); + $result = []; + + foreach ($functionNames as $functionName) { + $result[strtolower($functionName)] = true; } - return $functionNames; + return $result; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php index 9549b45a8..a63e99141 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoSpacesAfterFunctionNameFixer.php @@ -33,7 +33,7 @@ public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( 'When making a method or function call, there MUST NOT be a space between the method or function name and the opening parenthesis.', - [new CodeSample("isAnyTokenKindsFound(array_merge($this->getFunctionyTokenKinds(), [T_STRING])); + return $tokens->isAnyTokenKindsFound([T_STRING, ...$this->getFunctionyTokenKinds()]); } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void @@ -73,7 +73,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $nextNonWhiteSpace = $tokens->getNextMeaningfulToken($endParenthesisIndex); if ( null !== $nextNonWhiteSpace - && $tokens[$nextNonWhiteSpace]->equals('?') + && !$tokens[$nextNonWhiteSpace]->equals(';') && $tokens[$lastTokenIndex]->isGivenKind($languageConstructionTokens) ) { continue; @@ -116,24 +116,22 @@ private function fixFunctionCall(Tokens $tokens, int $index): void } /** - * @return array|string> + * @return list */ private function getBraceAfterVariableKinds(): array { - static $tokens = [ + return [ ')', ']', [CT::T_DYNAMIC_VAR_BRACE_CLOSE], [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE], ]; - - return $tokens; } /** * Gets the token kinds which can work as function calls. * - * @return int[] Token names + * @return list Token names */ private function getFunctionyTokenKinds(): array { @@ -160,7 +158,7 @@ private function getFunctionyTokenKinds(): array /** * Gets the token kinds of actually language construction. * - * @return int[] + * @return list */ private function getLanguageConstructionTokenKinds(): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php index 108901da3..850ee35be 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NoUnreachableDefaultArgumentValueFixer.php @@ -116,6 +116,12 @@ private function getLastNonDefaultArgumentIndex(Tokens $tokens, int $startIndex, continue; } + if ($token->isGivenKind(CT::T_PROPERTY_HOOK_BRACE_CLOSE)) { + $i = $tokens->findBlockStart(Tokens::BLOCK_TYPE_PROPERTY_HOOK, $i); + + continue; + } + if ($token->isGivenKind(T_VARIABLE) && !$this->isEllipsis($tokens, $i)) { return $i; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php index a8cec92c2..5399e9b8d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/NullableTypeDeclarationForDefaultNullValueFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -33,9 +34,21 @@ /** * @author HypeMC + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * use_nullable_type_declaration?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * use_nullable_type_declaration: bool, + * } */ final class NullableTypeDeclarationForDefaultNullValueFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -92,6 +105,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn (new FixerOptionBuilder('use_nullable_type_declaration', 'Whether to add or remove `?` or `|null` to parameters with a default `null` value.')) ->setAllowedTypes(['bool']) ->setDefault(true) + ->setDeprecationMessage('Behaviour will follow default one.') // @TODO remove the option on next major 4.0 ->getOption(), ]); } @@ -114,7 +128,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @param ArgumentAnalysis[] $arguments + * @param array $arguments */ private function fixFunctionParameters(Tokens $tokens, array $arguments): void { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php index 2ab134303..df697b45c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToParamTypeFixer.php @@ -16,6 +16,8 @@ use PhpCsFixer\AbstractPhpdocToTypeDeclarationFixer; use PhpCsFixer\DocBlock\Annotation; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ExperimentalFixerInterface; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; @@ -24,13 +26,26 @@ /** * @author Jan Gantzert + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * scalar_types?: bool, + * types_map?: array, + * union_types?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * scalar_types: bool, + * types_map: array, + * union_types: bool, + * } */ -final class PhpdocToParamTypeFixer extends AbstractPhpdocToTypeDeclarationFixer +final class PhpdocToParamTypeFixer extends AbstractPhpdocToTypeDeclarationFixer implements ConfigurableFixerInterface, ExperimentalFixerInterface { private const TYPE_CHECK_TEMPLATE = ' */ private const EXCLUDE_FUNC_NAMES = [ [T_STRING, '__clone'], @@ -49,7 +64,7 @@ final class PhpdocToParamTypeFixer extends AbstractPhpdocToTypeDeclarationFixer public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'EXPERIMENTAL: Takes `@param` annotations of non-mixed types and adjusts accordingly the function signature. Requires PHP >= 7.0.', + 'Takes `@param` annotations of non-mixed types and adjusts accordingly the function signature.', [ new CodeSample( ' false] ), + new CodeSample( + ' false] + ), ], null, - 'This rule is EXPERIMENTAL and [1] is not covered with backward compatibility promise. [2] `@param` annotation is mandatory for the fixer to make changes, signatures of methods without it (no docblock, inheritdocs) will not be fixed. [3] Manual actions are required if inherited signatures are not properly documented.' + 'The `@param` annotation is mandatory for the fixer to make changes, signatures of methods without it (no docblock, inheritdocs) will not be fixed. Manual actions are required if inherited signatures are not properly documented.' ); } public function isCandidate(Tokens $tokens): bool { - return $tokens->isTokenKindFound(T_FUNCTION); + return $tokens->isAnyTokenKindsFound([T_FUNCTION, T_FN]); } /** @@ -102,7 +127,7 @@ protected function isSkippedType(string $type): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { for ($index = $tokens->count() - 1; 0 < $index; --$index) { - if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { + if (!$tokens[$index]->isGivenKind([T_FUNCTION, T_FN])) { continue; } @@ -136,7 +161,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } if (null !== $typeInfo) { - [$paramType, $isNullable] = $typeInfo; + $paramType = $typeInfo['commonType']; + $isNullable = $typeInfo['isNullable']; } elseif (null !== $unionTypes) { $paramType = $unionTypes; $isNullable = false; @@ -163,7 +189,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - if (!$this->isValidSyntax(sprintf(self::TYPE_CHECK_TEMPLATE, $paramType))) { + if (!$this->isValidSyntax(\sprintf(self::TYPE_CHECK_TEMPLATE, $paramType))) { continue; } @@ -177,7 +203,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void protected function createTokensFromRawType(string $type): Tokens { - $typeTokens = Tokens::fromCode(sprintf(self::TYPE_CHECK_TEMPLATE, $type)); + $typeTokens = Tokens::fromCode(\sprintf(self::TYPE_CHECK_TEMPLATE, $type)); $typeTokens->clearRange(0, 4); $typeTokens->clearRange(\count($typeTokens) - 6, \count($typeTokens) - 1); $typeTokens->clearEmptyTokens(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php index 7a1f287ee..f6cd3ec01 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToPropertyTypeFixer.php @@ -16,13 +16,31 @@ use PhpCsFixer\AbstractPhpdocToTypeDeclarationFixer; use PhpCsFixer\DocBlock\Annotation; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ExperimentalFixerInterface; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; -final class PhpdocToPropertyTypeFixer extends AbstractPhpdocToTypeDeclarationFixer +/** + * @phpstan-import-type _CommonTypeInfo from AbstractPhpdocToTypeDeclarationFixer + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * scalar_types?: bool, + * types_map?: array, + * union_types?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * scalar_types: bool, + * types_map: array, + * union_types: bool, + * } + */ +final class PhpdocToPropertyTypeFixer extends AbstractPhpdocToTypeDeclarationFixer implements ConfigurableFixerInterface, ExperimentalFixerInterface { private const TYPE_CHECK_TEMPLATE = '= 7.4.', + 'Takes `@var` annotation of non-mixed types and adjusts accordingly the property signature..', [ new CodeSample( ' false] ), + new CodeSample( + ' false] + ), ], null, - 'This rule is EXPERIMENTAL and [1] is not covered with backward compatibility promise. [2] `@var` annotation is mandatory for the fixer to make changes, signatures of properties without it (no docblock) will not be fixed. [3] Manual actions might be required for newly typed properties that are read before initialization.' + 'The `@var` annotation is mandatory for the fixer to make changes, signatures of properties without it (no docblock) will not be fixed. Manual actions might be required for newly typed properties that are read before initialization.' ); } @@ -74,12 +103,12 @@ public function isCandidate(Tokens $tokens): bool /** * {@inheritdoc} * - * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer. + * Must run before FullyQualifiedStrictTypesFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer. * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. */ public function getPriority(): int { - return 7; + return 8; } protected function isSkippedType(string $type): bool @@ -98,7 +127,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void protected function createTokensFromRawType(string $type): Tokens { - $typeTokens = Tokens::fromCode(sprintf(self::TYPE_CHECK_TEMPLATE, $type)); + $typeTokens = Tokens::fromCode(\sprintf(self::TYPE_CHECK_TEMPLATE, $type)); $typeTokens->clearRange(0, 8); $typeTokens->clearRange(\count($typeTokens) - 5, \count($typeTokens) - 1); $typeTokens->clearEmptyTokens(); @@ -142,13 +171,14 @@ private function fixClass(Tokens $tokens, int $index): void continue; } - [$propertyType, $isNullable] = $typeInfo; + $propertyType = $typeInfo['commonType']; + $isNullable = $typeInfo['isNullable']; if (\in_array($propertyType, ['callable', 'never', 'void'], true)) { continue; } - if (!$this->isValidSyntax(sprintf(self::TYPE_CHECK_TEMPLATE, $propertyType))) { + if (!$this->isValidSyntax(\sprintf(self::TYPE_CHECK_TEMPLATE, $propertyType))) { continue; } @@ -198,7 +228,9 @@ private function findNextUntypedPropertiesDeclaration(Tokens $tokens, int $index /** * @param array $propertyIndices - * @param Annotation[] $annotations + * @param list $annotations + * + * @return ?_CommonTypeInfo */ private function resolveApplicableType(array $propertyIndices, array $annotations): ?array { @@ -212,7 +244,7 @@ private function resolveApplicableType(array $propertyIndices, array $annotation continue; } - $propertyName = key($propertyIndices); + $propertyName = array_key_first($propertyIndices); } if (!isset($propertyIndices[$propertyName])) { @@ -237,7 +269,7 @@ private function resolveApplicableType(array $propertyIndices, array $annotation } if (null !== $unionTypes) { - $typeInfo = [$unionTypes, false]; + $typeInfo = ['commonType' => $unionTypes, 'isNullable' => false]; } if (\array_key_exists($propertyName, $propertyTypes) && $typeInfo !== $propertyTypes[$propertyName]) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php index 5ce5f9dbc..7571ee763 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/PhpdocToReturnTypeFixer.php @@ -15,7 +15,8 @@ namespace PhpCsFixer\Fixer\FunctionNotation; use PhpCsFixer\AbstractPhpdocToTypeDeclarationFixer; -use PhpCsFixer\DocBlock\Annotation; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ExperimentalFixerInterface; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; @@ -27,8 +28,21 @@ /** * @author Filippo Tessarotto + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * scalar_types?: bool, + * types_map?: array, + * union_types?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * scalar_types: bool, + * types_map: array, + * union_types: bool, + * } */ -final class PhpdocToReturnTypeFixer extends AbstractPhpdocToTypeDeclarationFixer +final class PhpdocToReturnTypeFixer extends AbstractPhpdocToTypeDeclarationFixer implements ConfigurableFixerInterface, ExperimentalFixerInterface { private const TYPE_CHECK_TEMPLATE = ' false] ), + new CodeSample( + ' false] + ), new VersionSpecificCodeSample( 'getTypeExpression(); @@ -164,7 +187,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } if (null !== $typeInfo) { - [$returnType, $isNullable] = $typeInfo; + $returnType = $typeInfo['commonType']; + $isNullable = $typeInfo['isNullable']; } elseif (null !== $unionTypes) { $returnType = $unionTypes; $isNullable = false; @@ -174,20 +198,21 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - $startIndex = $tokens->getNextTokenOfKind($index, ['{', ';']); + $paramsStartIndex = $tokens->getNextTokenOfKind($index, ['(']); + $paramsEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $paramsStartIndex); + + $bodyStartIndex = $tokens->getNextTokenOfKind($paramsEndIndex, ['{', ';', [T_DOUBLE_ARROW]]); - if ($this->hasReturnTypeHint($tokens, $startIndex)) { + if ($this->hasReturnTypeHint($tokens, $bodyStartIndex)) { continue; } - if (!$this->isValidSyntax(sprintf(self::TYPE_CHECK_TEMPLATE, $returnType))) { + if (!$this->isValidSyntax(\sprintf(self::TYPE_CHECK_TEMPLATE, $returnType))) { continue; } - $endFuncIndex = $tokens->getPrevTokenOfKind($startIndex, [')']); - $tokens->insertAt( - $endFuncIndex + 1, + $paramsEndIndex + 1, array_merge( [ new Token([CT::T_TYPE_COLON, ':']), @@ -201,7 +226,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void protected function createTokensFromRawType(string $type): Tokens { - $typeTokens = Tokens::fromCode(sprintf(self::TYPE_CHECK_TEMPLATE, $type)); + $typeTokens = Tokens::fromCode(\sprintf(self::TYPE_CHECK_TEMPLATE, $type)); $typeTokens->clearRange(0, 7); $typeTokens->clearRange(\count($typeTokens) - 3, \count($typeTokens) - 1); $typeTokens->clearEmptyTokens(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php index 2bb372c34..7538ff7ab 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/RegularCallableCallFixer.php @@ -103,7 +103,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @param array $arguments + * @param non-empty-array $arguments */ private function processCall(Tokens $tokens, int $index, array $arguments): void { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php index 356bf45c3..6d7c3dd8e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/ReturnTypeDeclarationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,9 +29,21 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * space_before?: 'none'|'one', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * space_before: 'none'|'one', + * } */ final class ReturnTypeDeclarationFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php index 5cafd0a30..4d18b8cd5 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/UseArrowFunctionsFixer.php @@ -31,7 +31,7 @@ final class UseArrowFunctionsFixer extends AbstractFixer public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Anonymous functions with one-liner return statement must use arrow functions.', + 'Anonymous functions with return as the only statement must use arrow functions.', [ new CodeSample( <<<'SAMPLE' @@ -78,8 +78,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - // Find parameters end - // Abort if they are multilined + // Find parameters $parametersStart = $tokens->getNextMeaningfulToken($index); @@ -89,10 +88,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $parametersEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $parametersStart); - if ($this->isMultilined($tokens, $parametersStart, $parametersEnd)) { - continue; - } - // Find `use ()` start and end // Abort if it contains reference variables @@ -158,29 +153,12 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - // Abort if the `return` statement is multilined - - if ($this->isMultilined($tokens, $return, $semicolon)) { - continue; - } - // Transform the function to an arrow function $this->transform($tokens, $index, $useStart, $useEnd, $braceOpen, $return, $semicolon, $braceClose); } } - private function isMultilined(Tokens $tokens, int $start, int $end): bool - { - for ($i = $start; $i < $end; ++$i) { - if (str_contains($tokens[$i]->getContent(), "\n")) { - return true; - } - } - - return false; - } - private function transform(Tokens $tokens, int $index, ?int $useStart, ?int $useEnd, int $braceOpen, int $return, int $semicolon, int $braceClose): void { $tokensToInsert = [new Token([T_DOUBLE_ARROW, '=>'])]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php index 65e8268da..f391347ed 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/FunctionNotation/VoidReturnFixer.php @@ -33,7 +33,7 @@ final class VoidReturnFixer extends AbstractFixer public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Add `void` return type to functions with missing or empty return statements, but priority is given to `@return` annotations. Requires PHP >= 7.1.', + 'Add `void` return type to functions with missing or empty return statements, but priority is given to `@return` annotations.', [ new CodeSample( " */ private function findReturnAnnotations(Tokens $tokens, int $index): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php index e9f04f3c9..8c0f6c537 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/FullyQualifiedStrictTypesFixer.php @@ -15,44 +15,147 @@ namespace PhpCsFixer\Fixer\Import; use PhpCsFixer\AbstractFixer; +use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\AttributeAnalyzer; use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; use PhpCsFixer\Tokenizer\CT; +use PhpCsFixer\Tokenizer\Processor\ImportProcessor; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; /** * @author VeeWee + * @author Tomas Jadrny + * @author Greg Korba + * @author SpacePossum + * @author Michael Vorisek + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * import_symbols?: bool, + * leading_backslash_in_global_namespace?: bool, + * phpdoc_tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * import_symbols: bool, + * leading_backslash_in_global_namespace: bool, + * phpdoc_tags: list, + * } + * @phpstan-type _Uses array{ + * constant?: array, + * class?: array, + * function?: array + * } + * + * @phpstan-import-type _ImportType from \PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis */ -final class FullyQualifiedStrictTypesFixer extends AbstractFixer implements ConfigurableFixerInterface +final class FullyQualifiedStrictTypesFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + private const REGEX_CLASS = '(?:\\\?+'.TypeExpression::REGEX_IDENTIFIER + .'(\\\\'.TypeExpression::REGEX_IDENTIFIER.')*+)'; + + /** + * @var array{ + * constant?: list, + * class?: list, + * function?: list + * }|null + */ + private ?array $discoveredSymbols; + + /** + * @var array{ + * constant?: array, + * class?: array, + * function?: array + * } + */ + private array $symbolsForImport = []; + + /** + * @var array, array> + */ + private array $reservedIdentifiersByLevel; + + /** + * @var array{ + * constant?: array, + * class?: array, + * function?: array + * } + */ + private array $cacheUsesLast = []; + + /** + * @var array{ + * constant?: array, + * class?: array, + * function?: array + * } + */ + private array $cacheUseNameByShortNameLower; + + /** @var _Uses */ + private array $cacheUseShortNameByNameLower; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Transforms imported FQCN parameters and return types in function arguments to short version.', + 'Removes the leading part of fully qualified symbol references if a given symbol is imported or belongs to the current namespace.', [ new CodeSample( 'baz = $baz; } - public function doY(Foo\NotImported $u, \Foo\NotImported $v) + /** + * @return \Foo\Bar\Baz + */ + public function getBaz() { + return $this->baz; + } + + public function doX(\Foo\Bar $foo, \Exception $e): \Foo\Bar\Baz { + try {} + catch (\Foo\SomeException $e) {} } } ' @@ -69,6 +172,43 @@ public function doY(Foo\NotImported $u, \Foo\NotImported $v) ', ['leading_backslash_in_global_namespace' => true] ), + new CodeSample( + ' true] + ), + new CodeSample( + ' true] + ), ] ); } @@ -76,8 +216,8 @@ public function doY(Foo\NotImported $u, \Foo\NotImported $v) /** * {@inheritdoc} * - * Must run before NoSuperfluousPhpdocTagsFixer. - * Must run after PhpdocToReturnTypeFixer. + * Must run before NoSuperfluousPhpdocTagsFixer, OrderedAttributesFixer, OrderedImportsFixer, OrderedInterfacesFixer, StatementIndentationFixer. + * Must run after ClassKeywordFixer, PhpUnitAttributesFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer. */ public function getPriority(): int { @@ -86,7 +226,19 @@ public function getPriority(): int public function isCandidate(Tokens $tokens): bool { - return $tokens->isTokenKindFound(T_FUNCTION); + return $tokens->isAnyTokenKindsFound([ + CT::T_USE_TRAIT, + ...(\defined('T_ATTRIBUTE') ? [T_ATTRIBUTE] : []), // @TODO: drop condition when PHP 8.0+ is required + T_CATCH, + T_DOUBLE_COLON, + T_DOC_COMMENT, + T_EXTENDS, + T_FUNCTION, + T_IMPLEMENTS, + T_INSTANCEOF, + T_NEW, + T_VARIABLE, + ]); } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface @@ -99,6 +251,41 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setAllowedTypes(['bool']) ->setDefault(false) ->getOption(), + (new FixerOptionBuilder( + 'import_symbols', + 'Whether FQCNs should be automatically imported.' + )) + ->setAllowedTypes(['bool']) + ->setDefault(false) + ->getOption(), + (new FixerOptionBuilder( + 'phpdoc_tags', + 'Collection of PHPDoc annotation tags where FQCNs should be processed. As of now only simple tags with `@tag \F\Q\C\N` format are supported (no complex types).' + )) + ->setAllowedTypes(['string[]']) + ->setDefault([ + 'param', + 'phpstan-param', + 'phpstan-property', + 'phpstan-property-read', + 'phpstan-property-write', + 'phpstan-return', + 'phpstan-var', + 'property', + 'property-read', + 'property-write', + 'psalm-param', + 'psalm-property', + 'psalm-property-read', + 'psalm-property-write', + 'psalm-return', + 'psalm-var', + 'return', + 'see', + 'throws', + 'var', + ]) + ->getOption(), ]); } @@ -107,24 +294,327 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $namespaceUsesAnalyzer = new NamespaceUsesAnalyzer(); $functionsAnalyzer = new FunctionsAnalyzer(); - foreach ($tokens->getNamespaceDeclarations() as $namespace) { - $namespaceName = strtolower($namespace->getFullName()); + $this->symbolsForImport = []; + + foreach ($tokens->getNamespaceDeclarations() as $namespaceIndex => $namespace) { + $namespace = $tokens->getNamespaceDeclarations()[$namespaceIndex]; + + $namespaceName = $namespace->getFullName(); + + /** @var _Uses $uses */ $uses = []; + $lastUse = null; + + foreach ($namespaceUsesAnalyzer->getDeclarationsInNamespace($tokens, $namespace, true) as $use) { + if (!$use->isClass()) { + continue; + } + + $uses[$use->getHumanFriendlyType()][ltrim($use->getFullName(), '\\')] = $use->getShortName(); + $lastUse = $use; + } + + $indexDiff = 0; + foreach (true === $this->configuration['import_symbols'] ? [true, false] : [false] as $discoverSymbolsPhase) { + $this->discoveredSymbols = $discoverSymbolsPhase ? [] : null; + + $classyKinds = [T_CLASS, T_INTERFACE, T_TRAIT]; + if (\defined('T_ENUM')) { // @TODO: drop condition when PHP 8.1+ is required + $classyKinds[] = T_ENUM; + } + + $openedCurlyBrackets = 0; + $this->reservedIdentifiersByLevel = []; + + for ($index = $namespace->getScopeStartIndex(); $index < $namespace->getScopeEndIndex() + $indexDiff; ++$index) { + $origSize = \count($tokens); + + if ($tokens[$index]->equals('{')) { + ++$openedCurlyBrackets; + } if ($tokens[$index]->equals('}')) { + unset($this->reservedIdentifiersByLevel[$openedCurlyBrackets]); + --$openedCurlyBrackets; + } elseif ($discoverSymbolsPhase && $tokens[$index]->isGivenKind($classyKinds)) { + $this->fixNextName($tokens, $index, $uses, $namespaceName); + } elseif ($tokens[$index]->isGivenKind(T_FUNCTION)) { + $this->fixFunction($functionsAnalyzer, $tokens, $index, $uses, $namespaceName); + } elseif ($tokens[$index]->isGivenKind([T_EXTENDS, T_IMPLEMENTS])) { + $this->fixExtendsImplements($tokens, $index, $uses, $namespaceName); + } elseif ($tokens[$index]->isGivenKind(T_CATCH)) { + $this->fixCatch($tokens, $index, $uses, $namespaceName); + } elseif ($tokens[$index]->isGivenKind(T_DOUBLE_COLON)) { + $this->fixPrevName($tokens, $index, $uses, $namespaceName); + } elseif ($tokens[$index]->isGivenKind([T_INSTANCEOF, T_NEW, CT::T_USE_TRAIT, CT::T_TYPE_COLON])) { + $this->fixNextName($tokens, $index, $uses, $namespaceName); + } elseif ($tokens[$index]->isGivenKind(T_VARIABLE)) { + $prevIndex = $tokens->getPrevMeaningfulToken($index); + if (null !== $prevIndex && $tokens[$prevIndex]->isGivenKind(T_STRING)) { + $this->fixPrevName($tokens, $index, $uses, $namespaceName); + } + } elseif (\defined('T_ATTRIBUTE') && $tokens[$index]->isGivenKind(T_ATTRIBUTE)) { // @TODO: drop const check when PHP 8.0+ is required + $this->fixAttribute($tokens, $index, $uses, $namespaceName); + } elseif ($discoverSymbolsPhase && !\defined('T_ATTRIBUTE') && $tokens[$index]->isComment() && Preg::match('/#\[\s*('.self::REGEX_CLASS.')/', $tokens[$index]->getContent(), $matches)) { // @TODO: drop when PHP 8.0+ is required + /** @var class-string $attributeClass */ + $attributeClass = $matches[1]; + $this->determineShortType($attributeClass, 'class', $uses, $namespaceName); + } elseif ($tokens[$index]->isGivenKind(T_DOC_COMMENT)) { + Preg::matchAll('/\*\h*@(?:psalm-|phpstan-)?(?:template(?:-covariant|-contravariant)?|(?:import-)?type)\h+('.TypeExpression::REGEX_IDENTIFIER.')(?!\S)/i', $tokens[$index]->getContent(), $matches); + foreach ($matches[1] as $reservedIdentifier) { + $this->reservedIdentifiersByLevel[$openedCurlyBrackets + 1][$reservedIdentifier] = true; + } + + $this->fixPhpDoc($tokens, $index, $uses, $namespaceName); + } + + $indexDiff += \count($tokens) - $origSize; + } + + $this->reservedIdentifiersByLevel = []; + + if ($discoverSymbolsPhase) { + $this->setupUsesFromDiscoveredSymbols($uses, $namespaceName); + } + } + + if ([] !== $this->symbolsForImport) { + if (null !== $lastUse) { + $atIndex = $lastUse->getEndIndex() + 1; + } elseif (0 !== $namespace->getEndIndex()) { + $atIndex = $namespace->getEndIndex() + 1; + } else { + $firstTokenIndex = $tokens->getNextMeaningfulToken($namespace->getScopeStartIndex()); + if (null !== $firstTokenIndex && $tokens[$firstTokenIndex]->isGivenKind(T_DECLARE)) { + $atIndex = $tokens->getNextTokenOfKind($firstTokenIndex, [';']) + 1; + } else { + $atIndex = $namespace->getScopeStartIndex() + 1; + } + } + + // Insert all registered FQCNs + $this->createImportProcessor()->insertImports($tokens, $this->symbolsForImport, $atIndex); + + $this->symbolsForImport = []; + } + } + } + + /** + * @param _Uses $uses + */ + private function refreshUsesCache(array $uses): void + { + if ($this->cacheUsesLast === $uses) { + return; + } + + $this->cacheUsesLast = $uses; + + $this->cacheUseNameByShortNameLower = []; + $this->cacheUseShortNameByNameLower = []; + + foreach ($uses as $kind => $kindUses) { + foreach ($kindUses as $useLongName => $useShortName) { + $this->cacheUseNameByShortNameLower[$kind][strtolower($useShortName)] = $useLongName; + + /** + * @var class-string $normalisedUseLongName + * + * @phpstan-ignore varTag.nativeType + */ + $normalisedUseLongName = strtolower($useLongName); + $this->cacheUseShortNameByNameLower[$kind][$normalisedUseLongName] = $useShortName; + } + } + } + + private function isReservedIdentifier(string $symbol): bool + { + if (str_contains($symbol, '\\')) { // optimization only + return false; + } + + if ((new TypeAnalysis($symbol))->isReservedType()) { + return true; + } + + foreach ($this->reservedIdentifiersByLevel as $reservedIdentifiers) { + if (isset($reservedIdentifiers[$symbol])) { + return true; + } + } + + return false; + } + + /** + * Resolve absolute or relative symbol to normalized FQCN. + * + * @param _ImportType $importKind + * @param _Uses $uses + * + * @return class-string + */ + private function resolveSymbol(string $symbol, string $importKind, array $uses, string $namespaceName): string + { + if (str_starts_with($symbol, '\\')) { + return substr($symbol, 1); // @phpstan-ignore return.type + } + + if ($this->isReservedIdentifier($symbol)) { + return $symbol; // @phpstan-ignore return.type + } + + $this->refreshUsesCache($uses); + + $symbolArr = explode('\\', $symbol, 2); + $shortStartNameLower = strtolower($symbolArr[0]); + if (isset($this->cacheUseNameByShortNameLower[$importKind][$shortStartNameLower])) { + // @phpstan-ignore return.type + return $this->cacheUseNameByShortNameLower[$importKind][$shortStartNameLower].(isset($symbolArr[1]) ? '\\'.$symbolArr[1] : ''); + } + + return ('' !== $namespaceName ? $namespaceName.'\\' : '').$symbol; // @phpstan-ignore return.type + } + + /** + * Shorten normalized FQCN as much as possible. + * + * @param _ImportType $importKind + * @param _Uses $uses + */ + private function shortenSymbol(string $fqcn, string $importKind, array $uses, string $namespaceName): string + { + if ($this->isReservedIdentifier($fqcn)) { + return $fqcn; + } + + $this->refreshUsesCache($uses); + + $res = null; + + // try to shorten the name using namespace + $iMin = 0; + if (str_starts_with($fqcn, $namespaceName.'\\')) { + $tmpRes = substr($fqcn, \strlen($namespaceName) + 1); + if (!isset($this->cacheUseNameByShortNameLower[$importKind][strtolower(explode('\\', $tmpRes, 2)[0])]) && !$this->isReservedIdentifier($tmpRes)) { + $res = $tmpRes; + $iMin = substr_count($namespaceName, '\\') + 1; + } + } + + // try to shorten the name using uses + $tmp = $fqcn; + for ($i = substr_count($fqcn, '\\'); $i >= $iMin; --$i) { + if (isset($this->cacheUseShortNameByNameLower[$importKind][strtolower($tmp)])) { + $tmpRes = $this->cacheUseShortNameByNameLower[$importKind][strtolower($tmp)].substr($fqcn, \strlen($tmp)); + if (!$this->isReservedIdentifier($tmpRes)) { + $res = $tmpRes; + + break; + } + } + + if ($i > 0) { + $tmp = substr($tmp, 0, strrpos($tmp, '\\')); + } + } + + // shortening is not possible, add leading backslash if needed + if (null === $res) { + $res = $fqcn; + if ('' !== $namespaceName + || true === $this->configuration['leading_backslash_in_global_namespace'] + || isset($this->cacheUseNameByShortNameLower[$importKind][strtolower(explode('\\', $res, 2)[0])]) + ) { + $res = '\\'.$res; + } + } + + return $res; + } + + /** + * @param _Uses $uses + */ + private function setupUsesFromDiscoveredSymbols(array &$uses, string $namespaceName): void + { + foreach ($this->discoveredSymbols as $kind => $discoveredSymbols) { + $discoveredFqcnByShortNameLower = []; + + if ('' === $namespaceName) { + foreach ($discoveredSymbols as $symbol) { + if (!str_starts_with($symbol, '\\')) { + $shortStartName = explode('\\', ltrim($symbol, '\\'), 2)[0]; + $shortStartNameLower = strtolower($shortStartName); + $discoveredFqcnByShortNameLower[$kind][$shortStartNameLower] = $this->resolveSymbol($shortStartName, $kind, $uses, $namespaceName); + } + } + } + + foreach ($uses[$kind] ?? [] as $useLongName => $useShortName) { + $discoveredFqcnByShortNameLower[$kind][strtolower($useShortName)] = $useLongName; + } + + $useByShortNameLower = []; + foreach ($uses[$kind] ?? [] as $useShortName) { + $useByShortNameLower[strtolower($useShortName)] = true; + } + + uasort($discoveredSymbols, static function ($a, $b) { + $res = str_starts_with($a, '\\') <=> str_starts_with($b, '\\'); + if (0 !== $res) { + return $res; + } + + return substr_count($a, '\\') <=> substr_count($b, '\\'); + }); + foreach ($discoveredSymbols as $symbol) { + while (true) { + $shortEndNameLower = strtolower(str_contains($symbol, '\\') ? substr($symbol, strrpos($symbol, '\\') + 1) : $symbol); + if (!isset($discoveredFqcnByShortNameLower[$kind][$shortEndNameLower])) { + $shortStartNameLower = strtolower(explode('\\', ltrim($symbol, '\\'), 2)[0]); + if (str_starts_with($symbol, '\\') || ('' === $namespaceName && !isset($useByShortNameLower[$shortStartNameLower])) + || !str_contains($symbol, '\\') + ) { + $discoveredFqcnByShortNameLower[$kind][$shortEndNameLower] = $this->resolveSymbol($symbol, $kind, $uses, $namespaceName); + + break; + } + } + // else short name collision - keep unimported - foreach ($namespaceUsesAnalyzer->getDeclarationsInNamespace($tokens, $namespace) as $use) { - $uses[strtolower(ltrim($use->getFullName(), '\\'))] = $use->getShortName(); + if (str_starts_with($symbol, '\\') || '' === $namespaceName || !str_contains($symbol, '\\')) { + break; + } + + $symbol = substr($symbol, 0, strrpos($symbol, '\\')); + } } - for ($index = $namespace->getScopeStartIndex(); $index < $namespace->getScopeEndIndex(); ++$index) { - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { - $this->fixFunction($functionsAnalyzer, $tokens, $index, $uses, $namespaceName); + foreach ($uses[$kind] ?? [] as $useLongName => $useShortName) { + $discoveredLongName = $discoveredFqcnByShortNameLower[$kind][strtolower($useShortName)] ?? null; + if (strtolower($discoveredLongName) === strtolower($useLongName)) { + unset($discoveredFqcnByShortNameLower[$kind][strtolower($useShortName)]); } } + + foreach ($discoveredFqcnByShortNameLower[$kind] ?? [] as $fqcn) { + $shortenedName = ltrim($this->shortenSymbol($fqcn, $kind, [], $namespaceName), '\\'); + if (str_contains($shortenedName, '\\')) { // prevent importing non-namespaced names in global namespace + $shortEndName = str_contains($fqcn, '\\') ? substr($fqcn, strrpos($fqcn, '\\') + 1) : $fqcn; + $uses[$kind][$fqcn] = $shortEndName; + $this->symbolsForImport[$kind][$shortEndName] = $fqcn; + } + } + + if (isset($this->symbolsForImport[$kind])) { + ksort($this->symbolsForImport[$kind], SORT_NATURAL); + } } } /** - * @param array $uses + * @param _Uses $uses */ private function fixFunction(FunctionsAnalyzer $functionsAnalyzer, Tokens $tokens, int $index, array $uses, string $namespaceName): void { @@ -146,93 +636,282 @@ private function fixFunction(FunctionsAnalyzer $functionsAnalyzer, Tokens $token } /** - * @param array $uses + * @param _Uses $uses */ - private function replaceByShortType(Tokens $tokens, TypeAnalysis $type, array $uses, string $namespaceName): void + private function fixPhpDoc(Tokens $tokens, int $index, array $uses, string $namespaceName): void { - $typeStartIndex = $type->getStartIndex(); + $allowedTags = $this->configuration['phpdoc_tags']; - if ($tokens[$typeStartIndex]->isGivenKind(CT::T_NULLABLE_TYPE)) { - $typeStartIndex = $tokens->getNextMeaningfulToken($typeStartIndex); + if ([] === $allowedTags) { + return; } - $namespaceNameLength = \strlen($namespaceName); - $types = $this->getTypes($tokens, $typeStartIndex, $type->getEndIndex()); + $phpDoc = $tokens[$index]; + $phpDocContent = $phpDoc->getContent(); + $phpDocContentNew = Preg::replaceCallback('/([*{]\h*@)(\S+)(\h+)('.TypeExpression::REGEX_TYPES.')(?!(?!\})\S)/', function ($matches) use ($allowedTags, $uses, $namespaceName) { + if (!\in_array($matches[2], $allowedTags, true)) { + return $matches[0]; + } + + return $matches[1].$matches[2].$matches[3].$this->fixPhpDocType($matches[4], $uses, $namespaceName); + }, $phpDocContent); - foreach ($types as $typeName => [$startIndex, $endIndex]) { - if ((new TypeAnalysis($typeName))->isReservedType()) { - return; + if ($phpDocContentNew !== $phpDocContent) { + $tokens[$index] = new Token([T_DOC_COMMENT, $phpDocContentNew]); + } + } + + /** + * @param _Uses $uses + */ + private function fixPhpDocType(string $type, array $uses, string $namespaceName): string + { + $typeExpression = new TypeExpression($type, null, []); + + $typeExpression = $typeExpression->mapTypes(function (TypeExpression $type) use ($uses, $namespaceName) { + $currentTypeValue = $type->toString(); + + if ($type->isCompositeType() || !Preg::match('/^'.self::REGEX_CLASS.'$/', $currentTypeValue)) { + return $type; } - $withLeadingBackslash = str_starts_with($typeName, '\\'); - if ($withLeadingBackslash) { - $typeName = substr($typeName, 1); + /** @var class-string $currentTypeValue */ + $shortTokens = $this->determineShortType($currentTypeValue, 'class', $uses, $namespaceName); + + if (null === $shortTokens) { + return $type; } - $typeNameLower = strtolower($typeName); - if (isset($uses[$typeNameLower]) && ($withLeadingBackslash || '' === $namespaceName)) { - // if the type without leading "\" equals any of the full "uses" long names, it can be replaced with the short one - $tokens->overrideRange($startIndex, $endIndex, $this->namespacedStringToTokens($uses[$typeNameLower])); + $newTypeValue = implode('', array_map( + static fn (Token $token) => $token->getContent(), + $shortTokens + )); - continue; + return $currentTypeValue === $newTypeValue + ? $type + : new TypeExpression($newTypeValue, null, []); + }); + + return $typeExpression->toString(); + } + + /** + * @param _Uses $uses + */ + private function fixExtendsImplements(Tokens $tokens, int $index, array $uses, string $namespaceName): void + { + // We handle `extends` and `implements` with similar logic, but we need to exit the loop under different conditions. + $isExtends = $tokens[$index]->equals([T_EXTENDS]); + $index = $tokens->getNextMeaningfulToken($index); + + $typeStartIndex = null; + $typeEndIndex = null; + + while (true) { + if ($tokens[$index]->equalsAny([',', '{', [T_IMPLEMENTS]])) { + if (null !== $typeStartIndex) { + $index += $this->shortenClassIfPossible($tokens, $typeStartIndex, $typeEndIndex, $uses, $namespaceName); + } + $typeStartIndex = null; + + if ($tokens[$index]->equalsAny($isExtends ? [[T_IMPLEMENTS], '{'] : ['{'])) { + break; + } + } else { + if (null === $typeStartIndex) { + $typeStartIndex = $index; + } + $typeEndIndex = $index; } - if ('' === $namespaceName) { - foreach ($uses as $useShortName) { - if (strtolower($useShortName) === $typeNameLower) { - continue 2; - } + $index = $tokens->getNextMeaningfulToken($index); + } + } + + /** + * @param _Uses $uses + */ + private function fixCatch(Tokens $tokens, int $index, array $uses, string $namespaceName): void + { + $index = $tokens->getNextMeaningfulToken($index); // '(' + $index = $tokens->getNextMeaningfulToken($index); // first part of first exception class to be caught + + $typeStartIndex = null; + $typeEndIndex = null; + + while (true) { + if ($tokens[$index]->equalsAny([')', [T_VARIABLE], [CT::T_TYPE_ALTERNATION]])) { + if (null === $typeStartIndex) { + break; } - // if we are in the global namespace and the type is not imported, - // we enforce/remove leading backslash (depending on the configuration) - if (true === $this->configuration['leading_backslash_in_global_namespace']) { - if (!$withLeadingBackslash && !isset($uses[$typeNameLower])) { - $tokens->overrideRange( - $startIndex, - $endIndex, - $this->namespacedStringToTokens($typeName, true) - ); - } - } else { - $tokens->overrideRange($startIndex, $endIndex, $this->namespacedStringToTokens($typeName)); + $index += $this->shortenClassIfPossible($tokens, $typeStartIndex, $typeEndIndex, $uses, $namespaceName); + $typeStartIndex = null; + + if ($tokens[$index]->equals(')')) { + break; } - } elseif (!str_contains($typeName, '\\')) { - // If we're NOT in the global namespace, there's no related import, - // AND used type is from global namespace, then it can't be shortened. - continue; - } elseif ($typeNameLower !== $namespaceName && str_starts_with($typeNameLower, $namespaceName.'\\')) { - // if the type starts with namespace and the type is not the same as the namespace it can be shortened - $typeNameShort = substr($typeName, $namespaceNameLength + 1); - - // if short names are the same, but long one are different then it cannot be shortened - foreach ($uses as $useLongName => $useShortName) { - if ( - strtolower($typeNameShort) === strtolower($useShortName) - && strtolower($typeName) !== strtolower($useLongName) - ) { - continue 2; - } + } else { + if (null === $typeStartIndex) { + $typeStartIndex = $index; + } + $typeEndIndex = $index; + } + + $index = $tokens->getNextMeaningfulToken($index); + } + } + + /** + * @param _Uses $uses + */ + private function fixAttribute(Tokens $tokens, int $index, array $uses, string $namespaceName): void + { + $attributeAnalysis = AttributeAnalyzer::collectOne($tokens, $index); + + foreach ($attributeAnalysis->getAttributes() as $attribute) { + $index = $attribute['start']; + while ($tokens[$index]->equalsAny([[T_STRING], [T_NS_SEPARATOR]])) { + $index = $tokens->getPrevMeaningfulToken($index); + } + $this->fixNextName($tokens, $index, $uses, $namespaceName); + } + } + + /** + * @param _Uses $uses + */ + private function fixPrevName(Tokens $tokens, int $index, array $uses, string $namespaceName): void + { + $typeStartIndex = null; + $typeEndIndex = null; + + while (true) { + $index = $tokens->getPrevMeaningfulToken($index); + if ($tokens[$index]->isObjectOperator()) { + break; + } + + if ($tokens[$index]->equalsAny([[T_STRING], [T_NS_SEPARATOR]])) { + $typeStartIndex = $index; + if (null === $typeEndIndex) { + $typeEndIndex = $index; + } + } else { + if (null !== $typeEndIndex) { + $index += $this->shortenClassIfPossible($tokens, $typeStartIndex, $typeEndIndex, $uses, $namespaceName); } - $tokens->overrideRange($startIndex, $endIndex, $this->namespacedStringToTokens($typeNameShort)); + break; } } } /** - * @return iterable + * @param _Uses $uses + */ + private function fixNextName(Tokens $tokens, int $index, array $uses, string $namespaceName): void + { + $typeStartIndex = null; + $typeEndIndex = null; + + while (true) { + $index = $tokens->getNextMeaningfulToken($index); + + if ($tokens[$index]->equalsAny([[T_STRING], [T_NS_SEPARATOR]])) { + if (null === $typeStartIndex) { + $typeStartIndex = $index; + } + $typeEndIndex = $index; + } else { + if (null !== $typeStartIndex) { + $index += $this->shortenClassIfPossible($tokens, $typeStartIndex, $typeEndIndex, $uses, $namespaceName); + } + + break; + } + } + } + + /** + * @param _Uses $uses + */ + private function shortenClassIfPossible(Tokens $tokens, int $typeStartIndex, int $typeEndIndex, array $uses, string $namespaceName): int + { + /** @var class-string $content */ + $content = $tokens->generatePartialCode($typeStartIndex, $typeEndIndex); + $newTokens = $this->determineShortType($content, 'class', $uses, $namespaceName); + if (null === $newTokens) { + return 0; + } + + $tokens->overrideRange($typeStartIndex, $typeEndIndex, $newTokens); + + return \count($newTokens) - ($typeEndIndex - $typeStartIndex) - 1; + } + + /** + * @param _Uses $uses + */ + private function replaceByShortType(Tokens $tokens, TypeAnalysis $type, array $uses, string $namespaceName): void + { + $typeStartIndex = $type->getStartIndex(); + + if ($tokens[$typeStartIndex]->isGivenKind(CT::T_NULLABLE_TYPE)) { + $typeStartIndex = $tokens->getNextMeaningfulToken($typeStartIndex); + } + + $types = $this->getTypes($tokens, $typeStartIndex, $type->getEndIndex()); + + foreach ($types as [$startIndex, $endIndex]) { + /** @var class-string $content */ + $content = $tokens->generatePartialCode($startIndex, $endIndex); + $newTokens = $this->determineShortType($content, 'class', $uses, $namespaceName); + if (null !== $newTokens) { + $tokens->overrideRange($startIndex, $endIndex, $newTokens); + } + } + } + + /** + * Determines short type based on FQCN, current namespace and imports (`use` declarations). + * + * @param class-string $typeName + * @param _ImportType $importKind + * @param _Uses $uses + * + * @return null|list + */ + private function determineShortType(string $typeName, string $importKind, array $uses, string $namespaceName): ?array + { + if (null !== $this->discoveredSymbols) { + if (!$this->isReservedIdentifier($typeName)) { + $this->discoveredSymbols[$importKind][] = $typeName; + } + + return null; + } + + $fqcn = $this->resolveSymbol($typeName, $importKind, $uses, $namespaceName); + $shortenedType = $this->shortenSymbol($fqcn, $importKind, $uses, $namespaceName); + if ($shortenedType === $typeName) { + return null; + } + + return $this->namespacedStringToTokens($shortenedType); + } + + /** + * @return iterable */ private function getTypes(Tokens $tokens, int $index, int $endIndex): iterable { $skipNextYield = false; $typeStartIndex = $typeEndIndex = null; - $type = null; while (true) { if ($tokens[$index]->isGivenKind(CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN)) { $index = $tokens->getNextMeaningfulToken($index); $typeStartIndex = $typeEndIndex = null; - $type = null; continue; } @@ -244,19 +923,17 @@ private function getTypes(Tokens $tokens, int $index, int $endIndex): iterable if (!$skipNextYield && null !== $typeStartIndex) { $origCount = \count($tokens); - yield $type => [$typeStartIndex, $typeEndIndex]; + yield [$typeStartIndex, $typeEndIndex]; $endIndex += \count($tokens) - $origCount; // type tokens were possibly updated, restart type match $skipNextYield = true; $index = $typeEndIndex = $typeStartIndex; - $type = null; } else { $skipNextYield = false; $index = $tokens->getNextMeaningfulToken($index); $typeStartIndex = $typeEndIndex = null; - $type = null; } if ($index > $endIndex) { @@ -268,25 +945,23 @@ private function getTypes(Tokens $tokens, int $index, int $endIndex): iterable if (null === $typeStartIndex) { $typeStartIndex = $index; - $type = ''; } - $typeEndIndex = $index; - $type .= $tokens[$index]->getContent(); $index = $tokens->getNextMeaningfulToken($index); } } /** - * @return Token[] + * @return list */ - private function namespacedStringToTokens(string $input, bool $withLeadingBackslash = false): array + private function namespacedStringToTokens(string $input): array { $tokens = []; - if ($withLeadingBackslash) { + if (str_starts_with($input, '\\')) { $tokens[] = new Token([T_NS_SEPARATOR, '\\']); + $input = substr($input, 1); } $parts = explode('\\', $input); @@ -300,4 +975,13 @@ private function namespacedStringToTokens(string $input, bool $withLeadingBacksl return $tokens; } + + /** + * We need to create import processor dynamically (not in costructor), because actual whitespace configuration + * is set later, not when fixer's instance is created. + */ + private function createImportProcessor(): ImportProcessor + { + return new ImportProcessor($this->whitespacesConfig); + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php index adda98289..ac52f9d8c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GlobalNamespaceImportFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\Annotation; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -31,15 +32,41 @@ use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; use PhpCsFixer\Tokenizer\Analyzer\NamespaceUsesAnalyzer; use PhpCsFixer\Tokenizer\CT; +use PhpCsFixer\Tokenizer\Processor\ImportProcessor; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; use PhpCsFixer\Tokenizer\TokensAnalyzer; /** * @author Gregor Harlan + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * import_classes?: bool|null, + * import_constants?: bool|null, + * import_functions?: bool|null, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * import_classes: bool|null, + * import_constants: bool|null, + * import_functions: bool|null, + * } */ final class GlobalNamespaceImportFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + private ImportProcessor $importProcessor; + + public function __construct() + { + parent::__construct(); + + $this->importProcessor = new ImportProcessor($this->whitespacesConfig); + } + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -90,7 +117,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run before NoUnusedImportsFixer, OrderedImportsFixer. + * Must run before NoUnusedImportsFixer, OrderedImportsFixer, StatementIndentationFixer. * Must run after NativeConstantInvocationFixer, NativeFunctionInvocationFixer. */ public function getPriority(): int @@ -136,10 +163,16 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $this->fullyQualifyClasses($tokens, $useDeclarations); } - $newImports = array_filter($newImports); - if (\count($newImports) > 0) { - $this->insertImports($tokens, $newImports, $useDeclarations); + if (\count($useDeclarations) > 0) { + $useDeclaration = end($useDeclarations); + $atIndex = $useDeclaration->getEndIndex() + 1; + } else { + $namespace = $tokens->getNamespaceDeclarations()[0]; + $atIndex = $namespace->getEndIndex() + 1; + } + + $this->importProcessor->insertImports($tokens, $newImports, $atIndex); } } @@ -148,23 +181,23 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('import_constants', 'Whether to import, not import or ignore global constants.')) ->setDefault(null) - ->setAllowedValues([true, false, null]) + ->setAllowedTypes(['null', 'bool']) ->getOption(), (new FixerOptionBuilder('import_functions', 'Whether to import, not import or ignore global functions.')) ->setDefault(null) - ->setAllowedValues([true, false, null]) + ->setAllowedTypes(['null', 'bool']) ->getOption(), (new FixerOptionBuilder('import_classes', 'Whether to import, not import or ignore global classes.')) ->setDefault(true) - ->setAllowedValues([true, false, null]) + ->setAllowedTypes(['null', 'bool']) ->getOption(), ]); } /** - * @param NamespaceUseAnalysis[] $useDeclarations + * @param list $useDeclarations * - * @return array + * @return array */ private function importConstants(Tokens $tokens, array $useDeclarations): array { @@ -233,9 +266,9 @@ private function importConstants(Tokens $tokens, array $useDeclarations): array } /** - * @param NamespaceUseAnalysis[] $useDeclarations + * @param list $useDeclarations * - * @return array + * @return array */ private function importFunctions(Tokens $tokens, array $useDeclarations): array { @@ -283,15 +316,15 @@ private function importFunctions(Tokens $tokens, array $useDeclarations): array } /** - * @param NamespaceUseAnalysis[] $useDeclarations + * @param list $useDeclarations * - * @return array + * @return array */ private function importClasses(Tokens $tokens, array $useDeclarations): array { [$global, $other] = $this->filterUseDeclarations($useDeclarations, static fn (NamespaceUseAnalysis $declaration): bool => $declaration->isClass(), false); - /** @var DocBlock[] $docBlocks */ + /** @var array $docBlocks */ $docBlocks = []; // find class declarations and class usages in docblocks @@ -370,7 +403,9 @@ private function importClasses(Tokens $tokens, array $useDeclarations): array return $type; } + /** @var class-string $name */ $name = substr($type, 1); + $checkName = strtolower($name); if (str_contains($checkName, '\\') || isset($other[$checkName])) { @@ -391,22 +426,24 @@ private function importClasses(Tokens $tokens, array $useDeclarations): array } } - return $imports + $this->prepareImports($tokens, $indices, $global, $other, false); + return array_merge($imports, $this->prepareImports($tokens, $indices, $global, $other, false)); } /** * Removes the leading slash at the given indices (when the name is not already used). * - * @param int[] $indices - * @param array $other + * @param list $indices + * @param array $global + * @param array $other * - * @return array array keys contain the names that must be imported + * @return array array keys contain the names that must be imported */ private function prepareImports(Tokens $tokens, array $indices, array $global, array $other, bool $caseSensitive): array { $imports = []; foreach ($indices as $index) { + /** @var class-string $name */ $name = $tokens[$index]->getContent(); $checkName = $caseSensitive ? $name : strtolower($name); @@ -427,50 +464,7 @@ private function prepareImports(Tokens $tokens, array $indices, array $global, a } /** - * @param NamespaceUseAnalysis[] $useDeclarations - */ - private function insertImports(Tokens $tokens, array $imports, array $useDeclarations): void - { - if (\count($useDeclarations) > 0) { - $useDeclaration = end($useDeclarations); - $index = $useDeclaration->getEndIndex() + 1; - } else { - $namespace = $tokens->getNamespaceDeclarations()[0]; - $index = $namespace->getEndIndex() + 1; - } - - $lineEnding = $this->whitespacesConfig->getLineEnding(); - - if (!$tokens[$index]->isWhitespace() || !str_contains($tokens[$index]->getContent(), "\n")) { - $tokens->insertAt($index, new Token([T_WHITESPACE, $lineEnding])); - } - - foreach ($imports as $type => $typeImports) { - foreach ($typeImports as $name) { - $items = [ - new Token([T_WHITESPACE, $lineEnding]), - new Token([T_USE, 'use']), - new Token([T_WHITESPACE, ' ']), - ]; - - if ('const' === $type) { - $items[] = new Token([CT::T_CONST_IMPORT, 'const']); - $items[] = new Token([T_WHITESPACE, ' ']); - } elseif ('function' === $type) { - $items[] = new Token([CT::T_FUNCTION_IMPORT, 'function']); - $items[] = new Token([T_WHITESPACE, ' ']); - } - - $items[] = new Token([T_STRING, $name]); - $items[] = new Token(';'); - - $tokens->insertAt($index, $items); - } - } - } - - /** - * @param NamespaceUseAnalysis[] $useDeclarations + * @param list $useDeclarations */ private function fullyQualifyConstants(Tokens $tokens, array $useDeclarations): void { @@ -480,7 +474,7 @@ private function fullyQualifyConstants(Tokens $tokens, array $useDeclarations): [$global] = $this->filterUseDeclarations($useDeclarations, static fn (NamespaceUseAnalysis $declaration): bool => $declaration->isConstant() && !$declaration->isAliased(), true); - if (!$global) { + if ([] === $global) { return; } @@ -510,7 +504,7 @@ private function fullyQualifyConstants(Tokens $tokens, array $useDeclarations): } /** - * @param NamespaceUseAnalysis[] $useDeclarations + * @param list $useDeclarations */ private function fullyQualifyFunctions(Tokens $tokens, array $useDeclarations): void { @@ -520,7 +514,7 @@ private function fullyQualifyFunctions(Tokens $tokens, array $useDeclarations): [$global] = $this->filterUseDeclarations($useDeclarations, static fn (NamespaceUseAnalysis $declaration): bool => $declaration->isFunction() && !$declaration->isAliased(), false); - if (!$global) { + if ([] === $global) { return; } @@ -550,7 +544,7 @@ private function fullyQualifyFunctions(Tokens $tokens, array $useDeclarations): } /** - * @param NamespaceUseAnalysis[] $useDeclarations + * @param list $useDeclarations */ private function fullyQualifyClasses(Tokens $tokens, array $useDeclarations): void { @@ -560,7 +554,7 @@ private function fullyQualifyClasses(Tokens $tokens, array $useDeclarations): vo [$global] = $this->filterUseDeclarations($useDeclarations, static fn (NamespaceUseAnalysis $declaration): bool => $declaration->isClass() && !$declaration->isAliased(), false); - if (!$global) { + if ([] === $global) { return; } @@ -608,7 +602,9 @@ private function fullyQualifyClasses(Tokens $tokens, array $useDeclarations): vo } /** - * @param NamespaceUseAnalysis[] $declarations + * @param list $declarations + * + * @return array{0: array, 1: array} */ private function filterUseDeclarations(array $declarations, callable $callback, bool $caseSensitive): array { @@ -706,7 +702,7 @@ private function traverseDocBlockTypes(DocBlock $doc, callable $callback): bool foreach ($types as $i => $fullType) { $newFullType = $fullType; - Preg::matchAll('/[\\\\\w]+/', $fullType, $matches, PREG_OFFSET_CAPTURE); + Preg::matchAll('/[\\\\\w]+(?![\\\\\w:])/', $fullType, $matches, PREG_OFFSET_CAPTURE); foreach (array_reverse($matches[0]) as [$type, $offset]) { $newType = $callback($type); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php index 00ee24b8b..e0a17d789 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/GroupImportFixer.php @@ -15,6 +15,11 @@ namespace PhpCsFixer\Fixer\Import; use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; @@ -23,12 +28,36 @@ use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +use PhpCsFixer\Utils; +use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; /** * @author Volodymyr Kupriienko + * @author Greg Korba + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * group_types?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * group_types: list, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ -final class GroupImportFixer extends AbstractFixer +final class GroupImportFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + /** @internal */ + public const GROUP_CLASSY = 'classy'; + + /** @internal */ + public const GROUP_CONSTANTS = 'constants'; + + /** @internal */ + public const GROUP_FUNCTIONS = 'functions'; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -37,6 +66,18 @@ public function getDefinition(): FixerDefinitionInterface new CodeSample( " [self::GROUP_CLASSY]] + ), ] ); } @@ -46,24 +87,72 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound(T_USE); } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + $allowedTypes = [self::GROUP_CLASSY, self::GROUP_FUNCTIONS, self::GROUP_CONSTANTS]; + + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('group_types', 'Defines the order of import types.')) + ->setAllowedTypes(['string[]']) + ->setAllowedValues([static function (array $types) use ($allowedTypes): bool { + foreach ($types as $type) { + if (!\in_array($type, $allowedTypes, true)) { + throw new InvalidOptionsException( + \sprintf( + 'Invalid group type: %s, allowed types: %s.', + $type, + Utils::naturalLanguageJoin($allowedTypes) + ) + ); + } + } + + return true; + }]) + ->setDefault($allowedTypes) + ->getOption(), + ]); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $useWithSameNamespaces = $this->getSameNamespaces($tokens); + $useWithSameNamespaces = $this->getSameNamespacesByType($tokens); if ([] === $useWithSameNamespaces) { return; } - $this->removeSingleUseStatements($useWithSameNamespaces, $tokens); - $this->addGroupUseStatements($useWithSameNamespaces, $tokens); + $typeMap = [ + NamespaceUseAnalysis::TYPE_CLASS => self::GROUP_CLASSY, + NamespaceUseAnalysis::TYPE_FUNCTION => self::GROUP_FUNCTIONS, + NamespaceUseAnalysis::TYPE_CONSTANT => self::GROUP_CONSTANTS, + ]; + + // As a first step we need to remove all the use statements for the enabled import types. + // We can't add new group imports yet, because we need to operate on previously determined token indices for all types. + foreach ($useWithSameNamespaces as $type => $uses) { + if (!\in_array($typeMap[$type], $this->configuration['group_types'], true)) { + continue; + } + + $this->removeSingleUseStatements($uses, $tokens); + } + + foreach ($useWithSameNamespaces as $type => $uses) { + if (!\in_array($typeMap[$type], $this->configuration['group_types'], true)) { + continue; + } + + $this->addGroupUseStatements($uses, $tokens); + } } /** * Gets namespace use analyzers with same namespaces. * - * @return NamespaceUseAnalysis[] + * @return array> */ - private function getSameNamespaces(Tokens $tokens): array + private function getSameNamespacesByType(Tokens $tokens): array { $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); @@ -89,16 +178,23 @@ private function getSameNamespaces(Tokens $tokens): array $namespaceA = $this->getNamespaceNameWithSlash($a); $namespaceB = $this->getNamespaceNameWithSlash($b); - $namespaceDifference = \strlen($namespaceA) - \strlen($namespaceB); + $namespaceDifference = \strlen($namespaceA) <=> \strlen($namespaceB); - return 0 !== $namespaceDifference ? $namespaceDifference : strcmp($a->getFullName(), $b->getFullName()); + return 0 !== $namespaceDifference ? $namespaceDifference : $a->getFullName() <=> $b->getFullName(); }); - return $sameNamespaceAnalysis; + $sameNamespaceAnalysisByType = []; + foreach ($sameNamespaceAnalysis as $analysis) { + $sameNamespaceAnalysisByType[$analysis->getType()][] = $analysis; + } + + ksort($sameNamespaceAnalysisByType); + + return $sameNamespaceAnalysisByType; } /** - * @param NamespaceUseAnalysis[] $statements + * @param list $statements */ private function removeSingleUseStatements(array $statements, Tokens $tokens): void { @@ -129,12 +225,21 @@ private function removeSingleUseStatements(array $statements, Tokens $tokens): v } /** - * @param NamespaceUseAnalysis[] $statements + * @param list $statements */ private function addGroupUseStatements(array $statements, Tokens $tokens): void { $currentUseDeclaration = null; - $insertIndex = \array_slice($statements, -1)[0]->getEndIndex() + 1; + $insertIndex = $statements[0]->getStartIndex(); + + // If group import was inserted in place of removed imports, it may have more tokens than before, + // and indices stored in imports of another type can be out-of-sync, and can point in the middle of group import. + // Let's move the pointer to the closest empty token (erased single import). + if (null !== $tokens[$insertIndex]->getId() || '' !== $tokens[$insertIndex]->getContent()) { + do { + ++$insertIndex; + } while (null !== $tokens[$insertIndex]->getId() || '' !== $tokens[$insertIndex]->getContent()); + } foreach ($statements as $index => $useDeclaration) { if ($this->areDeclarationsDifferent($currentUseDeclaration, $useDeclaration)) { @@ -143,7 +248,7 @@ private function addGroupUseStatements(array $statements, Tokens $tokens): void $tokens, $insertIndex, $useDeclaration, - $this->getNamespaceNameWithSlash($currentUseDeclaration) + rtrim($this->getNamespaceNameWithSlash($currentUseDeclaration), '\\') ); } else { $newTokens = [ @@ -207,10 +312,6 @@ private function createNewGroup(Tokens $tokens, int $insertIndex, NamespaceUseAn { $insertedTokens = 0; - if (\count($tokens) === $insertIndex) { - $tokens->setSize($insertIndex + 1); - } - $newTokens = [ new Token([T_USE, 'use']), new Token([T_WHITESPACE, ' ']), @@ -225,7 +326,7 @@ private function createNewGroup(Tokens $tokens, int $insertIndex, NamespaceUseAn $newTokens[] = new Token([T_WHITESPACE, ' ']); } - $namespaceParts = array_filter(explode('\\', $currentNamespace)); + $namespaceParts = explode('\\', $currentNamespace); foreach ($namespaceParts as $part) { $newTokens[] = new Token([T_STRING, $part]); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php index 898865d90..446428317 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/NoUnusedImportsFixer.php @@ -45,7 +45,7 @@ public function getDefinition(): FixerDefinitionInterface * {@inheritdoc} * * Must run before BlankLineAfterNamespaceFixer, NoExtraBlankLinesFixer, NoLeadingImportSlashFixer, SingleLineAfterImportsFixer. - * Must run after ClassKeywordRemoveFixer, GlobalNamespaceImportFixer, PhpUnitDedicateAssertFixer, PhpUnitFqcnAnnotationFixer, SingleImportPerStatementFixer. + * Must run after ClassKeywordRemoveFixer, GlobalNamespaceImportFixer, PhpUnitDedicateAssertFixer, PhpUnitFqcnAnnotationFixer. */ public function getPriority(): int { @@ -59,7 +59,7 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens); + $useDeclarations = (new NamespaceUsesAnalyzer())->getDeclarationsFromTokens($tokens, true); if (0 === \count($useDeclarations)) { return; @@ -175,7 +175,7 @@ private function isImportUsed(Tokens $tokens, NamespaceAnalysis $namespace, Name if ($token->isComment() && Preg::match( - '/(?getShortName().'(?![[:alnum:]])/i', + '/(?getShortName().'(?![[:alnum:]])/i', $token->getContent() ) ) { @@ -186,15 +186,23 @@ private function isImportUsed(Tokens $tokens, NamespaceAnalysis $namespace, Name return false; } - private function removeUseDeclaration(Tokens $tokens, NamespaceUseAnalysis $useDeclaration): void - { - for ($index = $useDeclaration->getEndIndex() - 1; $index >= $useDeclaration->getStartIndex(); --$index) { + private function removeUseDeclaration( + Tokens $tokens, + NamespaceUseAnalysis $useDeclaration, + bool $forceCompleteRemoval = false + ): void { + [$start, $end] = ($useDeclaration->isInMulti() && !$forceCompleteRemoval) + ? [$useDeclaration->getChunkStartIndex(), $useDeclaration->getChunkEndIndex()] + : [$useDeclaration->getStartIndex(), $useDeclaration->getEndIndex()]; + $loopStartIndex = $useDeclaration->isInMulti() || $forceCompleteRemoval ? $end : $end - 1; + + for ($index = $loopStartIndex; $index >= $start; --$index) { if ($tokens[$index]->isComment()) { continue; } if (!$tokens[$index]->isWhitespace() || !str_contains($tokens[$index]->getContent(), "\n")) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); + $tokens->clearAt($index); continue; } @@ -210,12 +218,109 @@ private function removeUseDeclaration(Tokens $tokens, NamespaceUseAnalysis $useD } } + // For multi-use import statements the tokens containing FQN were already removed in the loop above. + // We need to clean up tokens around the ex-chunk to keep the correct syntax and achieve proper formatting. + if (!$forceCompleteRemoval && $useDeclaration->isInMulti()) { + $this->cleanUpAfterImportChunkRemoval($tokens, $useDeclaration); + + return; + } + if ($tokens[$useDeclaration->getEndIndex()]->equals(';')) { // do not remove `? >` $tokens->clearAt($useDeclaration->getEndIndex()); } - // remove white space above and below where the `use` statement was + $this->cleanUpSurroundingNewLines($tokens, $useDeclaration); + } + + /** + * @param list $useDeclarations + */ + private function removeUsesInSameNamespace(Tokens $tokens, array $useDeclarations, NamespaceAnalysis $namespaceDeclaration): void + { + $namespace = $namespaceDeclaration->getFullName(); + $nsLength = \strlen($namespace.'\\'); + + foreach ($useDeclarations as $useDeclaration) { + if ($useDeclaration->isAliased()) { + continue; + } + + $useDeclarationFullName = ltrim($useDeclaration->getFullName(), '\\'); + + if (!str_starts_with($useDeclarationFullName, $namespace.'\\')) { + continue; + } + + $partName = substr($useDeclarationFullName, $nsLength); + + if (!str_contains($partName, '\\')) { + $this->removeUseDeclaration($tokens, $useDeclaration); + } + } + } + + private function cleanUpAfterImportChunkRemoval(Tokens $tokens, NamespaceUseAnalysis $useDeclaration): void + { + $beforeChunkIndex = $tokens->getPrevMeaningfulToken($useDeclaration->getChunkStartIndex()); + $afterChunkIndex = $tokens->getNextMeaningfulToken($useDeclaration->getChunkEndIndex()); + $hasNonEmptyTokenBefore = $this->scanForNonEmptyTokensUntilNewLineFound( + $tokens, + $afterChunkIndex, + -1 + ); + $hasNonEmptyTokenAfter = $this->scanForNonEmptyTokensUntilNewLineFound( + $tokens, + $afterChunkIndex, + 1 + ); + + // We don't want to merge consequent new lines with indentation (leading to e.g. `\n \n `), + // so it's safe to merge whitespace only if there is any non-empty token before or after the chunk. + $mergingSurroundingWhitespaceIsSafe = $hasNonEmptyTokenBefore[1] || $hasNonEmptyTokenAfter[1]; + $clearToken = static function (int $index) use ($tokens, $mergingSurroundingWhitespaceIsSafe): void { + if ($mergingSurroundingWhitespaceIsSafe) { + $tokens->clearTokenAndMergeSurroundingWhitespace($index); + } else { + $tokens->clearAt($index); + } + }; + + if ($tokens[$afterChunkIndex]->equals(',')) { + $clearToken($afterChunkIndex); + } elseif ($tokens[$beforeChunkIndex]->equals(',')) { + $clearToken($beforeChunkIndex); + } + + // Ensure there's a single space where applicable, otherwise no space (before comma, before closing brace) + for ($index = $beforeChunkIndex; $index <= $afterChunkIndex; ++$index) { + if (null === $tokens[$index]->getId() || !$tokens[$index]->isWhitespace(' ')) { + continue; + } + + $nextTokenIndex = $tokens->getNextMeaningfulToken($index); + if ( + $tokens[$nextTokenIndex]->equals(',') + || $tokens[$nextTokenIndex]->equals(';') + || $tokens[$nextTokenIndex]->isGivenKind([CT::T_GROUP_IMPORT_BRACE_CLOSE]) + ) { + $tokens->clearAt($index); + } else { + $tokens[$index] = new Token([T_WHITESPACE, ' ']); + } + + $prevTokenIndex = $tokens->getPrevMeaningfulToken($index); + if ($tokens[$prevTokenIndex]->isGivenKind([CT::T_GROUP_IMPORT_BRACE_OPEN])) { + $tokens->clearAt($index); + } + } + + $this->removeLineIfEmpty($tokens, $useDeclaration); + $this->removeImportStatementIfEmpty($tokens, $useDeclaration); + } + private function cleanUpSurroundingNewLines(Tokens $tokens, NamespaceUseAnalysis $useDeclaration): void + { $prevIndex = $useDeclaration->getStartIndex() - 1; $prevToken = $tokens[$prevIndex]; @@ -261,30 +366,90 @@ private function removeUseDeclaration(Tokens $tokens, NamespaceUseAnalysis $useD } } - /** - * @param list $useDeclarations - */ - private function removeUsesInSameNamespace(Tokens $tokens, array $useDeclarations, NamespaceAnalysis $namespaceDeclaration): void + private function removeImportStatementIfEmpty(Tokens $tokens, NamespaceUseAnalysis $useDeclaration): void { - $namespace = $namespaceDeclaration->getFullName(); - $nsLength = \strlen($namespace.'\\'); + // First we look for empty groups where all chunks were removed (`use Foo\{};`). + // We're only interested in ending brace if its index is between start and end of the import statement. + $endingBraceIndex = $tokens->getPrevTokenOfKind( + $useDeclaration->getEndIndex(), + [[CT::T_GROUP_IMPORT_BRACE_CLOSE]] + ); - foreach ($useDeclarations as $useDeclaration) { - if ($useDeclaration->isAliased()) { - continue; + if ($endingBraceIndex > $useDeclaration->getStartIndex()) { + $openingBraceIndex = $tokens->getPrevMeaningfulToken($endingBraceIndex); + + if ($tokens[$openingBraceIndex]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { + $this->removeUseDeclaration($tokens, $useDeclaration, true); } + } - $useDeclarationFullName = ltrim($useDeclaration->getFullName(), '\\'); + // Second we look for empty groups where all comma-separated chunks were removed (`use;`). + $beforeSemicolonIndex = $tokens->getPrevMeaningfulToken($useDeclaration->getEndIndex()); + if ( + $tokens[$beforeSemicolonIndex]->isGivenKind([T_USE]) + || \in_array($tokens[$beforeSemicolonIndex]->getContent(), ['function', 'const'], true) + ) { + $this->removeUseDeclaration($tokens, $useDeclaration, true); + } + } - if (!str_starts_with($useDeclarationFullName, $namespace.'\\')) { + private function removeLineIfEmpty(Tokens $tokens, NamespaceUseAnalysis $useAnalysis): void + { + if (!$useAnalysis->isInMulti()) { + return; + } + + $hasNonEmptyTokenBefore = $this->scanForNonEmptyTokensUntilNewLineFound( + $tokens, + $useAnalysis->getChunkStartIndex(), + -1 + ); + $hasNonEmptyTokenAfter = $this->scanForNonEmptyTokensUntilNewLineFound( + $tokens, + $useAnalysis->getChunkEndIndex(), + 1 + ); + + if ( + \is_int($hasNonEmptyTokenBefore[0]) + && !$hasNonEmptyTokenBefore[1] + && \is_int($hasNonEmptyTokenAfter[0]) + && !$hasNonEmptyTokenAfter[1] + ) { + $tokens->clearRange($hasNonEmptyTokenBefore[0], $hasNonEmptyTokenAfter[0] - 1); + } + } + + /** + * Returns tuple with the index of first token with whitespace containing new line char + * and a flag if any non-empty token was found along the way. + * + * @param -1|1 $direction + * + * @return array{0: null|int, 1: bool} + */ + private function scanForNonEmptyTokensUntilNewLineFound(Tokens $tokens, int $index, int $direction): array + { + $hasNonEmptyToken = false; + $newLineTokenIndex = null; + + // Iterate until we find new line OR we get out of $tokens bounds (next sibling index is `null`). + while (\is_int($index)) { + $index = $tokens->getNonEmptySibling($index, $direction); + + if (null === $index || null === $tokens[$index]->getId()) { continue; } - $partName = substr($useDeclarationFullName, $nsLength); + if (!$tokens[$index]->isWhitespace()) { + $hasNonEmptyToken = true; + } elseif (str_starts_with($tokens[$index]->getContent(), "\n")) { + $newLineTokenIndex = $index; - if (!str_contains($partName, '\\')) { - $this->removeUseDeclaration($tokens, $useDeclaration); + break; } } + + return [$newLineTokenIndex, $hasNonEmptyToken]; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php index 436206a3b..671d51de9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/OrderedImportsFixer.php @@ -15,7 +15,10 @@ namespace PhpCsFixer\Fixer\Import; use PhpCsFixer\AbstractFixer; +use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; +use PhpCsFixer\Console\Application; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -30,15 +33,40 @@ use PhpCsFixer\Tokenizer\TokensAnalyzer; use PhpCsFixer\Utils; use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; +use Symfony\Component\OptionsResolver\Options; /** * @author Sebastiaan Stok * @author Dariusz Rumiński * @author Darius Matulionis * @author Adriano Pilger + * + * @phpstan-type _UseImportInfo array{ + * namespace: non-empty-string, + * startIndex: int, + * endIndex: int, + * importType: self::IMPORT_TYPE_*, + * group: bool, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case_sensitive?: bool, + * imports_order?: list|null, + * sort_algorithm?: 'alpha'|'length'|'none', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case_sensitive: bool, + * imports_order: list|null, + * sort_algorithm: 'alpha'|'length'|'none', + * } */ final class OrderedImportsFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -60,6 +88,8 @@ final class OrderedImportsFixer extends AbstractFixer implements ConfigurableFix public const SORT_ALPHA = 'alpha'; /** + * @TODO 4.0 remove the possibility to sort by length + * * @internal */ public const SORT_LENGTH = 'length'; @@ -72,14 +102,14 @@ final class OrderedImportsFixer extends AbstractFixer implements ConfigurableFix /** * Array of supported sort types in configuration. * - * @var string[] + * @var list */ private const SUPPORTED_SORT_TYPES = [self::IMPORT_TYPE_CLASS, self::IMPORT_TYPE_CONST, self::IMPORT_TYPE_FUNCTION]; /** * Array of supported sort algorithms in configuration. * - * @var string[] + * @var list */ private const SUPPORTED_SORT_ALGORITHMS = [self::SORT_ALPHA, self::SORT_LENGTH, self::SORT_NONE]; @@ -175,7 +205,7 @@ public function getDefinition(): FixerDefinitionInterface * {@inheritdoc} * * Must run before BlankLineBetweenImportGroupsFixer. - * Must run after GlobalNamespaceImportFixer, NoLeadingImportSlashFixer. + * Must run after FullyQualifiedStrictTypesFixer, GlobalNamespaceImportFixer, NoLeadingImportSlashFixer. */ public function getPriority(): int { @@ -234,19 +264,31 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { $supportedSortTypes = self::SUPPORTED_SORT_TYPES; + $fixerName = $this->getName(); return new FixerConfigurationResolver([ - (new FixerOptionBuilder('sort_algorithm', 'Whether the statements should be sorted alphabetically or by length, or not sorted.')) + (new FixerOptionBuilder('sort_algorithm', 'Whether the statements should be sorted alphabetically or by length (*deprecated*), or not sorted.')) // @TODO 4.0 drop 'length' ->setAllowedValues(self::SUPPORTED_SORT_ALGORITHMS) ->setDefault(self::SORT_ALPHA) + ->setNormalizer(static function (Options $options, ?string $value) use ($fixerName): ?string { + if (self::SORT_LENGTH === $value) { + Utils::triggerDeprecation(new InvalidFixerConfigurationException($fixerName, \sprintf( + 'Option "sort_algorithm:%s" is deprecated and will be removed in version %d.0.', + self::SORT_LENGTH, + Application::getMajorVersion() + 1, + ))); + } + + return $value; + }) ->getOption(), (new FixerOptionBuilder('imports_order', 'Defines the order of import types.')) - ->setAllowedTypes(['array', 'null']) + ->setAllowedTypes(['string[]', 'null']) ->setAllowedValues([static function (?array $value) use ($supportedSortTypes): bool { if (null !== $value) { $missing = array_diff($supportedSortTypes, $value); if (\count($missing) > 0) { - throw new InvalidOptionsException(sprintf( + throw new InvalidOptionsException(\sprintf( 'Missing sort %s %s.', 1 === \count($missing) ? 'type' : 'types', Utils::naturalLanguageJoin($missing) @@ -255,7 +297,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn $unknown = array_diff($value, $supportedSortTypes); if (\count($unknown) > 0) { - throw new InvalidOptionsException(sprintf( + throw new InvalidOptionsException(\sprintf( 'Unknown sort %s %s.', 1 === \count($unknown) ? 'type' : 'types', Utils::naturalLanguageJoin($unknown) @@ -265,7 +307,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return true; }]) - ->setDefault(null) // @TODO set to ['class', 'function', 'const'] on 4.0 + ->setDefault(null) // @TODO 4.0 set to ['class', 'function', 'const'] ->getOption(), (new FixerOptionBuilder('case_sensitive', 'Whether the sorting should be case sensitive.')) ->setAllowedTypes(['bool']) @@ -277,29 +319,25 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn /** * This method is used for sorting the uses in a namespace. * - * @param array $first - * @param array $second - * - * @internal + * @param _UseImportInfo $first + * @param _UseImportInfo $second */ private function sortAlphabetically(array $first, array $second): int { - // Replace backslashes by spaces before sorting for correct sort order - $firstNamespace = str_replace('\\', ' ', $this->prepareNamespace($first['namespace'])); - $secondNamespace = str_replace('\\', ' ', $this->prepareNamespace($second['namespace'])); + // Replace backslashes by spaces and remove opening braces before sorting for correct sort order + $firstNamespace = str_replace(['\\', '{'], [' ', ''], $this->prepareNamespace($first['namespace'])); + $secondNamespace = str_replace(['\\', '{'], [' ', ''], $this->prepareNamespace($second['namespace'])); return true === $this->configuration['case_sensitive'] - ? strcmp($firstNamespace, $secondNamespace) + ? $firstNamespace <=> $secondNamespace : strcasecmp($firstNamespace, $secondNamespace); } /** * This method is used for sorting the uses statements in a namespace by length. * - * @param array $first - * @param array $second - * - * @internal + * @param _UseImportInfo $first + * @param _UseImportInfo $second */ private function sortByLength(array $first, array $second): int { @@ -311,7 +349,7 @@ private function sortByLength(array $first, array $second): int if ($firstNamespaceLength === $secondNamespaceLength) { $sortResult = true === $this->configuration['case_sensitive'] - ? strcmp($firstNamespace, $secondNamespace) + ? $firstNamespace <=> $secondNamespace : strcasecmp($firstNamespace, $secondNamespace); } else { $sortResult = $firstNamespaceLength > $secondNamespaceLength ? 1 : -1; @@ -327,6 +365,8 @@ private function prepareNamespace(string $namespace): string /** * @param list $uses + * + * @return array */ private function getNewOrder(array $uses, Tokens $tokens): array { @@ -511,27 +551,9 @@ private function getNewOrder(array $uses, Tokens $tokens): array } /** - * @param array< - * int, - * array{ - * namespace: string, - * startIndex: int, - * endIndex: int, - * importType: string, - * group: bool, - * } - * > $indices + * @param array $indices * - * @return array< - * int, - * array{ - * namespace: string, - * startIndex: int, - * endIndex: int, - * importType: string, - * group: bool, - * } - * > + * @return array */ private function sortByAlgorithm(array $indices): array { @@ -545,13 +567,7 @@ private function sortByAlgorithm(array $indices): array } /** - * @param array $usesOrder + * @param array $usesOrder */ private function setNewOrder(Tokens $tokens, array $usesOrder): void { @@ -563,7 +579,7 @@ private function setNewOrder(Tokens $tokens, array $usesOrder): void // Now insert the new tokens, starting from the end foreach (array_reverse($usesOrder, true) as $index => $use) { - $code = sprintf( + $code = \sprintf( 'getPrevMeaningfulToken($index); - if ($tokens[$prev]->equals(',')) { - $tokens[$prev] = new Token(';'); - $tokens->insertAt($prev + 1, new Token([T_USE, 'use'])); + self::fixCommaToUse($tokens, $tokens->getPrevMeaningfulToken($index)); - if (!$tokens[$prev + 2]->isWhitespace()) { - $tokens->insertAt($prev + 2, new Token([T_WHITESPACE, ' '])); - } - } + $closeGroupIndex = $tokens->getNextTokenOfKind($index, [[CT::T_GROUP_IMPORT_BRACE_CLOSE]]); + self::fixCommaToUse($tokens, $tokens->getNextMeaningfulToken($closeGroupIndex)); } } } + + private static function fixCommaToUse(Tokens $tokens, int $index): void + { + if (!$tokens[$index]->equals(',')) { + return; + } + + $tokens[$index] = new Token(';'); + $tokens->insertAt($index + 1, new Token([T_USE, 'use'])); + + if (!$tokens[$index + 2]->isWhitespace()) { + $tokens->insertAt($index + 2, new Token([T_WHITESPACE, ' '])); + } + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php index 2ced868cc..603c0996d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Import/SingleImportPerStatementFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -33,9 +34,21 @@ * Fixer for rules defined in PSR2 ¶3. * * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * group_to_single_imports?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * group_to_single_imports: bool, + * } */ final class SingleImportPerStatementFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -63,7 +76,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run before MultilineWhitespaceBeforeSemicolonsFixer, NoLeadingImportSlashFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, NoUnusedImportsFixer, SpaceAfterSemicolonFixer. + * Must run before MultilineWhitespaceBeforeSemicolonsFixer, NoLeadingImportSlashFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, SpaceAfterSemicolonFixer. */ public function getPriority(): int { @@ -84,7 +97,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $groupClose = $tokens->getPrevMeaningfulToken($endIndex); if ($tokens[$groupClose]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) { - if ($this->configuration['group_to_single_imports']) { + if (true === $this->configuration['group_to_single_imports']) { $this->fixGroupUse($tokens, $index, $endIndex); } } else { @@ -103,6 +116,9 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ]); } + /** + * @return array{string, ?int, int, string} + */ private function getGroupDeclaration(Tokens $tokens, int $index): array { $groupPrefix = ''; @@ -143,7 +159,7 @@ private function getGroupDeclaration(Tokens $tokens, int $index): array } /** - * @return string[] + * @return list */ private function getGroupStatements(Tokens $tokens, string $groupPrefix, int $groupOpenIndex, int $groupCloseIndex, string $comment): array { @@ -198,10 +214,6 @@ private function fixGroupUse(Tokens $tokens, int $index, int $endIndex): void [$groupPrefix, $groupOpenIndex, $groupCloseIndex, $comment] = $this->getGroupDeclaration($tokens, $index); $statements = $this->getGroupStatements($tokens, $groupPrefix, $groupOpenIndex, $groupCloseIndex, $comment); - if (\count($statements) < 2) { - return; - } - $tokens->clearRange($index, $groupCloseIndex); if ($tokens[$endIndex]->equals(';')) { $tokens->clearAt($endIndex); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/InternalFixerInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/InternalFixerInterface.php new file mode 100644 index 000000000..cf843c807 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/InternalFixerInterface.php @@ -0,0 +1,20 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer; + +/** + * @internal + */ +interface InternalFixerInterface extends FixerInterface {} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordFixer.php new file mode 100644 index 000000000..b171e56b6 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordFixer.php @@ -0,0 +1,100 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\LanguageConstruct; + +use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ExperimentalFixerInterface; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @author Dariusz Rumiński + */ +final class ClassKeywordFixer extends AbstractFixer implements ExperimentalFixerInterface +{ + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Converts FQCN strings to `*::class` keywords.', + [ + new CodeSample( + 'count() - 1; $index >= 0; --$index) { + $token = $tokens[$index]; + + if ($token->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { + $name = substr($token->getContent(), 1, -1); + $name = ltrim($name, '\\'); + $name = str_replace('\\\\', '\\', $name); + + if ($this->exists($name)) { + $substitution = Tokens::fromCode("clearRange(0, 2); + $substitution->clearAt($substitution->getSize() - 1); + $substitution->clearEmptyTokens(); + + $tokens->clearAt($index); + $tokens->insertAt($index, $substitution); + } + } + } + } + + private function exists(string $name): bool + { + if (class_exists($name) || interface_exists($name) || trait_exists($name)) { + $rc = new \ReflectionClass($name); + + return $rc->getName() === $name; + } + + return false; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php index 29b4b6a6d..6be1d44c5 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ClassKeywordRemoveFixer.php @@ -32,7 +32,7 @@ final class ClassKeywordRemoveFixer extends AbstractFixer implements DeprecatedFixerInterface { /** - * @var string[] + * @var array */ private array $imports = []; @@ -97,7 +97,7 @@ private function storeImports(Tokens $tokens, int $startIndex, int $endIndex): v } $import = ''; - while ($index = $tokens->getNextMeaningfulToken($index)) { + while (($index = $tokens->getNextMeaningfulToken($index)) !== null) { if ($tokens[$index]->equalsAny([';', [CT::T_GROUP_IMPORT_BRACE_OPEN]]) || $tokens[$index]->isGivenKind(T_AS)) { break; } @@ -188,7 +188,7 @@ private function replaceClassKeyword(Tokens $tokens, string $namespacePrefix, in $classStringArray = explode('\\', $classString); $namespaceToTest = $classStringArray[0]; - if (0 === strcmp($namespaceToTest, substr($import, -\strlen($namespaceToTest)))) { + if (0 === ($namespaceToTest <=> substr($import, -\strlen($namespaceToTest)))) { $classImport = $import; break; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php index 10e19180f..e84bcb9dc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveIssetsFixer.php @@ -104,7 +104,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @param int[] $indices + * @param list $indices */ private function clearTokens(Tokens $tokens, array $indices): void { @@ -116,7 +116,7 @@ private function clearTokens(Tokens $tokens, array $indices): void /** * @param int $index of T_ISSET * - * @return int[] indices of meaningful tokens belonging to the isset statement + * @return list indices of meaningful tokens belonging to the isset statement */ private function getIssetInfo(Tokens $tokens, int $index): array { @@ -146,9 +146,9 @@ private function getIssetInfo(Tokens $tokens, int $index): array } /** - * @param int[] $indices + * @param list $indices * - * @return Token[] + * @return list */ private function getTokenClones(Tokens $tokens, array $indices): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php index 6ec6b753f..24f189582 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/CombineConsecutiveUnsetsFixer.php @@ -92,7 +92,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @param int[] $indices + * @param list $indices */ private function clearOffsetTokens(Tokens $tokens, int $offset, array $indices): void { @@ -112,7 +112,7 @@ private function clearOffsetTokens(Tokens $tokens, int $offset, array $indices): * * Or the index to where the method looked for a call. * - * @return int|int[] + * @return array{int, int, int, int}|int */ private function getPreviousUnsetCall(Tokens $tokens, int $index) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php index 76b70a20c..af46fafb3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/DeclareEqualNormalizeFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,20 +28,20 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * space?: 'none'|'single', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * space: 'none'|'single', + * } */ final class DeclareEqualNormalizeFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var string - */ - private $callback; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->callback = 'none' === $this->configuration['space'] ? 'removeWhitespaceAroundToken' : 'ensureWhitespaceAroundToken'; - } + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; public function getDefinition(): FixerDefinitionInterface { @@ -70,7 +71,6 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $callback = $this->callback; for ($index = 0, $count = $tokens->count(); $index < $count - 6; ++$index) { if (!$tokens[$index]->isGivenKind(T_DECLARE)) { continue; @@ -81,7 +81,11 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void for ($i = $closeParenthesisIndex; $i > $openParenthesisIndex; --$i) { if ($tokens[$i]->equals('=')) { - $this->{$callback}($tokens, $i); + if ('none' === $this->configuration['space']) { + $this->removeWhitespaceAroundToken($tokens, $i); + } else { + $this->ensureWhitespaceAroundToken($tokens, $i); + } } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php index 5cf4b8521..22f9ef473 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ErrorSuppressionFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,9 +30,25 @@ /** * @author Jules Pietri * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * mute_deprecation_error?: bool, + * noise_remaining_usages?: bool, + * noise_remaining_usages_exclude?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * mute_deprecation_error: bool, + * noise_remaining_usages: bool, + * noise_remaining_usages_exclude: list, + * } */ final class ErrorSuppressionFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -92,7 +109,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setDefault(false) ->getOption(), (new FixerOptionBuilder(self::OPTION_NOISE_REMAINING_USAGES_EXCLUDE, 'List of global functions to exclude from removing `@`.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault([]) ->getOption(), ]); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php index 38ef5fe90..7be05e437 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/ExplicitIndirectVariableFixer.php @@ -30,7 +30,7 @@ final class ExplicitIndirectVariableFixer extends AbstractFixer public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Add curly braces to indirect variables to make them clear to understand. Requires PHP >= 7.0.', + 'Add curly braces to indirect variables to make them clear to understand.', [ new CodeSample( <<<'EOT' diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php index 0c81c54d2..f3355e90a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/FunctionToConstantFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -28,15 +29,28 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * functions?: list<'get_called_class'|'get_class'|'get_class_this'|'php_sapi_name'|'phpversion'|'pi'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * functions: list<'get_called_class'|'get_class'|'get_class_this'|'php_sapi_name'|'phpversion'|'pi'>, + * } + */ final class FunctionToConstantFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var array + * @var null|array> */ - private static $availableFunctions; + private static ?array $availableFunctions = null; /** - * @var array + * @var array> */ private array $functionsFixMap; @@ -49,7 +63,11 @@ public function __construct() new Token([T_DOUBLE_COLON, '::']), new Token([CT::T_CLASS_CONSTANT, 'class']), ], - 'get_class' => [new Token([T_CLASS_C, '__CLASS__'])], + 'get_class' => [ + new Token([T_STRING, 'self']), + new Token([T_DOUBLE_COLON, '::']), + new Token([CT::T_CLASS_CONSTANT, 'class']), + ], 'get_class_this' => [ new Token([T_STATIC, 'static']), new Token([T_DOUBLE_COLON, '::']), @@ -64,17 +82,6 @@ public function __construct() parent::__construct(); } - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->functionsFixMap = []; - - foreach ($this->configuration['functions'] as $key) { - $this->functionsFixMap[$key] = self::$availableFunctions[$key]; - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -114,6 +121,15 @@ public function isRisky(): bool return true; } + protected function configurePostNormalisation(): void + { + $this->functionsFixMap = []; + + foreach ($this->configuration['functions'] as $key) { + $this->functionsFixMap[$key] = self::$availableFunctions[$key]; + } + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $functionAnalyzer = new FunctionsAnalyzer(); @@ -140,7 +156,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('functions', 'List of function names to fix.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($functionNames)]) ->setDefault([ 'get_called_class', @@ -155,7 +171,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn } /** - * @param Token[] $replacements + * @param list $replacements */ private function fixFunctionCallToConstant(Tokens $tokens, int $index, int $braceOpenIndex, int $braceCloseIndex, array $replacements): void { @@ -167,7 +183,10 @@ private function fixFunctionCallToConstant(Tokens $tokens, int $index, int $brac $tokens->clearTokenAndMergeSurroundingWhitespace($i); } - if ($replacements[0]->isGivenKind([T_CLASS_C, T_STATIC])) { + if ( + $replacements[0]->isGivenKind([T_CLASS_C, T_STATIC]) + || ($replacements[0]->isGivenKind(T_STRING) && 'self' === $replacements[0]->getContent()) + ) { $prevIndex = $tokens->getPrevMeaningfulToken($index); $prevToken = $tokens[$prevIndex]; if ($prevToken->isGivenKind(T_NS_SEPARATOR)) { @@ -179,6 +198,9 @@ private function fixFunctionCallToConstant(Tokens $tokens, int $index, int $brac $tokens->insertAt($index, $replacements); } + /** + * @return ?array{int, int, list} + */ private function getReplaceCandidate( Tokens $tokens, FunctionsAnalyzer $functionAnalyzer, @@ -216,6 +238,9 @@ private function getReplaceCandidate( return $this->getReplacementTokenClones($lowerContent, $braceOpenIndex, $braceCloseIndex); } + /** + * @return ?array{int, int, list} + */ private function fixGetClassCall( Tokens $tokens, FunctionsAnalyzer $functionAnalyzer, @@ -267,12 +292,15 @@ private function fixGetClassCall( return null; } + /** + * @return array{int, int, list} + */ private function getReplacementTokenClones(string $lowerContent, int $braceOpenIndex, int $braceCloseIndex): array { - $clones = []; - foreach ($this->functionsFixMap[$lowerContent] as $token) { - $clones[] = clone $token; - } + $clones = array_map( + static fn (Token $token): Token => clone $token, + $this->functionsFixMap[$lowerContent], + ); return [ $braceOpenIndex, diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php index 15a151a15..2bfb32cb1 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NoUnsetOnPropertyFixer.php @@ -33,10 +33,10 @@ public function getDefinition(): FixerDefinitionInterface 'Properties should be set to `null` instead of using `unset`.', [new CodeSample("a);\n")], null, - 'Risky when relying on attributes to be removed using `unset` rather than be set to `null`.'. - ' Changing variables to `null` instead of unsetting means these still show up when looping over class variables'. - ' and reference properties remain unbroken.'. - ' With PHP 7.4, this rule might introduce `null` assignments to properties whose type declaration does not allow it.' + 'Risky when relying on attributes to be removed using `unset` rather than be set to `null`.' + .' Changing variables to `null` instead of unsetting means these still show up when looping over class variables' + .' and reference properties remain unbroken.' + .' With PHP 7.4, this rule might introduce `null` assignments to properties whose type declaration does not allow it.' ); } @@ -84,7 +84,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @return array> + * @return list> */ private function getUnsetsInfo(Tokens $tokens, int $index): array { @@ -144,7 +144,7 @@ private function isProperty(Tokens $tokens, int $index, int $endIndex): bool } /** - * @param array> $unsetsInfo + * @param list> $unsetsInfo */ private function isAnyUnsetToTransform(array $unsetsInfo): bool { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NullableTypeDeclarationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NullableTypeDeclarationFixer.php index a7b65432d..745c3384a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NullableTypeDeclarationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/NullableTypeDeclarationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -33,9 +34,21 @@ /** * @author John Paul E. Balandan, CPA + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * syntax?: 'question_mark'|'union', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * syntax: 'question_mark'|'union', + * } */ final class NullableTypeDeclarationFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const OPTION_SYNTAX_UNION = 'union'; private const OPTION_SYNTAX_QUESTION_MARK = 'question_mark'; @@ -81,17 +94,15 @@ public function isCandidate(Tokens $tokens): bool * {@inheritdoc} * * Must run before OrderedTypesFixer, TypesSpacesFixer. - * Must run after NullableTypeDeclarationForDefaultNullValueFixer, SingleSpaceAroundConstructFixer. + * Must run after NullableTypeDeclarationForDefaultNullValueFixer. */ public function getPriority(): int { return 2; } - public function configure(array $configuration): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - $this->candidateTokenKind = self::OPTION_SYNTAX_QUESTION_MARK === $this->configuration['syntax'] ? CT::T_TYPE_ALTERNATION // `|` -> `?` : CT::T_NULLABLE_TYPE; // `?` -> `|` @@ -172,12 +183,12 @@ private function collectTypeAnalysis(Tokens $tokens, int $startIndex, int $endIn private function isTypeNormalizable(TypeAnalysis $typeAnalysis): bool { - if (!$typeAnalysis->isNullable()) { + $type = $typeAnalysis->getName(); + + if ('null' === strtolower($type) || !$typeAnalysis->isNullable()) { return false; } - $type = $typeAnalysis->getName(); - if (str_contains($type, '&')) { return false; // skip DNF types } @@ -262,6 +273,11 @@ private function normalizeNullableType(Tokens $tokens, TypeAnalysis $typeAnalysi $typeAnalysis->getEndIndex(), $this->createTypeDeclarationTokens($normalizedType, $isQuestionMarkSyntax) ); + + $prevStartIndex = $typeAnalysis->getStartIndex() - 1; + if (!$tokens[$prevStartIndex]->isWhitespace() && !$tokens[$prevStartIndex]->equals('(')) { + $tokens->ensureWhitespaceAtIndex($prevStartIndex, 1, ' '); + } } /** @@ -296,18 +312,18 @@ private function convertToExplicitUnionType(string $type): array private function createTypeDeclarationTokens(array $types, bool $isQuestionMarkSyntax): array { static $specialTypes = [ - '?' => [CT::T_NULLABLE_TYPE, '?'], - 'array' => [CT::T_ARRAY_TYPEHINT, 'array'], - 'callable' => [T_CALLABLE, 'callable'], - 'static' => [T_STATIC, 'static'], + '?' => CT::T_NULLABLE_TYPE, + 'array' => CT::T_ARRAY_TYPEHINT, + 'callable' => T_CALLABLE, + 'static' => T_STATIC, ]; $count = \count($types); $newTokens = []; foreach ($types as $index => $type) { - if (isset($specialTypes[$type])) { - $newTokens[] = new Token($specialTypes[$type]); + if (isset($specialTypes[strtolower($type)])) { + $newTokens[] = new Token([$specialTypes[strtolower($type)], $type]); } else { foreach (explode('\\', $type) as $nsIndex => $value) { if (0 === $nsIndex && '' === $value) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php index 229049a32..722136d4b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAfterConstructFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractProxyFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\DeprecatedFixerInterface; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; @@ -30,13 +31,25 @@ * @author Andreas Möller * * @deprecated + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * constructs?: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * constructs: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>, + * } */ final class SingleSpaceAfterConstructFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, DeprecatedFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array */ - private static array $tokenMap = [ + private const TOKEN_MAP = [ 'abstract' => T_ABSTRACT, 'as' => T_AS, 'attribute' => CT::T_ATTRIBUTE_CLOSE, @@ -114,19 +127,6 @@ public function getSuccessorsNames(): array return array_keys($this->proxyFixers); } - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->singleSpaceAroundConstructFixer->configure([ - 'constructs_contain_a_single_space' => [ - 'yield_from', - ], - 'constructs_preceded_by_a_single_space' => [], - 'constructs_followed_by_a_single_space' => $this->configuration['constructs'], - ]); - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -175,6 +175,17 @@ public function getPriority(): int return parent::getPriority(); } + protected function configurePostNormalisation(): void + { + $this->singleSpaceAroundConstructFixer->configure([ + 'constructs_contain_a_single_space' => [ + 'yield_from', + ], + 'constructs_preceded_by_a_single_space' => [], + 'constructs_followed_by_a_single_space' => $this->configuration['constructs'], + ]); + } + protected function createProxyFixers(): array { return [$this->singleSpaceAroundConstructFixer]; @@ -182,14 +193,14 @@ protected function createProxyFixers(): array protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { - $defaults = self::$tokenMap; + $defaults = self::TOKEN_MAP; $tokens = array_keys($defaults); unset($defaults['type_colon']); return new FixerConfigurationResolver([ (new FixerOptionBuilder('constructs', 'List of constructs which must be followed by a single space.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($tokens)]) ->setDefault(array_keys($defaults)) ->getOption(), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAroundConstructFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAroundConstructFixer.php index 29d395f99..044a4e5da 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAroundConstructFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/LanguageConstruct/SingleSpaceAroundConstructFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -31,9 +32,25 @@ /** * @author Andreas Möller * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * constructs_contain_a_single_space?: list<'yield_from'>, + * constructs_followed_by_a_single_space?: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>, + * constructs_preceded_by_a_single_space?: list<'as'|'else'|'elseif'|'use_lambda'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * constructs_contain_a_single_space: list<'yield_from'>, + * constructs_followed_by_a_single_space: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>, + * constructs_preceded_by_a_single_space: list<'as'|'else'|'elseif'|'use_lambda'>, + * } */ final class SingleSpaceAroundConstructFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array */ @@ -47,6 +64,8 @@ final class SingleSpaceAroundConstructFixer extends AbstractFixer implements Con */ private static array $tokenMapPrecededByASingleSpace = [ 'as' => T_AS, + 'else' => T_ELSE, + 'elseif' => T_ELSEIF, 'use_lambda' => CT::T_USE_LAMBDA, ]; @@ -132,59 +151,6 @@ final class SingleSpaceAroundConstructFixer extends AbstractFixer implements Con */ private array $fixTokenMapPrecededByASingleSpace = []; - public function configure(array $configuration): void - { - parent::configure($configuration); - - if (\defined('T_MATCH')) { // @TODO: drop condition when PHP 8.0+ is required - self::$tokenMapFollowedByASingleSpace['match'] = T_MATCH; - } - - if (\defined('T_READONLY')) { // @TODO: drop condition when PHP 8.1+ is required - self::$tokenMapFollowedByASingleSpace['readonly'] = T_READONLY; - } - - if (\defined('T_ENUM')) { // @TODO: drop condition when PHP 8.1+ is required - self::$tokenMapFollowedByASingleSpace['enum'] = T_ENUM; - } - - $this->fixTokenMapContainASingleSpace = []; - - foreach ($this->configuration['constructs_contain_a_single_space'] as $key) { - if (null !== self::$tokenMapContainASingleSpace[$key]) { - $this->fixTokenMapContainASingleSpace[$key] = self::$tokenMapContainASingleSpace[$key]; - } - } - - $this->fixTokenMapPrecededByASingleSpace = []; - - foreach ($this->configuration['constructs_preceded_by_a_single_space'] as $key) { - if (null !== self::$tokenMapPrecededByASingleSpace[$key]) { - $this->fixTokenMapPrecededByASingleSpace[$key] = self::$tokenMapPrecededByASingleSpace[$key]; - } - } - - $this->fixTokenMapFollowedByASingleSpace = []; - - foreach ($this->configuration['constructs_followed_by_a_single_space'] as $key) { - if (null !== self::$tokenMapFollowedByASingleSpace[$key]) { - $this->fixTokenMapFollowedByASingleSpace[$key] = self::$tokenMapFollowedByASingleSpace[$key]; - } - } - - if (isset($this->fixTokenMapFollowedByASingleSpace['public'])) { - $this->fixTokenMapFollowedByASingleSpace['constructor_public'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC; - } - - if (isset($this->fixTokenMapFollowedByASingleSpace['protected'])) { - $this->fixTokenMapFollowedByASingleSpace['constructor_protected'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED; - } - - if (isset($this->fixTokenMapFollowedByASingleSpace['private'])) { - $this->fixTokenMapFollowedByASingleSpace['constructor_private'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE; - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -255,7 +221,7 @@ function foo() { yield from baz(); } /** * {@inheritdoc} * - * Must run before BracesFixer, FunctionDeclarationFixer, NullableTypeDeclarationFixer. + * Must run before BracesFixer, FunctionDeclarationFixer. * Must run after ArraySyntaxFixer, ModernizeStrposFixer. */ public function getPriority(): int @@ -271,7 +237,58 @@ public function isCandidate(Tokens $tokens): bool ...array_values($this->fixTokenMapFollowedByASingleSpace), ]; - return $tokens->isAnyTokenKindsFound($tokenKinds) && !$tokens->hasAlternativeSyntax(); + return $tokens->isAnyTokenKindsFound($tokenKinds); + } + + protected function configurePostNormalisation(): void + { + if (\defined('T_MATCH')) { // @TODO: drop condition when PHP 8.0+ is required + self::$tokenMapFollowedByASingleSpace['match'] = T_MATCH; + } + + if (\defined('T_READONLY')) { // @TODO: drop condition when PHP 8.1+ is required + self::$tokenMapFollowedByASingleSpace['readonly'] = T_READONLY; + } + + if (\defined('T_ENUM')) { // @TODO: drop condition when PHP 8.1+ is required + self::$tokenMapFollowedByASingleSpace['enum'] = T_ENUM; + } + + $this->fixTokenMapContainASingleSpace = []; + + foreach ($this->configuration['constructs_contain_a_single_space'] as $key) { + if (null !== self::$tokenMapContainASingleSpace[$key]) { + $this->fixTokenMapContainASingleSpace[$key] = self::$tokenMapContainASingleSpace[$key]; + } + } + + $this->fixTokenMapPrecededByASingleSpace = []; + + foreach ($this->configuration['constructs_preceded_by_a_single_space'] as $key) { + if (null !== self::$tokenMapPrecededByASingleSpace[$key]) { + $this->fixTokenMapPrecededByASingleSpace[$key] = self::$tokenMapPrecededByASingleSpace[$key]; + } + } + + $this->fixTokenMapFollowedByASingleSpace = []; + + foreach ($this->configuration['constructs_followed_by_a_single_space'] as $key) { + if (null !== self::$tokenMapFollowedByASingleSpace[$key]) { + $this->fixTokenMapFollowedByASingleSpace[$key] = self::$tokenMapFollowedByASingleSpace[$key]; + } + } + + if (isset($this->fixTokenMapFollowedByASingleSpace['public'])) { + $this->fixTokenMapFollowedByASingleSpace['constructor_public'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC; + } + + if (isset($this->fixTokenMapFollowedByASingleSpace['protected'])) { + $this->fixTokenMapFollowedByASingleSpace['constructor_protected'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED; + } + + if (isset($this->fixTokenMapFollowedByASingleSpace['private'])) { + $this->fixTokenMapFollowedByASingleSpace['constructor_private'] = CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE; + } } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void @@ -299,7 +316,9 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void for ($index = $tokens->count() - 1; $index > 0; --$index) { if ($tokens[$index]->isGivenKind($tokenKindsPrecededByASingleSpace)) { - $tokens->ensureWhitespaceAtIndex($index - 1, 1, ' '); + if (!$this->isFullLineCommentBefore($tokens, $index)) { + $tokens->ensureWhitespaceAtIndex($index - 1, 1, ' '); + } } } @@ -314,7 +333,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $whitespaceTokenIndex = $index + 1; - if ($tokens[$whitespaceTokenIndex]->equalsAny([',', ';', ')', [CT::T_ARRAY_SQUARE_BRACE_CLOSE], [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE]])) { + if ($tokens[$whitespaceTokenIndex]->equalsAny([',', ':', ';', ')', [CT::T_ARRAY_SQUARE_BRACE_CLOSE], [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE]])) { continue; } @@ -345,7 +364,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - if ($token->isGivenKind(T_CONST) && $this->isMultilineConstant($tokens, $index)) { + if ($token->isGivenKind(T_CONST) && $this->isMultilineCommaSeparatedConstant($tokens, $index)) { continue; } @@ -355,6 +374,23 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } } + if ($tokens[$whitespaceTokenIndex]->isWhitespace() && str_contains($tokens[$whitespaceTokenIndex]->getContent(), "\n")) { + $nextNextToken = $tokens[$whitespaceTokenIndex + 1]; + if (\defined('T_ATTRIBUTE')) { // @TODO: drop condition and else when PHP 8.0+ is required + if ($nextNextToken->isGivenKind(T_ATTRIBUTE)) { + continue; + } + } else { + if ($nextNextToken->isComment() && str_starts_with($nextNextToken->getContent(), '#[')) { + continue; + } + } + + if ($nextNextToken->isGivenKind(T_DOC_COMMENT)) { + continue; + } + } + $tokens->ensureWhitespaceAtIndex($whitespaceTokenIndex, 0, ' '); } } @@ -367,17 +403,17 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('constructs_contain_a_single_space', 'List of constructs which must contain a single space.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($tokenMapContainASingleSpaceKeys)]) ->setDefault($tokenMapContainASingleSpaceKeys) ->getOption(), (new FixerOptionBuilder('constructs_preceded_by_a_single_space', 'List of constructs which must be preceded by a single space.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($tokenMapPrecededByASingleSpaceKeys)]) - ->setDefault($tokenMapPrecededByASingleSpaceKeys) + ->setDefault(['as', 'use_lambda']) ->getOption(), (new FixerOptionBuilder('constructs_followed_by_a_single_space', 'List of constructs which must be followed by a single space.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($tokenMapFollowedByASingleSpaceKeys)]) ->setDefault($tokenMapFollowedByASingleSpaceKeys) ->getOption(), @@ -419,7 +455,8 @@ private function isMultilineExtendsOrImplementsWithMoreThanOneAncestor(Tokens $t { $hasMoreThanOneAncestor = false; - while (++$index) { + while (true) { + ++$index; $token = $tokens[$index]; if ($token->equals(',')) { @@ -437,14 +474,43 @@ private function isMultilineExtendsOrImplementsWithMoreThanOneAncestor(Tokens $t } } - return false; + return LogicException('Not reachable code was reached.'); // @phpstan-ignore deadCode.unreachable + } + + private function isMultilineCommaSeparatedConstant(Tokens $tokens, int $constantIndex): bool + { + $isMultilineConstant = false; + $hasMoreThanOneConstant = false; + $index = $constantIndex; + while (!$tokens[$index]->equalsAny([';', [T_CLOSE_TAG]])) { + ++$index; + + $isMultilineConstant = $isMultilineConstant || str_contains($tokens[$index]->getContent(), "\n"); + + if ($tokens[$index]->equals(',')) { + $hasMoreThanOneConstant = true; + } + + $blockType = Tokens::detectBlockType($tokens[$index]); + + if (null !== $blockType && true === $blockType['isStart']) { + $index = $tokens->findBlockEnd($blockType['type'], $index); + } + } + + return $hasMoreThanOneConstant && $isMultilineConstant; } - private function isMultilineConstant(Tokens $tokens, int $index): bool + private function isFullLineCommentBefore(Tokens $tokens, int $index): bool { - $scopeEnd = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]) - 1; - $hasMoreThanOneConstant = null !== $tokens->findSequence([new Token(',')], $index + 1, $scopeEnd); + $beforeIndex = $tokens->getPrevNonWhitespace($index); + + if (!$tokens[$beforeIndex]->isGivenKind([T_COMMENT])) { + return false; + } + + $content = $tokens[$beforeIndex]->getContent(); - return $hasMoreThanOneConstant && $tokens->isPartialCodeMultiline($index, $scopeEnd); + return str_starts_with($content, '#') || str_starts_with($content, '//'); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php index f7f06bca5..d11156d3e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ListNotation/ListSyntaxFixer.php @@ -15,8 +15,8 @@ namespace PhpCsFixer\Fixer\ListNotation; use PhpCsFixer\AbstractFixer; -use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,29 +27,27 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * syntax?: 'long'|'short', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * syntax: 'long'|'short', + * } + */ final class ListSyntaxFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var null|int - */ - private $candidateTokenKind; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; - /** - * @param array{syntax: 'long'|'short'} $configuration - * - * @throws InvalidFixerConfigurationException - */ - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->candidateTokenKind = 'long' === $this->configuration['syntax'] ? CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN : T_LIST; - } + private ?int $candidateTokenKind = null; public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'List (`array` destructuring) assignment should be declared using the configured syntax. Requires PHP >= 7.1.', + 'List (`array` destructuring) assignment should be declared using the configured syntax.', [ new CodeSample( "isTokenKindFound($this->candidateTokenKind); } + protected function configurePostNormalisation(): void + { + $this->candidateTokenKind = 'long' === $this->configuration['syntax'] ? CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN : T_LIST; + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { for ($index = $tokens->count() - 1; 0 <= $index; --$index) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLinesBeforeNamespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLinesBeforeNamespaceFixer.php index 162bc65f6..16c1296eb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLinesBeforeNamespaceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/BlankLinesBeforeNamespaceFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -31,9 +32,23 @@ /** * @author Graham Campbell * @author Greg Korba + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * max_line_breaks?: int, + * min_line_breaks?: int, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * max_line_breaks: int, + * min_line_breaks: int, + * } */ final class BlankLinesBeforeNamespaceFixer extends AbstractFixer implements WhitespacesAwareFixerInterface, ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -69,7 +84,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn (new FixerOptionBuilder('min_line_breaks', 'Minimum line breaks that should exist before namespace declaration.')) ->setAllowedTypes(['int']) ->setDefault(2) - ->setNormalizer(static function (Options $options, $value): int { + ->setNormalizer(static function (Options $options, int $value): int { if ($value < 0) { throw new InvalidFixerConfigurationException( (new self())->getName(), @@ -83,7 +98,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn (new FixerOptionBuilder('max_line_breaks', 'Maximum line breaks that should exist before namespace declaration.')) ->setAllowedTypes(['int']) ->setDefault(2) - ->setNormalizer(static function (Options $options, $value): int { + ->setNormalizer(static function (Options $options, int $value): int { if ($value < 0) { throw new InvalidFixerConfigurationException( (new self())->getName(), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php index f39ed81de..aaa13cc02 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/NamespaceNotation/CleanNamespaceFixer.php @@ -27,7 +27,7 @@ public function getDefinition(): FixerDefinitionInterface { $samples = []; - foreach (['namespace Foo \\ Bar;', 'echo foo /* comment */ \\ bar();'] as $sample) { + foreach (['namespace Foo \ Bar;', 'echo foo /* comment */ \ bar();'] as $sample) { $samples[] = new VersionSpecificCodeSample( " */ - private static array $replacements = [ + private const REPLACEMENTS = [ 'O' => '0', '0' => '0', 'I' => '1', @@ -220,9 +220,9 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - $replaced = Preg::replaceCallback('/[^[:ascii:]]/u', static fn (array $matches): string => self::$replacements[$matches[0]] ?? $matches[0], $token->getContent(), -1, $count); + $replaced = Preg::replaceCallback('/[^[:ascii:]]/u', static fn (array $matches): string => self::REPLACEMENTS[$matches[0]] ?? $matches[0], $token->getContent(), -1, $count); - if ($count) { + if ($count > 0) { $tokens->offsetSet($index, new Token([$token->getId(), $replaced])); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php index 3f95b1895..f9dc3b42d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/BinaryOperatorSpacesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -32,9 +33,23 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * default?: 'align'|'align_by_scope'|'align_single_space'|'align_single_space_by_scope'|'align_single_space_minimal'|'align_single_space_minimal_by_scope'|'at_least_single_space'|'no_space'|'single_space'|null, + * operators?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * default: 'align'|'align_by_scope'|'align_single_space'|'align_single_space_by_scope'|'align_single_space_minimal'|'align_single_space_minimal_by_scope'|'at_least_single_space'|'no_space'|'single_space'|null, + * operators: array, + * } */ final class BinaryOperatorSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -88,7 +103,7 @@ final class BinaryOperatorSpacesFixer extends AbstractFixer implements Configura public const ALIGN_PLACEHOLDER = "\x2 ALIGNABLE%d \x3"; /** - * @var string[] + * @var list */ private const SUPPORTED_OPERATORS = [ '=', @@ -136,23 +151,9 @@ final class BinaryOperatorSpacesFixer extends AbstractFixer implements Configura ]; /** - * Keep track of the deepest level ever achieved while - * parsing the code. Used later to replace alignment - * placeholders with spaces. + * @var list */ - private int $deepestLevel; - - /** - * Level counter of the current nest level. - * So one level alignments are not mixed with - * other level ones. - */ - private int $currentLevel; - - /** - * @var array - */ - private static array $allowedValues = [ + private const ALLOWED_VALUES = [ self::ALIGN, self::ALIGN_BY_SCOPE, self::ALIGN_SINGLE_SPACE, @@ -165,6 +166,20 @@ final class BinaryOperatorSpacesFixer extends AbstractFixer implements Configura null, ]; + /** + * Keep track of the deepest level ever achieved while + * parsing the code. Used later to replace alignment + * placeholders with spaces. + */ + private int $deepestLevel; + + /** + * Level counter of the current nest level. + * So one level alignments are not mixed with + * other level ones. + */ + private int $currentLevel; + private TokensAnalyzer $tokensAnalyzer; /** @@ -177,13 +192,6 @@ final class BinaryOperatorSpacesFixer extends AbstractFixer implements Configura */ private array $operators = []; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->operators = $this->resolveOperatorsFromConfig(); - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -200,7 +208,7 @@ public function getDefinition(): FixerDefinitionInterface $c = $d xor $e; $f -= 1; ', - ['operators' => ['=' => 'align', 'xor' => null]] + ['operators' => ['=' => self::ALIGN, 'xor' => null]] ), new CodeSample( ' ['+=' => 'align_single_space']] + ['operators' => ['+=' => self::ALIGN_SINGLE_SPACE]] ), new CodeSample( ' ['===' => 'align_single_space_minimal']] + ['operators' => ['===' => self::ALIGN_SINGLE_SPACE_MINIMAL]] ), new CodeSample( ' ['|' => 'no_space']] + ['operators' => ['|' => self::NO_SPACE]] ), new CodeSample( ' 11, ]; ', - ['operators' => ['=>' => 'single_space']] + ['operators' => ['=>' => self::SINGLE_SPACE]] ), new CodeSample( ' 1, ]; ', - ['operators' => ['=>' => 'align']] + ['operators' => ['=>' => self::ALIGN]] ), new CodeSample( ' 1, ]; ', - ['operators' => ['=>' => 'align_by_scope']] + ['operators' => ['=>' => self::ALIGN_BY_SCOPE]] ), new CodeSample( ' 1, ]; ', - ['operators' => ['=>' => 'align_single_space']] + ['operators' => ['=>' => self::ALIGN_SINGLE_SPACE]] ), new CodeSample( ' 1, ]; ', - ['operators' => ['=>' => 'align_single_space_by_scope']] + ['operators' => ['=>' => self::ALIGN_SINGLE_SPACE_BY_SCOPE]] ), new CodeSample( ' 1, ]; ', - ['operators' => ['=>' => 'align_single_space_minimal']] + ['operators' => ['=>' => self::ALIGN_SINGLE_SPACE_MINIMAL]] ), new CodeSample( ' 1, ]; ', - ['operators' => ['=>' => 'align_single_space_minimal_by_scope']] + ['operators' => ['=>' => self::ALIGN_SINGLE_SPACE_MINIMAL_BY_SCOPE]] ), ] ); @@ -320,6 +328,11 @@ public function isCandidate(Tokens $tokens): bool return true; } + protected function configurePostNormalisation(): void + { + $this->operators = $this->resolveOperatorsFromConfig(); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $this->tokensAnalyzer = new TokensAnalyzer($tokens); @@ -355,15 +368,15 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('default', 'Default fix strategy.')) ->setDefault(self::SINGLE_SPACE) - ->setAllowedValues(self::$allowedValues) + ->setAllowedValues(self::ALLOWED_VALUES) ->getOption(), (new FixerOptionBuilder('operators', 'Dictionary of `binary operator` => `fix strategy` values that differ from the default strategy. Supported are: '.Utils::naturalLanguageJoinWithBackticks(self::SUPPORTED_OPERATORS).'.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['array']) ->setAllowedValues([static function (array $option): bool { foreach ($option as $operator => $value) { if (!\in_array($operator, self::SUPPORTED_OPERATORS, true)) { throw new InvalidOptionsException( - sprintf( + \sprintf( 'Unexpected "operators" key, expected any of %s, got "%s".', Utils::naturalLanguageJoin(self::SUPPORTED_OPERATORS), \gettype($operator).'#'.$operator @@ -371,14 +384,14 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ); } - if (!\in_array($value, self::$allowedValues, true)) { + if (!\in_array($value, self::ALLOWED_VALUES, true)) { throw new InvalidOptionsException( - sprintf( + \sprintf( 'Unexpected value for operator "%s", expected any of %s, got "%s".', $operator, Utils::naturalLanguageJoin(array_map( static fn ($value): string => Utils::toString($value), - self::$allowedValues + self::ALLOWED_VALUES )), \is_object($value) ? \get_class($value) : (null === $value ? 'null' : \gettype($value).'#'.$value) ) @@ -618,7 +631,7 @@ private function injectAlignmentPlaceholdersDefault(Tokens $tokens, int $startAt && ('=' !== $content || !$this->isEqualPartOfDeclareStatement($tokens, $index)) && $newLineFoundSinceLastPlaceholder ) { - $tokens[$index] = new Token(sprintf(self::ALIGN_PLACEHOLDER, $this->currentLevel).$content); + $tokens[$index] = new Token(\sprintf(self::ALIGN_PLACEHOLDER, $this->currentLevel).$content); $newLineFoundSinceLastPlaceholder = false; continue; @@ -751,7 +764,7 @@ private function injectAlignmentPlaceholdersForArrow(Tokens $tokens, int $startA ++$this->deepestLevel; ++$this->currentLevel; } - $tokenContent = sprintf(self::ALIGN_PLACEHOLDER, $this->currentLevel).$token->getContent(); + $tokenContent = \sprintf(self::ALIGN_PLACEHOLDER, $this->currentLevel).$token->getContent(); $nextToken = $tokens[$index + 1]; if (!$nextToken->isWhitespace()) { @@ -858,7 +871,7 @@ private function replacePlaceholders(Tokens $tokens, string $alignStrategy, stri $tmpCode = $tokens->generateCode(); for ($j = 0; $j <= $this->deepestLevel; ++$j) { - $placeholder = sprintf(self::ALIGN_PLACEHOLDER, $j); + $placeholder = \sprintf(self::ALIGN_PLACEHOLDER, $j); if (!str_contains($tmpCode, $placeholder)) { continue; @@ -915,12 +928,12 @@ private function replacePlaceholders(Tokens $tokens, string $alignStrategy, stri $rightmostSymbol = 0; foreach ($group as $index) { - $rightmostSymbol = max($rightmostSymbol, mb_strpos($lines[$index], $placeholder)); + $rightmostSymbol = max($rightmostSymbol, $this->getSubstringWidth($lines[$index], $placeholder)); } foreach ($group as $index) { $line = $lines[$index]; - $currentSymbol = mb_strpos($line, $placeholder); + $currentSymbol = $this->getSubstringWidth($line, $placeholder); $delta = abs($rightmostSymbol - $currentSymbol); if ($delta > 0) { @@ -935,4 +948,14 @@ private function replacePlaceholders(Tokens $tokens, string $alignStrategy, stri return $tmpCode; } + + private function getSubstringWidth(string $haystack, string $needle): int + { + $position = strpos($haystack, $needle); + \assert(\is_int($position)); + + $substring = substr($haystack, 0, $position); + + return mb_strwidth($substring); + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php index 8c4526049..db5e2e2b2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/ConcatSpaceFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,24 +28,20 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * spacing?: 'none'|'one', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * spacing: 'none'|'one', + * } */ final class ConcatSpaceFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var null|string - */ - private $fixCallback; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - if ('one' === $this->configuration['spacing']) { - $this->fixCallback = 'fixConcatenationToSingleSpace'; - } else { - $this->fixCallback = 'fixConcatenationToNoSpace'; - } - } + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; public function getDefinition(): FixerDefinitionInterface { @@ -83,10 +80,13 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $callBack = $this->fixCallback; for ($index = $tokens->count() - 1; $index >= 0; --$index) { if ($tokens[$index]->equals('.')) { - $this->{$callBack}($tokens, $index); + if ('one' === $this->configuration['spacing']) { + $this->fixConcatenationToSingleSpace($tokens, $index); + } else { + $this->fixConcatenationToNoSpace($tokens, $index); + } } } } @@ -133,7 +133,7 @@ private function fixConcatenationToSingleSpace(Tokens $tokens, int $index): void private function fixWhiteSpaceAroundConcatToken(Tokens $tokens, int $index, int $offset): void { if (-1 !== $offset && 1 !== $offset) { - throw new \InvalidArgumentException(sprintf( + throw new \InvalidArgumentException(\sprintf( 'Expected `-1|1` for "$offset", got "%s"', $offset )); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php index 4d2d9b8af..9e5c7b774 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/IncrementStyleFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractIncrementOperatorFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,9 +30,21 @@ /** * @author Gregor Harlan * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * style?: 'post'|'pre', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * style: 'post'|'pre', + * } */ final class IncrementStyleFixer extends AbstractIncrementOperatorFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LongToShorthandOperatorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LongToShorthandOperatorFixer.php index ca57caa4e..230996213 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LongToShorthandOperatorFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/LongToShorthandOperatorFixer.php @@ -27,7 +27,7 @@ final class LongToShorthandOperatorFixer extends AbstractShortOperatorFixer /** * @var array */ - private static array $operators = [ + private const OPERATORS = [ '+' => [T_PLUS_EQUAL, '+='], '-' => [T_MINUS_EQUAL, '-='], '*' => [T_MUL_EQUAL, '*='], @@ -40,7 +40,7 @@ final class LongToShorthandOperatorFixer extends AbstractShortOperatorFixer ]; /** - * @var string[] + * @var list */ private array $operatorTypes; @@ -75,7 +75,7 @@ public function isRisky(): bool public function isCandidate(Tokens $tokens): bool { - if ($tokens->isAnyTokenKindsFound(array_keys(self::$operators))) { + if ($tokens->isAnyTokenKindsFound(array_keys(self::OPERATORS))) { return true; } @@ -85,7 +85,7 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $this->operatorTypes = array_keys(self::$operators); + $this->operatorTypes = array_keys(self::OPERATORS); $this->tokensAnalyzer = new TokensAnalyzer($tokens); parent::applyFix($file, $tokens); @@ -133,6 +133,8 @@ protected function isOperatorTokenCandidate(Tokens $tokens, int $index): bool protected function getReplacementToken(Token $token): Token { - return new Token(self::$operators[$token->getContent()]); + \assert(isset(self::OPERATORS[$token->getContent()])); // for PHPStan + + return new Token(self::OPERATORS[$token->getContent()]); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php index 1fad4c76c..5c47c1255 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithBracesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractProxyFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\DeprecatedFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerDefinition\FixerDefinition; @@ -25,9 +26,23 @@ * @author Dariusz Rumiński * * @deprecated + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * anonymous_class?: bool, + * named_class?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * anonymous_class: bool, + * named_class: bool, + * } */ final class NewWithBracesFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, DeprecatedFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private NewWithParenthesesFixer $newWithParenthesesFixer; public function __construct() @@ -59,13 +74,6 @@ public function getPriority(): int return $this->newWithParenthesesFixer->getPriority(); } - public function configure(array $configuration): void - { - $this->newWithParenthesesFixer->configure($configuration); - - parent::configure($configuration); - } - public function getSuccessorsNames(): array { return [ @@ -73,6 +81,14 @@ public function getSuccessorsNames(): array ]; } + /** + * @param _AutogeneratedInputConfiguration $configuration + */ + protected function configurePreNormalisation(array $configuration): void + { + $this->newWithParenthesesFixer->configure($configuration); + } + protected function createProxyFixers(): array { return [ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithParenthesesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithParenthesesFixer.php index 9c9d7aab7..0398bb144 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithParenthesesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NewWithParenthesesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,9 +29,23 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * anonymous_class?: bool, + * named_class?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * anonymous_class: bool, + * named_class: bool, + * } */ final class NewWithParenthesesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -64,6 +79,21 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound(T_NEW); } + /** @protected */ + public function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('named_class', 'Whether named classes should be followed by parentheses.')) + ->setAllowedTypes(['bool']) + ->setDefault(true) + ->getOption(), + (new FixerOptionBuilder('anonymous_class', 'Whether anonymous classes should be followed by parentheses.')) + ->setAllowedTypes(['bool']) + ->setDefault(true) // @TODO 4.0: set to `false` + ->getOption(), + ]); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { static $nextTokenKinds = null; @@ -131,7 +161,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void if ($tokens[$nextIndex]->isGivenKind(T_CLASS)) { $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - if ($this->configuration['anonymous_class']) { + if (true === $this->configuration['anonymous_class']) { $this->ensureParenthesesAt($tokens, $nextIndex); } else { $this->ensureNoParenthesesAt($tokens, $nextIndex); @@ -147,7 +177,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); } - if ($this->configuration['named_class']) { + if (true === $this->configuration['named_class']) { $this->ensureParenthesesAt($tokens, $nextIndex); } else { $this->ensureNoParenthesesAt($tokens, $nextIndex); @@ -155,20 +185,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } } - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface - { - return new FixerConfigurationResolver([ - (new FixerOptionBuilder('named_class', 'Whether named classes should be followed by parentheses.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - (new FixerOptionBuilder('anonymous_class', 'Whether anonymous classes should be followed by parentheses.')) - ->setAllowedTypes(['bool']) - ->setDefault(true) - ->getOption(), - ]); - } - private function ensureParenthesesAt(Tokens $tokens, int $index): void { $token = $tokens[$index]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoSpaceAroundDoubleColonFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoSpaceAroundDoubleColonFixer.php index ddf0c2dfd..d897fff59 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoSpaceAroundDoubleColonFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoSpaceAroundDoubleColonFixer.php @@ -30,6 +30,16 @@ public function getDefinition(): FixerDefinitionInterface ); } + /** + * {@inheritdoc} + * + * Must run before MethodChainingIndentationFixer. + */ + public function getPriority(): int + { + return 1; + } + public function isCandidate(Tokens $tokens): bool { return $tokens->isTokenKindFound(T_DOUBLE_COLON); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoUselessConcatOperatorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoUselessConcatOperatorFixer.php index 5f834da37..de2f0da85 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoUselessConcatOperatorFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/NoUselessConcatOperatorFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -26,8 +27,27 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @phpstan-type _ConcatOperandType array{ + * start: int, + * end: int, + * type: self::STR_*, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * juggle_simple_strings?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * juggle_simple_strings: bool, + * } + */ final class NoUselessConcatOperatorFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const STR_DOUBLE_QUOTE = 0; private const STR_DOUBLE_QUOTE_VAR = 1; private const STR_SINGLE_QUOTE = 2; @@ -47,7 +67,7 @@ public function getDefinition(): FixerDefinitionInterface * {@inheritdoc} * * Must run before DateTimeCreateFromFormatCallFixer, EregToPregFixer, PhpUnitDedicateAssertInternalTypeFixer, RegularCallableCallFixer, SetTypeToCastFixer. - * Must run after NoBinaryStringFixer, SingleQuoteFixer. + * Must run after ExplicitStringVariableFixer, NoBinaryStringFixer, SingleQuoteFixer. */ public function getPriority(): int { @@ -105,16 +125,8 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn } /** - * @param array{ - * start: int, - * end: int, - * type: self::STR_*, - * } $firstOperand - * @param array{ - * start: int, - * end: int, - * type: self::STR_*, - * } $secondOperand + * @param _ConcatOperandType $firstOperand + * @param _ConcatOperandType $secondOperand */ private function fixConcatOperation(Tokens $tokens, array $firstOperand, int $concatIndex, array $secondOperand): void { @@ -124,13 +136,17 @@ private function fixConcatOperation(Tokens $tokens, array $firstOperand, int $co (self::STR_DOUBLE_QUOTE === $firstOperand['type'] && self::STR_DOUBLE_QUOTE === $secondOperand['type']) || (self::STR_SINGLE_QUOTE === $firstOperand['type'] && self::STR_SINGLE_QUOTE === $secondOperand['type']) ) { - $this->mergeContantEscapedStringOperands($tokens, $firstOperand, $concatIndex, $secondOperand); + $this->mergeConstantEscapedStringOperands($tokens, $firstOperand, $concatIndex, $secondOperand); return; } if (self::STR_DOUBLE_QUOTE_VAR === $firstOperand['type'] && self::STR_DOUBLE_QUOTE_VAR === $secondOperand['type']) { - $this->mergeContantEscapedStringVarOperands($tokens, $firstOperand, $concatIndex, $secondOperand); + if ($this->operandsCanNotBeMerged($tokens, $firstOperand, $secondOperand)) { + return; + } + + $this->mergeConstantEscapedStringVarOperands($tokens, $firstOperand, $concatIndex, $secondOperand); return; } @@ -146,12 +162,16 @@ private function fixConcatOperation(Tokens $tokens, array $firstOperand, int $co [$operand1, $operand2] = $operandPair; if (self::STR_DOUBLE_QUOTE_VAR === $operand1['type'] && self::STR_DOUBLE_QUOTE === $operand2['type']) { - $this->mergeContantEscapedStringVarOperands($tokens, $firstOperand, $concatIndex, $secondOperand); + if ($this->operandsCanNotBeMerged($tokens, $operand1, $operand2)) { + return; + } + + $this->mergeConstantEscapedStringVarOperands($tokens, $firstOperand, $concatIndex, $secondOperand); return; } - if (!$this->configuration['juggle_simple_strings']) { + if (false === $this->configuration['juggle_simple_strings']) { continue; } @@ -159,7 +179,7 @@ private function fixConcatOperation(Tokens $tokens, array $firstOperand, int $co $operantContent = $tokens[$operand2['start']]->getContent(); if ($this->isSimpleQuotedStringContent($operantContent)) { - $this->mergeContantEscapedStringOperands($tokens, $firstOperand, $concatIndex, $secondOperand); + $this->mergeConstantEscapedStringOperands($tokens, $firstOperand, $concatIndex, $secondOperand); } return; @@ -169,7 +189,11 @@ private function fixConcatOperation(Tokens $tokens, array $firstOperand, int $co $operantContent = $tokens[$operand2['start']]->getContent(); if ($this->isSimpleQuotedStringContent($operantContent)) { - $this->mergeContantEscapedStringVarOperands($tokens, $firstOperand, $concatIndex, $secondOperand); + if ($this->operandsCanNotBeMerged($tokens, $operand1, $operand2)) { + return; + } + + $this->mergeConstantEscapedStringVarOperands($tokens, $firstOperand, $concatIndex, $secondOperand); } return; @@ -180,11 +204,7 @@ private function fixConcatOperation(Tokens $tokens, array $firstOperand, int $co /** * @param -1|1 $direction * - * @return null|array{ - * start: int, - * end: int, - * type: self::STR_*, - * } + * @return null|_ConcatOperandType */ private function getConcatOperandType(Tokens $tokens, int $index, int $direction): ?array { @@ -216,18 +236,10 @@ private function getConcatOperandType(Tokens $tokens, int $index, int $direction } /** - * @param array{ - * start: int, - * end: int, - * type: self::STR_*, - * } $firstOperand - * @param array{ - * start: int, - * end: int, - * type: self::STR_*, - * } $secondOperand + * @param _ConcatOperandType $firstOperand + * @param _ConcatOperandType $secondOperand */ - private function mergeContantEscapedStringOperands( + private function mergeConstantEscapedStringOperands( Tokens $tokens, array $firstOperand, int $concatOperatorIndex, @@ -244,29 +256,21 @@ private function mergeContantEscapedStringOperands( ], ); - $tokens->clearTokenAndMergeSurroundingWhitespace($secondOperand['start']); $this->clearConcatAndAround($tokens, $concatOperatorIndex); + $tokens->clearTokenAndMergeSurroundingWhitespace($secondOperand['start']); } /** - * @param array{ - * start: int, - * end: int, - * type: self::STR_*, - * } $firstOperand - * @param array{ - * start: int, - * end: int, - * type: self::STR_*, - * } $secondOperand + * @param _ConcatOperandType $firstOperand + * @param _ConcatOperandType $secondOperand */ - private function mergeContantEscapedStringVarOperands( + private function mergeConstantEscapedStringVarOperands( Tokens $tokens, array $firstOperand, int $concatOperatorIndex, array $secondOperand ): void { - // build uo the new content + // build up the new content $newContent = ''; foreach ([$firstOperand, $secondOperand] as $operant) { @@ -336,4 +340,36 @@ private function containsLinebreak(Tokens $tokens, int $startIndex, int $endInde return false; } + + /** + * @param _ConcatOperandType $firstOperand + * @param _ConcatOperandType $secondOperand + */ + private function operandsCanNotBeMerged(Tokens $tokens, array $firstOperand, array $secondOperand): bool + { + // If the first operand does not end with a variable, no variables would be broken by concatenation. + if (self::STR_DOUBLE_QUOTE_VAR !== $firstOperand['type']) { + return false; + } + if (!$tokens[$firstOperand['end'] - 1]->isGivenKind(T_VARIABLE)) { + return false; + } + + $allowedPatternsForSecondOperand = [ + '/^ .*/', // e.g. " foo", ' bar', " $baz" + '/^-(?!\>)/', // e.g. "-foo", '-bar', "-$baz" + ]; + + // If the first operand ends with a variable, the second operand should match one of the allowed patterns. + // Otherwise, the concatenation can break a variable in the first operand. + foreach ($allowedPatternsForSecondOperand as $allowedPattern) { + $secondOperandInnerContent = substr($tokens->generatePartialCode($secondOperand['start'], $secondOperand['end']), 1, -1); + + if (Preg::match($allowedPattern, $secondOperandInnerContent)) { + return false; + } + } + + return true; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php index ad6887e72..63ab344a0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/OperatorLinebreakFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -24,24 +25,37 @@ use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Preg; use PhpCsFixer\Tokenizer\Analyzer\AlternativeSyntaxAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\SwitchAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\ControlCaseStructuresAnalyzer; use PhpCsFixer\Tokenizer\Analyzer\GotoLabelAnalyzer; use PhpCsFixer\Tokenizer\Analyzer\ReferenceAnalyzer; +use PhpCsFixer\Tokenizer\Analyzer\SwitchAnalyzer; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; /** * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * only_booleans?: bool, + * position?: 'beginning'|'end', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * only_booleans: bool, + * position: 'beginning'|'end', + * } */ final class OperatorLinebreakFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const BOOLEAN_OPERATORS = [[T_BOOLEAN_AND], [T_BOOLEAN_OR], [T_LOGICAL_AND], [T_LOGICAL_OR], [T_LOGICAL_XOR]]; private string $position = 'beginning'; /** - * @var array|string> + * @var list */ private array $operators = []; @@ -69,10 +83,13 @@ function foo() { ); } - public function configure(array $configuration): void + public function isCandidate(Tokens $tokens): bool { - parent::configure($configuration); + return true; + } + protected function configurePostNormalisation(): void + { $this->position = $this->configuration['position']; $this->operators = self::BOOLEAN_OPERATORS; @@ -81,11 +98,6 @@ public function configure(array $configuration): void } } - public function isCandidate(Tokens $tokens): bool - { - return true; - } - protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ @@ -106,8 +118,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $gotoLabelAnalyzer = new GotoLabelAnalyzer(); $alternativeSyntaxAnalyzer = new AlternativeSyntaxAnalyzer(); - $excludedIndices = $this->getExcludedIndices($tokens); - $index = $tokens->count(); while ($index > 1) { --$index; @@ -128,7 +138,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - if (\in_array($index, $excludedIndices, true)) { + if (SwitchAnalyzer::belongsToSwitch($tokens, $index)) { continue; } @@ -147,32 +157,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * Currently only colons from "switch". - * - * @return int[] - */ - private function getExcludedIndices(Tokens $tokens): array - { - $colonIndices = []; - - /** @var SwitchAnalysis $analysis */ - foreach (ControlCaseStructuresAnalyzer::findControlStructures($tokens, [T_SWITCH]) as $analysis) { - foreach ($analysis->getCases() as $case) { - $colonIndices[] = $case->getColonIndex(); - } - - $defaultAnalysis = $analysis->getDefaultAnalysis(); - - if (null !== $defaultAnalysis) { - $colonIndices[] = $defaultAnalysis->getColonIndex(); - } - } - - return $colonIndices; - } - - /** - * @param int[] $operatorIndices + * @param non-empty-list $operatorIndices */ private function fixOperatorLinebreak(Tokens $tokens, array $operatorIndices): void { @@ -204,7 +189,7 @@ private function fixOperatorLinebreak(Tokens $tokens, array $operatorIndices): v } /** - * @param int[] $operatorIndices + * @param non-empty-list $operatorIndices */ private function fixMoveToTheBeginning(Tokens $tokens, array $operatorIndices): void { @@ -229,7 +214,7 @@ private function fixMoveToTheBeginning(Tokens $tokens, array $operatorIndices): } /** - * @param int[] $operatorIndices + * @param non-empty-list $operatorIndices */ private function fixMoveToTheEnd(Tokens $tokens, array $operatorIndices): void { @@ -254,9 +239,9 @@ private function fixMoveToTheEnd(Tokens $tokens, array $operatorIndices): void } /** - * @param int[] $indices + * @param list $indices * - * @return Token[] + * @return list */ private function getReplacementsAndClear(Tokens $tokens, array $indices, int $direction): array { @@ -287,6 +272,9 @@ private function isMultiline(Tokens $tokens, int $indexStart, int $indexEnd): bo return false; } + /** + * @return list + */ private static function getNonBooleanOperators(): array { return array_merge( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php index 1e6e0eb6b..758c79393 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryOperatorSpacesFixer.php @@ -19,9 +19,8 @@ use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Tokenizer\Analyzer\AlternativeSyntaxAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\Analysis\SwitchAnalysis; -use PhpCsFixer\Tokenizer\Analyzer\ControlCaseStructuresAnalyzer; use PhpCsFixer\Tokenizer\Analyzer\GotoLabelAnalyzer; +use PhpCsFixer\Tokenizer\Analyzer\SwitchAnalyzer; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; @@ -45,7 +44,7 @@ public function getDefinition(): FixerDefinitionInterface */ public function getPriority(): int { - return 0; + return 1; } public function isCandidate(Tokens $tokens): bool @@ -58,14 +57,13 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $alternativeSyntaxAnalyzer = new AlternativeSyntaxAnalyzer(); $gotoLabelAnalyzer = new GotoLabelAnalyzer(); $ternaryOperatorIndices = []; - $excludedIndices = $this->getColonIndicesForSwitch($tokens); foreach ($tokens as $index => $token) { if (!$token->equalsAny(['?', ':'])) { continue; } - if (\in_array($index, $excludedIndices, true)) { + if (SwitchAnalyzer::belongsToSwitch($tokens, $index)) { continue; } @@ -114,29 +112,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } } - /** - * @return int[] - */ - private function getColonIndicesForSwitch(Tokens $tokens): array - { - $colonIndices = []; - - /** @var SwitchAnalysis $analysis */ - foreach (ControlCaseStructuresAnalyzer::findControlStructures($tokens, [T_SWITCH]) as $analysis) { - foreach ($analysis->getCases() as $case) { - $colonIndices[] = $case->getColonIndex(); - } - - $defaultAnalysis = $analysis->getDefaultAnalysis(); - - if (null !== $defaultAnalysis) { - $colonIndices[] = $defaultAnalysis->getColonIndex(); - } - } - - return $colonIndices; - } - private function ensureWhitespaceExistence(Tokens $tokens, int $index, bool $after): void { if ($tokens[$index]->isWhitespace()) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php index 4cbae0a10..e1e85b37e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToElvisOperatorFixer.php @@ -80,7 +80,7 @@ public function getDefinition(): FixerDefinitionInterface */ public function getPriority(): int { - return 1; + return 2; } public function isCandidate(Tokens $tokens): bool @@ -95,8 +95,6 @@ public function isRisky(): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - $blockEdgeDefinitions = Tokens::getBlockEdgeDefinitions(); - for ($index = \count($tokens) - 5; $index > 1; --$index) { if (!$tokens[$index]->equals('?')) { continue; @@ -110,7 +108,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // get and check what is before the `?` operator - $beforeOperator = $this->getBeforeOperator($tokens, $index, $blockEdgeDefinitions); + $beforeOperator = $this->getBeforeOperator($tokens, $index); if (null === $beforeOperator) { continue; // contains something we cannot fix because of priorities @@ -129,10 +127,11 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @return null|array{start: int, end: int} null if contains ++/-- operator + * @return ?array{start: int, end: int} null if contains ++/-- operator */ - private function getBeforeOperator(Tokens $tokens, int $index, array $blockEdgeDefinitions): ?array + private function getBeforeOperator(Tokens $tokens, int $index): ?array { + $blockEdgeDefinitions = Tokens::getBlockEdgeDefinitions(); $index = $tokens->getPrevMeaningfulToken($index); $before = ['end' => $index]; @@ -141,16 +140,17 @@ private function getBeforeOperator(Tokens $tokens, int $index, array $blockEdgeD return null; } - $blockType = Tokens::detectBlockType($tokens[$index]); + $detectedBlockType = Tokens::detectBlockType($tokens[$index]); - if (null === $blockType || $blockType['isStart']) { + if (null === $detectedBlockType || $detectedBlockType['isStart']) { $before['start'] = $index; $index = $tokens->getPrevMeaningfulToken($index); continue; } - $blockType = $blockEdgeDefinitions[$blockType['type']]; + /** @phpstan-ignore-next-line offsetAccess.notFound (we just detected block type, we know it's definition exists under given PHP runtime) */ + $blockType = $blockEdgeDefinitions[$detectedBlockType['type']]; $openCount = 1; do { @@ -190,7 +190,7 @@ private function getAfterOperator(Tokens $tokens, int $index): array $index = $tokens->getNextMeaningfulToken($index); $after = ['start' => $index]; - while (!$tokens[$index]->equals(':')) { + do { $blockType = Tokens::detectBlockType($tokens[$index]); if (null !== $blockType) { @@ -199,7 +199,7 @@ private function getAfterOperator(Tokens $tokens, int $index): array $after['end'] = $index; $index = $tokens->getNextMeaningfulToken($index); - } + } while (!$tokens[$index]->equals(':')); return $after; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php index 83cf9337d..17c86e82b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/TernaryToNullCoalescingFixer.php @@ -29,7 +29,7 @@ final class TernaryToNullCoalescingFixer extends AbstractFixer public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Use `null` coalescing operator `??` where possible. Requires PHP >= 7.0.', + 'Use `null` coalescing operator `??` where possible.', [ new CodeSample( "findGivenKind(T_ISSET)); - while ($issetIndex = array_pop($issetIndices)) { + foreach (array_reverse($issetIndices) as $issetIndex) { $this->fixIsset($tokens, $issetIndex); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php index 059537171..728fee495 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Operator/UnaryOperatorSpacesFixer.php @@ -15,6 +15,11 @@ namespace PhpCsFixer\Fixer\Operator; use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; @@ -22,17 +27,42 @@ use PhpCsFixer\Tokenizer\TokensAnalyzer; /** - * Fixer for rules defined in PSR12 ¶6.1. - * * @author Gregor Harlan + * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * only_dec_inc?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * only_dec_inc: bool, + * } */ -final class UnaryOperatorSpacesFixer extends AbstractFixer +final class UnaryOperatorSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( 'Unary operators should be placed adjacent to their operands.', - [new CodeSample(" false] + ), + new CodeSample( + ' true] + ), + ] ); } @@ -51,11 +81,25 @@ public function isCandidate(Tokens $tokens): bool return true; } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('only_dec_inc', 'Limit to increment and decrement operators.')) + ->setAllowedTypes(['bool']) + ->setDefault(false) + ->getOption(), + ]); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $tokensAnalyzer = new TokensAnalyzer($tokens); for ($index = $tokens->count() - 1; $index >= 0; --$index) { + if (true === $this->configuration['only_dec_inc'] && !$tokens[$index]->isGivenKind([T_DEC, T_INC])) { + continue; + } + if ($tokensAnalyzer->isUnarySuccessorOperator($index)) { if (!$tokens[$tokens->getPrevNonWhitespace($index)]->isComment()) { $tokens->removeLeadingWhitespace($index); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php index 8c8dbad73..849f30161 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/BlankLineAfterOpeningTagFixer.php @@ -48,23 +48,16 @@ public function getPriority(): int public function isCandidate(Tokens $tokens): bool { - return $tokens->isTokenKindFound(T_OPEN_TAG); + return $tokens->isMonolithicPhp() && !$tokens->isTokenKindFound(T_OPEN_TAG_WITH_ECHO); } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $lineEnding = $this->whitespacesConfig->getLineEnding(); - // ignore files with short open tag and ignore non-monolithic files - if (!$tokens[0]->isGivenKind(T_OPEN_TAG) || !$tokens->isMonolithicPhp()) { - return; - } - $newlineFound = false; - - /** @var Token $token */ foreach ($tokens as $token) { - if ($token->isWhitespace() && str_contains($token->getContent(), "\n")) { + if (($token->isWhitespace() || $token->isGivenKind(T_OPEN_TAG)) && str_contains($token->getContent(), "\n")) { $newlineFound = true; break; @@ -76,18 +69,24 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void return; } - $token = $tokens[0]; + $openTagIndex = $tokens[0]->isGivenKind(T_INLINE_HTML) ? 1 : 0; + $token = $tokens[$openTagIndex]; if (!str_contains($token->getContent(), "\n")) { - $tokens[0] = new Token([$token->getId(), rtrim($token->getContent()).$lineEnding]); + $tokens[$openTagIndex] = new Token([$token->getId(), rtrim($token->getContent()).$lineEnding]); + } + + $newLineIndex = $openTagIndex + 1; + if (!$tokens->offsetExists($newLineIndex)) { + return; } - if (!str_contains($tokens[1]->getContent(), "\n")) { - if ($tokens[1]->isWhitespace()) { - $tokens[1] = new Token([T_WHITESPACE, $lineEnding.$tokens[1]->getContent()]); - } else { - $tokens->insertAt(1, new Token([T_WHITESPACE, $lineEnding])); + if ($tokens[$newLineIndex]->isWhitespace()) { + if (!str_contains($tokens[$newLineIndex]->getContent(), "\n")) { + $tokens[$newLineIndex] = new Token([T_WHITESPACE, $lineEnding.$tokens[$newLineIndex]->getContent()]); } + } else { + $tokens->insertAt($newLineIndex, new Token([T_WHITESPACE, $lineEnding])); } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php index ed09a4854..e0809f30d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/EchoTagSyntaxFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -27,9 +28,25 @@ /** * @author Michele Locati + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * format?: 'long'|'short', + * long_function?: 'echo'|'print', + * shorten_simple_statements_only?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * format: 'long'|'short', + * long_function: 'echo'|'print', + * shorten_simple_statements_only: bool, + * } */ final class EchoTagSyntaxFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** @internal */ public const OPTION_FORMAT = 'format'; @@ -226,7 +243,7 @@ private function isComplexCode(Tokens $tokens, int $index): bool /** * Builds the list of tokens that replace a long echo sequence. * - * @return Token[] + * @return list */ private function buildLongToShortTokens(Tokens $tokens, int $openTagIndex, int $echoTagIndex): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php index 61186ccd2..bf6c1313a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/FullOpeningTagFixer.php @@ -62,7 +62,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // replace all isTokenKindFound(T_OPEN_TAG); + return $tokens->isMonolithicPhp() && !$tokens->isTokenKindFound(T_OPEN_TAG_WITH_ECHO); } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - // ignore files with short open tag and ignore non-monolithic files - if (!$tokens[0]->isGivenKind(T_OPEN_TAG) || !$tokens->isMonolithicPhp()) { - return; - } + $openTagIndex = $tokens[0]->isGivenKind(T_INLINE_HTML) ? 1 : 0; // ignore if linebreak already present - if (str_contains($tokens[0]->getContent(), "\n")) { + if (str_contains($tokens[$openTagIndex]->getContent(), "\n")) { return; } $newlineFound = false; foreach ($tokens as $token) { - if ($token->isWhitespace() && str_contains($token->getContent(), "\n")) { + if (($token->isWhitespace() || $token->isGivenKind(T_OPEN_TAG)) && str_contains($token->getContent(), "\n")) { $newlineFound = true; break; @@ -66,6 +63,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void return; } - $tokens[0] = new Token([T_OPEN_TAG, rtrim($tokens[0]->getContent()).$this->whitespacesConfig->getLineEnding()]); + $tokens[$openTagIndex] = new Token([T_OPEN_TAG, rtrim($tokens[$openTagIndex]->getContent()).$this->whitespacesConfig->getLineEnding()]); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php index c6e611b3a..14c40c037 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpTag/NoClosingTagFixer.php @@ -38,17 +38,13 @@ public function getDefinition(): FixerDefinitionInterface public function isCandidate(Tokens $tokens): bool { - return $tokens->isTokenKindFound(T_CLOSE_TAG); + return \count($tokens) >= 2 && $tokens->isMonolithicPhp() && $tokens->isTokenKindFound(T_CLOSE_TAG); } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - if (\count($tokens) < 2 || !$tokens->isMonolithicPhp() || !$tokens->isTokenKindFound(T_CLOSE_TAG)) { - return; - } - $closeTags = $tokens->findGivenKind(T_CLOSE_TAG); - $index = key($closeTags); + $index = array_key_first($closeTags); if (isset($tokens[$index - 1]) && $tokens[$index - 1]->isWhitespace()) { $tokens->clearAt($index - 1); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAssertNewNamesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAssertNewNamesFixer.php new file mode 100644 index 000000000..71f02b5df --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAssertNewNamesFixer.php @@ -0,0 +1,107 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\PhpUnit; + +use PhpCsFixer\Fixer\AbstractPhpUnitFixer; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @author Krzysztof Ciszewski + */ +final class PhpUnitAssertNewNamesFixer extends AbstractPhpUnitFixer +{ + public function isRisky(): bool + { + return true; + } + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Rename deprecated PHPUnit assertions like `assertFileNotExists` to new methods like `assertFileDoesNotExist`.', + [ + new CodeSample( + 'assertFileNotExists("test.php"); + $this->assertNotIsWritable("path.php"); + } +} +' + ), + ], + null, + 'Fixer could be risky if one is overriding PHPUnit\'s native methods.' + ); + } + + /** + * {@inheritdoc} + * + * Must run after PhpUnitDedicateAssertFixer. + */ + public function getPriority(): int + { + return -10; + } + + protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void + { + foreach ($this->getPreviousAssertCall($tokens, $startIndex, $endIndex) as $assertCall) { + $this->fixAssertNewNames($tokens, $assertCall); + } + } + + /** + * @param array{ + * index: int, + * loweredName: string, + * openBraceIndex: int, + * closeBraceIndex: int, + * } $assertCall + */ + private function fixAssertNewNames(Tokens $tokens, array $assertCall): void + { + $replacements = [ + 'assertnotisreadable' => 'assertIsNotReadable', + 'assertnotiswritable' => 'assertIsNotWritable', + 'assertdirectorynotexists' => 'assertDirectoryDoesNotExist', + 'assertfilenotexists' => 'assertFileDoesNotExist', + 'assertdirectorynotisreadable' => 'assertDirectoryIsNotReadable', + 'assertdirectorynotiswritable' => 'assertDirectoryIsNotWriteable', + 'assertfilenotisreadable' => 'assertFileIsNotReadable', + 'assertfilenotiswritable' => 'assertFileIsNotWriteable', + 'assertregexp' => 'assertMatchesRegularExpression', + 'assertnotregexp' => 'assertDoesNotMatchRegularExpression', + ]; + $replacement = $replacements[$assertCall['loweredName']] ?? null; + + if (null === $replacement) { + return; + } + + $tokens[$assertCall['index']] = new Token([ + T_STRING, + $replacement, + ]); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAttributesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAttributesFixer.php new file mode 100644 index 000000000..537e27637 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitAttributesFixer.php @@ -0,0 +1,620 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\PhpUnit; + +use PhpCsFixer\DocBlock\Annotation; +use PhpCsFixer\DocBlock\DocBlock; +use PhpCsFixer\Fixer\AbstractPhpUnitFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\FixerDefinition\VersionSpecification; +use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Analyzer\AttributeAnalyzer; +use PhpCsFixer\Tokenizer\Analyzer\FullyQualifiedNameAnalyzer; +use PhpCsFixer\Tokenizer\CT; +use PhpCsFixer\Tokenizer\Processor\ImportProcessor; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * keep_annotations?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * keep_annotations: bool, + * } + */ +final class PhpUnitAttributesFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface +{ + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + /** @var array */ + private array $fixingMap; + + public function __construct() + { + parent::__construct(); + $this->prepareFixingMap(); + } + + public function getDefinition(): FixerDefinitionInterface + { + $codeSample = <<<'PHP' + true]), + ], + ); + } + + public function isCandidate(Tokens $tokens): bool + { + return \PHP_VERSION_ID >= 8_00_00 && parent::isCandidate($tokens); + } + + /** + * {@inheritdoc} + * + * Must run before FullyQualifiedStrictTypesFixer, NoEmptyPhpdocFixer, PhpdocSeparationFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer. + * Must run after PhpUnitDataProviderNameFixer, PhpUnitDataProviderReturnTypeFixer, PhpUnitDataProviderStaticFixer, PhpUnitSizeClassFixer, PhpUnitTestClassRequiresCoversFixer. + */ + public function getPriority(): int + { + return 8; + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('keep_annotations', 'Whether to keep annotations or not. This may be helpful for projects that support PHP before version 8 or PHPUnit before version 10.')) + ->setAllowedTypes(['bool']) + ->setDefault(false) + ->getOption(), + ]); + } + + protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void + { + $fullyQualifiedNameAnalyzer = new FullyQualifiedNameAnalyzer($tokens); + + $classIndex = $tokens->getPrevTokenOfKind($startIndex, [[T_CLASS]]); + $docBlockIndex = $this->getDocBlockIndex($tokens, $classIndex); + if ($tokens[$docBlockIndex]->isGivenKind(T_DOC_COMMENT)) { + $startIndex = $docBlockIndex; + } + + for ($index = $endIndex; $index >= $startIndex; --$index) { + if (!$tokens[$index]->isGivenKind(T_DOC_COMMENT)) { + continue; + } + + $targetIndex = $tokens->getTokenNotOfKindSibling( + $index, + 1, + [[T_ABSTRACT], [T_COMMENT], [T_FINAL], [T_FUNCTION], [T_PRIVATE], [T_PROTECTED], [T_PUBLIC], [T_STATIC], [T_WHITESPACE]], + ); + $annotationScope = $tokens[$targetIndex]->isGivenKind(T_CLASS) ? 'class' : 'method'; + + $docBlock = new DocBlock($tokens[$index]->getContent()); + + $presentAttributes = []; + foreach (array_reverse($docBlock->getAnnotations()) as $annotation) { + $annotationName = $annotation->getTag()->getName(); + + if (!isset($this->fixingMap[$annotationName])) { + continue; + } + if (!self::shouldBeFixed($annotationName, $annotationScope)) { + continue; + } + + /** @phpstan-ignore-next-line */ + $tokensToInsert = self::{$this->fixingMap[$annotationName]}($tokens, $index, $annotation); + + $presentAttributes[$annotationName] ??= self::isAttributeAlreadyPresent($fullyQualifiedNameAnalyzer, $tokens, $index, $tokensToInsert); + + if ($presentAttributes[$annotationName]) { + continue; + } + + if ([] === $tokensToInsert) { + continue; + } + + $tokens->insertSlices([$index + 1 => $tokensToInsert]); + + if (!$this->configuration['keep_annotations']) { + $annotation->remove(); + } + } + + if ('' === $docBlock->getContent()) { + $tokens->clearTokenAndMergeSurroundingWhitespace($index); + } else { + $tokens[$index] = new Token([T_DOC_COMMENT, $docBlock->getContent()]); + } + } + } + + private function prepareFixingMap(): void + { + // annotations that map to attribute without parameters + foreach ([ + 'after', + 'afterClass', + 'before', + 'beforeClass', + 'coversNothing', + 'doesNotPerformAssertions', + 'large', + 'medium', + 'runInSeparateProcess', + 'runTestsInSeparateProcesses', + 'small', + 'test', + 'preCondition', + 'postCondition', + ] as $annotation) { + $this->fixingMap[$annotation] = 'fixWithoutParameters'; + } + + // annotations that map to attribute with single string value + foreach (['group', 'testDox', 'ticket'] as $annotation) { + $this->fixingMap[$annotation] = 'fixWithSingleStringValue'; + } + + // annotations that map from 'enabled'/'disabled' value to attribute with boolean value + foreach (['backupGlobals', 'backupStaticAttributes', 'preserveGlobalState'] as $annotation) { + $this->fixingMap[$annotation] = 'fixWithEnabledDisabledValue'; + } + + // annotations that has custom mapping function + $this->fixingMap['covers'] = 'fixCovers'; + $this->fixingMap['dataProvider'] = 'fixDataProvider'; + $this->fixingMap['depends'] = 'fixDepends'; + $this->fixingMap['requires'] = 'fixRequires'; + $this->fixingMap['testWith'] = 'fixTestWith'; + $this->fixingMap['uses'] = 'fixUses'; + } + + private static function shouldBeFixed(string $annotationName, string $annotationScope): bool + { + if ( + 'method' === $annotationScope + && \in_array($annotationName, ['covers', 'large', 'medium', 'runTestsInSeparateProcesses', 'small', 'uses'], true) + ) { + return false; + } + + if ( + 'class' === $annotationScope + && \in_array($annotationName, ['after', 'afterClass', 'before', 'beforeClass', 'dataProvider', 'depends', 'postCondition', 'preCondition', 'runInSeparateProcess', 'test', 'testWith'], true) + ) { + return false; + } + + return true; + } + + /** + * @param list $tokensToInsert + */ + private static function isAttributeAlreadyPresent( + FullyQualifiedNameAnalyzer $fullyQualifiedNameAnalyzer, + Tokens $tokens, + int $index, + array $tokensToInsert + ): bool { + $attributeIndex = $tokens->getNextMeaningfulToken($index); + if (!$tokens[$attributeIndex]->isGivenKind(T_ATTRIBUTE)) { + return false; + } + + $insertedClassName = ''; + foreach (\array_slice($tokensToInsert, 3) as $token) { + if ($token->equals('(') || $token->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { + break; + } + $insertedClassName .= $token->getContent(); + } + + foreach (AttributeAnalyzer::collect($tokens, $attributeIndex) as $attributeAnalysis) { + foreach ($attributeAnalysis->getAttributes() as $attribute) { + $className = ltrim(AttributeAnalyzer::determineAttributeFullyQualifiedName($tokens, $attribute['name'], $attribute['start']), '\\'); + + if ($insertedClassName === $className) { + return true; + } + } + } + + return false; + } + + /** + * @return list + */ + private static function fixWithoutParameters(Tokens $tokens, int $index, Annotation $annotation): array + { + return self::createAttributeTokens($tokens, $index, self::getAttributeNameForAnnotation($annotation)); + } + + /** + * @return list + */ + private static function fixWithSingleStringValue(Tokens $tokens, int $index, Annotation $annotation): array + { + Preg::match( + \sprintf('/@%s\s+(.*\S)(?:\R|\s*\*+\/$)/', $annotation->getTag()->getName()), + $annotation->getContent(), + $matches, + ); + if (!isset($matches[1])) { + return []; + } + + return self::createAttributeTokens( + $tokens, + $index, + self::getAttributeNameForAnnotation($annotation), + self::createEscapedStringToken($matches[1]), + ); + } + + /** + * @return list + */ + private static function fixWithEnabledDisabledValue(Tokens $tokens, int $index, Annotation $annotation): array + { + $matches = self::getMatches($annotation); + if (!isset($matches[1])) { + return []; + } + + return self::createAttributeTokens( + $tokens, + $index, + self::getAttributeNameForAnnotation($annotation), + new Token([T_STRING, isset($matches[1]) && 'enabled' === $matches[1] ? 'true' : 'false']), + ); + } + + /** + * @return list + */ + private static function fixCovers(Tokens $tokens, int $index, Annotation $annotation): array + { + $matches = self::getMatches($annotation); + \assert(isset($matches[1])); + + if (str_starts_with($matches[1], '::')) { + return self::createAttributeTokens($tokens, $index, 'CoversFunction', self::createEscapedStringToken(substr($matches[1], 2))); + } + if (!str_contains($matches[1], '::')) { + return self::createAttributeTokens( + $tokens, + $index, + 'CoversClass', + ...self::toClassConstant($matches[1]), + ); + } + + return []; + } + + /** + * @return list + */ + private static function fixDataProvider(Tokens $tokens, int $index, Annotation $annotation): array + { + $matches = self::getMatches($annotation); + if (!isset($matches[1])) { + return []; + } + + if (str_contains($matches[1], '::')) { + // @phpstan-ignore offsetAccess.notFound + [$class, $method] = explode('::', $matches[1]); + + return self::createAttributeTokens( + $tokens, + $index, + 'DataProviderExternal', + ...[ + ...self::toClassConstant($class), + new Token(','), + new Token([T_WHITESPACE, ' ']), + self::fixNameAndCreateEscapedStringToken($method), + ], + ); + } + + return self::createAttributeTokens($tokens, $index, 'DataProvider', self::fixNameAndCreateEscapedStringToken($matches[1])); + } + + /** + * @see https://github.com/sebastianbergmann/phpunit/blob/11.5.12/src/Metadata/Parser/AnnotationParser.php#L266 + */ + private static function fixNameAndCreateEscapedStringToken(string $methodName): Token + { + return self::createEscapedStringToken(rtrim($methodName, " ()\n\r\t\v\x00")); + } + + /** + * @return list + */ + private static function fixDepends(Tokens $tokens, int $index, Annotation $annotation): array + { + $matches = self::getMatches($annotation); + if (!isset($matches[1])) { + return []; + } + + $nameSuffix = ''; + $depended = $matches[1]; + if (isset($matches[2])) { + if ('clone' === $matches[1]) { + $nameSuffix = 'UsingDeepClone'; + $depended = $matches[2]; + } elseif ('shallowClone' === $matches[1]) { + $nameSuffix = 'UsingShallowClone'; + $depended = $matches[2]; + } + } + + $class = null; + $method = $depended; + if (str_contains($depended, '::')) { + // @phpstan-ignore offsetAccess.notFound + [$class, $method] = explode('::', $depended); + + if ('class' === $method) { + $method = null; + $nameSuffix = '' === $nameSuffix ? 'OnClass' : ('OnClass'.$nameSuffix); + } else { + $nameSuffix = ('External'.$nameSuffix); + } + } + + $attributeTokens = []; + if (null !== $class) { + $attributeTokens = self::toClassConstant($class); + } + if (null !== $method) { + if ([] !== $attributeTokens) { + $attributeTokens[] = new Token(','); + $attributeTokens[] = new Token([T_WHITESPACE, ' ']); + } + $attributeTokens[] = self::createEscapedStringToken($method); + } + + return self::createAttributeTokens($tokens, $index, 'Depends'.$nameSuffix, ...$attributeTokens); + } + + /** + * @return list + */ + private static function fixRequires(Tokens $tokens, int $index, Annotation $annotation): array + { + $matches = self::getMatches($annotation); + if (!isset($matches[1])) { + return []; + } + + $map = [ + 'extension' => 'RequiresPhpExtension', + 'function' => 'RequiresFunction', + 'PHP' => 'RequiresPhp', + 'PHPUnit' => 'RequiresPhpunit', + 'OS' => 'RequiresOperatingSystem', + 'OSFAMILY' => 'RequiresOperatingSystemFamily', + 'setting' => 'RequiresSetting', + ]; + + if (!isset($matches[2]) || !isset($map[$matches[1]])) { + return []; + } + + $attributeName = $map[$matches[1]]; + + if ('RequiresFunction' === $attributeName && str_contains($matches[2], '::')) { + // @phpstan-ignore offsetAccess.notFound + [$class, $method] = explode('::', $matches[2]); + + $attributeName = 'RequiresMethod'; + $attributeTokens = [ + ...self::toClassConstant($class), + new Token(','), + new Token([T_WHITESPACE, ' ']), + self::createEscapedStringToken($method), + ]; + } elseif ('RequiresPhp' === $attributeName && isset($matches[3])) { + $attributeTokens = [self::createEscapedStringToken($matches[2].' '.$matches[3])]; + } else { + $attributeTokens = [self::createEscapedStringToken(self::fixVersionConstraint($matches[2]))]; + } + + if (isset($matches[3]) && 'RequiresPhp' !== $attributeName) { + $attributeTokens[] = new Token(','); + $attributeTokens[] = new Token([T_WHITESPACE, ' ']); + $attributeTokens[] = self::createEscapedStringToken(self::fixVersionConstraint($matches[3])); + } + + return self::createAttributeTokens($tokens, $index, $attributeName, ...$attributeTokens); + } + + private static function fixVersionConstraint(string $version): string + { + if (Preg::match('/^[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?$/', $version)) { + $version = '>= '.$version; + } + + return $version; + } + + /** + * @return list + */ + private static function fixTestWith(Tokens $tokens, int $index, Annotation $annotation): array + { + $content = $annotation->getContent(); + $content = Preg::replace('/@testWith\s+/', '', $content); + $content = Preg::replace('/(^|\R)\s+\**\s*/', "\n", $content); + $content = trim($content); + if ('' === $content) { + return []; + } + + $attributeTokens = []; + foreach (explode("\n", $content) as $json) { + $attributeTokens = array_merge( + $attributeTokens, + self::createAttributeTokens($tokens, $index, 'TestWithJson', self::createEscapedStringToken($json)), + ); + } + + return $attributeTokens; + } + + /** + * @return list + */ + private static function fixUses(Tokens $tokens, int $index, Annotation $annotation): array + { + $matches = self::getMatches($annotation); + if (!isset($matches[1])) { + return []; + } + + if (str_starts_with($matches[1], '::')) { + $attributeName = 'UsesFunction'; + $attributeTokens = [self::createEscapedStringToken(substr($matches[1], 2))]; + } elseif (Preg::match('/^[a-zA-Z\d\\\]+$/', $matches[1])) { + $attributeName = 'UsesClass'; + $attributeTokens = self::toClassConstant($matches[1]); + } else { + return []; + } + + return self::createAttributeTokens($tokens, $index, $attributeName, ...$attributeTokens); + } + + /** + * @return list + */ + private static function getMatches(Annotation $annotation): array + { + Preg::match( + \sprintf('/@%s\s+(\S+)(?:\s+(\S+))?(?:\s+(.+\S))?\s*(?:\R|\*+\/$)/', $annotation->getTag()->getName()), + $annotation->getContent(), + $matches, + ); + + \assert(array_is_list($matches)); // preg_match matches is not well typed, it depends on used regex, let's assure the type to instruct SCA + + return $matches; + } + + private static function getAttributeNameForAnnotation(Annotation $annotation): string + { + $annotationName = $annotation->getTag()->getName(); + + return 'backupStaticAttributes' === $annotationName + ? 'BackupStaticProperties' + : ucfirst($annotationName); + } + + /** + * @return list + */ + private static function createAttributeTokens( + Tokens $tokens, + int $index, + string $className, + Token ...$attributeTokens + ): array { + if ([] !== $attributeTokens) { + $attributeTokens = [ + new Token('('), + ...$attributeTokens, + new Token(')'), + ]; + } + + return [ + clone $tokens[$index + 1], + new Token([T_ATTRIBUTE, '#[']), + new Token([T_NS_SEPARATOR, '\\']), + new Token([T_STRING, 'PHPUnit']), + new Token([T_NS_SEPARATOR, '\\']), + new Token([T_STRING, 'Framework']), + new Token([T_NS_SEPARATOR, '\\']), + new Token([T_STRING, 'Attributes']), + new Token([T_NS_SEPARATOR, '\\']), + new Token([T_STRING, $className]), + ...$attributeTokens, + new Token([CT::T_ATTRIBUTE_CLOSE, ']']), + ]; + } + + /** + * @param class-string $name + * + * @return list + */ + private static function toClassConstant(string $name): array + { + return [ + ...ImportProcessor::tokenizeName($name), + new Token([T_DOUBLE_COLON, '::']), + new Token([CT::T_CLASS_CONSTANT, 'class']), + ]; + } + + private static function createEscapedStringToken(string $value): Token + { + return new Token([T_CONSTANT_ENCAPSED_STRING, "'".str_replace("'", "\\'", $value)."'"]); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php index a3b8cf7ef..01f10a79b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitConstructFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -29,18 +30,20 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * assertions?: list<'assertEquals'|'assertNotEquals'|'assertNotSame'|'assertSame'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * assertions: list<'assertEquals'|'assertNotEquals'|'assertNotSame'|'assertSame'>, + * } */ final class PhpUnitConstructFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { - /** - * @var array - */ - private static array $assertionFixers = [ - 'assertSame' => 'fixAssertPositive', - 'assertEquals' => 'fixAssertPositive', - 'assertNotEquals' => 'fixAssertNegative', - 'assertNotSame' => 'fixAssertNegative', - ]; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; public function isRisky(): bool { @@ -93,6 +96,10 @@ public function getPriority(): int return -8; } + /** + * @uses fixAssertNegative() + * @uses fixAssertPositive() + */ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void { // no assertions to be fixed - fast return @@ -101,10 +108,13 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en } foreach ($this->configuration['assertions'] as $assertionMethod) { - $assertionFixer = self::$assertionFixers[$assertionMethod]; - for ($index = $startIndex; $index < $endIndex; ++$index) { - $index = $this->{$assertionFixer}($tokens, $index, $assertionMethod); + $index = \call_user_func_array( + \in_array($assertionMethod, ['assertSame', 'assertEquals'], true) + ? [$this, 'fixAssertPositive'] + : [$this, 'fixAssertNegative'], + [$tokens, $index, $assertionMethod] + ); if (null === $index) { break; @@ -115,16 +125,18 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { + $assertMethods = [ + 'assertEquals', + 'assertNotEquals', + 'assertNotSame', + 'assertSame', + ]; + return new FixerConfigurationResolver([ (new FixerOptionBuilder('assertions', 'List of assertion methods to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$assertionFixers))]) - ->setDefault([ - 'assertEquals', - 'assertSame', - 'assertNotEquals', - 'assertNotSame', - ]) + ->setAllowedTypes(['string[]']) + ->setAllowedValues([new AllowedValueSubset($assertMethods)]) + ->setDefault($assertMethods) ->getOption(), ]); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderMethodOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderMethodOrderFixer.php new file mode 100644 index 000000000..96efabe13 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderMethodOrderFixer.php @@ -0,0 +1,288 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\PhpUnit; + +use PhpCsFixer\Fixer\AbstractPhpUnitFixer; +use PhpCsFixer\Fixer\ClassNotation\OrderedClassElementsFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Tokenizer\Analyzer\DataProviderAnalyzer; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * placement?: 'after'|'before', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * placement: 'after'|'before', + * } + * + * @phpstan-import-type _ClassElement from OrderedClassElementsFixer + */ +final class PhpUnitDataProviderMethodOrderFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface +{ + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Data provider method must be placed after/before the last/first test where used.', + [ + new CodeSample( + ' 'before', + ] + ), + ] + ); + } + + /** + * {@inheritdoc} + * + * Must run before ClassAttributesSeparationFixer, NoBlankLinesAfterClassOpeningFixer. + * Must run after OrderedClassElementsFixer. + */ + public function getPriority(): int + { + return 64; + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('placement', 'Where to place the data provider relative to the test where used.')) + ->setAllowedValues(['after', 'before']) + ->setDefault('after') + ->getOption(), + ]); + } + + protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void + { + $elements = $this->getElements($tokens, $startIndex); + + if (0 === \count($elements)) { + return; + } + + $endIndex = $elements[array_key_last($elements)]['end']; + + $dataProvidersWithUsagePairs = $this->getDataProvidersWithUsagePairs($tokens, $startIndex, $endIndex); + $origUsageDataProviderOrderPairs = $this->getOrigUsageDataProviderOrderPairs($dataProvidersWithUsagePairs); + + $sorted = $elements; + $providersPlaced = []; + if ('before' === $this->configuration['placement']) { + foreach ($origUsageDataProviderOrderPairs as [$usageName, $providerName]) { + if (!isset($providersPlaced[$providerName])) { + $providersPlaced[$providerName] = true; + + $sorted = $this->moveMethodElement($sorted, $usageName, $providerName, false); + } + } + } else { + $sameUsageName = false; + $sameProviderName = false; + foreach ($origUsageDataProviderOrderPairs as [$usageName, $providerName]) { + if (!isset($providersPlaced[$providerName])) { + $providersPlaced[$providerName] = true; + + $sortedBefore = $sorted; + $sorted = $this->moveMethodElement( + $sorted, + $usageName === $sameUsageName // @phpstan-ignore argument.type (https://github.com/phpstan/phpstan/issues/12482) + ? $sameProviderName + : $usageName, + $providerName, + true + ); + + // honor multiple providers order for one test + $sameUsageName = $usageName; + $sameProviderName = $providerName; + + // keep placement after the first test + if ($sortedBefore !== $sorted) { + unset($providersPlaced[$providerName]); + } + } + } + } + + if ($sorted !== $elements) { + $this->sortTokens($tokens, $startIndex, $endIndex, $sorted); + } + } + + /** + * @return list<_ClassElement> + */ + private function getElements(Tokens $tokens, int $startIndex): array + { + $methodOrderFixer = new OrderedClassElementsFixer(); + + return \Closure::bind(static fn () => $methodOrderFixer->getElements($tokens, $startIndex), null, OrderedClassElementsFixer::class)(); + } + + /** + * @param list<_ClassElement> $elements + */ + private function sortTokens(Tokens $tokens, int $startIndex, int $endIndex, array $elements): void + { + $methodOrderFixer = new OrderedClassElementsFixer(); + + \Closure::bind(static fn () => $methodOrderFixer->sortTokens($tokens, $startIndex, $endIndex, $elements), null, OrderedClassElementsFixer::class)(); + } + + /** + * @param list<_ClassElement> $elements + * + * @return list<_ClassElement> + */ + private function moveMethodElement(array $elements, string $nameKeep, string $nameToMove, bool $after): array + { + $i = 0; + $iKeep = false; + $iToMove = false; + foreach ($elements as $element) { + if ('method' === $element['type']) { + if ($element['name'] === $nameKeep) { + $iKeep = $i; + } elseif ($element['name'] === $nameToMove) { + $iToMove = $i; + } + } + + ++$i; + } + \assert(false !== $iKeep); + \assert(false !== $iToMove); + + if ($iToMove === $iKeep + ($after ? 1 : -1)) { + return $elements; + } + + $elementToMove = $elements[$iToMove]; // @phpstan-ignore offsetAccess.notFound + unset($elements[$iToMove]); + + $c = $iKeep + + ($after ? 1 : 0) + + ($iToMove < $iKeep ? -1 : 0); + + return [ + ...\array_slice($elements, 0, $c), + $elementToMove, + ...\array_slice($elements, $c), + ]; + } + + /** + * @return list + * }> + */ + private function getDataProvidersWithUsagePairs(Tokens $tokens, int $startIndex, int $endIndex): array + { + $dataProvidersWithUsagePairs = []; + + $dataProviderAnalyzer = new DataProviderAnalyzer(); + foreach ($dataProviderAnalyzer->getDataProviders($tokens, $startIndex, $endIndex) as $dataProviderAnalysis) { + $usages = []; + foreach ($dataProviderAnalysis->getUsageIndices() as $usageIndex) { + $methodNameTokens = $tokens->findSequence([[T_FUNCTION], [T_STRING]], $usageIndex[0], $endIndex); + if (null === $methodNameTokens) { + continue; + } + + $usages[] = [ + array_key_last($methodNameTokens), + end($methodNameTokens)->getContent(), + $usageIndex[1], + ]; + } + \assert([] !== $usages); + + $dataProvidersWithUsagePairs[] = [ + [$dataProviderAnalysis->getNameIndex(), $dataProviderAnalysis->getName()], + $usages, + ]; + } + + return $dataProvidersWithUsagePairs; + } + + /** + * @param list + * }> $dataProvidersWithUsagePairs + * + * @return list + */ + private function getOrigUsageDataProviderOrderPairs(array $dataProvidersWithUsagePairs): array + { + $origUsagesOrderPairs = []; + foreach ($dataProvidersWithUsagePairs as [$dataProviderPair, $usagePairs]) { + foreach ($usagePairs as $usagePair) { + $origUsagesOrderPairs[] = [$usagePair, $dataProviderPair[1]]; + } + } + uasort($origUsagesOrderPairs, static function (array $a, array $b): int { + $cmp = $a[0][0] <=> $b[0][0]; + + return 0 !== $cmp + ? $cmp + : $a[0][2] <=> $b[0][2]; + }); + + $origUsageDataProviderOrderPairs = []; + foreach (array_map(static fn (array $v): array => [$v[0][1], $v[1]], $origUsagesOrderPairs) as [$usageName, $providerName]) { + $origUsageDataProviderOrderPairs[] = [$usageName, $providerName]; + } + + return $origUsageDataProviderOrderPairs; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderNameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderNameFixer.php index c42123b86..a717f150c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderNameFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderNameFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,9 +30,23 @@ /** * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * prefix?: string, + * suffix?: string, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * prefix: string, + * suffix: string, + * } */ final class PhpUnitDataProviderNameFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -101,7 +116,22 @@ public function dataProviderUsedAsSecondInTest() {} ); } - public function getConfigurationDefinition(): FixerConfigurationResolverInterface + /** + * {@inheritdoc} + * + * Must run before PhpUnitAttributesFixer. + */ + public function getPriority(): int + { + return 9; + } + + public function isRisky(): bool + { + return true; + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ (new FixerOptionBuilder('prefix', 'Prefix that replaces "test".')) @@ -115,16 +145,6 @@ public function getConfigurationDefinition(): FixerConfigurationResolverInterfac ]); } - public function getPriority(): int - { - return 0; - } - - public function isRisky(): bool - { - return true; - } - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void { $dataProviderAnalyzer = new DataProviderAnalyzer(); @@ -133,14 +153,12 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en continue; } - $usageIndex = $dataProviderAnalysis->getUsageIndices()[0]; + $usageIndex = $dataProviderAnalysis->getUsageIndices()[0][0]; if (substr_count($tokens[$usageIndex]->getContent(), '@dataProvider') > 1) { continue; } - $testNameIndex = $tokens->getNextTokenOfKind($usageIndex, [[T_STRING]]); - - $dataProviderNewName = $this->getProviderNameForTestName($tokens[$testNameIndex]->getContent()); + $dataProviderNewName = $this->getDataProviderNameForUsageIndex($tokens, $usageIndex); if (null !== $tokens->findSequence([[T_FUNCTION], [T_STRING, $dataProviderNewName]], $startIndex, $endIndex)) { continue; } @@ -148,8 +166,8 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en $tokens[$dataProviderAnalysis->getNameIndex()] = new Token([T_STRING, $dataProviderNewName]); $newCommentContent = Preg::replace( - sprintf('/(@dataProvider\s+)%s/', $dataProviderAnalysis->getName()), - sprintf('$1%s', $dataProviderNewName), + \sprintf('/(@dataProvider\s+)%s/', $dataProviderAnalysis->getName()), + \sprintf('$1%s', $dataProviderNewName), $tokens[$usageIndex]->getContent(), ); @@ -157,8 +175,17 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en } } - private function getProviderNameForTestName(string $name): string + private function getDataProviderNameForUsageIndex(Tokens $tokens, int $index): string { + do { + if (\defined('T_ATTRIBUTE') && $tokens[$index]->isGivenKind(T_ATTRIBUTE)) { + $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $index); + } + $index = $tokens->getNextMeaningfulToken($index); + } while (!$tokens[$index]->isGivenKind(T_STRING)); + + $name = $tokens[$index]->getContent(); + $name = Preg::replace('/^test_*/i', '', $name); if ('' === $this->configuration['prefix']) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderReturnTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderReturnTypeFixer.php index 4c077585d..cbeda2c75 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderReturnTypeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderReturnTypeFixer.php @@ -65,12 +65,12 @@ public function provideSomethingCases() {} /** * {@inheritdoc} * - * Must run before ReturnToYieldFromFixer, ReturnTypeDeclarationFixer. + * Must run before PhpUnitAttributesFixer, ReturnToYieldFromFixer, ReturnTypeDeclarationFixer. * Must run after CleanNamespaceFixer. */ public function getPriority(): int { - return 2; + return 9; } public function isRisky(): bool diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderStaticFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderStaticFixer.php index 3d4786b7e..268a2a9fa 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderStaticFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDataProviderStaticFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,9 +30,21 @@ /** * @author Kuba Werłos + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * force?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * force: bool, + * } */ final class PhpUnitDataProviderStaticFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -82,6 +95,16 @@ public function provideSomething2Cases() { self::getData2(); } ); } + /** + * {@inheritdoc} + * + * Must run before PhpUnitAttributesFixer. + */ + public function getPriority(): int + { + return 9; + } + public function isRisky(): bool { return true; @@ -113,10 +136,12 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en if (null !== $methodStartIndex) { $methodEndIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $methodStartIndex); - if (!$this->configuration['force'] && null !== $tokens->findSequence([[T_VARIABLE, '$this']], $methodStartIndex, $methodEndIndex)) { + if (false === $this->configuration['force'] && null !== $tokens->findSequence([[T_VARIABLE, '$this']], $methodStartIndex, $methodEndIndex)) { continue; } } + + /** @var int $functionIndex */ $functionIndex = $tokens->getPrevTokenOfKind($dataProviderDefinitionIndex->getNameIndex(), [[T_FUNCTION]]); $methodAttributes = $tokensAnalyzer->getMethodAttributes($functionIndex); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php index ed599f5f4..ce3d01c13 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -23,20 +24,31 @@ use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Tokenizer\Analyzer\ArgumentsAnalyzer; -use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * target?: '3.0'|'3.5'|'5.0'|'5.6'|'newest', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * target: '3.0'|'3.5'|'5.0'|'5.6'|'newest', + * } */ final class PhpUnitDedicateAssertFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var array|true> + * @var array */ - private static array $fixMap = [ + private const FIX_MAP = [ 'array_key_exists' => [ 'positive' => 'assertArrayHasKey', 'negative' => 'assertArrayNotHasKey', @@ -109,14 +121,65 @@ final class PhpUnitDedicateAssertFixer extends AbstractPhpUnitFixer implements C ]; /** - * @var string[] + * @var list */ private array $functions = []; - public function configure(array $configuration): void + public function isRisky(): bool { - parent::configure($configuration); + return true; + } + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'PHPUnit assertions like `assertInternalType`, `assertFileExists`, should be used over `assertTrue`.', + [ + new CodeSample( + 'assertTrue(is_float( $a), "my message"); + $this->assertTrue(is_nan($a)); + } +} +' + ), + new CodeSample( + 'assertTrue(is_dir($a)); + $this->assertTrue(is_writable($a)); + $this->assertTrue(is_readable($a)); + } +} +', + ['target' => PhpUnitTargetVersion::VERSION_5_6] + ), + ], + null, + 'Fixer could be risky if one is overriding PHPUnit\'s native methods.' + ); + } + + /** + * {@inheritdoc} + * + * Must run before NoUnusedImportsFixer, PhpUnitAssertNewNamesFixer, PhpUnitDedicateAssertInternalTypeFixer. + * Must run after ModernizeStrposFixer, NoAliasFunctionsFixer, PhpUnitConstructFixer. + */ + public function getPriority(): int + { + return -9; + } + + protected function configurePostNormalisation(): void + { // assertions added in 3.0: assertArrayNotHasKey assertArrayHasKey assertFileNotExists assertFileExists assertNotNull, assertNull $this->functions = [ 'array_key_exists', @@ -171,80 +234,24 @@ public function configure(array $configuration): void } } - public function isRisky(): bool - { - return true; - } - - public function getDefinition(): FixerDefinitionInterface - { - return new FixerDefinition( - 'PHPUnit assertions like `assertInternalType`, `assertFileExists`, should be used over `assertTrue`.', - [ - new CodeSample( - 'assertTrue(is_float( $a), "my message"); - $this->assertTrue(is_nan($a)); - } -} -' - ), - new CodeSample( - 'assertTrue(is_dir($a)); - $this->assertTrue(is_writable($a)); - $this->assertTrue(is_readable($a)); - } -} -', - ['target' => PhpUnitTargetVersion::VERSION_5_6] - ), - ], - null, - 'Fixer could be risky if one is overriding PHPUnit\'s native methods.' - ); - } - - /** - * {@inheritdoc} - * - * Must run before NoUnusedImportsFixer, PhpUnitDedicateAssertInternalTypeFixer. - * Must run after ModernizeStrposFixer, NoAliasFunctionsFixer, PhpUnitConstructFixer. - */ - public function getPriority(): int - { - return -9; - } - protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void { $argumentsAnalyzer = new ArgumentsAnalyzer(); foreach ($this->getPreviousAssertCall($tokens, $startIndex, $endIndex) as $assertCall) { // test and fix for assertTrue/False to dedicated asserts - if ('asserttrue' === $assertCall['loweredName'] || 'assertfalse' === $assertCall['loweredName']) { + if (\in_array($assertCall['loweredName'], ['asserttrue', 'assertfalse'], true)) { $this->fixAssertTrueFalse($tokens, $argumentsAnalyzer, $assertCall); continue; } - if ( - 'assertsame' === $assertCall['loweredName'] - || 'assertnotsame' === $assertCall['loweredName'] - || 'assertequals' === $assertCall['loweredName'] - || 'assertnotequals' === $assertCall['loweredName'] - ) { + if (\in_array( + $assertCall['loweredName'], + ['assertsame', 'assertnotsame', 'assertequals', 'assertnotequals'], + true + )) { $this->fixAssertSameEquals($tokens, $assertCall); - - continue; } } } @@ -314,8 +321,9 @@ private function fixAssertTrueFalse(Tokens $tokens, ArgumentsAnalyzer $arguments $arguments = $argumentsAnalyzer->getArguments($tokens, $testOpenIndex, $testCloseIndex); $isPositive = 'asserttrue' === $assertCall['loweredName']; - if (\is_array(self::$fixMap[$content])) { - $expectedCount = self::$fixMap[$content]['argument_count'] ?? 1; + if (isset(self::FIX_MAP[$content]) && \is_array(self::FIX_MAP[$content])) { + $fixDetails = self::FIX_MAP[$content]; + $expectedCount = $fixDetails['argument_count'] ?? 1; if ($expectedCount !== \count($arguments)) { return; @@ -323,14 +331,14 @@ private function fixAssertTrueFalse(Tokens $tokens, ArgumentsAnalyzer $arguments $isPositive = $isPositive ? 'positive' : 'negative'; - if (false === self::$fixMap[$content][$isPositive]) { + if (false === $fixDetails[$isPositive]) { return; } - $tokens[$assertCall['index']] = new Token([T_STRING, self::$fixMap[$content][$isPositive]]); + $tokens[$assertCall['index']] = new Token([T_STRING, $fixDetails[$isPositive]]); $this->removeFunctionCall($tokens, $testDefaultNamespaceTokenIndex, $testIndex, $testOpenIndex, $testCloseIndex); - if (self::$fixMap[$content]['swap_arguments'] ?? false) { + if ($fixDetails['swap_arguments'] ?? false) { if (2 !== $expectedCount) { throw new \RuntimeException('Can only swap two arguments, please update map or logic.'); } @@ -484,7 +492,7 @@ private function fixAssertSameEquals(Tokens $tokens, array $assertCall): void $lowerContent = strtolower($tokens[$countCallIndex]->getContent()); - if ('count' !== $lowerContent && 'sizeof' !== $lowerContent) { + if (!\in_array($lowerContent, ['count', 'sizeof'], true)) { return; // not a call to "count" or "sizeOf" } @@ -516,52 +524,6 @@ private function fixAssertSameEquals(Tokens $tokens, array $assertCall): void ]); } - /** - * @return iterable - */ - private function getPreviousAssertCall(Tokens $tokens, int $startIndex, int $endIndex): iterable - { - $functionsAnalyzer = new FunctionsAnalyzer(); - - for ($index = $endIndex; $index > $startIndex; --$index) { - $index = $tokens->getPrevTokenOfKind($index, [[T_STRING]]); - - if (null === $index) { - return; - } - - // test if "assert" something call - $loweredContent = strtolower($tokens[$index]->getContent()); - - if (!str_starts_with($loweredContent, 'assert')) { - continue; - } - - // test candidate for simple calls like: ([\]+'some fixable call'(...)) - $openBraceIndex = $tokens->getNextMeaningfulToken($index); - - if (!$tokens[$openBraceIndex]->equals('(')) { - continue; - } - - if (!$functionsAnalyzer->isTheSameClassCall($tokens, $index)) { - continue; - } - - yield [ - 'index' => $index, - 'loweredName' => $loweredContent, - 'openBraceIndex' => $openBraceIndex, - 'closeBraceIndex' => $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openBraceIndex), - ]; - } - } - private function removeFunctionCall(Tokens $tokens, ?int $callNSIndex, int $callIndex, int $openIndex, int $closeIndex): void { $tokens->clearTokenAndMergeSurroundingWhitespace($callIndex); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php index b6e955ea4..892b730b2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitDedicateAssertInternalTypeFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,9 +29,21 @@ /** * @author Filippo Tessarotto + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * target?: '7.5'|'newest', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * target: '7.5'|'newest', + * } */ final class PhpUnitDedicateAssertInternalTypeFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php index ca8464d28..119ce2879 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitExpectationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -30,32 +31,26 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * target?: '5.2'|'5.6'|'8.4'|'newest', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * target: '5.2'|'5.6'|'8.4'|'newest', + * } */ final class PhpUnitExpectationFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array */ private array $methodMap = []; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->methodMap = [ - 'setExpectedException' => 'expectExceptionMessage', - ]; - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_6)) { - $this->methodMap['setExpectedExceptionRegExp'] = 'expectExceptionMessageRegExp'; - } - - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_8_4)) { - $this->methodMap['setExpectedExceptionRegExp'] = 'expectExceptionMessageMatches'; - $this->methodMap['expectExceptionMessageRegExp'] = 'expectExceptionMessageMatches'; - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -157,6 +152,22 @@ public function isRisky(): bool return true; } + protected function configurePostNormalisation(): void + { + $this->methodMap = [ + 'setExpectedException' => 'expectExceptionMessage', + ]; + + if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_6)) { + $this->methodMap['setExpectedExceptionRegExp'] = 'expectExceptionMessageRegExp'; + } + + if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_8_4)) { + $this->methodMap['setExpectedExceptionRegExp'] = 'expectExceptionMessageMatches'; + $this->methodMap['expectExceptionMessageRegExp'] = 'expectExceptionMessageMatches'; + } + } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ @@ -219,6 +230,10 @@ private function applyPhpUnitClassFixWithObjectOperator(Tokens $tokens, int $sta $argStart = array_keys($arguments)[$cnt]; $argBefore = $tokens->getPrevMeaningfulToken($argStart); + if (!isset($argumentsReplacements[$cnt])) { + throw new \LogicException(\sprintf('Unexpected index %d to find replacement method.', $cnt)); + } + if ('expectExceptionMessage' === $argumentsReplacements[$cnt]) { $paramIndicatorIndex = $tokens->getNextMeaningfulToken($argBefore); $afterParamIndicatorIndex = $tokens->getNextMeaningfulToken($paramIndicatorIndex); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php index 65ae1ada2..46bb9a7da 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitFqcnAnnotationFixer.php @@ -77,7 +77,7 @@ private function fixPhpUnitClass(Tokens $tokens, int $startIndex, int $endIndex) if ($tokens[$index]->isGivenKind(T_DOC_COMMENT)) { $tokens[$index] = new Token([T_DOC_COMMENT, Preg::replace( '~^(\s*\*\s*@(?:expectedException|covers|coversDefaultClass|uses)\h+)(?!(?:self|static)::)(\w.*)$~m', - '$1\\\\$2', + '$1\\\$2', $tokens[$index]->getContent() )]); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php index 6d89deb5a..ac1121ba9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitInternalClassFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; @@ -29,9 +30,21 @@ /** * @author Gert de Pagter + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * types?: list<'abstract'|'final'|'normal'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * types: list<'abstract'|'final'|'normal'>, + * } */ final class PhpUnitInternalClassFixer extends AbstractPhpUnitFixer implements WhitespacesAwareFixerInterface, ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -63,7 +76,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('types', 'What types of classes to mark as internal.')) ->setAllowedValues([new AllowedValueSubset($types)]) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault(['normal', 'final']) ->getOption(), ]); @@ -77,11 +90,12 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en return; } - $this->ensureIsDockBlockWithAnnotation( + $this->ensureIsDocBlockWithAnnotation( $tokens, $classIndex, 'internal', - ['internal'] + ['internal'], + [], ); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php index 04a3e5f73..195e4acb7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMethodCasingFixer.php @@ -18,12 +18,15 @@ use PhpCsFixer\DocBlock\Line; use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\FixerDefinition\VersionSpecification; +use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; use PhpCsFixer\Preg; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; @@ -32,9 +35,21 @@ /** * @author Filippo Tessarotto + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case?: 'camel_case'|'snake_case', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case: 'camel_case'|'snake_case', + * } */ final class PhpUnitMethodCasingFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -52,7 +67,7 @@ public function getDefinition(): FixerDefinitionInterface [ new CodeSample( ' self::SNAKE_CASE] ), + new VersionSpecificCodeSample( + ' self::SNAKE_CASE] + ), ] ); } @@ -149,6 +187,10 @@ private function isTestMethod(Tokens $tokens, int $index): bool return true; } + if (\defined('T_ATTRIBUTE') && $this->isTestAttributePresent($tokens, $index)) { + return true; + } + $docBlockIndex = $this->getDocBlockIndex($tokens, $index); return @@ -175,7 +217,7 @@ private function updateDocBlock(Tokens $tokens, int $docBlockIndex): void continue; } - $newLineContent = Preg::replaceCallback('/(@depends\s+)(.+)(\b)/', fn (array $matches): string => sprintf( + $newLineContent = Preg::replaceCallback('/(@depends\s+)(.+)(\b)/', fn (array $matches): string => \sprintf( '%s%s%s', $matches[1], $this->updateMethodCasing($matches[2]), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php index a3d3484c6..d69d53dc3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,13 +29,22 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * target?: '5.4'|'5.5'|'newest', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * target: '5.4'|'5.5'|'newest', + * } */ final class PhpUnitMockFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { - /** - * @var bool - */ - private $fixCreatePartialMock; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + private bool $fixCreatePartialMock; public function getDefinition(): FixerDefinitionInterface { @@ -79,10 +89,8 @@ public function isRisky(): bool return true; } - public function configure(array $configuration): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - $this->fixCreatePartialMock = PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_5_5); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php index e429a7ae8..3350b669b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitMockShortWillReturnFixer.php @@ -101,10 +101,6 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en $openingBraceIndex = $tokens->getNextMeaningfulToken($functionToRemoveIndex); - if (!$tokens[$openingBraceIndex]->equals('(')) { - continue; - } - if ($tokens[$tokens->getNextMeaningfulToken($openingBraceIndex)]->isGivenKind(CT::T_FIRST_CLASS_CALLABLE)) { continue; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php index 4221fe92d..eeb2576dc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNamespacedFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,13 +30,22 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * target?: '4.8'|'5.7'|'6.0'|'newest', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * target: '4.8'|'5.7'|'6.0'|'newest', + * } */ final class PhpUnitNamespacedFixer extends AbstractFixer implements ConfigurableFixerInterface { - /** - * @var string - */ - private $originalClassRegEx; + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + private string $originalClassRegEx; /** * Class Mappings. @@ -45,9 +55,9 @@ final class PhpUnitNamespacedFixer extends AbstractFixer implements Configurable * space class and need a dedicated translation table. This trans- * lation table is defined in @see configure. * - * @var array|string[] Class Mappings + * @var array Class Mappings */ - private $classMap; + private array $classMap; public function getDefinition(): FixerDefinitionInterface { @@ -85,10 +95,8 @@ public function isRisky(): bool return true; } - public function configure(array $configuration): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - if (PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_6_0)) { $this->originalClassRegEx = '/^PHPUnit_\w+$/i'; // @noinspection ClassConstantCanBeUsedInspection diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php index f6fa1f0fe..ad2c849f5 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitNoExpectationAnnotationFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -33,20 +34,24 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * target?: '3.2'|'4.3'|'newest', + * use_class_const?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * target: '3.2'|'4.3'|'newest', + * use_class_const: bool, + * } */ final class PhpUnitNoExpectationAnnotationFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { - /** - * @var bool - */ - private $fixMessageRegExp; - - public function configure(array $configuration): void - { - parent::configure($configuration); + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; - $this->fixMessageRegExp = PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_4_3); - } + private bool $fixMessageRegExp; public function getDefinition(): FixerDefinitionInterface { @@ -115,6 +120,11 @@ public function isRisky(): bool return true; } + protected function configurePostNormalisation(): void + { + $this->fixMessageRegExp = PhpUnitTargetVersion::fulfills($this->configuration['target'], PhpUnitTargetVersion::VERSION_4_3); + } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php index 3fbd98ce4..85cd27c9f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSetUpTearDownVisibilityFixer.php @@ -51,8 +51,8 @@ public function tearDown() ), ], null, - 'This fixer may change functions named `setUp()` or `tearDown()` outside of PHPUnit tests, '. - 'when a class is wrongly seen as a PHPUnit test.' + 'This fixer may change functions named `setUp()` or `tearDown()` outside of PHPUnit tests, ' + .'when a class is wrongly seen as a PHPUnit test.' ); } @@ -66,43 +66,46 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en $counter = 0; $tokensAnalyzer = new TokensAnalyzer($tokens); - for ($i = $endIndex - 1; $i > $startIndex; --$i) { + $slicesToInsert = []; + + for ($index = $startIndex + 1; $index < $endIndex; ++$index) { if (2 === $counter) { - break; // we've seen both method we are interested in, so stop analyzing this class + break; // we've seen both methods we are interested in, so stop analyzing this class + } + + if ($tokens[$index]->equals('{')) { + $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); + + continue; } - if (!$this->isSetupOrTearDownMethod($tokens, $i)) { + if (!$tokens[$index]->isGivenKind(T_FUNCTION)) { + continue; + } + + $functionNameIndex = $tokens->getNextMeaningfulToken($index); + $functionName = strtolower($tokens[$functionNameIndex]->getContent()); + + if ('setup' !== $functionName && 'teardown' !== $functionName) { continue; } ++$counter; - $visibility = $tokensAnalyzer->getMethodAttributes($i)['visibility']; + + $visibility = $tokensAnalyzer->getMethodAttributes($index)['visibility']; if (T_PUBLIC === $visibility) { - $index = $tokens->getPrevTokenOfKind($i, [[T_PUBLIC]]); - $tokens[$index] = new Token([T_PROTECTED, 'protected']); + $visibilityIndex = $tokens->getPrevTokenOfKind($index, [[T_PUBLIC]]); + $tokens[$visibilityIndex] = new Token([T_PROTECTED, 'protected']); continue; } if (null === $visibility) { - $tokens->insertAt($i, [new Token([T_PROTECTED, 'protected']), new Token([T_WHITESPACE, ' '])]); + $slicesToInsert[$index] = [new Token([T_PROTECTED, 'protected']), new Token([T_WHITESPACE, ' '])]; } } - } - - private function isSetupOrTearDownMethod(Tokens $tokens, int $index): bool - { - $tokensAnalyzer = new TokensAnalyzer($tokens); - - $isMethod = $tokens[$index]->isGivenKind(T_FUNCTION) && !$tokensAnalyzer->isLambda($index); - if (!$isMethod) { - return false; - } - - $functionNameIndex = $tokens->getNextMeaningfulToken($index); - $functionName = strtolower($tokens[$functionNameIndex]->getContent()); - return 'setup' === $functionName || 'teardown' === $functionName; + $tokens->insertSlices($slicesToInsert); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php index 0696cdfd9..32cc5d7d7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitSizeClassFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -27,9 +28,21 @@ /** * @author Jefersson Nathan + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * group?: 'large'|'medium'|'small', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * group: 'large'|'medium'|'small', + * } */ final class PhpUnitSizeClassFixer extends AbstractPhpUnitFixer implements WhitespacesAwareFixerInterface, ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const SIZES = ['small', 'medium', 'large']; public function getDefinition(): FixerDefinitionInterface @@ -47,11 +60,11 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run before PhpdocSeparationFixer. + * Must run before PhpUnitAttributesFixer, PhpdocSeparationFixer. */ public function getPriority(): int { - return 0; + return 9; } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface @@ -72,11 +85,16 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en return; } - $this->ensureIsDockBlockWithAnnotation( + $this->ensureIsDocBlockWithAnnotation( $tokens, $classIndex, $this->configuration['group'], - self::SIZES + self::SIZES, + [ + 'phpunit\framework\attributes\small', + 'phpunit\framework\attributes\medium', + 'phpunit\framework\attributes\large', + ], ); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php index 4d5325661..d4b6be19e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitStrictFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -30,13 +31,25 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * assertions?: list<'assertAttributeEquals'|'assertAttributeNotEquals'|'assertEquals'|'assertNotEquals'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * assertions: list<'assertAttributeEquals'|'assertAttributeNotEquals'|'assertEquals'|'assertNotEquals'>, + * } */ final class PhpUnitStrictFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var array + * @var array */ - private static array $assertionMap = [ + private const ASSERTION_MAP = [ 'assertAttributeEquals' => 'assertAttributeSame', 'assertAttributeNotEquals' => 'assertAttributeNotSame', 'assertEquals' => 'assertSame', @@ -94,7 +107,7 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en $functionsAnalyzer = new FunctionsAnalyzer(); foreach ($this->configuration['assertions'] as $methodBefore) { - $methodAfter = self::$assertionMap[$methodBefore]; + $methodAfter = self::ASSERTION_MAP[$methodBefore]; for ($index = $startIndex; $index < $endIndex; ++$index) { $methodIndex = $tokens->getNextTokenOfKind($index, [[T_STRING, $methodBefore]]); @@ -127,8 +140,8 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('assertions', 'List of assertion methods to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$assertionMap))]) + ->setAllowedTypes(['string[]']) + ->setAllowedValues([new AllowedValueSubset(array_keys(self::ASSERTION_MAP))]) ->setDefault([ 'assertAttributeEquals', 'assertAttributeNotEquals', diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php index 4bd1800a6..8ecc1c2db 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTargetVersion.php @@ -37,6 +37,7 @@ final class PhpUnitTargetVersion public const VERSION_6_0 = '6.0'; public const VERSION_7_5 = '7.5'; public const VERSION_8_4 = '8.4'; + public const VERSION_9_1 = '9.1'; public const VERSION_NEWEST = 'newest'; private function __construct() {} @@ -44,7 +45,7 @@ private function __construct() {} public static function fulfills(string $candidate, string $target): bool { if (self::VERSION_NEWEST === $target) { - throw new \LogicException(sprintf('Parameter `target` shall not be provided as "%s", determine proper target for tested PHPUnit feature instead.', self::VERSION_NEWEST)); + throw new \LogicException(\sprintf('Parameter `target` shall not be provided as "%s", determine proper target for tested PHPUnit feature instead.', self::VERSION_NEWEST)); } if (self::VERSION_NEWEST === $candidate) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php index abee1f2ee..35b9795c5 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestAnnotationFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\Line; use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -33,9 +34,21 @@ /** * @author Gert de Pagter + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * style?: 'annotation'|'prefix', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * style: 'annotation'|'prefix', + * } */ final class PhpUnitTestAnnotationFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function isRisky(): bool { return true; @@ -47,20 +60,20 @@ public function getDefinition(): FixerDefinitionInterface 'Adds or removes @test annotations from tests, following configuration.', [ new CodeSample('whitespacesConfig->getLineEnding()), new CodeSample('whitespacesConfig->getLineEnding(), ['style' => 'annotation']), ], null, - 'This fixer may change the name of your tests, and could cause incompatibility with'. - ' abstract classes or interfaces.' + 'This fixer may change the name of your tests, and could cause incompatibility with' + .' abstract classes or interfaces.' ); } @@ -225,7 +238,7 @@ private function createDocBlock(Tokens $tokens, int $docBlockIndex): void } /** - * @return Line[] + * @return list */ private function updateDocBlock(Tokens $tokens, int $docBlockIndex): array { @@ -236,9 +249,9 @@ private function updateDocBlock(Tokens $tokens, int $docBlockIndex): array } /** - * @param Line[] $lines + * @param list $lines * - * @return Line[] + * @return list */ private function updateLines(array $lines, Tokens $tokens, int $docBlockIndex): array { @@ -278,9 +291,9 @@ private function updateLines(array $lines, Tokens $tokens, int $docBlockIndex): /** * Take a one line doc block, and turn it into a multi line doc block. * - * @param Line[] $lines + * @param non-empty-list $lines * - * @return Line[] + * @return list */ private function splitUpDocBlock(array $lines, Tokens $tokens, int $docBlockIndex): array { @@ -298,7 +311,7 @@ private function splitUpDocBlock(array $lines, Tokens $tokens, int $docBlockInde /** * @todo check whether it's doable to use \PhpCsFixer\DocBlock\DocBlock::getSingleLineDocBlockEntry instead * - * @param Line[] $lines + * @param non-empty-list $lines */ private function getSingleLineDocBlockEntry(array $lines): string { @@ -377,9 +390,9 @@ private function findWhereDependsFunctionNameStarts(array $line): int } /** - * @param Line[] $lines + * @param list $lines * - * @return Line[] + * @return list */ private function addTestAnnotation(array $lines, Tokens $tokens, int $docBlockIndex): array { @@ -389,7 +402,8 @@ private function addTestAnnotation(array $lines, Tokens $tokens, int $docBlockIn $originalIndent = WhitespacesAnalyzer::detectIndent($tokens, $docBlockIndex); $lineEnd = $this->whitespacesConfig->getLineEnding(); - array_splice($lines, -1, 0, $originalIndent.' *'.$lineEnd.$originalIndent.' * @test'.$lineEnd); + array_splice($lines, -1, 0, [new Line($originalIndent.' *'.$lineEnd.$originalIndent.' * @test'.$lineEnd)]); + \assert(array_is_list($lines)); // we know it's list, but we need to tell PHPStan } return $lines; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php index 692389c85..20ecebc83 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestCaseStaticMethodCallsFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\Fixer\AbstractPhpUnitFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -32,9 +33,23 @@ /** * @author Filippo Tessarotto + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * call_type?: 'self'|'static'|'this', + * methods?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * call_type: 'self'|'static'|'this', + * methods: array, + * } */ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -51,13 +66,17 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i public const CALL_TYPE_STATIC = 'static'; /** - * @var array + * @var array */ - private array $staticMethods = [ + private const STATIC_METHODS = [ // Assert methods 'anything' => true, 'arrayHasKey' => true, 'assertArrayHasKey' => true, + 'assertArrayIsEqualToArrayIgnoringListOfKeys' => true, + 'assertArrayIsEqualToArrayOnlyConsideringListOfKeys' => true, + 'assertArrayIsIdenticalToArrayIgnoringListOfKeys' => true, + 'assertArrayIsIdenticalToArrayOnlyConsideringListOfKeys' => true, 'assertArrayNotHasKey' => true, 'assertArraySubset' => true, 'assertAttributeContains' => true, @@ -86,8 +105,35 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'assertClassNotHasStaticAttribute' => true, 'assertContains' => true, 'assertContainsEquals' => true, + 'assertContainsNotOnlyArray' => true, + 'assertContainsNotOnlyBool' => true, + 'assertContainsNotOnlyCallable' => true, + 'assertContainsNotOnlyClosedResource' => true, + 'assertContainsNotOnlyFloat' => true, + 'assertContainsNotOnlyInstancesOf' => true, + 'assertContainsNotOnlyInt' => true, + 'assertContainsNotOnlyIterable' => true, + 'assertContainsNotOnlyNull' => true, + 'assertContainsNotOnlyNumeric' => true, + 'assertContainsNotOnlyObject' => true, + 'assertContainsNotOnlyResource' => true, + 'assertContainsNotOnlyScalar' => true, + 'assertContainsNotOnlyString' => true, 'assertContainsOnly' => true, + 'assertContainsOnlyArray' => true, + 'assertContainsOnlyBool' => true, + 'assertContainsOnlyCallable' => true, + 'assertContainsOnlyClosedResource' => true, + 'assertContainsOnlyFloat' => true, 'assertContainsOnlyInstancesOf' => true, + 'assertContainsOnlyInt' => true, + 'assertContainsOnlyIterable' => true, + 'assertContainsOnlyNull' => true, + 'assertContainsOnlyNumeric' => true, + 'assertContainsOnlyObject' => true, + 'assertContainsOnlyResource' => true, + 'assertContainsOnlyScalar' => true, + 'assertContainsOnlyString' => true, 'assertCount' => true, 'assertDirectoryDoesNotExist' => true, 'assertDirectoryExists' => true, @@ -100,11 +146,11 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'assertDirectoryNotIsWritable' => true, 'assertDoesNotMatchRegularExpression' => true, 'assertEmpty' => true, - 'assertEqualXMLStructure' => true, 'assertEquals' => true, 'assertEqualsCanonicalizing' => true, 'assertEqualsIgnoringCase' => true, 'assertEqualsWithDelta' => true, + 'assertEqualXMLStructure' => true, 'assertFalse' => true, 'assertFileDoesNotExist' => true, 'assertFileEquals' => true, @@ -115,6 +161,8 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'assertFileIsNotWritable' => true, 'assertFileIsReadable' => true, 'assertFileIsWritable' => true, + 'assertFileMatchesFormat' => true, + 'assertFileMatchesFormatFile' => true, 'assertFileNotEquals' => true, 'assertFileNotEqualsCanonicalizing' => true, 'assertFileNotEqualsIgnoringCase' => true, @@ -134,6 +182,7 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'assertIsFloat' => true, 'assertIsInt' => true, 'assertIsIterable' => true, + 'assertIsList' => true, 'assertIsNotArray' => true, 'assertIsNotBool' => true, 'assertIsNotCallable' => true, @@ -189,6 +238,7 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'assertObjectEquals' => true, 'assertObjectHasAttribute' => true, 'assertObjectHasProperty' => true, + 'assertObjectNotEquals' => true, 'assertObjectNotHasAttribute' => true, 'assertObjectNotHasProperty' => true, 'assertRegExp' => true, @@ -196,11 +246,13 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'assertSameSize' => true, 'assertStringContainsString' => true, 'assertStringContainsStringIgnoringCase' => true, + 'assertStringContainsStringIgnoringLineEndings' => true, 'assertStringEndsNotWith' => true, 'assertStringEndsWith' => true, 'assertStringEqualsFile' => true, 'assertStringEqualsFileCanonicalizing' => true, 'assertStringEqualsFileIgnoringCase' => true, + 'assertStringEqualsStringIgnoringLineEndings' => true, 'assertStringMatchesFormat' => true, 'assertStringMatchesFormatFile' => true, 'assertStringNotContainsString' => true, @@ -229,7 +281,20 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'containsEqual' => true, 'containsIdentical' => true, 'containsOnly' => true, + 'containsOnlyArray' => true, + 'containsOnlyBool' => true, + 'containsOnlyCallable' => true, + 'containsOnlyClosedResource' => true, + 'containsOnlyFloat' => true, 'containsOnlyInstancesOf' => true, + 'containsOnlyInt' => true, + 'containsOnlyIterable' => true, + 'containsOnlyNull' => true, + 'containsOnlyNumeric' => true, + 'containsOnlyObject' => true, + 'containsOnlyResource' => true, + 'containsOnlyScalar' => true, + 'containsOnlyString' => true, 'countOf' => true, 'directoryExists' => true, 'equalTo' => true, @@ -244,15 +309,28 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'greaterThan' => true, 'greaterThanOrEqual' => true, 'identicalTo' => true, + 'isArray' => true, + 'isBool' => true, + 'isCallable' => true, + 'isClosedResource' => true, 'isEmpty' => true, 'isFalse' => true, 'isFinite' => true, + 'isFloat' => true, 'isInfinite' => true, 'isInstanceOf' => true, + 'isInt' => true, + 'isIterable' => true, 'isJson' => true, + 'isList' => true, 'isNan' => true, 'isNull' => true, + 'isNumeric' => true, + 'isObject' => true, 'isReadable' => true, + 'isResource' => true, + 'isScalar' => true, + 'isString' => true, 'isTrue' => true, 'isType' => true, 'isWritable' => true, @@ -272,6 +350,7 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'resetCount' => true, 'stringContains' => true, 'stringEndsWith' => true, + 'stringEqualsStringIgnoringLineEndings' => true, 'stringStartsWith' => true, // TestCase methods @@ -280,6 +359,9 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i 'atLeast' => true, 'atLeastOnce' => true, 'atMost' => true, + 'createStub' => true, + 'createConfiguredStub' => true, + 'createStubForIntersectionOfInterfaces' => true, 'exactly' => true, 'never' => true, 'once' => true, @@ -295,16 +377,16 @@ final class PhpUnitTestCaseStaticMethodCallsFixer extends AbstractPhpUnitFixer i ]; /** - * @var array + * @var array */ - private array $allowedValues = [ + private const ALLOWED_VALUES = [ self::CALL_TYPE_THIS => true, self::CALL_TYPE_SELF => true, self::CALL_TYPE_STATIC => true, ]; /** - * @var array>> + * @var array> */ private array $conversionMap = [ self::CALL_TYPE_THIS => [[T_OBJECT_OPERATOR, '->'], [T_VARIABLE, '$this']], @@ -322,6 +404,7 @@ public function testMe() $this->assertSame(1, 2); self::assertSame(1, 2); static::assertSame(1, 2); + static::assertTrue(false); } } '; @@ -331,6 +414,7 @@ public function testMe() [ new CodeSample($codeSample), new CodeSample($codeSample, ['call_type' => self::CALL_TYPE_THIS]), + new CodeSample($codeSample, ['methods' => ['assertTrue' => self::CALL_TYPE_THIS]]), ], null, 'Risky when PHPUnit methods are overridden or not accessible, or when project has PHPUnit incompatibilities.' @@ -354,34 +438,32 @@ public function isRisky(): bool protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { - $thisFixer = $this; - return new FixerConfigurationResolver([ (new FixerOptionBuilder('call_type', 'The call type to use for referring to PHPUnit methods.')) ->setAllowedTypes(['string']) - ->setAllowedValues(array_keys($this->allowedValues)) - ->setDefault('static') + ->setAllowedValues(array_keys(self::ALLOWED_VALUES)) + ->setDefault(self::CALL_TYPE_STATIC) ->getOption(), (new FixerOptionBuilder('methods', 'Dictionary of `method` => `call_type` values that differ from the default strategy.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([static function (array $option) use ($thisFixer): bool { + ->setAllowedTypes(['array']) + ->setAllowedValues([static function (array $option): bool { foreach ($option as $method => $value) { - if (!isset($thisFixer->staticMethods[$method])) { + if (!isset(self::STATIC_METHODS[$method])) { throw new InvalidOptionsException( - sprintf( + \sprintf( 'Unexpected "methods" key, expected any of %s, got "%s".', - Utils::naturalLanguageJoin(array_keys($thisFixer->staticMethods)), + Utils::naturalLanguageJoin(array_keys(self::STATIC_METHODS)), \gettype($method).'#'.$method ) ); } - if (!isset($thisFixer->allowedValues[$value])) { + if (!isset(self::ALLOWED_VALUES[$value])) { throw new InvalidOptionsException( - sprintf( + \sprintf( 'Unexpected value for method "%s", expected any of %s, got "%s".', $method, - Utils::naturalLanguageJoin(array_keys($thisFixer->allowedValues)), + Utils::naturalLanguageJoin(array_keys(self::ALLOWED_VALUES)), \is_object($value) ? \get_class($value) : (null === $value ? 'null' : \gettype($value).'#'.$value) ) ); @@ -418,7 +500,7 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en } // do not change `self` to `this` in static methods - if ('this' === $callType) { + if (self::CALL_TYPE_THIS === $callType) { $attributes = $analyzer->getMethodAttributes($index); if (false !== $attributes['static']) { @@ -429,7 +511,7 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en } } - if (!$tokens[$index]->isGivenKind(T_STRING) || !isset($this->staticMethods[$tokens[$index]->getContent()])) { + if (!$tokens[$index]->isGivenKind(T_STRING) || !isset(self::STATIC_METHODS[$tokens[$index]->getContent()])) { continue; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php index a8373290e..580bd2580 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/PhpUnit/PhpUnitTestClassRequiresCoversFixer.php @@ -50,11 +50,11 @@ public function testSomeTest() /** * {@inheritdoc} * - * Must run before PhpdocSeparationFixer. + * Must run before PhpUnitAttributesFixer, PhpdocSeparationFixer. */ public function getPriority(): int { - return 0; + return 9; } protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $endIndex): void @@ -68,7 +68,7 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en return; // don't add `@covers` annotation for abstract base classes } - $this->ensureIsDockBlockWithAnnotation( + $this->ensureIsDocBlockWithAnnotation( $tokens, $classIndex, 'coversNothing', @@ -76,7 +76,13 @@ protected function applyPhpUnitClassFix(Tokens $tokens, int $startIndex, int $en 'covers', 'coversDefaultClass', 'coversNothing', - ] + ], + [ + 'phpunit\framework\attributes\coversclass', + 'phpunit\framework\attributes\coversnothing', + 'phpunit\framework\attributes\coversmethod', + 'phpunit\framework\attributes\coversfunction', + ], ); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php index 130b1349d..5eefcb958 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/AlignMultilineCommentFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -30,23 +31,25 @@ /** * @author Filippo Tessarotto * @author Julien Falque + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * comment_type?: 'all_multiline'|'phpdocs_like'|'phpdocs_only', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * comment_type: 'all_multiline'|'phpdocs_like'|'phpdocs_only', + * } */ final class AlignMultilineCommentFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var null|int[] + * @var null|list */ - private $tokenKinds; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->tokenKinds = [T_DOC_COMMENT]; - if ('phpdocs_only' !== $this->configuration['comment_type']) { - $this->tokenKinds[] = T_COMMENT; - } - } + private ?array $tokenKinds = null; public function getDefinition(): FixerDefinitionInterface { @@ -87,7 +90,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run before CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. + * Must run before CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. * Must run after ArrayIndentationFixer. */ public function getPriority(): int @@ -100,6 +103,14 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isAnyTokenKindsFound($this->tokenKinds); } + protected function configurePostNormalisation(): void + { + $this->tokenKinds = [T_DOC_COMMENT]; + if ('phpdocs_only' !== $this->configuration['comment_type']) { + $this->tokenKinds[] = T_COMMENT; + } + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $lineEnding = $this->whitespacesConfig->getLineEnding(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php index b2282e863..4506e6f5e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocAnnotationRemoveFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\Annotation; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,13 +31,27 @@ /** * @author Graham Campbell * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * annotations?: list, + * case_sensitive?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * annotations: list, + * case_sensitive: bool, + * } */ final class GeneralPhpdocAnnotationRemoveFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Configured annotations should be omitted from PHPDoc.', + 'Removes configured annotations from PHPDoc.', [ new CodeSample( 'setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault([]) ->getOption(), (new FixerOptionBuilder('case_sensitive', 'Should annotations be case sensitive.')) diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php index 030aa338e..e1b26b49f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/GeneralPhpdocTagRenameFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,8 +29,27 @@ use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; use Symfony\Component\OptionsResolver\Options; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case_sensitive?: bool, + * fix_annotation?: bool, + * fix_inline?: bool, + * replacements?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case_sensitive: bool, + * fix_annotation: bool, + * fix_inline: bool, + * replacements: array, + * } + */ final class GeneralPhpdocTagRenameFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -91,8 +111,8 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setDefault(true) ->getOption(), (new FixerOptionBuilder('replacements', 'A map of tags to replace.')) - ->setAllowedTypes(['array']) - ->setNormalizer(static function (Options $options, $value): array { + ->setAllowedTypes(['array']) + ->setNormalizer(static function (Options $options, array $value): array { $normalizedValue = []; foreach ($value as $from => $to) { @@ -100,15 +120,8 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn throw new InvalidOptionsException('Tag to replace must be a string.'); } - if (!\is_string($to)) { - throw new InvalidOptionsException(sprintf( - 'Tag to replace to from "%s" must be a string.', - $from - )); - } - if (!Preg::match('#^\S+$#', $to) || str_contains($to, '*/')) { - throw new InvalidOptionsException(sprintf( + throw new InvalidOptionsException(\sprintf( 'Tag "%s" cannot be replaced by invalid tag "%s".', $from, $to @@ -118,11 +131,11 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn $from = trim($from); $to = trim($to); - if (!$options['case_sensitive']) { + if (false === $options['case_sensitive']) { $lowercaseFrom = strtolower($from); if (isset($normalizedValue[$lowercaseFrom]) && $normalizedValue[$lowercaseFrom] !== $to) { - throw new InvalidOptionsException(sprintf( + throw new InvalidOptionsException(\sprintf( 'Tag "%s" cannot be configured to be replaced with several different tags when case sensitivity is off.', $from )); @@ -136,7 +149,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn foreach ($normalizedValue as $from => $to) { if (isset($normalizedValue[$to]) && $normalizedValue[$to] !== $to) { - throw new InvalidOptionsException(sprintf( + throw new InvalidOptionsException(\sprintf( 'Cannot change tag "%1$s" to tag "%2$s", as the tag "%2$s" is configured to be replaced to "%3$s".', $from, $to, @@ -163,16 +176,16 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } if (true === $this->configuration['fix_annotation']) { - $regex = $this->configuration['fix_inline'] - ? '/"[^"]*"(*SKIP)(*FAIL)|\b(?<=@)(%s)\b/' - : '/"[^"]*"(*SKIP)(*FAIL)|(?configuration['fix_inline'] + ? '/(["\'])[^\1]*\1(*SKIP)(*FAIL)|\b(?<=@)(?P%s)\b/' + : '/(["\'])[^\1]*\1(*SKIP)(*FAIL)|(?%s)(?!\})/'; } else { - $regex = '/(?<={@)(%s)(?=[ \t}])/'; + $regex = '/(?<={@)(?P%s)(?=[ \t}])/'; } $caseInsensitive = false === $this->configuration['case_sensitive']; $replacements = $this->configuration['replacements']; - $regex = sprintf($regex, implode('|', array_keys($replacements))); + $regex = \sprintf($regex, implode('|', array_keys($replacements))); if ($caseInsensitive) { $regex .= 'i'; @@ -186,11 +199,12 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $tokens[$index] = new Token([T_DOC_COMMENT, Preg::replaceCallback( $regex, static function (array $matches) use ($caseInsensitive, $replacements) { + \assert(isset($matches['tag'])); if ($caseInsensitive) { - $matches[1] = strtolower($matches[1]); + $matches['tag'] = strtolower($matches['tag']); } - return $replacements[$matches[1]]; + return $replacements[$matches['tag']]; }, $token->getContent() )]); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php index e24211395..5a745f13a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoEmptyPhpdocFixer.php @@ -19,6 +19,7 @@ use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; final class NoEmptyPhpdocFixer extends AbstractFixer @@ -34,8 +35,8 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer, PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, NoSuperfluousPhpdocTagsFixer, PhpUnitNoExpectationAnnotationFixer, PhpUnitTestAnnotationFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. + * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, PhpdocAlignFixer. + * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, NoSuperfluousPhpdocTagsFixer, PhpUnitAttributesFixer, PhpUnitNoExpectationAnnotationFixer, PhpUnitTestAnnotationFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. */ public function getPriority(): int { @@ -54,9 +55,30 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - if (Preg::match('#^/\*\*[\s\*]*\*/$#', $token->getContent())) { - $tokens->clearTokenAndMergeSurroundingWhitespace($index); + if (!Preg::match('#^/\*\*[\s\*]*\*/$#', $token->getContent())) { + continue; } + + if ( + $tokens[$index - 1]->isGivenKind([T_OPEN_TAG, T_WHITESPACE]) + && substr_count($tokens[$index - 1]->getContent(), "\n") > 0 + && $tokens[$index + 1]->isGivenKind(T_WHITESPACE) + && Preg::match('/^\R/', $tokens[$index + 1]->getContent()) + ) { + $tokens[$index - 1] = new Token([ + $tokens[$index - 1]->getId(), + Preg::replace('/\h*$/', '', $tokens[$index - 1]->getContent()), + ]); + + $newContent = Preg::replace('/^\R/', '', $tokens[$index + 1]->getContent()); + if ('' === $newContent) { + $tokens->clearAt($index + 1); + } else { + $tokens[$index + 1] = new Token([T_WHITESPACE, $newContent]); + } + } + + $tokens->clearTokenAndMergeSurroundingWhitespace($index); } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php index c8b628821..5f10d4adc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/NoSuperfluousPhpdocTagsFixer.php @@ -19,6 +19,7 @@ use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -34,8 +35,39 @@ use PhpCsFixer\Tokenizer\Tokens; use PhpCsFixer\Tokenizer\TokensAnalyzer; +/** + * @phpstan-type _TypeInfo array{ + * types: list, + * allows_null: bool, + * } + * @phpstan-type _DocumentElement array{ + * index: int, + * type: 'classy'|'function'|'property', + * modifiers: array, + * types: array, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * allow_hidden_params?: bool, + * allow_mixed?: bool, + * allow_unused_params?: bool, + * remove_inheritdoc?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * allow_hidden_params: bool, + * allow_mixed: bool, + * allow_unused_params: bool, + * remove_inheritdoc: bool, + * } + */ final class NoSuperfluousPhpdocTagsFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + /** @var _TypeInfo */ private const NO_TYPE_INFO = [ 'types' => [], 'allows_null' => true, @@ -46,7 +78,8 @@ public function getDefinition(): FixerDefinitionInterface return new FixerDefinition( 'Removes `@param`, `@return` and `@var` tags that don\'t provide any useful information.', [ - new CodeSample(' true]), - new CodeSample(' true], + ), + new CodeSample( + ' true]), - new CodeSample(' true], + ), + new CodeSample( + ' true]), +', + ['allow_hidden_params' => true], + ), + new CodeSample( + ' true], + ), ] ); } @@ -196,6 +254,10 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setAllowedTypes(['bool']) ->setDefault(false) ->getOption(), + (new FixerOptionBuilder('allow_hidden_params', 'Whether `param` annotation for hidden params in method signature are allowed.')) + ->setAllowedTypes(['bool']) + ->setDefault(false) // @TODO set to `true` on 4.0 + ->getOption(), (new FixerOptionBuilder('allow_unused_params', 'Whether `param` annotation without actual signature is allowed (`true`) or considered superfluous (`false`).')) ->setAllowedTypes(['bool']) ->setDefault(false) @@ -204,12 +266,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn } /** - * @return null|array{ - * index: int, - * type: 'classy'|'function'|'property', - * modifiers: array, - * types: array, - * } + * @return null|_DocumentElement */ private function findDocumentedElement(Tokens $tokens, int $docCommentIndex): ?array { @@ -262,7 +319,7 @@ private function findDocumentedElement(Tokens $tokens, int $docCommentIndex): ?a return $element; } - if ($tokens[$index]->isGivenKind(T_FUNCTION)) { + if ($tokens[$index]->isGivenKind([T_FUNCTION, T_FN])) { $element['index'] = $index; $element['type'] = 'function'; @@ -291,14 +348,9 @@ private function findDocumentedElement(Tokens $tokens, int $docCommentIndex): ?a } /** - * @param array{ - * index: int, - * type: 'function', - * modifiers: array, - * types: array, - * } $element - * @param null|non-empty-string $namespace - * @param array $shortNames + * @param _DocumentElement&array{type: 'function'} $element + * @param null|non-empty-string $namespace + * @param array $shortNames */ private function fixFunctionDocComment( string $content, @@ -353,14 +405,9 @@ private function fixFunctionDocComment( } /** - * @param array{ - * index: int, - * type: 'property', - * modifiers: array, - * types: array, - * } $element - * @param null|non-empty-string $namespace - * @param array $shortNames + * @param _DocumentElement&array{type: 'property'} $element + * @param null|non-empty-string $namespace + * @param array $shortNames */ private function fixPropertyDocComment( string $content, @@ -388,12 +435,7 @@ private function fixPropertyDocComment( } /** - * @param array{ - * index: int, - * type: 'classy', - * modifiers: array, - * types: array, - * } $element + * @param _DocumentElement&array{type: 'classy'} $element */ private function fixClassDocComment(string $content, array $element): string { @@ -405,7 +447,7 @@ private function fixClassDocComment(string $content, array $element): string } /** - * @return array, allows_null: bool}> + * @return array */ private function getArgumentsInfo(Tokens $tokens, int $start, int $end): array { @@ -418,7 +460,7 @@ private function getArgumentsInfo(Tokens $tokens, int $start, int $end): array continue; } - $beforeArgumentIndex = $tokens->getPrevTokenOfKind($index, ['(', ',']); + $beforeArgumentIndex = $tokens->getPrevTokenOfKind($index, ['(', ',', [CT::T_ATTRIBUTE_CLOSE]]); $typeIndex = $tokens->getNextMeaningfulToken($beforeArgumentIndex); if ($typeIndex !== $index) { @@ -440,11 +482,22 @@ private function getArgumentsInfo(Tokens $tokens, int $start, int $end): array $argumentsInfo[$token->getContent()] = $info; } + // virtualise "hidden params" as if they would be regular ones + if (true === $this->configuration['allow_hidden_params']) { + $paramsString = $tokens->generatePartialCode($start, $end); + Preg::matchAll('|/\*[^$]*(\$\w+)[^*]*\*/|', $paramsString, $matches); + + /** @var non-empty-string $match */ + foreach ($matches[1] as $match) { + $argumentsInfo[$match] = self::NO_TYPE_INFO; // HINT: one could try to extract actual type for hidden param, for now we only indicate it's existence + } + } + return $argumentsInfo; } /** - * @return array{types: list, allows_null: bool} + * @return _TypeInfo */ private function getReturnTypeInfo(Tokens $tokens, int $closingParenthesisIndex): array { @@ -458,7 +511,7 @@ private function getReturnTypeInfo(Tokens $tokens, int $closingParenthesisIndex) /** * @param int $index The index of the first token of the type hint * - * @return array{types: list, allows_null: bool} + * @return _TypeInfo */ private function parseTypeHint(Tokens $tokens, int $index): array { @@ -509,6 +562,7 @@ private function parseTypeHint(Tokens $tokens, int $index): array } /** + * @param _TypeInfo $info * @param null|non-empty-string $namespace * @param array $symbolShortNames */ @@ -520,11 +574,11 @@ private function annotationIsSuperfluous( array $symbolShortNames ): bool { if ('param' === $annotation->getTag()->getName()) { - $regex = '{@param(?:\s+'.TypeExpression::REGEX_TYPES.')?(?!\S)(?:\s+(?:\&\s*)?(?:\.{3}\s*)?\$\S+)?(?:\s+(?(?!\*+\/)\S+))?}s'; + $regex = '{\*\h*@param(?:\h+'.TypeExpression::REGEX_TYPES.')?(?!\S)(?:\h+(?:\&\h*)?(?:\.{3}\h*)?\$\S+)?(?:\s+(?(?!\*+\/)\S+))?}s'; } elseif ('var' === $annotation->getTag()->getName()) { - $regex = '{@var(?:\s+'.TypeExpression::REGEX_TYPES.')?(?!\S)(?:\s+\$\S+)?(?:\s+(?(?!\*\/)\S+))?}s'; + $regex = '{\*\h*@var(?:\h+'.TypeExpression::REGEX_TYPES.')?(?!\S)(?:\h+\$\S+)?(?:\s+(?(?!\*\/)\S+))?}s'; } else { - $regex = '{@return(?:\s+'.TypeExpression::REGEX_TYPES.')?(?!\S)(?:\s+(?(?!\*\/)\S+))?}s'; + $regex = '{\*\h*@return(?:\h+'.TypeExpression::REGEX_TYPES.')?(?!\S)(?:\s+(?(?!\*\/)\S+))?}s'; } if (!Preg::match($regex, $annotation->getContent(), $matches)) { @@ -566,7 +620,10 @@ private function annotationIsSuperfluous( // retry comparison with annotation type unioned with null // phpstan implies the null presence from the native type - return $actualTypes === $this->toComparableNames(array_merge($annotationTypes, ['null']), null, null, []); + $annotationTypes = array_merge($annotationTypes, ['null']); + sort($annotationTypes); + + return $actualTypes === $annotationTypes; } /** @@ -575,14 +632,21 @@ private function annotationIsSuperfluous( * Converts given types to lowercase, replaces imports aliases with * their matching FQCN, and finally sorts the result. * - * @param string[] $types The types to normalize + * @param list $types The types to normalize * @param null|non-empty-string $namespace * @param array $symbolShortNames The imports aliases * - * @return array The normalized types + * @return list The normalized types */ private function toComparableNames(array $types, ?string $namespace, ?string $currentSymbol, array $symbolShortNames): array { + if (isset($types[0][0]) && '?' === $types[0][0]) { + $types = [ + substr($types[0], 1), + 'null', + ]; + } + $normalized = array_map( function (string $type) use ($namespace, $currentSymbol, $symbolShortNames): string { if (str_contains($type, '&')) { @@ -672,6 +736,9 @@ private function removeSuperfluousInheritDoc(string $docComment): string ~ix', '$1$2', $docComment); } + /** + * @param _DocumentElement $element + */ private function removeSuperfluousModifierAnnotation(DocBlock $docBlock, array $element): void { foreach (['abstract' => T_ABSTRACT, 'final' => T_FINAL] as $annotationType => $modifierToken) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php index 908a4bc0b..963aa19f3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAddMissingParamAnnotationFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\DocBlock\Line; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -33,9 +34,21 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * only_untyped?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * only_untyped: bool, + * } */ final class PhpdocAddMissingParamAnnotationFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -106,7 +119,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $tokenContent = $token->getContent(); - if (false !== stripos($tokenContent, 'inheritdoc')) { + if (str_contains(strtolower($tokenContent), strtolower('inheritdoc'))) { continue; } @@ -180,13 +193,13 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $newLines = []; foreach ($arguments as $argument) { - $type = $argument['type'] ?: 'mixed'; + $type = '' !== $argument['type'] ? $argument['type'] : 'mixed'; if (!str_starts_with($type, '?') && 'null' === strtolower($argument['default'])) { $type = 'null|'.$type; } - $newLines[] = new Line(sprintf( + $newLines[] = new Line(\sprintf( '%s* @param %s %s%s', $indent, $type, diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php index fb18574e3..85e4e4d1f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAlignFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -28,6 +29,7 @@ use PhpCsFixer\Preg; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; /** * @author Fabien Potencier @@ -35,9 +37,26 @@ * @author Sebastiaan Stok * @author Graham Campbell * @author Dariusz Rumiński + * @author Jakub Kwaśniewski + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * align?: 'left'|'vertical', + * spacing?: array|int, + * tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * align: 'left'|'vertical', + * spacing: array|int, + * tags: list, + * } */ final class PhpdocAlignFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -86,49 +105,22 @@ final class PhpdocAlignFixer extends AbstractFixer implements ConfigurableFixerI 'psalm-method', ]; + private const DEFAULT_SPACING = 1; + + private const DEFAULT_SPACING_KEY = '_default'; + private string $regex; private string $regexCommentLine; + private string $align; + /** - * @var string + * same spacing for all or specific for different tags. + * + * @var array|int */ - private $align; - - public function configure(array $configuration): void - { - parent::configure($configuration); - - $tagsWithNameToAlign = array_intersect($this->configuration['tags'], self::TAGS_WITH_NAME); - $tagsWithMethodSignatureToAlign = array_intersect($this->configuration['tags'], self::TAGS_WITH_METHOD_SIGNATURE); - $tagsWithoutNameToAlign = array_diff($this->configuration['tags'], $tagsWithNameToAlign, $tagsWithMethodSignatureToAlign); - - $indentRegex = '^(?P(?:\ {2}|\t)*)\ ?'; - - $types = []; - - // e.g. @param <$var> - if ([] !== $tagsWithNameToAlign) { - $types[] = '(?P'.implode('|', $tagsWithNameToAlign).')\s+(?P(?:'.TypeExpression::REGEX_TYPES.')?)\s*(?P(?:&|\.{3})?\$\S+)'; - } - - // e.g. @return - if ([] !== $tagsWithoutNameToAlign) { - $types[] = '(?P'.implode('|', $tagsWithoutNameToAlign).')\s+(?P(?:'.TypeExpression::REGEX_TYPES.')?)'; - } - - // e.g. @method - if ([] !== $tagsWithMethodSignatureToAlign) { - $types[] = '(?P'.implode('|', $tagsWithMethodSignatureToAlign).')(\s+(?Pstatic))?(\s+(?P(?:'.TypeExpression::REGEX_TYPES.')?))\s+(?P.+\))'; - } - - // optional - $desc = '(?:\s+(?P\V*))'; - - $this->regex = '/'.$indentRegex.'\*\h*@(?J)(?:'.implode('|', $types).')'.$desc.'\h*\r?$/'; - $this->regexCommentLine = '/'.$indentRegex.'\*(?!\h?+@)(?:\s+(?P\V+))(?align = $this->configuration['align']; - } + private $spacing = 1; public function getDefinition(): FixerDefinitionInterface { @@ -140,16 +132,24 @@ public function getDefinition(): FixerDefinitionInterface * @param int $code an HTTP response status code * @param bool $debug * @param mixed &$reference a parameter passed by reference + * + * @return Foo description foo + * + * @throws Foo description foo + * description foo + * */ EOF; return new FixerDefinition( - 'All items of the given phpdoc tags must be either left-aligned or (by default) aligned vertically.', + 'All items of the given PHPDoc tags must be either left-aligned or (by default) aligned vertically.', [ new CodeSample($code), new CodeSample($code, ['align' => self::ALIGN_VERTICAL]), new CodeSample($code, ['align' => self::ALIGN_LEFT]), + new CodeSample($code, ['align' => self::ALIGN_LEFT, 'spacing' => 2]), + new CodeSample($code, ['align' => self::ALIGN_LEFT, 'spacing' => ['param' => 2]]), ], ); } @@ -157,7 +157,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. + * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. */ public function getPriority(): int { @@ -176,6 +176,40 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound(T_DOC_COMMENT); } + protected function configurePostNormalisation(): void + { + $tagsWithNameToAlign = array_intersect($this->configuration['tags'], self::TAGS_WITH_NAME); + $tagsWithMethodSignatureToAlign = array_intersect($this->configuration['tags'], self::TAGS_WITH_METHOD_SIGNATURE); + $tagsWithoutNameToAlign = array_diff($this->configuration['tags'], $tagsWithNameToAlign, $tagsWithMethodSignatureToAlign); + + $indentRegex = '^(?P(?:\ {2}|\t)*)\ ?'; + + $types = []; + + // e.g. @param <$var> + if ([] !== $tagsWithNameToAlign) { + $types[] = '(?P'.implode('|', $tagsWithNameToAlign).')\s+(?P(?:'.TypeExpression::REGEX_TYPES.')?)\s*(?P(?:&|\.{3})?\$\S+)'; + } + + // e.g. @return + if ([] !== $tagsWithoutNameToAlign) { + $types[] = '(?P'.implode('|', $tagsWithoutNameToAlign).')\s+(?P(?:'.TypeExpression::REGEX_TYPES.')?)'; + } + + // e.g. @method + if ([] !== $tagsWithMethodSignatureToAlign) { + $types[] = '(?P'.implode('|', $tagsWithMethodSignatureToAlign).')(\s+(?Pstatic))?(\s+(?P(?:'.TypeExpression::REGEX_TYPES.')?))\s+(?P.+\))'; + } + + // optional + $desc = '(?:\s+(?P\V*))'; + + $this->regex = '/'.$indentRegex.'\*\h*@(?J)(?:'.implode('|', $types).')'.$desc.'\h*\r?$/'; + $this->regexCommentLine = '/'.$indentRegex.'\*(?!\h?+@)(?:\s+(?P\V+))(?align = $this->configuration['align']; + $this->spacing = $this->configuration['spacing']; + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { foreach ($tokens as $index => $token) { @@ -195,12 +229,23 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { + $allowPositiveIntegers = static function ($value) { + $spacings = \is_array($value) ? $value : [$value]; + foreach ($spacings as $val) { + if (\is_int($val) && $val <= 0) { + throw new InvalidOptionsException('The option "spacing" is invalid. All spacings must be greater than zero.'); + } + } + + return true; + }; + $tags = new FixerOptionBuilder( 'tags', 'The tags that should be aligned. Allowed values are tags with name (`\''.implode('\', \'', self::TAGS_WITH_NAME).'\'`), tags with method signature (`\''.implode('\', \'', self::TAGS_WITH_METHOD_SIGNATURE).'\'`) and any custom tag with description (e.g. `@tag `).' ); $tags - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault(self::DEFAULT_TAGS) ; @@ -211,7 +256,16 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn ->setDefault(self::ALIGN_VERTICAL) ; - return new FixerConfigurationResolver([$tags->getOption(), $align->getOption()]); + $spacing = new FixerOptionBuilder( + 'spacing', + 'Spacing between tag, hint, comment, signature, etc. You can set same spacing for all tags using a positive integer or different spacings for different tags using an associative array of positive integers `[\'tagA\' => spacingForA, \'tagB\' => spacingForB]`. If you want to define default spacing to more than 1 space use `_default` key in config array, e.g.: `[\'tagA\' => spacingForA, \'tagB\' => spacingForB, \'_default\' => spacingForAllOthers]`.' + ); + $spacing->setAllowedTypes(['int', 'array']) + ->setAllowedValues([$allowPositiveIntegers]) + ->setDefault(self::DEFAULT_SPACING) + ; + + return new FixerConfigurationResolver([$tags->getOption(), $align->getOption(), $spacing->getOption()]); } private function fixDocBlock(DocBlock $docBlock): void @@ -252,13 +306,16 @@ private function fixDocBlock(DocBlock $docBlock): void continue; } - $hasStatic |= '' !== $item['static']; + $hasStatic = $hasStatic || '' !== $item['static']; $tagMax = max($tagMax, \strlen($item['tag'])); $hintMax = max($hintMax, \strlen($item['hint'])); $varMax = max($varMax, \strlen($item['var'])); } + $itemOpeningLine = null; + $currTag = null; + $spacingForTag = $this->spacingForTag($currTag); // update foreach ($items as $j => $item) { @@ -270,19 +327,19 @@ private function fixDocBlock(DocBlock $docBlock): void continue; } - $extraIndent = 2; + $extraIndent = 2 * $spacingForTag; - if (\in_array($currTag, self::TAGS_WITH_NAME, true) || \in_array($currTag, self::TAGS_WITH_METHOD_SIGNATURE, true)) { - $extraIndent += $varMax + 1; + if (\in_array($itemOpeningLine['tag'], self::TAGS_WITH_NAME, true) || \in_array($itemOpeningLine['tag'], self::TAGS_WITH_METHOD_SIGNATURE, true)) { + $extraIndent += $varMax + $spacingForTag; } if ($hasStatic) { $extraIndent += 7; // \strlen('static '); } - $line = - $item['indent'] - .' * ' + $line = $item['indent'] + .' * ' + .('' !== $itemOpeningLine['hint'] ? ' ' : '') .$this->getIndent( $tagMax + $hintMax + $extraIndent, $this->getLeftAlignedDescriptionIndent($items, $j) @@ -296,41 +353,41 @@ private function fixDocBlock(DocBlock $docBlock): void $currTag = $item['tag']; - $line = - $item['indent'] + $spacingForTag = $this->spacingForTag($currTag); + + $itemOpeningLine = $item; + + $line = $item['indent'] .' * @' .$item['tag']; if ($hasStatic) { - $line .= - $this->getIndent( - $tagMax - \strlen($item['tag']) + 1, - '' !== $item['static'] ? 1 : 0 - ) - .($item['static'] ?: $this->getIndent(6 /* \strlen('static') */, 0)); - $hintVerticalAlignIndent = 1; + $line .= $this->getIndent( + $tagMax - \strlen($item['tag']) + $spacingForTag, + '' !== $item['static'] ? $spacingForTag : 0 + ) + .('' !== $item['static'] ? $item['static'] : $this->getIndent(6 /* \strlen('static') */, 0)); + $hintVerticalAlignIndent = $spacingForTag; } else { - $hintVerticalAlignIndent = $tagMax - \strlen($item['tag']) + 1; + $hintVerticalAlignIndent = $tagMax - \strlen($item['tag']) + $spacingForTag; } - $line .= - $this->getIndent( - $hintVerticalAlignIndent, - '' !== $item['hint'] ? 1 : 0 - ) + $line .= $this->getIndent( + $hintVerticalAlignIndent, + '' !== $item['hint'] ? $spacingForTag : 0 + ) .$item['hint']; if ('' !== $item['var']) { - $line .= - $this->getIndent(($hintMax ?: -1) - \strlen($item['hint']) + 1) + $line .= $this->getIndent((0 !== $hintMax ? $hintMax : -1) - mb_strlen($item['hint']) + $spacingForTag, $spacingForTag) .$item['var'] .( '' !== $item['desc'] - ? $this->getIndent($varMax - \strlen($item['var']) + 1).$item['desc'] + ? $this->getIndent($varMax - \strlen($item['var']) + $spacingForTag, $spacingForTag).$item['desc'] : '' ); } elseif ('' !== $item['desc']) { - $line .= $this->getIndent($hintMax - \strlen($item['hint']) + 1).$item['desc']; + $line .= $this->getIndent($hintMax - \strlen($item['hint']) + $spacingForTag, $spacingForTag).$item['desc']; } $docBlock->getLine($current + $j)->setContent($line.$lineEnding); @@ -338,6 +395,13 @@ private function fixDocBlock(DocBlock $docBlock): void } } + private function spacingForTag(?string $tag): int + { + return (\is_int($this->spacing)) + ? $this->spacing + : ($this->spacing[$tag] ?? $this->spacing[self::DEFAULT_SPACING_KEY] ?? self::DEFAULT_SPACING); + } + /** * @TODO Introduce proper DTO instead of an array * @@ -369,9 +433,7 @@ private function getMatches(string $line, bool $matchCommentOnly = false): ?arra $matches['hint'] = trim($matches['hint']); } - if (!isset($matches['static'])) { - $matches['static'] = ''; - } + $matches['static'] ??= ''; return $matches; } @@ -418,18 +480,20 @@ private function getLeftAlignedDescriptionIndent(array $items, int $index): int return 0; } + $spacingForTag = $this->spacingForTag($item['tag']); + // Indent according to existing values: return - $this->getSentenceIndent($item['static']) + - $this->getSentenceIndent($item['tag']) + - $this->getSentenceIndent($item['hint']) + - $this->getSentenceIndent($item['var']); + $this->getSentenceIndent($item['static'], $spacingForTag) + + $this->getSentenceIndent($item['tag'], $spacingForTag) + + $this->getSentenceIndent($item['hint'], $spacingForTag) + + $this->getSentenceIndent($item['var'], $spacingForTag); } /** * Get indent for sentence. */ - private function getSentenceIndent(?string $sentence): int + private function getSentenceIndent(?string $sentence, int $spacingForTag = 1): int { if (null === $sentence) { return 0; @@ -437,6 +501,6 @@ private function getSentenceIndent(?string $sentence): int $length = \strlen($sentence); - return 0 === $length ? 0 : $length + 1; + return 0 === $length ? 0 : $length + $spacingForTag; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php index 8cacdc389..756086b57 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocAnnotationWithoutDotFixer.php @@ -29,7 +29,7 @@ final class PhpdocAnnotationWithoutDotFixer extends AbstractFixer { /** - * @var string[] + * @var list */ private array $tags = ['throws', 'return', 'param', 'internal', 'deprecated', 'var', 'type']; @@ -106,7 +106,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $startLine = $doc->getLine($annotation->getStart()); $optionalTypeRegEx = $annotation->supportTypes() - ? sprintf('(?:%s\s+(?:\$\w+\s+)?)?', preg_quote(implode('|', $annotation->getTypes()), '/')) + ? \sprintf('(?:%s\s+(?:\$\w+\s+)?)?', preg_quote(implode('|', $annotation->getTypes()), '/')) : ''; $content = Preg::replaceCallback( '/^(\s*\*\s*@\w+\s+'.$optionalTypeRegEx.')(\p{Lu}?(?=\p{Ll}|\p{Zs}))(.*)$/', diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocArrayTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocArrayTypeFixer.php new file mode 100644 index 000000000..f3f64c11f --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocArrayTypeFixer.php @@ -0,0 +1,92 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\Phpdoc; + +use PhpCsFixer\AbstractPhpdocTypesFixer; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Tokens; + +final class PhpdocArrayTypeFixer extends AbstractPhpdocTypesFixer +{ + public function isCandidate(Tokens $tokens): bool + { + return $tokens->isTokenKindFound(T_DOC_COMMENT); + } + + public function isRisky(): bool + { + return true; + } + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'PHPDoc `array` type must be used instead of `T[]`.', + [ + new CodeSample(<<<'PHP' + ', $level); + }, + $type, + ); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php index dcb49fc28..818595d26 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocIndentFixer.php @@ -48,7 +48,7 @@ class DocBlocks /** * {@inheritdoc} * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. + * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. * Must run after IndentationTypeFixer, PhpdocToCommentFixer. */ public function getPriority(): int @@ -63,7 +63,9 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - foreach ($tokens as $index => $token) { + for ($index = $tokens->count() - 1; 0 <= $index; --$index) { + $token = $tokens[$index]; + if (!$token->isGivenKind(T_DOC_COMMENT)) { continue; } @@ -95,7 +97,13 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $newPrevContent = $this->fixWhitespaceBeforeDocblock($prevToken->getContent(), $indent); - if ('' !== $newPrevContent) { + $tokens[$index] = new Token([T_DOC_COMMENT, $this->fixDocBlock($token->getContent(), $indent)]); + + if (!$prevToken->isWhitespace()) { + if ('' !== $indent) { + $tokens->insertAt($index, new Token([T_WHITESPACE, $indent])); + } + } elseif ('' !== $newPrevContent) { if ($prevToken->isArray()) { $tokens[$prevIndex] = new Token([$prevToken->getId(), $newPrevContent]); } else { @@ -104,8 +112,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } else { $tokens->clearAt($prevIndex); } - - $tokens[$index] = new Token([T_DOC_COMMENT, $this->fixDocBlock($token->getContent(), $indent)]); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php index 668dd843e..101bb99c0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocInlineTagNormalizerFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -26,8 +27,21 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * tags: list, + * } + */ final class PhpdocInlineTagNormalizerFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function isCandidate(Tokens $tokens): bool { return $tokens->isTokenKindFound(T_DOC_COMMENT); @@ -75,7 +89,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // remove spaces between '{' and '@', remove white space between end // of text and closing bracket and between the tag and inline comment. $content = Preg::replaceCallback( - sprintf( + \sprintf( '#(?:@{+|{+\h*@)\h*(%s)\b([^}]*)(?:}+)#i', implode('|', array_map(static fn (string $tag): string => preg_quote($tag, '/'), $this->configuration['tags'])) ), @@ -99,7 +113,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('tags', 'The list of tags to normalize.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault(['example', 'id', 'internal', 'inheritdoc', 'inheritdocs', 'link', 'source', 'toc', 'tutorial']) ->getOption(), ]); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php index a667dd207..fcf84ec68 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocLineSpanFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -32,9 +33,25 @@ /** * @author Gert de Pagter + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * const?: 'multi'|'single'|null, + * method?: 'multi'|'single'|null, + * property?: 'multi'|'single'|null, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * const: 'multi'|'single'|null, + * method: 'multi'|'single'|null, + * property: 'multi'|'single'|null, + * } */ final class PhpdocLineSpanFixer extends AbstractFixer implements WhitespacesAwareFixerInterface, ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocListTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocListTypeFixer.php new file mode 100644 index 000000000..9d2cdff9b --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocListTypeFixer.php @@ -0,0 +1,70 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\Phpdoc; + +use PhpCsFixer\AbstractPhpdocTypesFixer; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Tokens; + +final class PhpdocListTypeFixer extends AbstractPhpdocTypesFixer +{ + public function isCandidate(Tokens $tokens): bool + { + return $tokens->isTokenKindFound(T_DOC_COMMENT); + } + + public function isRisky(): bool + { + return true; + } + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'PHPDoc `list` type must be used instead of `array` without a key.', + [ + new CodeSample(<<<'PHP' + $x + * @param array> $y + */ + + PHP), + ], + null, + 'Risky when `array` key should be present, but is missing.' + ); + } + + /** + * {@inheritdoc} + * + * Must run before PhpdocAlignFixer, PhpdocTypesOrderFixer. + * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. + */ + public function getPriority(): int + { + return 1; + } + + protected function normalize(string $type): string + { + return Preg::replace('/array(?=<(?:[^,<]|<[^>]+>)+(>|{|\())/i', 'list', $type); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php index 12300026b..d2f959a15 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAccessFixer.php @@ -28,7 +28,7 @@ final class PhpdocNoAccessFixer extends AbstractProxyFixer public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - '`@access` annotations should be omitted from PHPDoc.', + '`@access` annotations must be removed from PHPDoc.', [ new CodeSample( 'configure(['annotations' => ['access']]); + $fixer->configure( + ['annotations' => ['access'], + 'case_sensitive' => true, + ] + ); return [$fixer]; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php index 5bd713855..bef3c786e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoAliasTagFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\ConfigurationException\InvalidConfigurationException; use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -31,9 +32,21 @@ * * @author Graham Campbell * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * replacements?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * replacements: array, + * } */ final class PhpdocNoAliasTagFixer extends AbstractProxyFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -81,10 +94,8 @@ public function getPriority(): int return parent::getPriority(); } - public function configure(array $configuration): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - /** @var GeneralPhpdocTagRenameFixer $generalPhpdocTagRenameFixer */ $generalPhpdocTagRenameFixer = $this->proxyFixers['general_phpdoc_tag_rename']; @@ -108,7 +119,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('replacements', 'Mapping between replaced annotations with new ones.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['array']) ->setDefault([ 'property-read' => 'property', 'property-write' => 'property', diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php index 3b22bad97..c591c67ab 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoEmptyReturnFixer.php @@ -36,7 +36,7 @@ public function isCandidate(Tokens $tokens): bool public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - '`@return void` and `@return null` annotations should be omitted from PHPDoc.', + '`@return void` and `@return null` annotations must be removed from PHPDoc.', [ new CodeSample( 'configure(['annotations' => ['package', 'subpackage']]); + $fixer->configure([ + 'annotations' => ['package', 'subpackage'], + 'case_sensitive' => true, + ]); return [$fixer]; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php index 4174f2d93..b1e88a3af 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocNoUselessInheritdocFixer.php @@ -121,7 +121,7 @@ private function fixToken(Tokens $tokens, int $tokenIndex): void $count ); - if ($count) { + if ($count > 0) { $tokens[$tokenIndex] = new Token([T_DOC_COMMENT, $content]); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php index c3728efce..cd88b7b64 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderByValueFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -32,13 +33,25 @@ /** * @author Filippo Tessarotto * @author Andreas Möller + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * annotations?: list<'author'|'covers'|'coversNothing'|'dataProvider'|'depends'|'group'|'internal'|'method'|'mixin'|'property'|'property-read'|'property-write'|'requires'|'throws'|'uses'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * annotations: array{'author'?: 'author', 'covers'?: 'covers', 'coversNothing'?: 'coversnothing', 'dataProvider'?: 'dataprovider', 'depends'?: 'depends', 'group'?: 'group', 'internal'?: 'internal', 'method'?: 'method', 'mixin'?: 'mixin', 'property'?: 'property', 'property-read'?: 'property-read', 'property-write'?: 'property-write', 'requires'?: 'requires', 'throws'?: 'throws', 'uses'?: 'uses'}, + * } */ final class PhpdocOrderByValueFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Order phpdoc tags by value.', + 'Order PHPDoc tags by value.', [ new CodeSample( 'count() - 1; $index > 0; --$index) { foreach ($this->configuration['annotations'] as $type => $typeLowerCase) { - $findPattern = sprintf( + $findPattern = \sprintf( '/@%s\s.+@%s\s/s', $type, $type @@ -112,8 +125,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $annotationMap = []; if (\in_array($type, ['property', 'property-read', 'property-write'], true)) { - $replacePattern = sprintf( - '/(?s)\*\s*@%s\s+(?P.+\s+)?\$(?P[^\s]+).*/', + $replacePattern = \sprintf( + '/(?s)\*\s*@%s\s+(?P.+\s+)?\$(?P\S+).*/', $type ); @@ -122,7 +135,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $replacePattern = '/(?s)\*\s*@method\s+(?P.+\s+)?(?P.+)\(.*/'; $replacement = '\2'; } else { - $replacePattern = sprintf( + $replacePattern = \sprintf( '/\*\s*@%s\s+(?P.+)/', $typeLowerCase ); @@ -188,13 +201,11 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('annotations', 'List of annotations to order, e.g. `["covers"]`.')) - ->setAllowedTypes([ - 'array', - ]) + ->setAllowedTypes(['string[]']) ->setAllowedValues([ new AllowedValueSubset($allowedValues), ]) - ->setNormalizer(static function (Options $options, $value): array { + ->setNormalizer(static function (Options $options, array $value): array { $normalized = []; foreach ($value as $annotation) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php index 4ae2c5f15..dcb3ea043 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocOrderFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,9 +31,21 @@ /** * @author Graham Campbell * @author Jakub Kwaśniewski + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * order?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * order: list, + * } */ final class PhpdocOrderFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @const string[] * @@ -88,7 +101,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('order', 'Sequence in which annotations in PHPDoc should be ordered.')) ->setAllowedTypes(['string[]']) - ->setAllowedValues([static function ($order) { + ->setAllowedValues([static function (array $order): bool { if (\count($order) < 2) { throw new InvalidOptionsException('The option "order" value is invalid. Minimum two tags are required.'); } @@ -111,6 +124,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $content = $token->getContent(); // sort annotations + /** @var list */ $successors = $this->configuration['order']; while (\count($successors) >= 3) { $predecessor = array_shift($successors); @@ -119,6 +133,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // we're parsing the content last time to make sure the internal // state of the docblock is correct after the modifications + /** @var list */ $predecessors = $this->configuration['order']; $last = array_pop($predecessors); $content = $this->moveAnnotationsAfter($last, $predecessors, $content); @@ -131,8 +146,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void /** * Move all given annotations in before given set of annotations. * - * @param string $move Tag of annotations that should be moved - * @param string[] $before Tags of annotations that should moved annotations be placed before + * @param string $move Tag of annotations that should be moved + * @param list $before Tags of annotations that should moved annotations be placed before */ private function moveAnnotationsBefore(string $move, array $before, string $content): string { @@ -170,8 +185,8 @@ private function moveAnnotationsBefore(string $move, array $before, string $cont /** * Move all given annotations after given set of annotations. * - * @param string $move Tag of annotations that should be moved - * @param string[] $after Tags of annotations that should moved annotations be placed after + * @param string $move Tag of annotations that should be moved + * @param list $after Tags of annotations that should moved annotations be placed after */ private function moveAnnotationsAfter(string $move, array $after, string $content): string { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocParamOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocParamOrderFixer.php index fb3f41240..dbed46eb4 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocParamOrderFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocParamOrderFixer.php @@ -103,7 +103,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @return Token[] + * @return list */ private function getFunctionParamNames(Tokens $tokens, int $paramBlockStart): array { @@ -124,8 +124,8 @@ private function getFunctionParamNames(Tokens $tokens, int $paramBlockStart): ar /** * Overwrite the param annotations in order. * - * @param Token[] $paramNames - * @param Annotation[] $paramAnnotations + * @param list $paramNames + * @param list $paramAnnotations */ private function rewriteDocBlock(DocBlock $doc, array $paramNames, array $paramAnnotations): DocBlock { @@ -161,10 +161,10 @@ private function rewriteDocBlock(DocBlock $doc, array $paramNames, array $paramA /** * Sort the param annotations according to the function parameters. * - * @param Token[] $funcParamNames - * @param Annotation[] $paramAnnotations + * @param list $funcParamNames + * @param list $paramAnnotations * - * @return string[] + * @return list */ private function sortParamAnnotations(array $funcParamNames, array $paramAnnotations): array { @@ -181,9 +181,10 @@ private function sortParamAnnotations(array $funcParamNames, array $paramAnnotat } // Detect superfluous annotations - /** @var Annotation[] $invalidParams */ - $invalidParams = array_diff_key($paramAnnotations, $validParams); - $invalidParams = array_values($invalidParams); + /** @var list $invalidParams */ + $invalidParams = array_values( + array_diff_key($paramAnnotations, $validParams) + ); // Append invalid parameters to the (ordered) valid ones $orderedParams = array_values($validParams); @@ -197,9 +198,9 @@ private function sortParamAnnotations(array $funcParamNames, array $paramAnnotat /** * Fetch all annotations except the param ones. * - * @param Annotation[] $paramAnnotations + * @param list $paramAnnotations * - * @return string[] + * @return list */ private function getOtherAnnotationsBetweenParams(DocBlock $doc, array $paramAnnotations): array { @@ -227,9 +228,9 @@ private function getOtherAnnotationsBetweenParams(DocBlock $doc, array $paramAnn /** * Return the indices of the lines of a specific parameter annotation. * - * @param Annotation[] $paramAnnotations + * @param list $paramAnnotations * - * @return null|array + * @return ?list */ private function findParamAnnotationByIdentifier(array $paramAnnotations, string $identifier): ?array { @@ -237,7 +238,7 @@ private function findParamAnnotationByIdentifier(array $paramAnnotations, string $blockMatch = false; $blockIndices = []; - $paramRegex = '/\*\s*@param\s*(?:|'.TypeExpression::REGEX_TYPES.'\s*)&?(?=\$\b)'.preg_quote($identifier).'\b/'; + $paramRegex = '/\*\h*@param\h*(?:|'.TypeExpression::REGEX_TYPES.'\h*)&?(?=\$\b)'.preg_quote($identifier).'\b/'; foreach ($paramAnnotations as $i => $param) { $blockStart = Preg::match('/\s*{\s*/', $param->getContent()); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php index f672e1eec..8450317e9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocReturnSelfReferenceFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,12 +31,25 @@ use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; use Symfony\Component\OptionsResolver\Options; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * replacements?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * replacements: array, + * } + */ final class PhpdocReturnSelfReferenceFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var string[] + * @var list */ - private static array $toTypes = [ + private const TO_TYPES = [ '$this', 'static', 'self', @@ -135,7 +149,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('replacements', 'Mapping between replaced return types with new ones.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['array']) ->setNormalizer(static function (Options $options, array $value) use ($default): array { $normalizedValue = []; @@ -145,18 +159,18 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn } if (!isset($default[$from])) { - throw new InvalidOptionsException(sprintf( + throw new InvalidOptionsException(\sprintf( 'Unknown key "%s", expected any of %s.', \gettype($from).'#'.$from, Utils::naturalLanguageJoin(array_keys($default)) )); } - if (!\in_array($to, self::$toTypes, true)) { - throw new InvalidOptionsException(sprintf( + if (!\in_array($to, self::TO_TYPES, true)) { + throw new InvalidOptionsException(\sprintf( 'Unknown value "%s", expected any of %s.', \is_object($to) ? \get_class($to) : \gettype($to).(\is_resource($to) ? '' : '#'.$to), - Utils::naturalLanguageJoin(self::$toTypes) + Utils::naturalLanguageJoin(self::TO_TYPES) )); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php index df397ef01..84452ddb0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocScalarFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractPhpdocTypesFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -26,15 +27,25 @@ /** * @author Graham Campbell + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * types?: list<'boolean'|'callback'|'double'|'integer'|'real'|'str'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * types: list<'boolean'|'callback'|'double'|'integer'|'real'|'str'>, + * } */ final class PhpdocScalarFixer extends AbstractPhpdocTypesFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * The types to fix. - * - * @var array */ - private static array $types = [ + private const TYPES_MAP = [ 'boolean' => 'bool', 'callback' => 'callable', 'double' => 'float', @@ -82,7 +93,7 @@ function sample($a, $b, $c) /** * {@inheritdoc} * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. + * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. * Must run after PhpdocTypesFixer. */ public function getPriority(): int @@ -101,7 +112,7 @@ public function getPriority(): int protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { - $types = array_keys(self::$types); + $types = array_keys(self::TYPES_MAP); return new FixerConfigurationResolver([ (new FixerOptionBuilder('types', 'A list of types to fix.')) @@ -113,10 +124,16 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn protected function normalize(string $type): string { + $suffix = ''; + while (str_ends_with($type, '[]')) { + $type = substr($type, 0, -2); + $suffix .= '[]'; + } + if (\in_array($type, $this->configuration['types'], true)) { - return self::$types[$type]; + $type = self::TYPES_MAP[$type]; } - return $type; + return $type.$suffix; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php index 032753674..4f5917e06 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSeparationFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\DocBlock\Annotation; use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -32,13 +33,27 @@ /** * @author Graham Campbell * @author Jakub Kwaśniewski + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * groups?: list>, + * skip_unlisted_annotations?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * groups: list>, + * skip_unlisted_annotations: bool, + * } */ final class PhpdocSeparationFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal * - * @var string[][] + * @var list> */ public const OPTION_GROUPS_DEFAULT = [ ['author', 'copyright', 'license'], @@ -48,7 +63,7 @@ final class PhpdocSeparationFixer extends AbstractFixer implements ConfigurableF ]; /** - * @var string[][] + * @var list> */ private array $groups; @@ -106,18 +121,11 @@ public function getDefinition(): FixerDefinitionInterface ); } - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->groups = $this->configuration['groups']; - } - /** * {@inheritdoc} * * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpUnitInternalClassFixer, PhpUnitSizeClassFixer, PhpUnitTestClassRequiresCoversFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocOrderFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. + * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpUnitAttributesFixer, PhpUnitInternalClassFixer, PhpUnitSizeClassFixer, PhpUnitTestClassRequiresCoversFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocOrderFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. */ public function getPriority(): int { @@ -129,6 +137,11 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isTokenKindFound(T_DOC_COMMENT); } + protected function configurePostNormalisation(): void + { + $this->groups = $this->configuration['groups']; + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { foreach ($tokens as $index => $token) { @@ -146,21 +159,21 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { - $allowTagToBelongToOnlyOneGroup = static function ($groups) { + $allowTagToBelongToOnlyOneGroup = static function (array $groups): bool { $tags = []; foreach ($groups as $groupIndex => $group) { foreach ($group as $member) { if (isset($tags[$member])) { if ($groupIndex === $tags[$member]) { throw new InvalidOptionsException( - 'The option "groups" value is invalid. '. - 'The "'.$member.'" tag is specified more than once.' + 'The option "groups" value is invalid. ' + .'The "'.$member.'" tag is specified more than once.' ); } throw new InvalidOptionsException( - 'The option "groups" value is invalid. '. - 'The "'.$member.'" tag belongs to more than one group.' + 'The option "groups" value is invalid. ' + .'The "'.$member.'" tag belongs to more than one group.' ); } $tags[$member] = $groupIndex; @@ -221,7 +234,7 @@ private function fixAnnotations(DocBlock $doc): void if (true === $shouldBeTogether) { $this->ensureAreTogether($doc, $annotation, $next); - } elseif (false === $shouldBeTogether || !$this->configuration['skip_unlisted_annotations']) { + } elseif (false === $shouldBeTogether || false === $this->configuration['skip_unlisted_annotations']) { $this->ensureAreSeparate($doc, $annotation, $next); } } @@ -295,7 +308,7 @@ private function shouldBeTogether(Annotation $first, Annotation $second, array $ private function tagName(Annotation $annotation): ?string { - Preg::match('/@([a-zA-Z0-9_\\\\-]+(?=\s|$|\())/', $annotation->getContent(), $matches); + Preg::match('/@([a-zA-Z0-9_\\\-]+(?=\s|$|\())/', $annotation->getContent(), $matches); return $matches[1] ?? null; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php index 65406b37e..034be5c9d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocSummaryFixer.php @@ -90,7 +90,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void */ private function isCorrectlyFormatted(string $content): bool { - if (false !== stripos($content, '{@inheritdoc}')) { + if (str_contains(strtolower($content), strtolower('{@inheritdoc}'))) { return true; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php index cdeb53159..3c7c2a9b1 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagCasingFixer.php @@ -18,6 +18,7 @@ use PhpCsFixer\ConfigurationException\InvalidConfigurationException; use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -26,8 +27,21 @@ use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Preg; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * tags: list, + * } + */ final class PhpdocTagCasingFixer extends AbstractProxyFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -52,10 +66,8 @@ public function getPriority(): int return parent::getPriority(); } - public function configure(array $configuration): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - $replacements = []; foreach ($this->configuration['tags'] as $tag) { $replacements[$tag] = $tag; @@ -66,10 +78,10 @@ public function configure(array $configuration): void try { $generalPhpdocTagRenameFixer->configure([ + 'case_sensitive' => false, 'fix_annotation' => true, 'fix_inline' => true, 'replacements' => $replacements, - 'case_sensitive' => false, ]); } catch (InvalidConfigurationException $exception) { throw new InvalidFixerConfigurationException( @@ -84,7 +96,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('tags', 'List of tags to fix with their expected casing.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault(['inheritDoc']) ->getOption(), ]); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php index 947b526ca..016fcd3a0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTagTypeFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,8 +29,21 @@ use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; use Symfony\Component\OptionsResolver\Options; +/** + * @phpstan-type _AutogeneratedInputConfiguration array{ + * tags?: array, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * tags: array, + * } + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + */ final class PhpdocTagTypeFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + private const TAG_REGEX = '/^(?: (? (?:@(?.+?)(?:\s.+)?) @@ -78,7 +92,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void return; } - $regularExpression = sprintf( + $regularExpression = \sprintf( '/({?@(?:%s).*?(?:(?=\s\*\/)|(?=\n)}?))/i', implode('|', array_map( static fn (string $tag): string => preg_quote($tag, '/'), @@ -135,7 +149,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('tags', 'The list of tags to fix.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(["array"]) ->setAllowedValues([static function (array $value): bool { foreach ($value as $type) { if (!\in_array($type, ['annotation', 'inline'], true)) { @@ -168,7 +182,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn 'var' => 'annotation', 'version' => 'annotation', ]) - ->setNormalizer(static function (Options $options, $value): array { + ->setNormalizer(static function (Options $options, array $value): array { $normalized = []; foreach ($value as $tag => $type) { @@ -182,7 +196,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn } /** - * @param list $parts + * @param array $parts */ private function tagIsSurroundedByText(array $parts, int $index): bool { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php index 402ca5fc4..342978178 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocToCommentFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -30,13 +31,28 @@ /** * @author Ceeram * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * allow_before_return_statement?: bool, + * ignored_tags?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * allow_before_return_statement: bool, + * ignored_tags: list, + * } */ final class PhpdocToCommentFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var string[] + * @var list */ private array $ignoredTags = []; + private bool $allowBeforeReturnStatement = false; public function isCandidate(Tokens $tokens): bool { @@ -46,7 +62,7 @@ public function isCandidate(Tokens $tokens): bool /** * {@inheritdoc} * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer, SingleLineCommentSpacingFixer, SingleLineCommentStyleFixer. + * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer, SingleLineCommentSpacingFixer, SingleLineCommentStyleFixer. * Must run after CommentToPhpdocFixer. */ public function getPriority(): int @@ -90,27 +106,47 @@ public function getDefinition(): FixerDefinitionInterface ', ['ignored_tags' => ['todo']] ), + new CodeSample( + ' $sqlite) { + $sqlite->open($path); +} + +function returnClassName() { + /** @var class-string */ + return \StdClass::class; +} +', + ['allow_before_return_statement' => true] + ), ] ); } - public function configure(array $configuration = null): void + protected function configurePostNormalisation(): void { - parent::configure($configuration); - $this->ignoredTags = array_map( static fn (string $tag): string => strtolower($tag), $this->configuration['ignored_tags'] ); + + $this->allowBeforeReturnStatement = true === $this->configuration['allow_before_return_statement']; } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ (new FixerOptionBuilder('ignored_tags', 'List of ignored tags (matched case insensitively).')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setDefault([]) ->getOption(), + (new FixerOptionBuilder('allow_before_return_statement', 'Whether to allow PHPDoc before return statement.')) + ->setAllowedTypes(['bool']) + ->setDefault(false) // @TODO 4.0: set to `true` + ->getOption(), ]); } @@ -127,11 +163,15 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } + if ($this->allowBeforeReturnStatement && $commentsAnalyzer->isBeforeReturn($tokens, $index)) { + continue; + } + if ($commentsAnalyzer->isBeforeStructuralElement($tokens, $index)) { continue; } - if (0 < Preg::matchAll('~\@([a-zA-Z0-9_\\\\-]+)\b~', $token->getContent(), $matches)) { + if (0 < Preg::matchAll('~\@([a-zA-Z0-9_\\\-]+)\b~', $token->getContent(), $matches)) { foreach ($matches[1] as $match) { if (\in_array(strtolower($match), $this->ignoredTags, true)) { continue 2; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php index 33a4a0375..6b107af1b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimConsecutiveBlankLineSeparationFixer.php @@ -63,7 +63,7 @@ function fnc($foo) {} * {@inheritdoc} * * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. + * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpUnitAttributesFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. */ public function getPriority(): int { @@ -165,13 +165,16 @@ private function findNonBlankLine(DocBlock $doc, int $after): ?int private function findFirstAnnotationOrEnd(DocBlock $doc): int { - $index = null; foreach ($doc->getLines() as $index => $line) { if ($line->containsATag()) { return $index; } } + if (!isset($index)) { + throw new \LogicException('PHPDoc has empty lines collection.'); + } + return $index; // no Annotation, return the last line } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php index c472d0d93..d6b2391ee 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTrimFixer.php @@ -47,7 +47,7 @@ final class Foo {} * {@inheritdoc} * * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpUnitTestAnnotationFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocOrderFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. + * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpUnitAttributesFixer, PhpUnitTestAnnotationFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocOrderFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. */ public function getPriority(): int { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesFixer.php index 761f0b55b..61172ef8c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesFixer.php @@ -17,6 +17,7 @@ use PhpCsFixer\AbstractPhpdocTypesFixer; use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -24,31 +25,31 @@ use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; /** * @author Graham Campbell * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * groups?: list<'alias'|'meta'|'simple'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * groups: list<'alias'|'meta'|'simple'>, + * } */ final class PhpdocTypesFixer extends AbstractPhpdocTypesFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * Available types, grouped. * - * @var array + * @var array> */ private const POSSIBLE_TYPES = [ - 'simple' => [ - 'array', - 'bool', - 'callable', - 'float', - 'int', - 'iterable', - 'null', - 'object', - 'string', - ], 'alias' => [ 'boolean', 'double', @@ -66,20 +67,22 @@ final class PhpdocTypesFixer extends AbstractPhpdocTypesFixer implements Configu 'true', 'void', ], + 'simple' => [ + 'array', + 'bool', + 'callable', + 'float', + 'int', + 'iterable', + 'null', + 'object', + 'string', + ], ]; /** @var array */ private array $typesSetToFix; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $typesToFix = array_merge(...array_map(static fn (string $group): array => self::POSSIBLE_TYPES[$group], $this->configuration['groups'])); - - $this->typesSetToFix = array_combine($typesToFix, array_fill(0, \count($typesToFix), true)); - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -111,7 +114,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. + * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer. * Must run after PhpdocIndentFixer. */ public function getPriority(): int @@ -127,34 +130,32 @@ public function getPriority(): int return 16; } + protected function configurePostNormalisation(): void + { + $typesToFix = array_merge(...array_map(static fn (string $group): array => self::POSSIBLE_TYPES[$group], $this->configuration['groups'])); + + $this->typesSetToFix = array_combine($typesToFix, array_fill(0, \count($typesToFix), true)); + } + protected function normalize(string $type): string { $typeExpression = new TypeExpression($type, null, []); - $typeExpression->walkTypes(function (TypeExpression $type): void { - if (!$type->isUnionType()) { - $value = $type->toString(); - $valueLower = strtolower($value); - if (isset($this->typesSetToFix[$valueLower])) { - $value = $valueLower; - } - - // normalize shape/callable/generic identifiers too - // TODO parse them as inner types and this will be not needed then - $value = Preg::replaceCallback( - '/^(\??\s*)([^()[\]{}<>\'"]+)(?])/', - fn ($matches) => $matches[1].$this->normalize($matches[2]).$matches[3], - $value - ); - - // TODO TypeExpression should be immutable and walkTypes method should be changed to mapTypes method - \Closure::bind(static function () use ($type, $value): void { - $type->value = $value; - }, null, TypeExpression::class)(); + $newTypeExpression = $typeExpression->mapTypes(function (TypeExpression $type) { + if ($type->isUnionType()) { + return $type; } + + $value = $type->toString(); + $valueLower = strtolower($value); + if (isset($this->typesSetToFix[$valueLower])) { + return new TypeExpression($valueLower, null, []); + } + + return $type; }); - return $typeExpression->toString(); + return $newTypeExpression->toString(); } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface @@ -163,7 +164,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('groups', 'Type groups to fix.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($possibleGroups)]) ->setDefault($possibleGroups) ->getOption(), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php index 044eb8f6b..4a5b602d7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocTypesOrderFixer.php @@ -19,6 +19,7 @@ use PhpCsFixer\DocBlock\DocBlock; use PhpCsFixer\DocBlock\TypeExpression; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,8 +30,25 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * case_sensitive?: bool, + * null_adjustment?: 'always_first'|'always_last'|'none', + * sort_algorithm?: 'alpha'|'none', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * case_sensitive: bool, + * null_adjustment: 'always_first'|'always_last'|'none', + * sort_algorithm: 'alpha'|'none', + * } + */ final class PhpdocTypesOrderFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -97,7 +115,7 @@ public function getDefinition(): FixerDefinitionInterface * {@inheritdoc} * * Must run before PhpdocAlignFixer. - * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. + * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocListTypeFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer. */ public function getPriority(): int { @@ -153,7 +171,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void // fix @method parameters types $line = $doc->getLine($annotation->getStart()); - $line->setContent(Preg::replaceCallback('/@method\s+'.TypeExpression::REGEX_TYPES.'\s+\K(?&callable)/', function (array $matches) { + $line->setContent(Preg::replaceCallback('/\*\h*@method\h+'.TypeExpression::REGEX_TYPES.'\h+\K(?&callable)/', function (array $matches) { $typeExpression = new TypeExpression($matches[0], null, []); return implode('|', $this->sortTypes($typeExpression)); @@ -165,13 +183,13 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @return string[] + * @return list */ private function sortTypes(TypeExpression $typeExpression): array { - $normalizeType = static fn (string $type): string => Preg::replace('/^\\??\\\?/', '', $type); + $normalizeType = static fn (string $type): string => Preg::replace('/^\(*\??\\\?/', '', $type); - $typeExpression->sortTypes( + $sortedTypeExpression = $typeExpression->sortTypes( function (TypeExpression $a, TypeExpression $b) use ($normalizeType): int { $a = $normalizeType($a->toString()); $b = $normalizeType($b->toString()); @@ -188,13 +206,13 @@ function (TypeExpression $a, TypeExpression $b) use ($normalizeType): int { } if ('alpha' === $this->configuration['sort_algorithm']) { - return $this->configuration['case_sensitive'] ? strcmp($a, $b) : strcasecmp($a, $b); + return true === $this->configuration['case_sensitive'] ? $a <=> $b : strcasecmp($a, $b); } return 0; } ); - return $typeExpression->getTypes(); + return $sortedTypeExpression->getTypes(); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php index 400f8dd7a..441710ae3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarAnnotationCorrectOrderFixer.php @@ -61,7 +61,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - if (false === stripos($token->getContent(), '@var') && false === stripos($token->getContent(), '@type')) { + if (!str_contains(strtolower($token->getContent()), strtolower('@var')) && !str_contains(strtolower($token->getContent()), strtolower('@type'))) { continue; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php index f42b2d9fe..d6e9675c3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Phpdoc/PhpdocVarWithoutNameFixer.php @@ -116,15 +116,13 @@ private function fixLine(Line $line): void { Preg::matchAll('/ \$'.TypeExpression::REGEX_IDENTIFIER.'(?getContent(), $matches); - if (isset($matches[0])) { - foreach ($matches[0] as $match) { - $line->setContent(str_replace($match, '', $line->getContent())); - } + foreach ($matches[0] as $match) { + $line->setContent(str_replace($match, '', $line->getContent())); } } /** - * @return Line[] + * @return array */ private function getFirstLevelLines(DocBlock $docBlock): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php index bc222aa31..38d133933 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/ReturnNotation/SimplifiedNullReturnFixer.php @@ -79,7 +79,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void */ private function clear(Tokens $tokens, int $index): void { - while (!$tokens[++$index]->equals(';')) { + while (!$tokens[++$index]->equalsAny([';', [T_CLOSE_TAG]])) { if ($this->shouldClearToken($tokens, $index)) { $tokens->clearAt($index); } @@ -96,13 +96,16 @@ private function needFixing(Tokens $tokens, int $index): bool } $content = ''; - while (!$tokens[$index]->equals(';')) { + while (!$tokens[$index]->equalsAny([';', [T_CLOSE_TAG]])) { $index = $tokens->getNextMeaningfulToken($index); $content .= $tokens[$index]->getContent(); } + $lastTokenContent = $tokens[$index]->getContent(); + $content = substr($content, 0, -\strlen($lastTokenContent)); + $content = ltrim($content, '('); - $content = rtrim($content, ');'); + $content = rtrim($content, ')'); return 'null' === strtolower($content); } @@ -125,7 +128,8 @@ private function isStrictOrNullableReturnTypeFunction(Tokens $tokens, int $retur } while ($closingCurlyBraceIndex < $returnIndex); $possibleVoidIndex = $tokens->getPrevMeaningfulToken($openingCurlyBraceIndex); - $isStrictReturnType = $tokens[$possibleVoidIndex]->isGivenKind(T_STRING) && 'void' !== $tokens[$possibleVoidIndex]->getContent(); + $isStrictReturnType = $tokens[$possibleVoidIndex]->isGivenKind([T_STRING, CT::T_ARRAY_TYPEHINT]) + && 'void' !== $tokens[$possibleVoidIndex]->getContent(); $nullableTypeIndex = $tokens->getNextTokenOfKind($functionIndex, [[CT::T_NULLABLE_TYPE]]); $isNullableReturnType = null !== $nullableTypeIndex && $nullableTypeIndex < $openingCurlyBraceIndex; @@ -136,13 +140,32 @@ private function isStrictOrNullableReturnTypeFunction(Tokens $tokens, int $retur /** * Should we clear the specific token? * - * If the token is a comment, or is whitespace that is immediately before a - * comment, then we'll leave it alone. + * We'll leave it alone if + * - token is a comment + * - token is whitespace that is immediately before a comment + * - token is whitespace that is immediately before the PHP close tag + * - token is whitespace that is immediately after a comment and before a semicolon */ private function shouldClearToken(Tokens $tokens, int $index): bool { $token = $tokens[$index]; - return !$token->isComment() && !($token->isWhitespace() && $tokens[$index + 1]->isComment()); + if ($token->isComment()) { + return false; + } + + if (!$token->isWhitespace()) { + return true; + } + + if ( + $tokens[$index + 1]->isComment() + || $tokens[$index + 1]->equals([T_CLOSE_TAG]) + || ($tokens[$index - 1]->isComment() && $tokens[$index + 1]->equals(';')) + ) { + return false; + } + + return true; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php index f92ced5c9..3885eb39b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/MultilineWhitespaceBeforeSemicolonsFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -30,9 +31,21 @@ /** * @author Graham Campbell * @author Egidijus Girčys + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * strategy?: 'new_line_for_chained_calls'|'no_multi_line', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * strategy: 'new_line_for_chained_calls'|'no_multi_line', + * } */ final class MultilineWhitespaceBeforeSemicolonsFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @internal */ @@ -163,6 +176,9 @@ private function getNewLineIndex(int $index, Tokens $tokens): int $lineEnding = $this->whitespacesConfig->getLineEnding(); for ($index, $count = \count($tokens); $index < $count; ++$index) { + if (!$tokens[$index]->isWhitespace() && !$tokens[$index]->isComment()) { + break; + } if (false !== strstr($tokens[$index]->getContent(), $lineEnding)) { return $index; } @@ -219,7 +235,7 @@ private function findWhitespaceBeforeFirstCall(int $index, Tokens $tokens): ?str if ($tokens[$index]->isObjectOperator() || $tokens[$index]->isGivenKind(T_DOUBLE_COLON)) { $prevIndex = $tokens->getPrevMeaningfulToken($index); - $isMultilineCall |= $tokens->isPartialCodeMultiline($prevIndex, $index); + $isMultilineCall = $isMultilineCall || $tokens->isPartialCodeMultiline($prevIndex, $index); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php index 63be6cfe5..40de134a5 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Semicolon/SpaceAfterSemicolonFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -26,8 +27,21 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * remove_in_empty_for_expressions?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * remove_in_empty_for_expressions: bool, + * } + */ final class SpaceAfterSemicolonFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php index 4a83a9def..b0ff7180d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/DeclareStrictTypesFixer.php @@ -30,7 +30,7 @@ final class DeclareStrictTypesFixer extends AbstractFixer implements Whitespaces public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( - 'Force strict types declaration in all files. Requires PHP >= 7.0.', + 'Force strict types declaration in all files.', [ new CodeSample( "isGivenKind(T_OPEN_TAG); + return $tokens->isMonolithicPhp() && !$tokens->isTokenKindFound(T_OPEN_TAG_WITH_ECHO); } public function isRisky(): bool @@ -63,17 +63,11 @@ public function isRisky(): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { - // check if the declaration is already done - $searchIndex = $tokens->getNextMeaningfulToken(0); - if (null === $searchIndex) { - $this->insertSequence($tokens); // declaration not found, insert one + $openTagIndex = $tokens[0]->isGivenKind(T_INLINE_HTML) ? 1 : 0; - return; - } - - $sequenceLocation = $tokens->findSequence([[T_DECLARE, 'declare'], '(', [T_STRING, 'strict_types'], '=', [T_LNUMBER], ')'], $searchIndex, null, false); + $sequenceLocation = $tokens->findSequence([[T_DECLARE, 'declare'], '(', [T_STRING, 'strict_types'], '=', [T_LNUMBER], ')'], $openTagIndex, null, false); if (null === $sequenceLocation) { - $this->insertSequence($tokens); // declaration not found, insert one + $this->insertSequence($openTagIndex, $tokens); // declaration not found, insert one return; } @@ -102,7 +96,7 @@ private function fixStrictTypesCasingAndValue(Tokens $tokens, array $sequence): } } - private function insertSequence(Tokens $tokens): void + private function insertSequence(int $openTagIndex, Tokens $tokens): void { $sequence = [ new Token([T_DECLARE, 'declare']), @@ -113,28 +107,26 @@ private function insertSequence(Tokens $tokens): void new Token(')'), new Token(';'), ]; - $endIndex = \count($sequence); + $nextIndex = $openTagIndex + \count($sequence) + 1; - $tokens->insertAt(1, $sequence); + $tokens->insertAt($openTagIndex + 1, $sequence); - // start index of the sequence is always 1 here, 0 is always open tag - // transform "getContent(), "\n")) { - $tokens[0] = new Token([$tokens[0]->getId(), trim($tokens[0]->getContent()).' ']); + // transform "getContent(); + if (!str_contains($content, ' ') || str_contains($content, "\n")) { + $tokens[$openTagIndex] = new Token([$tokens[$openTagIndex]->getId(), trim($tokens[$openTagIndex]->getContent()).' ']); } - if ($endIndex === \count($tokens) - 1) { + if (\count($tokens) === $nextIndex) { return; // no more tokens after sequence, single_blank_line_at_eof might add a line } $lineEnding = $this->whitespacesConfig->getLineEnding(); - if (!$tokens[1 + $endIndex]->isWhitespace()) { - $tokens->insertAt(1 + $endIndex, new Token([T_WHITESPACE, $lineEnding])); - - return; + if ($tokens[$nextIndex]->isWhitespace()) { + $content = $tokens[$nextIndex]->getContent(); + $tokens[$nextIndex] = new Token([T_WHITESPACE, $lineEnding.ltrim($content, " \t")]); + } else { + $tokens->insertAt($nextIndex, new Token([T_WHITESPACE, $lineEnding])); } - - $content = $tokens[1 + $endIndex]->getContent(); - $tokens[1 + $endIndex] = new Token([T_WHITESPACE, $lineEnding.ltrim($content, " \t")]); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php index d92809696..e0f12f333 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Strict/StrictParamFixer.php @@ -91,6 +91,9 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } } + /** + * @param list $functionParams + */ private function fixFunction(Tokens $tokens, int $functionIndex, array $functionParams): void { $startBraceIndex = $tokens->getNextTokenOfKind($functionIndex, ['(']); @@ -135,7 +138,7 @@ private function fixFunction(Tokens $tokens, int $functionIndex, array $function for ($i = $paramsQuantity; $i < $functionParamsQuantity; ++$i) { // function call do not have all params that are required to set useStrict flag, exit from method! - if (!$functionParams[$i]) { + if (null === $functionParams[$i]) { return; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php index af0a103df..8dce82eaa 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/EscapeImplicitBackslashesFixer.php @@ -14,23 +14,46 @@ namespace PhpCsFixer\Fixer\StringNotation; -use PhpCsFixer\AbstractFixer; +use PhpCsFixer\AbstractProxyFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\Fixer\DeprecatedFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; -use PhpCsFixer\Preg; -use PhpCsFixer\Tokenizer\Token; -use PhpCsFixer\Tokenizer\Tokens; /** * @author Filippo Tessarotto + * @author Michael Vorisek + * + * @deprecated Use `string_implicit_backslashes` with config: ['single_quoted' => 'ignore', 'double_quoted' => 'escape', 'heredoc' => 'escape'] (default) + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * double_quoted?: bool, + * heredoc_syntax?: bool, + * single_quoted?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * double_quoted: bool, + * heredoc_syntax: bool, + * single_quoted: bool, + * } */ -final class EscapeImplicitBackslashesFixer extends AbstractFixer implements ConfigurableFixerInterface +final class EscapeImplicitBackslashesFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, DeprecatedFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + public function getSuccessorsNames(): array + { + return array_keys($this->proxyFixers); + } + public function getDefinition(): FixerDefinitionInterface { $codeSample = <<<'EOF' @@ -73,69 +96,41 @@ public function getDefinition(): FixerDefinitionInterface ); } - public function isCandidate(Tokens $tokens): bool - { - return $tokens->isAnyTokenKindsFound([T_ENCAPSED_AND_WHITESPACE, T_CONSTANT_ENCAPSED_STRING]); - } - /** * {@inheritdoc} * * Must run before HeredocToNowdocFixer, SingleQuoteFixer. - * Must run after BacktickToShellExecFixer. + * Must run after MultilineStringToHeredocFixer. */ public function getPriority(): int { - return 15; + return parent::getPriority(); + } + + protected function configurePostNormalisation(): void + { + /** @var StringImplicitBackslashesFixer */ + $stringImplicitBackslashesFixer = $this->proxyFixers['string_implicit_backslashes']; + + $stringImplicitBackslashesFixer->configure([ + 'single_quoted' => true === $this->configuration['single_quoted'] ? 'escape' : 'ignore', + 'double_quoted' => true === $this->configuration['double_quoted'] ? 'escape' : 'ignore', + 'heredoc' => true === $this->configuration['heredoc_syntax'] ? 'escape' : 'ignore', + ]); } - protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + protected function createProxyFixers(): array { - static $singleQuotedRegex = '/(? $token) { - $content = $token->getContent(); - if ($token->equalsAny(['"', 'b"', 'B"'])) { - $doubleQuoteOpened = !$doubleQuoteOpened; - } - if (!$token->isGivenKind([T_ENCAPSED_AND_WHITESPACE, T_CONSTANT_ENCAPSED_STRING]) || !str_contains($content, '\\')) { - continue; - } - - // Nowdoc syntax - if ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) && '\'' === substr(rtrim($tokens[$index - 1]->getContent()), -1)) { - continue; - } - - $firstTwoCharacters = strtolower(substr($content, 0, 2)); - $isSingleQuotedString = $token->isGivenKind(T_CONSTANT_ENCAPSED_STRING) && ('\'' === $content[0] || 'b\'' === $firstTwoCharacters); - $isDoubleQuotedString = - ($token->isGivenKind(T_CONSTANT_ENCAPSED_STRING) && ('"' === $content[0] || 'b"' === $firstTwoCharacters)) - || ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) && $doubleQuoteOpened); - $isHeredocSyntax = !$isSingleQuotedString && !$isDoubleQuotedString; - if ( - (false === $this->configuration['single_quoted'] && $isSingleQuotedString) - || (false === $this->configuration['double_quoted'] && $isDoubleQuotedString) - || (false === $this->configuration['heredoc_syntax'] && $isHeredocSyntax) - ) { - continue; - } - - $regex = $heredocSyntaxRegex; - if ($isSingleQuotedString) { - $regex = $singleQuotedRegex; - } elseif ($isDoubleQuotedString) { - $regex = $doubleQuotedRegex; - } - - $newContent = Preg::replace($regex, '\\\\\\\\$1', $content); - if ($newContent !== $content) { - $tokens[$index] = new Token([$token->getId(), $newContent]); - } - } + $stringImplicitBackslashesFixer = new StringImplicitBackslashesFixer(); + $stringImplicitBackslashesFixer->configure([ + 'single_quoted' => 'ignore', + 'double_quoted' => 'escape', + 'heredoc' => 'escape', + ]); + + return [ + $stringImplicitBackslashesFixer, + ]; } protected function createConfigurationDefinition(): FixerConfigurationResolverInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php index 92bc84ff5..1671940c8 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/ExplicitStringVariableFixer.php @@ -42,8 +42,8 @@ public function getDefinition(): FixerDefinitionInterface )], 'The reasoning behind this rule is the following:' ."\n".'- When there are two valid ways of doing the same thing, using both is confusing, there should be a coding standard to follow.' - ."\n".'- PHP manual marks `"$var"` syntax as implicit and `"${var}"` syntax as explicit: explicit code should always be preferred.' - ."\n".'- Explicit syntax allows word concatenation inside strings, e.g. `"${var}IsAVar"`, implicit doesn\'t.' + ."\n".'- PHP manual marks `"$var"` syntax as implicit and `"{$var}"` syntax as explicit: explicit code should always be preferred.' + ."\n".'- Explicit syntax allows word concatenation inside strings, e.g. `"{$var}IsAVar"`, implicit doesn\'t.' ."\n".'- Explicit syntax is easier to detect for IDE/editors and therefore has colors/highlight with higher contrast, which is easier to read.' ."\n".'Backtick operator is skipped because it is harder to handle; you can use `backtick_to_shell_exec` fixer to normalize backticks to strings.' ); @@ -52,11 +52,12 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * + * Must run before NoUselessConcatOperatorFixer. * Must run after BacktickToShellExecFixer. */ public function getPriority(): int { - return 0; + return 6; } public function isCandidate(Tokens $tokens): bool @@ -123,7 +124,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void foreach ($variableTokens as $distinctVariableSet) { if (1 === \count($distinctVariableSet['tokens'])) { - $singleVariableIndex = key($distinctVariableSet['tokens']); + $singleVariableIndex = array_key_first($distinctVariableSet['tokens']); $singleVariableToken = current($distinctVariableSet['tokens']); $tokens->overrideRange($singleVariableIndex, $singleVariableIndex, [ new Token([T_CURLY_OPEN, '{']), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocClosingMarkerFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocClosingMarkerFixer.php new file mode 100644 index 000000000..34959cd27 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocClosingMarkerFixer.php @@ -0,0 +1,205 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\StringNotation; + +use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @author Michael Vorisek + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * closing_marker?: string, + * explicit_heredoc_style?: bool, + * reserved_closing_markers?: list, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * closing_marker: string, + * explicit_heredoc_style: bool, + * reserved_closing_markers: list, + * } + */ +final class HeredocClosingMarkerFixer extends AbstractFixer implements ConfigurableFixerInterface +{ + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + /** + * @var list + */ + public const RESERVED_CLOSING_MARKERS = [ + 'CSS', + 'DIFF', + 'HTML', + 'JS', + 'JSON', + 'MD', + 'PHP', + 'PYTHON', + 'RST', + 'TS', + 'SQL', + 'XML', + 'YAML', + ]; + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Unify `heredoc` or `nowdoc` closing marker.', + [ + new CodeSample( + <<<'EOD' + 'EOF'] + ), + new CodeSample( + <<<'EOD_' + true] + ), + ] + ); + } + + public function isCandidate(Tokens $tokens): bool + { + return $tokens->isTokenKindFound(T_START_HEREDOC); + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder( + 'closing_marker', + 'Preferred closing marker.' + )) + ->setAllowedTypes(['string']) + ->setDefault('EOD') + ->getOption(), + (new FixerOptionBuilder( + 'reserved_closing_markers', + 'Reserved closing markers to be kept unchanged.' + )) + ->setAllowedTypes(['string[]']) + ->setDefault(self::RESERVED_CLOSING_MARKERS) + ->getOption(), + (new FixerOptionBuilder( + 'explicit_heredoc_style', + 'Whether the closing marker should be wrapped in double quotes.' + )) + ->setAllowedTypes(['bool']) + ->setDefault(false) + ->getOption(), + ]); + } + + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + { + $reservedClosingMarkersMap = null; + + $startIndex = null; + foreach ($tokens as $index => $token) { + if ($token->isGivenKind(T_START_HEREDOC)) { + $startIndex = $index; + + continue; + } + + if (null !== $startIndex && $token->isGivenKind(T_END_HEREDOC)) { + $existingClosingMarker = trim($token->getContent()); + + if (null === $reservedClosingMarkersMap) { + $reservedClosingMarkersMap = []; + foreach ($this->configuration['reserved_closing_markers'] as $v) { + $reservedClosingMarkersMap[mb_strtoupper($v)] = $v; + } + } + + $existingClosingMarker = mb_strtoupper($existingClosingMarker); + do { + $newClosingMarker = $reservedClosingMarkersMap[$existingClosingMarker] ?? null; + if (!str_ends_with($existingClosingMarker, '_')) { + break; + } + $existingClosingMarker = substr($existingClosingMarker, 0, -1); + } while (null === $newClosingMarker); + + if (null === $newClosingMarker) { + $newClosingMarker = $this->configuration['closing_marker']; + } + + $content = $tokens->generatePartialCode($startIndex + 1, $index - 1); + while (Preg::match('~(^|[\r\n])\s*'.preg_quote($newClosingMarker, '~').'(?!\w)~', $content)) { + $newClosingMarker .= '_'; + } + + [$tokens[$startIndex], $tokens[$index]] = $this->convertClosingMarker($tokens[$startIndex], $token, $newClosingMarker); + + $startIndex = null; + + continue; + } + } + } + + /** + * @return array{Token, Token} + */ + private function convertClosingMarker(Token $startToken, Token $endToken, string $newClosingMarker): array + { + $isNowdoc = str_contains($startToken->getContent(), '\''); + + $markerQuote = $isNowdoc + ? '\'' + : (true === $this->configuration['explicit_heredoc_style'] ? '"' : ''); + + return [new Token([ + $startToken->getId(), + Preg::replace('/<<<\h*\K["\']?[^\s"\']+["\']?/', $markerQuote.$newClosingMarker.$markerQuote, $startToken->getContent()), + ]), new Token([ + $endToken->getId(), + Preg::replace('/\S+/', $newClosingMarker, $endToken->getContent()), + ])]; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php index 88add2d57..9c736c142 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/HeredocToNowdocFixer.php @@ -47,7 +47,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run after EscapeImplicitBackslashesFixer. + * Must run after EscapeImplicitBackslashesFixer, StringImplicitBackslashesFixer. */ public function getPriority(): int { @@ -81,12 +81,12 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $content = $tokens[$index + 1]->getContent(); // regex: odd number of backslashes, not followed by dollar - if (Preg::match('/(?convertToNowdoc($token); - $content = str_replace(['\\\\', '\\$'], ['\\', '$'], $content); + $content = str_replace(['\\\\', '\$'], ['\\', '$'], $content); $tokens[$index + 1] = new Token([ $tokens[$index + 1]->getId(), $content, diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/MultilineStringToHeredocFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/MultilineStringToHeredocFixer.php new file mode 100644 index 000000000..1a6790e67 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/MultilineStringToHeredocFixer.php @@ -0,0 +1,166 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\StringNotation; + +use PhpCsFixer\AbstractFixer; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @author Michael Vorisek + */ +final class MultilineStringToHeredocFixer extends AbstractFixer +{ + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition( + 'Convert multiline string to `heredoc` or `nowdoc`.', + [ + new CodeSample( + <<<'EOD' + getName()}"; + EOD."\n" + ), + ] + ); + } + + public function isCandidate(Tokens $tokens): bool + { + return $tokens->isAnyTokenKindsFound([T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE]); + } + + /** + * {@inheritdoc} + * + * Must run before EscapeImplicitBackslashesFixer, HeredocIndentationFixer, StringImplicitBackslashesFixer. + */ + public function getPriority(): int + { + return 16; + } + + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + { + $inHeredoc = false; + $complexStringStartIndex = null; + foreach ($tokens as $index => $token) { + if ($token->isGivenKind([T_START_HEREDOC, T_END_HEREDOC])) { + $inHeredoc = $token->isGivenKind(T_START_HEREDOC) || !$token->isGivenKind(T_END_HEREDOC); + + continue; + } + + if (null === $complexStringStartIndex) { + if ($token->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { + $this->convertStringToHeredoc($tokens, $index, $index); + + // skip next 2 added tokens if replaced + if ($tokens[$index]->isGivenKind(T_START_HEREDOC)) { + $inHeredoc = true; + } + } elseif ($token->equalsAny(['"', 'b"', 'B"'])) { + $complexStringStartIndex = $index; + } + } elseif ($token->equals('"')) { + $this->convertStringToHeredoc($tokens, $complexStringStartIndex, $index); + + $complexStringStartIndex = null; + } + } + } + + private function convertStringToHeredoc(Tokens $tokens, int $stringStartIndex, int $stringEndIndex): void + { + $closingMarker = 'EOD'; + + if ($tokens[$stringStartIndex]->isGivenKind(T_CONSTANT_ENCAPSED_STRING)) { + $content = $tokens[$stringStartIndex]->getContent(); + if ('b' === strtolower(substr($content, 0, 1))) { + $content = substr($content, 1); + } + $isSingleQuoted = str_starts_with($content, '\''); + $content = substr($content, 1, -1); + + if ($isSingleQuoted) { + $content = Preg::replace('~\\\([\\\\\'])~', '$1', $content); + } else { + $content = Preg::replace('~(\\\\\\\)|\\\(")~', '$1$2', $content); + } + + $constantStringToken = new Token([T_ENCAPSED_AND_WHITESPACE, $content."\n"]); + } else { + $content = $tokens->generatePartialCode($stringStartIndex + 1, $stringEndIndex - 1); + $isSingleQuoted = false; + $constantStringToken = null; + } + + if (!str_contains($content, "\n") && !str_contains($content, "\r")) { + return; + } + + while (Preg::match('~(^|[\r\n])\s*'.preg_quote($closingMarker, '~').'(?!\w)~', $content)) { + $closingMarker .= '_'; + } + + $quoting = $isSingleQuoted ? '\'' : ''; + $heredocStartToken = new Token([T_START_HEREDOC, '<<<'.$quoting.$closingMarker.$quoting."\n"]); + $heredocEndToken = new Token([T_END_HEREDOC, $closingMarker]); + + if (null !== $constantStringToken) { + $tokens->overrideRange($stringStartIndex, $stringEndIndex, [ + $heredocStartToken, + $constantStringToken, + $heredocEndToken, + ]); + } else { + for ($i = $stringStartIndex + 1; $i < $stringEndIndex; ++$i) { + if ($tokens[$i]->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { + $tokens[$i] = new Token([ + $tokens[$i]->getId(), + Preg::replace('~(\\\\\\\)|\\\(")~', '$1$2', $tokens[$i]->getContent()), + ]); + } + } + + $tokens[$stringStartIndex] = $heredocStartToken; + $tokens[$stringEndIndex] = $heredocEndToken; + if ($tokens[$stringEndIndex - 1]->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) { + $tokens[$stringEndIndex - 1] = new Token([ + $tokens[$stringEndIndex - 1]->getId(), + $tokens[$stringEndIndex - 1]->getContent()."\n", + ]); + } else { + $tokens->insertAt($stringEndIndex, new Token([ + T_ENCAPSED_AND_WHITESPACE, + "\n", + ])); + } + } + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php index 75891ac08..9c6b4852b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SimpleToComplexStringVariableFixer.php @@ -73,38 +73,24 @@ public function isCandidate(Tokens $tokens): bool protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { for ($index = \count($tokens) - 3; $index > 0; --$index) { - $token = $tokens[$index]; - - if (!$token->isGivenKind(T_DOLLAR_OPEN_CURLY_BRACES)) { + if (!$tokens[$index]->isGivenKind(T_DOLLAR_OPEN_CURLY_BRACES)) { continue; } - $varnameToken = $tokens[$index + 1]; if (!$varnameToken->isGivenKind(T_STRING_VARNAME)) { continue; } - $dollarCloseToken = $tokens[$index + 2]; + $dollarCloseToken = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_COMPLEX_STRING_VARIABLE, $index); - if (!$dollarCloseToken->isGivenKind(CT::T_DOLLAR_CLOSE_CURLY_BRACES)) { - continue; + $prevTokenContent = $tokens[$index - 1]->getContent(); + if (str_ends_with($prevTokenContent, '$') && !str_ends_with($prevTokenContent, '\$')) { + $tokens[$index - 1] = new Token([T_ENCAPSED_AND_WHITESPACE, substr($prevTokenContent, 0, -1).'\$']); } - - $tokenOfStringBeforeToken = $tokens[$index - 1]; - $stringContent = $tokenOfStringBeforeToken->getContent(); - - if (str_ends_with($stringContent, '$') && !str_ends_with($stringContent, '\\$')) { - $newContent = substr($stringContent, 0, -1).'\\$'; - $tokenOfStringBeforeToken = new Token([T_ENCAPSED_AND_WHITESPACE, $newContent]); - } - - $tokens->overrideRange($index - 1, $index + 2, [ - $tokenOfStringBeforeToken, - new Token([T_CURLY_OPEN, '{']), - new Token([T_VARIABLE, '$'.$varnameToken->getContent()]), - new Token([CT::T_CURLY_CLOSE, '}']), - ]); + $tokens[$index] = new Token([T_CURLY_OPEN, '{']); + $tokens[$index + 1] = new Token([T_VARIABLE, '$'.$varnameToken->getContent()]); + $tokens[$dollarCloseToken] = new Token([CT::T_CURLY_CLOSE, '}']); } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php index ab3d7ddd3..b5dcb433e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/StringNotation/SingleQuoteFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -28,9 +29,21 @@ /** * @author Gregor Harlan + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * strings_containing_single_quote_chars?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * strings_containing_single_quote_chars: bool, + * } */ final class SingleQuoteFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { $codeSample = <<<'EOF' @@ -57,7 +70,7 @@ public function getDefinition(): FixerDefinitionInterface * {@inheritdoc} * * Must run before NoUselessConcatOperatorFixer. - * Must run after BacktickToShellExecFixer, EscapeImplicitBackslashesFixer. + * Must run after BacktickToShellExecFixer, EscapeImplicitBackslashesFixer, StringImplicitBackslashesFixer. */ public function getPriority(): int { @@ -88,10 +101,10 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void '"' === $content[0] && (true === $this->configuration['strings_containing_single_quote_chars'] || !str_contains($content, "'")) // regex: odd number of backslashes, not followed by double quote or dollar - && !Preg::match('/(? + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Fixer\StringNotation; + +use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; +use PhpCsFixer\FixerDefinition\CodeSample; +use PhpCsFixer\FixerDefinition\FixerDefinition; +use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @author Filippo Tessarotto + * @author Michael Vorisek + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * double_quoted?: 'escape'|'ignore'|'unescape', + * heredoc?: 'escape'|'ignore'|'unescape', + * single_quoted?: 'escape'|'ignore'|'unescape', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * double_quoted: 'escape'|'ignore'|'unescape', + * heredoc: 'escape'|'ignore'|'unescape', + * single_quoted: 'escape'|'ignore'|'unescape', + * } + */ +final class StringImplicitBackslashesFixer extends AbstractFixer implements ConfigurableFixerInterface +{ + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + + public function getDefinition(): FixerDefinitionInterface + { + $codeSample = <<<'EOF' + 'escape'] + ), + new CodeSample( + $codeSample, + ['double_quoted' => 'unescape'] + ), + new CodeSample( + $codeSample, + ['heredoc' => 'unescape'] + ), + ], + 'In PHP double-quoted strings and heredocs some chars like `n`, `$` or `u` have special meanings if preceded by a backslash ' + .'(and some are special only if followed by other special chars), while a backslash preceding other chars are interpreted like a plain ' + .'backslash. The precise list of those special chars is hard to remember and to identify quickly: this fixer escapes backslashes ' + ."that do not start a special interpretation with the char after them.\n" + .'It is possible to fix also single-quoted strings: in this case there is no special chars apart from single-quote and backslash ' + .'itself, so the fixer simply ensure that all backslashes are escaped. Both single and double backslashes are allowed in single-quoted ' + .'strings, so the purpose in this context is mainly to have a uniformed way to have them written all over the codebase.' + ); + } + + public function isCandidate(Tokens $tokens): bool + { + return $tokens->isAnyTokenKindsFound([T_ENCAPSED_AND_WHITESPACE, T_CONSTANT_ENCAPSED_STRING]); + } + + /** + * {@inheritdoc} + * + * Must run before HeredocToNowdocFixer, SingleQuoteFixer. + * Must run after MultilineStringToHeredocFixer. + */ + public function getPriority(): int + { + return 15; + } + + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void + { + $singleQuotedReservedRegex = '[\'\\\]'; + $doubleQuotedReservedRegex = '(?:[efnrtv$"\\\0-7]|x[0-9A-Fa-f]|u{|$)'; + $heredocSyntaxReservedRegex = '(?:[efnrtv$\\\0-7]|x[0-9A-Fa-f]|u{|$)'; + + $doubleQuoteOpened = false; + foreach ($tokens as $index => $token) { + if ($token->equalsAny(['"', 'b"', 'B"'])) { + $doubleQuoteOpened = !$doubleQuoteOpened; + } + + if (!$token->isGivenKind([T_ENCAPSED_AND_WHITESPACE, T_CONSTANT_ENCAPSED_STRING])) { + continue; + } + + $content = $token->getContent(); + if (!str_contains($content, '\\')) { + continue; + } + + // nowdoc syntax + if ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) && '\'' === substr(rtrim($tokens[$index - 1]->getContent()), -1)) { + continue; + } + + $firstTwoCharacters = strtolower(substr($content, 0, 2)); + $isSingleQuotedString = $token->isGivenKind(T_CONSTANT_ENCAPSED_STRING) && ('\'' === $content[0] || 'b\'' === $firstTwoCharacters); + $isDoubleQuotedString = ($token->isGivenKind(T_CONSTANT_ENCAPSED_STRING) && ('"' === $content[0] || 'b"' === $firstTwoCharacters)) + || ($token->isGivenKind(T_ENCAPSED_AND_WHITESPACE) && $doubleQuoteOpened); + + if ($isSingleQuotedString + ? 'ignore' === $this->configuration['single_quoted'] + : ($isDoubleQuotedString + ? 'ignore' === $this->configuration['double_quoted'] + : 'ignore' === $this->configuration['heredoc']) + ) { + continue; + } + + $escapeBackslashes = $isSingleQuotedString + ? 'escape' === $this->configuration['single_quoted'] + : ($isDoubleQuotedString + ? 'escape' === $this->configuration['double_quoted'] + : 'escape' === $this->configuration['heredoc']); + + $reservedRegex = $isSingleQuotedString + ? $singleQuotedReservedRegex + : ($isDoubleQuotedString + ? $doubleQuotedReservedRegex + : $heredocSyntaxReservedRegex); + + if ($escapeBackslashes) { + $regex = '/(?getId(), $newContent]); + } + } + } + + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('single_quoted', 'Whether to escape backslashes in single-quoted strings.')) + ->setAllowedValues(['escape', 'unescape', 'ignore']) + ->setDefault('unescape') + ->getOption(), + (new FixerOptionBuilder('double_quoted', 'Whether to escape backslashes in double-quoted strings.')) + ->setAllowedValues(['escape', 'unescape', 'ignore']) + ->setDefault('escape') + ->getOption(), + (new FixerOptionBuilder('heredoc', 'Whether to escape backslashes in heredoc syntax.')) + ->setAllowedValues(['escape', 'unescape', 'ignore']) + ->setDefault('escape') + ->getOption(), + ]); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php index 8434490ff..cfbba9cc5 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBeforeStatementFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; @@ -31,13 +32,25 @@ /** * @author Dariusz Rumiński * @author Andreas Möller + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * statements?: list<'break'|'case'|'continue'|'declare'|'default'|'do'|'exit'|'for'|'foreach'|'goto'|'if'|'include'|'include_once'|'phpdoc'|'require'|'require_once'|'return'|'switch'|'throw'|'try'|'while'|'yield'|'yield_from'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * statements: list<'break'|'case'|'continue'|'declare'|'default'|'do'|'exit'|'for'|'foreach'|'goto'|'if'|'include'|'include_once'|'phpdoc'|'require'|'require_once'|'return'|'switch'|'throw'|'try'|'while'|'yield'|'yield_from'>, + * } */ final class BlankLineBeforeStatementFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** * @var array */ - private static array $tokenMap = [ + private const TOKEN_MAP = [ 'break' => T_BREAK, 'case' => T_CASE, 'continue' => T_CONTINUE, @@ -68,19 +81,6 @@ final class BlankLineBeforeStatementFixer extends AbstractFixer implements Confi */ private array $fixTokenMap = []; - public function configure(array $configuration): void - { - parent::configure($configuration); - - $this->fixTokenMap = []; - - foreach ($this->configuration['statements'] as $key) { - $this->fixTokenMap[$key] = self::$tokenMap[$key]; - } - - $this->fixTokenMap = array_values($this->fixTokenMap); - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -251,6 +251,17 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isAnyTokenKindsFound($this->fixTokenMap); } + protected function configurePostNormalisation(): void + { + $fixTokenMap = []; + + foreach ($this->configuration['statements'] as $key) { + $fixTokenMap[$key] = self::TOKEN_MAP[$key]; + } + + $this->fixTokenMap = array_values($fixTokenMap); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $analyzer = new TokensAnalyzer($tokens); @@ -285,8 +296,8 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('statements', 'List of statements which must be preceded by an empty line.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(array_keys(self::$tokenMap))]) + ->setAllowedTypes(['string[]']) + ->setAllowedValues([new AllowedValueSubset(array_keys(self::TOKEN_MAP))]) ->setDefault([ 'break', 'continue', diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBetweenImportGroupsFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBetweenImportGroupsFixer.php index 1976aefb3..7bd48ca64 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBetweenImportGroupsFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/BlankLineBetweenImportGroupsFixer.php @@ -111,7 +111,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } /** - * @param int[] $uses + * @param list $uses */ private function walkOverUses(Tokens $tokens, array $uses): void { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php index c526d6dd9..e68004565 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/HeredocIndentationFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -30,9 +31,21 @@ /** * @author Gregor Harlan + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * indentation?: 'same_as_start'|'start_plus_one', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * indentation: 'same_as_start'|'start_plus_one', + * } */ final class HeredocIndentationFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -72,7 +85,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run after BracesFixer, StatementIndentationFixer. + * Must run after BracesFixer, MultilineStringToHeredocFixer, StatementIndentationFixer. */ public function getPriority(): int { @@ -127,7 +140,9 @@ private function fixIndentation(Tokens $tokens, int $start, int $end): void return; } - for ($index = $end - 1, $last = true; $index > $start; --$index, $last = false) { + $index = $end - 1; + + for ($last = true; $index > $start; --$index, $last = false) { if (!$tokens[$index]->isGivenKind([T_ENCAPSED_AND_WHITESPACE, T_WHITESPACE])) { continue; } @@ -138,7 +153,7 @@ private function fixIndentation(Tokens $tokens, int $start, int $end): void $content = Preg::replace('/(?<=\v)(?!'.$currentIndent.')\h+/', '', $content); } - $regexEnd = $last && !$currentIndent ? '(?!\v|$)' : '(?!\v)'; + $regexEnd = $last && '' === $currentIndent ? '(?!\v|$)' : '(?!\v)'; $content = Preg::replace('/(?<=\v)'.$currentIndent.$regexEnd.'/', $indent, $content); $tokens[$index] = new Token([$tokens[$index]->getId(), $content]); @@ -154,9 +169,9 @@ private function fixIndentation(Tokens $tokens, int $start, int $end): void $content = $tokens[$index]->getContent(); - if (!\in_array($content[0], ["\r", "\n"], true) && (!$currentIndent || str_starts_with($content, $currentIndent))) { + if (!\in_array($content[0], ["\r", "\n"], true) && ('' === $currentIndent || str_starts_with($content, $currentIndent))) { $content = $indent.substr($content, $currentIndentLength); - } elseif ($currentIndent) { + } elseif ('' !== $currentIndent) { $content = Preg::replace('/^(?!'.$currentIndent.')\h+/', '', $content); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php index d88c74ba0..4d332cc13 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/IndentationTypeFixer.php @@ -30,10 +30,7 @@ */ final class IndentationTypeFixer extends AbstractFixer implements WhitespacesAwareFixerInterface { - /** - * @var string - */ - private $indent; + private string $indent; public function getDefinition(): FixerDefinitionInterface { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php index 2830246a5..58725fbe9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/MethodChainingIndentationFixer.php @@ -36,6 +36,16 @@ public function getDefinition(): FixerDefinitionInterface ); } + /** + * {@inheritdoc} + * + * Must run after NoSpaceAroundDoubleColonFixer. + */ + public function getPriority(): int + { + return 0; + } + public function isCandidate(Tokens $tokens): bool { return $tokens->isAnyTokenKindsFound(Token::getObjectOperatorKinds()); @@ -51,8 +61,12 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } $endParenthesisIndex = $tokens->getNextTokenOfKind($index, ['(', ';', ',', [T_CLOSE_TAG]]); + $previousEndParenthesisIndex = $tokens->getPrevTokenOfKind($index, [')']); - if (null === $endParenthesisIndex || !$tokens[$endParenthesisIndex]->equals('(')) { + if ( + null === $endParenthesisIndex + || !$tokens[$endParenthesisIndex]->equals('(') && null === $previousEndParenthesisIndex + ) { continue; } @@ -80,6 +94,10 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $tokens[$index - 1] = new Token([T_WHITESPACE, $lineEnding.$expectedIndent]); } + if (!$tokens[$endParenthesisIndex]->equals('(')) { + continue; + } + $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $endParenthesisIndex); for ($searchIndex = $index + 1; $searchIndex < $endParenthesisIndex; ++$searchIndex) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php index 996d13f1b..8ef559e7c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoExtraBlankLinesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; @@ -25,6 +26,7 @@ use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Analyzer\SwitchAnalyzer; use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; @@ -33,13 +35,25 @@ /** * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * tokens?: list<'attribute'|'break'|'case'|'continue'|'curly_brace_block'|'default'|'extra'|'parenthesis_brace_block'|'return'|'square_brace_block'|'switch'|'throw'|'use'|'use_trait'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * tokens: list<'attribute'|'break'|'case'|'continue'|'curly_brace_block'|'default'|'extra'|'parenthesis_brace_block'|'return'|'square_brace_block'|'switch'|'throw'|'use'|'use_trait'>, + * } */ final class NoExtraBlankLinesFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + /** - * @var string[] + * @var list */ - private static array $availableTokens = [ + private const AVAILABLE_TOKENS = [ 'attribute', 'break', 'case', @@ -57,12 +71,12 @@ final class NoExtraBlankLinesFixer extends AbstractFixer implements Configurable ]; /** - * @var array key is token id, value is name of callback + * @var array key is token id */ private array $tokenKindCallbackMap; /** - * @var array token prototype, value is name of callback + * @var array key is token's content */ private array $tokenEqualsMap; @@ -70,50 +84,6 @@ final class NoExtraBlankLinesFixer extends AbstractFixer implements Configurable private TokensAnalyzer $tokensAnalyzer; - public function configure(array $configuration): void - { - if (isset($configuration['tokens']) && \in_array('use_trait', $configuration['tokens'], true)) { - Utils::triggerDeprecation(new \RuntimeException('Option "tokens: use_trait" used in `no_extra_blank_lines` rule is deprecated, use the rule `class_attributes_separation` with `elements: trait_import` instead.')); - } - - parent::configure($configuration); - - $tokensConfiguration = $this->configuration['tokens']; - - $this->tokenEqualsMap = []; - - if (\in_array('curly_brace_block', $tokensConfiguration, true)) { - $this->tokenEqualsMap['{'] = 'fixStructureOpenCloseIfMultiLine'; // i.e. not: CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN - } - - if (\in_array('parenthesis_brace_block', $tokensConfiguration, true)) { - $this->tokenEqualsMap['('] = 'fixStructureOpenCloseIfMultiLine'; // i.e. not: CT::T_BRACE_CLASS_INSTANTIATION_OPEN - } - - static $configMap = [ - 'attribute' => [CT::T_ATTRIBUTE_CLOSE, 'fixAfterToken'], - 'break' => [T_BREAK, 'fixAfterToken'], - 'case' => [T_CASE, 'fixAfterCaseToken'], - 'continue' => [T_CONTINUE, 'fixAfterToken'], - 'default' => [T_DEFAULT, 'fixAfterToken'], - 'extra' => [T_WHITESPACE, 'removeMultipleBlankLines'], - 'return' => [T_RETURN, 'fixAfterToken'], - 'square_brace_block' => [CT::T_ARRAY_SQUARE_BRACE_OPEN, 'fixStructureOpenCloseIfMultiLine'], - 'switch' => [T_SWITCH, 'fixAfterToken'], - 'throw' => [T_THROW, 'fixAfterThrowToken'], - 'use' => [T_USE, 'removeBetweenUse'], - 'use_trait' => [CT::T_USE_TRAIT, 'removeBetweenUse'], - ]; - - $this->tokenKindCallbackMap = []; - - foreach ($tokensConfiguration as $config) { - if (isset($configMap[$config])) { - $this->tokenKindCallbackMap[$configMap[$config][0]] = $configMap[$config][1]; - } - } - } - public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -267,6 +237,55 @@ public function isCandidate(Tokens $tokens): bool return true; } + /** + * @param _AutogeneratedInputConfiguration $configuration + */ + protected function configurePreNormalisation(array $configuration): void + { + if (isset($configuration['tokens']) && \in_array('use_trait', $configuration['tokens'], true)) { + Utils::triggerDeprecation(new \RuntimeException('Option "tokens: use_trait" used in `no_extra_blank_lines` rule is deprecated, use the rule `class_attributes_separation` with `elements: trait_import` instead.')); + } + } + + protected function configurePostNormalisation(): void + { + $tokensConfiguration = $this->configuration['tokens']; + + $this->tokenEqualsMap = []; + + if (\in_array('curly_brace_block', $tokensConfiguration, true)) { + $this->tokenEqualsMap['{'] = [$this, 'fixStructureOpenCloseIfMultiLine']; // i.e. not: CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN + } + + if (\in_array('parenthesis_brace_block', $tokensConfiguration, true)) { + $this->tokenEqualsMap['('] = [$this, 'fixStructureOpenCloseIfMultiLine']; // i.e. not: CT::T_BRACE_CLASS_INSTANTIATION_OPEN + } + + // Each item requires explicit array-like callable, otherwise PHPStan will complain about unused private methods. + $configMap = [ + 'attribute' => [CT::T_ATTRIBUTE_CLOSE, [$this, 'fixAfterToken']], + 'break' => [T_BREAK, [$this, 'fixAfterToken']], + 'case' => [T_CASE, [$this, 'fixAfterCaseToken']], + 'continue' => [T_CONTINUE, [$this, 'fixAfterToken']], + 'default' => [T_DEFAULT, [$this, 'fixAfterToken']], + 'extra' => [T_WHITESPACE, [$this, 'removeMultipleBlankLines']], + 'return' => [T_RETURN, [$this, 'fixAfterToken']], + 'square_brace_block' => [CT::T_ARRAY_SQUARE_BRACE_OPEN, [$this, 'fixStructureOpenCloseIfMultiLine']], + 'switch' => [T_SWITCH, [$this, 'fixAfterToken']], + 'throw' => [T_THROW, [$this, 'fixAfterThrowToken']], + 'use' => [T_USE, [$this, 'removeBetweenUse']], + 'use_trait' => [CT::T_USE_TRAIT, [$this, 'removeBetweenUse']], + ]; + + $this->tokenKindCallbackMap = []; + + foreach ($tokensConfiguration as $config) { + if (isset($configMap[$config])) { + $this->tokenKindCallbackMap[$configMap[$config][0]] = $configMap[$config][1]; + } + } + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $this->tokens = $tokens; @@ -281,13 +300,21 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('tokens', 'List of tokens to fix.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(self::$availableTokens)]) + ->setAllowedTypes(['string[]']) + ->setAllowedValues([new AllowedValueSubset(self::AVAILABLE_TOKENS)]) ->setDefault(['extra']) ->getOption(), ]); } + /** + * @uses fixAfterToken() + * @uses fixAfterCaseToken() + * @uses fixAfterThrowToken() + * @uses fixStructureOpenCloseIfMultiLine() + * @uses removeBetweenUse() + * @uses removeMultipleBlankLines() + */ private function fixByToken(Token $token, int $index): void { foreach ($this->tokenKindCallbackMap as $kind => $callback) { @@ -295,7 +322,7 @@ private function fixByToken(Token $token, int $index): void continue; } - $this->{$callback}($index); + \call_user_func_array($this->tokenKindCallbackMap[$token->getId()], [$index]); return; } @@ -305,7 +332,7 @@ private function fixByToken(Token $token, int $index): void continue; } - $this->{$callback}($index); + \call_user_func_array($this->tokenEqualsMap[$token->getContent()], [$index]); return; } @@ -374,9 +401,17 @@ private function fixAfterCaseToken(int $index): void private function fixAfterThrowToken(int $index): void { - if ($this->tokens[$this->tokens->getPrevMeaningfulToken($index)]->equalsAny([';', '{', '}', ':', [T_OPEN_TAG]])) { - $this->fixAfterToken($index); + $prevIndex = $this->tokens->getPrevMeaningfulToken($index); + + if (!$this->tokens[$prevIndex]->equalsAny([';', '{', '}', ':', [T_OPEN_TAG]])) { + return; } + + if ($this->tokens[$prevIndex]->equals(':') && !SwitchAnalyzer::belongsToSwitch($this->tokens, $prevIndex)) { + return; + } + + $this->fixAfterToken($index); } /** diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php index b3a0849f6..d6ffd2d94 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoSpacesAroundOffsetFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -28,9 +29,21 @@ /** * @author Javier Spagnoletti + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * positions?: list<'inside'|'outside'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * positions: list<'inside'|'outside'>, + * } */ final class NoSpacesAroundOffsetFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -90,7 +103,7 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn return new FixerConfigurationResolver([ (new FixerOptionBuilder('positions', 'Whether spacing should be fixed inside and/or outside the offset braces.')) - ->setAllowedTypes(['array']) + ->setAllowedTypes(['string[]']) ->setAllowedValues([new AllowedValueSubset($values)]) ->setDefault($values) ->getOption(), diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php index c21ff39f9..e05a9fdd0 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoTrailingWhitespaceFixer.php @@ -76,7 +76,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - $lines = Preg::split('/(\\R+)/', $token->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE); + $lines = Preg::split('/(\R+)/', $token->getContent(), -1, PREG_SPLIT_DELIM_CAPTURE); $linesSize = \count($lines); // fix only multiline whitespaces or singleline whitespaces at the end of file diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php index 60217e170..352ce7a85 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/NoWhitespaceInBlankLineFixer.php @@ -38,7 +38,7 @@ public function getDefinition(): FixerDefinitionInterface /** * {@inheritdoc} * - * Must run after AssignNullCoalescingToCoalesceEqualFixer, CombineConsecutiveIssetsFixer, CombineConsecutiveUnsetsFixer, FunctionToConstantFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoEmptyStatementFixer, NoUselessElseFixer, NoUselessReturnFixer, YieldFromArrayToYieldsFixer. + * Must run after AssignNullCoalescingToCoalesceEqualFixer, CombineConsecutiveIssetsFixer, CombineConsecutiveUnsetsFixer, FunctionToConstantFixer, NoEmptyCommentFixer, NoEmptyStatementFixer, NoUselessElseFixer, NoUselessReturnFixer, YieldFromArrayToYieldsFixer. */ public function getPriority(): int { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SpacesInsideParenthesesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SpacesInsideParenthesesFixer.php index cf862876f..cc49d808f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SpacesInsideParenthesesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/SpacesInsideParenthesesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -31,9 +32,21 @@ * * @author Marc Aubé * @author Dariusz Rumiński + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * space?: 'none'|'single', + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * space: 'none'|'single', + * } */ final class SpacesInsideParenthesesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -76,14 +89,14 @@ public function getPriority(): int public function isCandidate(Tokens $tokens): bool { - return $tokens->isTokenKindFound('('); + return $tokens->isAnyTokenKindsFound(['(', CT::T_BRACE_CLASS_INSTANTIATION_OPEN]); } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { if ('none' === $this->configuration['space']) { foreach ($tokens as $index => $token) { - if (!$token->equals('(')) { + if (!$token->equalsAny(['(', [CT::T_BRACE_CLASS_INSTANTIATION_OPEN]])) { continue; } @@ -94,7 +107,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); + $blockType = Tokens::detectBlockType($tokens[$index]); + $endIndex = $tokens->findBlockEnd($blockType['type'], $index); // remove space after opening `(` if (!$tokens[$tokens->getNextNonWhitespace($index)]->isComment()) { @@ -110,11 +124,12 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void if ('single' === $this->configuration['space']) { foreach ($tokens as $index => $token) { - if (!$token->equals('(')) { + if (!$token->equalsAny(['(', [CT::T_BRACE_CLASS_INSTANTIATION_OPEN]])) { continue; } - $endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); + $blockType = Tokens::detectBlockType($tokens[$index]); + $endParenthesisIndex = $tokens->findBlockEnd($blockType['type'], $index); // if not other content than spaces in block remove spaces $blockContent = $this->getBlockContent($index, $endParenthesisIndex, $tokens); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/StatementIndentationFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/StatementIndentationFixer.php index d22d50dd4..5e1ec41d9 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/StatementIndentationFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/StatementIndentationFixer.php @@ -15,8 +15,13 @@ namespace PhpCsFixer\Fixer\Whitespace; use PhpCsFixer\AbstractFixer; +use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\Fixer\Indentation; use PhpCsFixer\Fixer\WhitespacesAwareFixerInterface; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; +use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; +use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; @@ -26,8 +31,21 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; -final class StatementIndentationFixer extends AbstractFixer implements WhitespacesAwareFixerInterface +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * stick_comment_to_next_continuous_control_statement?: bool, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * stick_comment_to_next_continuous_control_statement: bool, + * } + */ +final class StatementIndentationFixer extends AbstractFixer implements ConfigurableFixerInterface, WhitespacesAwareFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + use Indentation; private AlternativeSyntaxAnalyzer $alternativeSyntaxAnalyzer; @@ -56,6 +74,35 @@ public function getDefinition(): FixerDefinitionInterface } ' ), + new CodeSample( + ' false] + ), + new CodeSample( + ' true] + ), ] ); } @@ -64,7 +111,7 @@ public function getDefinition(): FixerDefinitionInterface * {@inheritdoc} * * Must run before HeredocIndentationFixer. - * Must run after BracesPositionFixer, ClassAttributesSeparationFixer, CurlyBracesPositionFixer, MethodArgumentSpaceFixer, NoUselessElseFixer, YieldFromArrayToYieldsFixer. + * Must run after BracesPositionFixer, ClassAttributesSeparationFixer, CurlyBracesPositionFixer, FullyQualifiedStrictTypesFixer, GlobalNamespaceImportFixer, MethodArgumentSpaceFixer, NoUselessElseFixer, YieldFromArrayToYieldsFixer. */ public function getPriority(): int { @@ -76,6 +123,16 @@ public function isCandidate(Tokens $tokens): bool return true; } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface + { + return new FixerConfigurationResolver([ + (new FixerOptionBuilder('stick_comment_to_next_continuous_control_statement', 'Last comment of code block counts as comment for next block.')) + ->setAllowedTypes(['bool']) + ->setDefault(false) + ->getOption(), + ]); + } + protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { $this->alternativeSyntaxAnalyzer = new AlternativeSyntaxAnalyzer(); @@ -88,6 +145,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void T_FOR, T_FOREACH, T_WHILE, + T_DO, T_SWITCH, T_CASE, T_DEFAULT, @@ -97,12 +155,22 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void T_TRAIT, T_EXTENDS, T_IMPLEMENTS, + T_CONST, + ]; + $controlStructurePossibiblyWithoutBracesTokens = [ + T_IF, + T_ELSE, + T_ELSEIF, + T_FOR, + T_FOREACH, + T_WHILE, + T_DO, ]; if (\defined('T_MATCH')) { // @TODO: drop condition when PHP 8.0+ is required $blockSignatureFirstTokens[] = T_MATCH; } - $blockFirstTokens = ['{', [CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN], [CT::T_USE_TRAIT], [CT::T_GROUP_IMPORT_BRACE_OPEN]]; + $blockFirstTokens = ['{', [CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN], [CT::T_USE_TRAIT], [CT::T_GROUP_IMPORT_BRACE_OPEN], [CT::T_PROPERTY_HOOK_BRACE_OPEN]]; if (\defined('T_ATTRIBUTE')) { // @TODO: drop condition when PHP 8.0+ is required $blockFirstTokens[] = [T_ATTRIBUTE]; } @@ -118,20 +186,6 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $this->extractIndent($this->computeNewLineContent($tokens, 0)), ); - $methodModifierTokens = [ - // https://github.com/php/php-langspec/blob/master/spec/19-grammar.md#grammar-visibility-modifier - T_PUBLIC, - T_PROTECTED, - T_PRIVATE, - // https://github.com/php/php-langspec/blob/master/spec/19-grammar.md#grammar-static-modifier - T_STATIC, - // https://github.com/php/php-langspec/blob/master/spec/19-grammar.md#grammar-class-modifier - T_ABSTRACT, - T_FINAL, - ]; - - $methodModifierIndents = []; - /** * @var list $scopes */ @@ -155,12 +210,25 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $previousLineInitialIndent = ''; $previousLineNewIndent = ''; + $noBracesBlockStarts = []; $alternativeBlockStarts = []; $caseBlockStarts = []; foreach ($tokens as $index => $token) { $currentScope = \count($scopes) - 1; + if (isset($noBracesBlockStarts[$index])) { + $scopes[] = [ + 'type' => 'block', + 'skip' => false, + 'end_index' => $this->findStatementEndIndex($tokens, $index, \count($tokens) - 1) + 1, + 'end_index_inclusive' => true, + 'initial_indent' => $this->getLineIndentationWithBracesCompatibility($tokens, $index, $lastIndent), + 'is_indented_block' => true, + ]; + ++$currentScope; + } + if ( $token->equalsAny($blockFirstTokens) || ($token->equals('(') && !$tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_ARRAY)) @@ -176,7 +244,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void } elseif ($token->equals(':')) { if (isset($caseBlockStarts[$index])) { [$endIndex, $endIndexInclusive] = $this->findCaseBlockEnd($tokens, $index); - } else { + } elseif ($this->alternativeSyntaxAnalyzer->belongsToAlternativeSyntax($tokens, $index)) { $endIndex = $this->alternativeSyntaxAnalyzer->findAlternativeSyntaxBlockEnd($tokens, $alternativeBlockStarts[$index]); } } elseif ($token->isGivenKind(CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN)) { @@ -187,6 +255,8 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index); } elseif ($token->equals('(')) { $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); + } elseif ($token->isGivenKind(CT::T_PROPERTY_HOOK_BRACE_OPEN)) { + $endIndex = $tokens->getNextTokenOfKind($index, [[CT::T_PROPERTY_HOOK_BRACE_CLOSE]]); } else { $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $index); } @@ -227,19 +297,45 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void continue; } - if ($token->isGivenKind($blockSignatureFirstTokens)) { + if ( + $token->isGivenKind(CT::T_ARRAY_SQUARE_BRACE_OPEN) + || ($token->equals('(') && $tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_ARRAY)) + ) { + $blockType = $token->equals('(') ? Tokens::BLOCK_TYPE_PARENTHESIS_BRACE : Tokens::BLOCK_TYPE_ARRAY_SQUARE_BRACE; + + $scopes[] = [ + 'type' => 'statement', + 'skip' => true, + 'end_index' => $tokens->findBlockEnd($blockType, $index), + 'end_index_inclusive' => true, + 'initial_indent' => $previousLineInitialIndent, + 'new_indent' => $previousLineNewIndent, + 'is_indented_block' => false, + ]; + + continue; + } + + $isPropertyStart = $this->isPropertyStart($tokens, $index); + if ($isPropertyStart || $token->isGivenKind($blockSignatureFirstTokens)) { + $lastWhitespaceIndex = null; + $closingParenthesisIndex = null; + for ($endIndex = $index + 1, $max = \count($tokens); $endIndex < $max; ++$endIndex) { - if ($tokens[$endIndex]->equals('(')) { - $endIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $endIndex); + $endToken = $tokens[$endIndex]; + + if ($endToken->equals('(')) { + $closingParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $endIndex); + $endIndex = $closingParenthesisIndex; continue; } - if ($tokens[$endIndex]->equalsAny(['{', ';', [T_DOUBLE_ARROW], [T_IMPLEMENTS]])) { + if ($endToken->equalsAny(['{', ';', [T_DOUBLE_ARROW], [T_IMPLEMENTS]])) { break; } - if ($tokens[$endIndex]->equals(':')) { + if ($endToken->equals(':')) { if ($token->isGivenKind([T_CASE, T_DEFAULT])) { $caseBlockStarts[$endIndex] = $index; } else { @@ -248,6 +344,25 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void break; } + + if (!$token->isGivenKind($controlStructurePossibiblyWithoutBracesTokens)) { + continue; + } + + if ($endToken->isWhitespace()) { + $lastWhitespaceIndex = $endIndex; + + continue; + } + + if (!$endToken->isComment()) { + $noBraceBlockStartIndex = $lastWhitespaceIndex ?? $endIndex; + $noBracesBlockStarts[$noBraceBlockStartIndex] = true; + + $endIndex = $closingParenthesisIndex ?? $index; + + break; + } } $scopes[] = [ @@ -256,30 +371,13 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void 'end_index' => $endIndex, 'end_index_inclusive' => true, 'initial_indent' => $this->getLineIndentationWithBracesCompatibility($tokens, $index, $lastIndent), - 'is_indented_block' => $token->isGivenKind([T_EXTENDS, T_IMPLEMENTS]), + 'is_indented_block' => $isPropertyStart || $token->isGivenKind([T_EXTENDS, T_IMPLEMENTS, T_CONST]), ]; continue; } - if ($token->isGivenKind($methodModifierTokens)) { - $methodModifierIndents[$index] = $lastIndent; - - continue; - } - if ($token->isGivenKind(T_FUNCTION)) { - $x = $tokens->getPrevMeaningfulToken($index); - while ( - null !== $x - && $tokens[$x]->isGivenKind($methodModifierTokens) - && \array_key_exists($x, $methodModifierIndents) - ) { - $lastIndent = $methodModifierIndents[$x]; - $x = $tokens->getPrevMeaningfulToken($x); - } - - $methodModifierIndents = []; $endIndex = $index + 1; for ($max = \count($tokens); $endIndex < $max; ++$endIndex) { @@ -300,7 +398,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void 'end_index' => $endIndex, 'end_index_inclusive' => true, 'initial_indent' => $this->getLineIndentationWithBracesCompatibility($tokens, $index, $lastIndent), - 'is_indented_block' => $token->isGivenKind([T_EXTENDS, T_IMPLEMENTS]), + 'is_indented_block' => false, ]; continue; @@ -383,7 +481,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void $nextNextIndex = $tokens->getNextMeaningfulToken($nextIndex); if (null !== $nextNextIndex && $tokens[$nextNextIndex]->isGivenKind([T_ELSE, T_ELSEIF])) { - $indent = false; + $indent = true !== $this->configuration['stick_comment_to_next_continuous_control_statement']; } else { $indent = true; } @@ -477,6 +575,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void 'end_index_inclusive' => false, 'initial_indent' => $previousLineInitialIndent, 'new_indent' => $previousLineNewIndent, + 'is_indented_block' => true, ]; } } @@ -486,9 +585,26 @@ private function findStatementEndIndex(Tokens $tokens, int $index, int $parentSc { $endIndex = null; + $ifLevel = 0; + $doWhileLevel = 0; for ($searchEndIndex = $index; $searchEndIndex <= $parentScopeEndIndex; ++$searchEndIndex) { $searchEndToken = $tokens[$searchEndIndex]; + if ( + $searchEndToken->isGivenKind(T_IF) + && !$tokens[$tokens->getPrevMeaningfulToken($searchEndIndex)]->isGivenKind(T_ELSE) + ) { + ++$ifLevel; + + continue; + } + + if ($searchEndToken->isGivenKind(T_DO)) { + ++$doWhileLevel; + + continue; + } + if ($searchEndToken->equalsAny(['(', '{', [CT::T_ARRAY_SQUARE_BRACE_OPEN]])) { if ($searchEndToken->equals('(')) { $blockType = Tokens::BLOCK_TYPE_PARENTHESIS_BRACE; @@ -499,15 +615,46 @@ private function findStatementEndIndex(Tokens $tokens, int $index, int $parentSc } $searchEndIndex = $tokens->findBlockEnd($blockType, $searchEndIndex); + $searchEndToken = $tokens[$searchEndIndex]; + } + if (!$searchEndToken->equalsAny([';', ',', '}', [T_CLOSE_TAG]])) { continue; } - if ($searchEndToken->equalsAny([';', ',', '}', [T_CLOSE_TAG]])) { - $endIndex = $tokens->getPrevNonWhitespace($searchEndIndex); + $controlStructureContinuationIndex = $tokens->getNextMeaningfulToken($searchEndIndex); - break; + if ( + $ifLevel > 0 + && null !== $controlStructureContinuationIndex + && $tokens[$controlStructureContinuationIndex]->isGivenKind([T_ELSE, T_ELSEIF]) + ) { + if ( + $tokens[$controlStructureContinuationIndex]->isGivenKind(T_ELSE) + && !$tokens[$tokens->getNextMeaningfulToken($controlStructureContinuationIndex)]->isGivenKind(T_IF) + ) { + --$ifLevel; + } + + $searchEndIndex = $controlStructureContinuationIndex; + + continue; } + + if ( + $doWhileLevel > 0 + && null !== $controlStructureContinuationIndex + && $tokens[$controlStructureContinuationIndex]->isGivenKind([T_WHILE]) + ) { + --$doWhileLevel; + $searchEndIndex = $controlStructureContinuationIndex; + + continue; + } + + $endIndex = $tokens->getPrevNonWhitespace($searchEndIndex); + + break; } return $endIndex ?? $tokens->getPrevMeaningfulToken($parentScopeEndIndex); @@ -570,6 +717,37 @@ private function getLineIndentationWithBracesCompatibility(Tokens $tokens, int $ return $regularIndent; } + /** + * Returns whether the token at given index is the last token in a property + * declaration before the type or the name of that property. + */ + private function isPropertyStart(Tokens $tokens, int $index): bool + { + $propertyKeywords = [T_VAR, T_PUBLIC, T_PROTECTED, T_PRIVATE, T_STATIC]; + if (\defined('T_READONLY')) { // @TODO: drop condition when PHP 8.1+ is required + $propertyKeywords[] = T_READONLY; + } + + $nextIndex = $tokens->getNextMeaningfulToken($index); + if ( + null === $nextIndex + || $tokens[$nextIndex]->isGivenKind($propertyKeywords) + || $tokens[$nextIndex]->isGivenKind([T_CONST, T_FUNCTION]) + ) { + return false; + } + + while ($tokens[$index]->isGivenKind($propertyKeywords)) { + if ($tokens[$index]->isGivenKind([T_VAR, T_PUBLIC, T_PROTECTED, T_PRIVATE])) { + return true; + } + + $index = $tokens->getPrevMeaningfulToken($index); + } + + return false; + } + /** * Returns whether the token at given index is a comment whose indentation * can be fixed. @@ -596,22 +774,22 @@ private function isCommentWithFixableIndentation(Tokens $tokens, int $index): bo $firstCommentIndex = $index; while (true) { - $i = $this->getSiblingContinuousSingleLineComment($tokens, $firstCommentIndex, false); - if (null === $i) { + $firstCommentCandidateIndex = $this->getSiblingContinuousSingleLineComment($tokens, $firstCommentIndex, false); + if (null === $firstCommentCandidateIndex) { break; } - $firstCommentIndex = $i; + $firstCommentIndex = $firstCommentCandidateIndex; } $lastCommentIndex = $index; while (true) { - $i = $this->getSiblingContinuousSingleLineComment($tokens, $lastCommentIndex, true); - if (null === $i) { + $lastCommentCandidateIndex = $this->getSiblingContinuousSingleLineComment($tokens, $lastCommentIndex, true); + if (null === $lastCommentCandidateIndex) { break; } - $lastCommentIndex = $i; + $lastCommentIndex = $lastCommentCandidateIndex; } if ($firstCommentIndex === $lastCommentIndex) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypeDeclarationSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypeDeclarationSpacesFixer.php index 29cd7f5ab..801bbb16d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypeDeclarationSpacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypeDeclarationSpacesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\AllowedValueSubset; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; @@ -23,6 +24,8 @@ use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\FixerDefinition\VersionSpecification; +use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample; use PhpCsFixer\Tokenizer\Analyzer\Analysis\TypeAnalysis; use PhpCsFixer\Tokenizer\Analyzer\FunctionsAnalyzer; use PhpCsFixer\Tokenizer\Token; @@ -32,9 +35,21 @@ /** * @author Dariusz Rumiński * @author John Paul E. Balandan, CPA + * + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * elements?: list<'constant'|'function'|'property'>, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * elements: list<'constant'|'function'|'property'>, + * } */ final class TypeDeclarationSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface { + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; + public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( @@ -76,6 +91,16 @@ public function baz(string $a) {} ', ['elements' => ['property']] ), + new VersionSpecificCodeSample( + ' ['constant']] + ), ] ); } @@ -89,9 +114,9 @@ protected function createConfigurationDefinition(): FixerConfigurationResolverIn { return new FixerConfigurationResolver([ (new FixerOptionBuilder('elements', 'Structural elements where the spacing after the type declaration should be fixed.')) - ->setAllowedTypes(['array']) - ->setAllowedValues([new AllowedValueSubset(['function', 'property'])]) - ->setDefault(['function', 'property']) + ->setAllowedTypes(['string[]']) + ->setAllowedValues([new AllowedValueSubset(['function', 'property', 'constant'])]) + ->setDefault(['function', 'property']) // @TODO add 'constant' on next major 4.0 ->getOption(), ]); } @@ -110,6 +135,12 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void if ('method' === $type && \in_array('function', $this->configuration['elements'], true)) { $this->ensureSingleSpaceAtFunctionArgumentTypehint($functionsAnalyzer, $tokens, $index); + continue; + } + + if ('const' === $type && \in_array('constant', $this->configuration['elements'], true)) { + $this->ensureSingleSpaceAtConstantTypehint($tokens, $index); + // implicit continue; } } @@ -118,7 +149,7 @@ protected function applyFix(\SplFileInfo $file, Tokens $tokens): void /** * @return array * - * @phpstan-return array + * @phpstan-return array */ private function getElements(Tokens $tokens): array { @@ -128,7 +159,7 @@ private function getElements(Tokens $tokens): array static fn (array $element): string => $element['type'], array_filter( $tokensAnalyzer->getClassyElements(), - static fn (array $element): bool => \in_array($element['type'], ['method', 'property'], true) + static fn (array $element): bool => \in_array($element['type'], ['method', 'property', 'const'], true) ) ); @@ -179,6 +210,30 @@ private function ensureSingleSpaceAtPropertyTypehint(Tokens $tokens, int $index) $tokens->ensureWhitespaceAtIndex($propertyType->getEndIndex() + 1, 0, ' '); } + private function ensureSingleSpaceAtConstantTypehint(Tokens $tokens, int $index): void + { + $constIndex = $index; + $equalsIndex = $tokens->getNextTokenOfKind($constIndex, ['=']); + + if (null === $equalsIndex) { + return; + } + + $nameIndex = $tokens->getPrevMeaningfulToken($equalsIndex); + + if (!$tokens[$nameIndex]->isGivenKind(T_STRING)) { + return; + } + + $typeEndIndex = $tokens->getPrevMeaningfulToken($nameIndex); + + if (null === $typeEndIndex || $tokens[$typeEndIndex]->isGivenKind(T_CONST)) { + return; + } + + $tokens->ensureWhitespaceAtIndex($typeEndIndex + 1, 0, ' '); + } + private function collectTypeAnalysis(Tokens $tokens, int $startIndex, int $endIndex): ?TypeAnalysis { $type = ''; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php index 72d8e77e3..f8df42744 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Fixer/Whitespace/TypesSpacesFixer.php @@ -16,6 +16,7 @@ use PhpCsFixer\AbstractFixer; use PhpCsFixer\Fixer\ConfigurableFixerInterface; +use PhpCsFixer\Fixer\ConfigurableFixerTrait; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver; use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface; use PhpCsFixer\FixerConfiguration\FixerOptionBuilder; @@ -29,16 +30,22 @@ use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; +/** + * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> + * + * @phpstan-type _AutogeneratedInputConfiguration array{ + * space?: 'none'|'single', + * space_multiple_catch?: 'none'|'single'|null, + * } + * @phpstan-type _AutogeneratedComputedConfiguration array{ + * space: 'none'|'single', + * space_multiple_catch: 'none'|'single'|null, + * } + */ final class TypesSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface { - public function configure(array $configuration): void - { - parent::configure($configuration); - - if (!isset($this->configuration['space_multiple_catch'])) { - $this->configuration['space_multiple_catch'] = $this->configuration['space']; - } - } + /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */ + use ConfigurableFixerTrait; public function getDefinition(): FixerDefinitionInterface { @@ -75,6 +82,16 @@ public function isCandidate(Tokens $tokens): bool return $tokens->isAnyTokenKindsFound([CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION]); } + protected function configurePostNormalisation(): void + { + if (!isset($this->configuration['space_multiple_catch'])) { + $this->configuration = [ + 'space' => $this->configuration['space'], + 'space_multiple_catch' => $this->configuration['space'], + ]; + } + } + protected function createConfigurationDefinition(): FixerConfigurationResolverInterface { return new FixerConfigurationResolver([ diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php index 65a7a3b3c..87f2eac48 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOption.php @@ -17,6 +17,8 @@ /** * @author ntzm * + * @readonly + * * @internal */ final class AliasedFixerOption implements FixerOptionInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php index 13bb3faae..a602549ee 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AliasedFixerOptionBuilder.php @@ -52,7 +52,7 @@ public function setAllowedTypes(array $allowedTypes): self } /** - * @param list $allowedValues + * @param non-empty-list $allowedValues */ public function setAllowedValues(array $allowedValues): self { diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php index fad56516e..4f3289748 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/AllowedValueSubset.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\FixerConfiguration; /** + * @readonly + * * @internal */ final class AllowedValueSubset @@ -29,8 +31,8 @@ final class AllowedValueSubset */ public function __construct(array $allowedValues) { + sort($allowedValues, SORT_FLAG_CASE | SORT_STRING); $this->allowedValues = $allowedValues; - sort($this->allowedValues, SORT_FLAG_CASE | SORT_STRING); } /** diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php index 7224a673d..c2ea366af 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/DeprecatedFixerOption.php @@ -14,6 +14,9 @@ namespace PhpCsFixer\FixerConfiguration; +/** + * @readonly + */ final class DeprecatedFixerOption implements DeprecatedFixerOptionInterface { private FixerOptionInterface $option; @@ -41,6 +44,9 @@ public function hasDefault(): bool return $this->option->hasDefault(); } + /** + * @return mixed + */ public function getDefault() { return $this->option->getDefault(); diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php index ea073f25b..246111443 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerConfigurationResolver.php @@ -14,21 +14,22 @@ namespace PhpCsFixer\FixerConfiguration; +use PhpCsFixer\Preg; use PhpCsFixer\Utils; use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; use Symfony\Component\OptionsResolver\OptionsResolver; +/** + * @readonly + */ final class FixerConfigurationResolver implements FixerConfigurationResolverInterface { /** * @var list + * + * @readonly */ - private array $options = []; - - /** - * @var list - */ - private array $registeredNames = []; + private array $options; /** * @param iterable $options @@ -36,12 +37,11 @@ final class FixerConfigurationResolver implements FixerConfigurationResolverInte public function __construct(iterable $options) { $fixerOptionSorter = new FixerOptionSorter(); + $this->validateOptions($options); - foreach ($fixerOptionSorter->sort($options) as $option) { - $this->addOption($option); - } + $this->options = $fixerOptionSorter->sort($options); - if (0 === \count($this->registeredNames)) { + if (0 === \count($this->options)) { throw new \LogicException('Options cannot be empty.'); } } @@ -63,10 +63,10 @@ public function resolve(array $configuration): array if (\array_key_exists($alias, $configuration)) { if (\array_key_exists($name, $configuration)) { - throw new InvalidOptionsException(sprintf('Aliased option "%s"/"%s" is passed multiple times.', $name, $alias)); + throw new InvalidOptionsException(\sprintf('Aliased option "%s"/"%s" is passed multiple times.', $name, $alias)); } - Utils::triggerDeprecation(new \RuntimeException(sprintf( + Utils::triggerDeprecation(new \RuntimeException(\sprintf( 'Option "%s" is deprecated, use "%s" instead.', $alias, $name @@ -96,7 +96,29 @@ public function resolve(array $configuration): array $allowedTypes = $option->getAllowedTypes(); if (null !== $allowedTypes) { - $resolver->setAllowedTypes($name, $allowedTypes); + $allowedTypesNormalised = array_map( + static function (string $type): string { + // Symfony OptionsResolver doesn't support `array` natively, let's simplify the type + $matches = []; + if (true === Preg::match('/array<\w+,\s*(\??[\w\'|]+)>/', $type, $matches)) { + if ('?' === $matches[1][0]) { + return 'array'; + } + + if ("'" === $matches[1][0]) { + return 'string[]'; + } + + return $matches[1].'[]'; + } + + // Symfony OptionsResolver doesn't support 'class-string' natively, let's simplify the type + return str_replace('class-string', 'string', $type); + }, + $allowedTypes, + ); + + $resolver->setAllowedTypes($name, $allowedTypesNormalised); } $normalizer = $option->getNormalizer(); @@ -109,17 +131,22 @@ public function resolve(array $configuration): array } /** + * @param iterable $options + * * @throws \LogicException when the option is already defined */ - private function addOption(FixerOptionInterface $option): void + private function validateOptions(iterable $options): void { - $name = $option->getName(); + $names = []; - if (\in_array($name, $this->registeredNames, true)) { - throw new \LogicException(sprintf('The "%s" option is defined multiple times.', $name)); - } + foreach ($options as $option) { + $name = $option->getName(); - $this->options[] = $option; - $this->registeredNames[] = $name; + if (\in_array($name, $names, true)) { + throw new \LogicException(\sprintf('The "%s" option is defined multiple times.', $name)); + } + + $names[] = $name; + } } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php index 2866bdc1b..dd88e72c3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOption.php @@ -14,6 +14,9 @@ namespace PhpCsFixer\FixerConfiguration; +/** + * @readonly + */ final class FixerOption implements FixerOptionInterface { private string $name; @@ -30,22 +33,19 @@ final class FixerOption implements FixerOptionInterface /** * @var null|list */ - private $allowedTypes; + private ?array $allowedTypes; /** - * @var null|list + * @var null|non-empty-list */ - private $allowedValues; + private ?array $allowedValues; - /** - * @var null|\Closure - */ - private $normalizer; + private ?\Closure $normalizer; /** - * @param mixed $default - * @param null|list $allowedTypes - * @param null|list $allowedValues + * @param mixed $default + * @param null|list $allowedTypes + * @param null|non-empty-list $allowedValues */ public function __construct( string $name, @@ -77,6 +77,8 @@ public function __construct( if (null !== $normalizer) { $this->normalizer = $this->unbind($normalizer); + } else { + $this->normalizer = null; } } @@ -95,6 +97,9 @@ public function hasDefault(): bool return !$this->isRequired; } + /** + * @return mixed + */ public function getDefault() { if (!$this->hasDefault()) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php index 307518dca..b2a652a86 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionBuilder.php @@ -21,7 +21,7 @@ final class FixerOptionBuilder private string $description; /** - * @var mixed + * @var null|mixed */ private $default; @@ -30,27 +30,22 @@ final class FixerOptionBuilder /** * @var null|list */ - private $allowedTypes; + private ?array $allowedTypes = null; /** - * @var null|list + * @var null|non-empty-list */ - private $allowedValues; + private ?array $allowedValues = null; - /** - * @var null|\Closure - */ - private $normalizer; + private ?\Closure $normalizer = null; - /** - * @var null|string - */ - private $deprecationMessage; + private ?string $deprecationMessage = null; public function __construct(string $name, string $description) { $this->name = $name; $this->description = $description; + $this->default = null; } /** @@ -79,7 +74,7 @@ public function setAllowedTypes(array $allowedTypes): self } /** - * @param list $allowedValues + * @param non-empty-list $allowedValues * * @return $this */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php index d760e4df9..43bc785a2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionInterface.php @@ -35,7 +35,7 @@ public function getDefault(); public function getAllowedTypes(): ?array; /** - * @return null|list + * @return null|non-empty-list */ public function getAllowedValues(): ?array; diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionSorter.php b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionSorter.php index 9cd385a45..bb5268748 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionSorter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerConfiguration/FixerOptionSorter.php @@ -30,7 +30,7 @@ public function sort(iterable $options): array $options = iterator_to_array($options, false); } - usort($options, static fn (FixerOptionInterface $a, FixerOptionInterface $b): int => strcmp($a->getName(), $b->getName())); + usort($options, static fn (FixerOptionInterface $a, FixerOptionInterface $b): int => $a->getName() <=> $b->getName()); return $options; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php index b0dd2feda..b705bb66f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/CodeSample.php @@ -16,6 +16,8 @@ /** * @author Dariusz Rumiński + * + * @readonly */ final class CodeSample implements CodeSampleInterface { diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php index effd0e529..8547737c7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FileSpecificCodeSample.php @@ -17,6 +17,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class FileSpecificCodeSample implements FileSpecificCodeSampleInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php index f4ae91597..8da7f3d1c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/FixerDefinition.php @@ -16,6 +16,8 @@ /** * @author Dariusz Rumiński + * + * @readonly */ final class FixerDefinition implements FixerDefinitionInterface { diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php index f4b981112..c27a8748d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecificCodeSample.php @@ -16,6 +16,8 @@ /** * @author Andreas Möller + * + * @readonly */ final class VersionSpecificCodeSample implements VersionSpecificCodeSampleInterface { diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php index 2910fe728..e33fa4aa7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerDefinition/VersionSpecification.php @@ -16,6 +16,8 @@ /** * @author Andreas Möller + * + * @readonly */ final class VersionSpecification implements VersionSpecificationInterface { diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php b/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php index 7ee99bf25..8b4223964 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php +++ b/vendor/friendsofphp/php-cs-fixer/src/FixerFactory.php @@ -83,25 +83,35 @@ public function registerBuiltInFixers(): self static $builtInFixers = null; if (null === $builtInFixers) { + /** @var list> */ $builtInFixers = []; + $finder = SymfonyFinder::create()->files() + ->in(__DIR__.'/Fixer') + ->exclude(['Internal']) + ->name('*Fixer.php') + ->depth(1) + ; + /** @var SplFileInfo $file */ - foreach (SymfonyFinder::create()->files()->in(__DIR__.'/Fixer')->name('*Fixer.php')->depth(1) as $file) { + foreach ($finder as $file) { $relativeNamespace = $file->getRelativePath(); - $fixerClass = 'PhpCsFixer\\Fixer\\'.('' !== $relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php'); + $fixerClass = 'PhpCsFixer\Fixer\\'.('' !== $relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php'); $builtInFixers[] = $fixerClass; } } foreach ($builtInFixers as $class) { - $this->registerFixer(new $class(), false); + /** @var FixerInterface */ + $fixer = new $class(); + $this->registerFixer($fixer, false); } return $this; } /** - * @param FixerInterface[] $fixers + * @param iterable $fixers * * @return $this */ @@ -122,11 +132,11 @@ public function registerFixer(FixerInterface $fixer, bool $isCustom): self $name = $fixer->getName(); if (isset($this->fixersByName[$name])) { - throw new \UnexpectedValueException(sprintf('Fixer named "%s" is already registered.', $name)); + throw new \UnexpectedValueException(\sprintf('Fixer named "%s" is already registered.', $name)); } if (!$this->nameValidator->isValid($name, $isCustom)) { - throw new \UnexpectedValueException(sprintf('Fixer named "%s" has invalid name.', $name)); + throw new \UnexpectedValueException(\sprintf('Fixer named "%s" has invalid name.', $name)); } $this->fixers[] = $fixer; @@ -149,7 +159,7 @@ public function useRuleSet(RuleSetInterface $ruleSet): self $fixerNames = array_keys($ruleSet->getRules()); foreach ($fixerNames as $name) { if (!\array_key_exists($name, $this->fixersByName)) { - throw new \UnexpectedValueException(sprintf('Rule "%s" does not exist.', $name)); + throw new \UnexpectedValueException(\sprintf('Rule "%s" does not exist.', $name)); } $fixer = $this->fixersByName[$name]; @@ -195,7 +205,7 @@ public function hasRule(string $name): bool } /** - * @return string[] + * @return list */ private function getFixersConflicts(FixerInterface $fixer): array { @@ -214,7 +224,7 @@ private function getFixersConflicts(FixerInterface $fixer): array } /** - * @param array $fixerConflicts + * @param array> $fixerConflicts */ private function generateConflictMessage(array $fixerConflicts): string { @@ -229,7 +239,7 @@ private function generateConflictMessage(array $fixerConflicts): string ); if (\count($report[$fixer]) > 0) { - $message .= sprintf("\n- \"%s\" with %s", $fixer, Utils::naturalLanguageJoin($report[$fixer])); + $message .= \sprintf("\n- \"%s\" with %s", $fixer, Utils::naturalLanguageJoin($report[$fixer])); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php b/vendor/friendsofphp/php-cs-fixer/src/Hasher.php similarity index 68% rename from vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php rename to vendor/friendsofphp/php-cs-fixer/src/Hasher.php index ec316615b..331f5dba8 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CodeHasher.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Hasher.php @@ -12,14 +12,14 @@ * with this source code in the file LICENSE. */ -namespace PhpCsFixer\Tokenizer; +namespace PhpCsFixer; /** * @author Dariusz Rumiński * * @internal */ -final class CodeHasher +final class Hasher { private function __construct() { @@ -27,10 +27,12 @@ private function __construct() } /** - * Calculate hash for code. + * @return non-empty-string */ - public static function calculateCodeHash(string $code): string + public static function calculate(string $code): string { - return md5($code); + return \PHP_VERSION_ID >= 8_01_00 + ? hash('xxh128', $code) + : md5($code); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php b/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php index b4942d93d..ed82aaa2a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Indicator/PhpUnitTestCaseIndicator.php @@ -25,7 +25,7 @@ final class PhpUnitTestCaseIndicator public function isPhpUnitClass(Tokens $tokens, int $index): bool { if (!$tokens[$index]->isGivenKind(T_CLASS)) { - throw new \LogicException(sprintf('No "T_CLASS" at given index %d, got "%s".', $index, $tokens[$index]->getName())); + throw new \LogicException(\sprintf('No "T_CLASS" at given index %d, got "%s".', $index, $tokens[$index]->getName())); } $index = $tokens->getNextMeaningfulToken($index); @@ -65,7 +65,7 @@ public function isPhpUnitClass(Tokens $tokens, int $index): bool * Returns an indices of PHPUnit classes in reverse appearance order. * Order is important - it's reverted, so if we inject tokens into collection, * we do it for bottom of file first, and then to the top of the file, so we - * mitigate risk of not visiting whole collcetion (final indices). + * mitigate risk of not visiting whole collections (final indices). * * @return iterable array of [int start, int end] indices from later to earlier classes */ diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php index b85906006..253075cba 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Linter/CachingLinter.php @@ -14,6 +14,8 @@ namespace PhpCsFixer\Linter; +use PhpCsFixer\Hasher; + /** * @author Dariusz Rumiński * @@ -40,23 +42,15 @@ public function isAsync(): bool public function lintFile(string $path): LintingResultInterface { - $checksum = md5(file_get_contents($path)); - - if (!isset($this->cache[$checksum])) { - $this->cache[$checksum] = $this->sublinter->lintFile($path); - } + $checksum = Hasher::calculate(file_get_contents($path)); - return $this->cache[$checksum]; + return $this->cache[$checksum] ??= $this->sublinter->lintFile($path); } public function lintSource(string $source): LintingResultInterface { - $checksum = md5($source); - - if (!isset($this->cache[$checksum])) { - $this->cache[$checksum] = $this->sublinter->lintSource($source); - } + $checksum = Hasher::calculate($source); - return $this->cache[$checksum]; + return $this->cache[$checksum] ??= $this->sublinter->lintSource($source); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php index b8619b447..86129ab44 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Linter/Linter.php @@ -19,6 +19,8 @@ * * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class Linter implements LinterInterface diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php index 1808a17e6..74d276a60 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinter.php @@ -35,10 +35,8 @@ final class ProcessLinter implements LinterInterface /** * Temporary file for code linting. - * - * @var null|string */ - private $temporaryFile; + private ?string $temporaryFile = null; /** * @param null|string $executable PHP executable, null for autodetection @@ -84,7 +82,7 @@ public function __destruct() */ public function __sleep(): array { - throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + throw new \BadMethodCallException('Cannot serialize '.self::class); } /** @@ -95,7 +93,7 @@ public function __sleep(): array */ public function __wakeup(): void { - throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + throw new \BadMethodCallException('Cannot unserialize '.self::class); } public function isAsync(): bool @@ -143,7 +141,7 @@ private function createProcessForSource(string $source): Process } if (false === @file_put_contents($this->temporaryFile, $source)) { - throw new IOException(sprintf('Failed to write file "%s".', $this->temporaryFile), 0, null, $this->temporaryFile); + throw new IOException(\sprintf('Failed to write file "%s".', $this->temporaryFile), 0, null, $this->temporaryFile); } return $this->createProcessForFile($this->temporaryFile); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php index ee9a555e5..2dd24e17b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLinterProcessBuilder.php @@ -19,6 +19,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class ProcessLinterProcessBuilder diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php index 7d282d162..bbdd78c97 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Linter/ProcessLintingResult.php @@ -53,25 +53,25 @@ private function getProcessErrorMessage(): string } if (null !== $this->path) { - $needle = sprintf('in %s ', $this->path); + $needle = \sprintf('in %s ', $this->path); $pos = strrpos($output, $needle); if (false !== $pos) { - $output = sprintf('%s%s', substr($output, 0, $pos), substr($output, $pos + \strlen($needle))); + $output = \sprintf('%s%s', substr($output, 0, $pos), substr($output, $pos + \strlen($needle))); } } $prefix = substr($output, 0, 18); if ('PHP Parse error: ' === $prefix) { - return sprintf('Parse error: %s.', substr($output, 18)); + return \sprintf('Parse error: %s.', substr($output, 18)); } if ('PHP Fatal error: ' === $prefix) { - return sprintf('Fatal error: %s.', substr($output, 18)); + return \sprintf('Fatal error: %s.', substr($output, 18)); } - return sprintf('%s.', $output); + return \sprintf('%s.', $output); } private function isSuccessful(): bool diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php index b0920d302..45bd3cffc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLinter.php @@ -15,7 +15,7 @@ namespace PhpCsFixer\Linter; use PhpCsFixer\FileReader; -use PhpCsFixer\Tokenizer\CodeHasher; +use PhpCsFixer\Hasher; use PhpCsFixer\Tokenizer\Tokens; /** @@ -23,6 +23,8 @@ * * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class TokenizerLinter implements LinterInterface @@ -44,7 +46,7 @@ public function lintSource(string $source): LintingResultInterface // During that process, it might throw a ParseError or CompileError. // If it won't, cache of tokenized version of source will be kept, which is great for Runner. // Yet, first we need to clear already existing cache to not hit it and lint the code indeed. - $codeHash = CodeHasher::calculateCodeHash($source); + $codeHash = Hasher::calculate($source); Tokens::clearCache($codeHash); Tokens::fromCode($source); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php b/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php index 4880d9282..469f2dfdc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Linter/TokenizerLintingResult.php @@ -17,6 +17,8 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class TokenizerLintingResult implements LintingResultInterface @@ -32,7 +34,7 @@ public function check(): void { if (null !== $this->error) { throw new LintingException( - sprintf('%s: %s on line %d.', $this->getMessagePrefix(), $this->error->getMessage(), $this->error->getLine()), + \sprintf('%s: %s on line %d.', $this->getMessagePrefix(), $this->error->getMessage(), $this->error->getLine()), $this->error->getCode(), $this->error ); diff --git a/vendor/friendsofphp/php-cs-fixer/src/ParallelAwareConfigInterface.php b/vendor/friendsofphp/php-cs-fixer/src/ParallelAwareConfigInterface.php new file mode 100644 index 000000000..6716cf3ce --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/ParallelAwareConfigInterface.php @@ -0,0 +1,29 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer; + +use PhpCsFixer\Runner\Parallel\ParallelConfig; + +/** + * @author Greg Korba + * + * @TODO 4.0 Include parallel runner config in main ConfigInterface + */ +interface ParallelAwareConfigInterface extends ConfigInterface +{ + public function getParallelConfig(): ParallelConfig; + + public function setParallelConfig(ParallelConfig $config): ConfigInterface; +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Preg.php b/vendor/friendsofphp/php-cs-fixer/src/Preg.php index 1dadb476f..da286af98 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Preg.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Preg.php @@ -25,8 +25,19 @@ final class Preg { /** - * @param null|string[] $matches - * @param int-mask<0, 256, 512> $flags + * @param array $matches + * @param int-mask $flags + * + * @param-out ($flags is PREG_OFFSET_CAPTURE + * ? array + * : ($flags is PREG_UNMATCHED_AS_NULL + * ? array + * : ($flags is int-mask&768 + * ? array + * : array + * ) + * ) + * ) $matches * * @throws PregException */ @@ -42,11 +53,35 @@ public static function match(string $pattern, string $subject, ?array &$matches return 1 === $result; } - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); + throw self::newPregException(preg_last_error(), preg_last_error_msg(), __METHOD__, $pattern); } /** - * @param null|string[] $matches + * @param array $matches + * @param int-mask $flags + * + * @param-out ($flags is PREG_PATTERN_ORDER + * ? array> + * : ($flags is PREG_SET_ORDER + * ? list> + * : ($flags is int-mask&(256|257) + * ? array> + * : ($flags is int-mask&258 + * ? list> + * : ($flags is int-mask&(512|513) + * ? array> + * : ($flags is int-mask&514 + * ? list> + * : ($flags is int-mask&770 + * ? list> + * : ($flags is 0 ? array> : array) + * ) + * ) + * ) + * ) + * ) + * ) + * ) $matches * * @throws PregException */ @@ -62,15 +97,17 @@ public static function matchAll(string $pattern, string $subject, ?array &$match return $result; } - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); + throw self::newPregException(preg_last_error(), preg_last_error_msg(), __METHOD__, $pattern); } /** - * @param string|string[] $subject + * @param-out int $count + * + * @return ($subject is non-empty-string ? ($replacement is non-empty-string ? non-empty-string : string) : string) * * @throws PregException */ - public static function replace(string $pattern, string $replacement, $subject, int $limit = -1, ?int &$count = null): string + public static function replace(string $pattern, string $replacement, string $subject, int $limit = -1, ?int &$count = null): string { $result = @preg_replace(self::addUtf8Modifier($pattern), $replacement, $subject, $limit, $count); if (null !== $result && PREG_NO_ERROR === preg_last_error()) { @@ -82,10 +119,12 @@ public static function replace(string $pattern, string $replacement, $subject, i return $result; } - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); + throw self::newPregException(preg_last_error(), preg_last_error_msg(), __METHOD__, $pattern); } /** + * @param-out int $count + * * @throws PregException */ public static function replaceCallback(string $pattern, callable $callback, string $subject, int $limit = -1, ?int &$count = null): string @@ -100,11 +139,11 @@ public static function replaceCallback(string $pattern, callable $callback, stri return $result; } - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); + throw self::newPregException(preg_last_error(), preg_last_error_msg(), __METHOD__, $pattern); } /** - * @return string[] + * @return list * * @throws PregException */ @@ -120,34 +159,16 @@ public static function split(string $pattern, string $subject, int $limit = -1, return $result; } - throw self::newPregException(preg_last_error(), __METHOD__, (array) $pattern); + throw self::newPregException(preg_last_error(), preg_last_error_msg(), __METHOD__, $pattern); } - /** - * @param string|string[] $pattern - * - * @return string|string[] - */ - private static function addUtf8Modifier($pattern) + private static function addUtf8Modifier(string $pattern): string { - if (\is_array($pattern)) { - return array_map(__METHOD__, $pattern); - } - return $pattern.'u'; } - /** - * @param string|string[] $pattern - * - * @return string|string[] - */ - private static function removeUtf8Modifier($pattern) + private static function removeUtf8Modifier(string $pattern): string { - if (\is_array($pattern)) { - return array_map(__METHOD__, $pattern); - } - if ('' === $pattern) { return ''; } @@ -160,42 +181,35 @@ private static function removeUtf8Modifier($pattern) } /** - * Create PregException. - * - * Create the generic PregException message and if possible due to finding - * an invalid pattern, tell more about such kind of error in the message. - * - * @param string[] $patterns + * Create the generic PregException message and tell more about such kind of error in the message. */ - private static function newPregException(int $error, string $method, array $patterns): PregException + private static function newPregException(int $error, string $errorMsg, string $method, string $pattern): PregException { - foreach ($patterns as $pattern) { - $last = error_get_last(); - $result = @preg_match($pattern, ''); - - if (false !== $result) { - continue; - } - - $code = preg_last_error(); - $next = error_get_last(); - - if ($last !== $next) { - $message = sprintf( - '(code: %d) %s', - $code, - preg_replace('~preg_[a-z_]+[()]{2}: ~', '', $next['message']) - ); - } else { - $message = sprintf('(code: %d)', $code); - } - - return new PregException( - sprintf('%s(): Invalid PCRE pattern "%s": %s (version: %s)', $method, $pattern, $message, PCRE_VERSION), - $code - ); + $result = null; + $errorMessage = null; + + try { + $result = ExecutorWithoutErrorHandler::execute(static fn () => preg_match($pattern, '')); + } catch (ExecutorWithoutErrorHandlerException $e) { + $result = false; + $errorMessage = $e->getMessage(); + } + + if (false !== $result) { + return new PregException(\sprintf('Unknown error occurred when calling %s: %s.', $method, $errorMsg), $error); } - return new PregException(sprintf('Error occurred when calling %s.', $method), $error); + $code = preg_last_error(); + + $message = \sprintf( + '(code: %d) %s', + $code, + preg_replace('~preg_[a-z_]+[()]{2}: ~', '', $errorMessage) + ); + + return new PregException( + \sprintf('%s(): Invalid PCRE pattern "%s": %s (version: %s)', $method, $pattern, $message, PCRE_VERSION), + $code + ); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractMigrationSetDescription.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractMigrationSetDescription.php index 57e1911ba..397c6873b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractMigrationSetDescription.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/AbstractMigrationSetDescription.php @@ -26,13 +26,13 @@ public function getDescription(): string $name = $this->getName(); if (Preg::match('#^@PHPUnit(\d+)(\d)Migration.*$#', $name, $matches)) { - return sprintf('Rules to improve tests code for PHPUnit %d.%d compatibility.', $matches[1], $matches[2]); + return \sprintf('Rules to improve tests code for PHPUnit %d.%d compatibility.', $matches[1], $matches[2]); } if (Preg::match('#^@PHP([\d]{2})Migration.*$#', $name, $matches)) { - return sprintf('Rules to improve code for PHP %d.%d compatibility.', $matches[1][0], $matches[1][1]); + return \sprintf('Rules to improve code for PHP %d.%d compatibility.', $matches[1][0], $matches[1][1]); } - throw new \RuntimeException(sprintf('Cannot generate description for "%s" "%s".', static::class, $name)); + throw new \RuntimeException(\sprintf('Cannot generate description for "%s" "%s".', static::class, $name)); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/DeprecatedRuleSetDescriptionInterface.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/DeprecatedRuleSetDescriptionInterface.php new file mode 100644 index 000000000..ae52441d5 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/DeprecatedRuleSetDescriptionInterface.php @@ -0,0 +1,28 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\RuleSet; + +/** + * @author Greg Korba + */ +interface DeprecatedRuleSetDescriptionInterface extends RuleSetDescriptionInterface +{ + /** + * Returns names of rule sets to use instead, if any. + * + * @return list + */ + public function getSuccessorsNames(): array; +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php index 19f48c09e..79286c9fc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSet.php @@ -15,12 +15,15 @@ namespace PhpCsFixer\RuleSet; use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException; +use PhpCsFixer\Utils; /** * Set of rules to be used by fixer. * * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class RuleSet implements RuleSetInterface @@ -28,10 +31,10 @@ final class RuleSet implements RuleSetInterface /** * Group of rules generated from input set. * - * The key is name of rule, value is bool if the rule/set should be used. + * The key is name of rule, value is configuration array or true. * The key must not point to any set. * - * @var array|bool> + * @var array|true> */ private array $rules; @@ -43,7 +46,7 @@ public function __construct(array $set = []) } if (\is_int($name)) { - throw new \InvalidArgumentException(sprintf('Missing value for "%s" rule/set.', $value)); + throw new \InvalidArgumentException(\sprintf('Missing value for "%s" rule/set.', $value)); } if (!\is_bool($value) && !\is_array($value)) { @@ -57,7 +60,7 @@ public function __construct(array $set = []) } } - $this->resolveSet($set); + $this->rules = $this->resolveSet($set); } public function hasRule(string $rule): bool @@ -68,7 +71,7 @@ public function hasRule(string $rule): bool public function getRuleConfiguration(string $rule): ?array { if (!$this->hasRule($rule)) { - throw new \InvalidArgumentException(sprintf('Rule "%s" is not in the set.', $rule)); + throw new \InvalidArgumentException(\sprintf('Rule "%s" is not in the set.', $rule)); } if (true === $this->rules[$rule]) { @@ -87,8 +90,10 @@ public function getRules(): array * Resolve input set into group of rules. * * @param array|bool> $rules + * + * @return array|true> */ - private function resolveSet(array $rules): void + private function resolveSet(array $rules): array { $resolvedRules = []; @@ -96,7 +101,7 @@ private function resolveSet(array $rules): void foreach ($rules as $name => $value) { if (str_starts_with($name, '@')) { if (!\is_bool($value)) { - throw new \UnexpectedValueException(sprintf('Nested rule set "%s" configuration must be a boolean.', $name)); + throw new \UnexpectedValueException(\sprintf('Nested rule set "%s" configuration must be a boolean.', $name)); } $set = $this->resolveSubset($name, $value); @@ -107,9 +112,12 @@ private function resolveSet(array $rules): void } // filter out all resolvedRules that are off - $resolvedRules = array_filter($resolvedRules); + $resolvedRules = array_filter( + $resolvedRules, + static fn ($value): bool => false !== $value + ); - $this->rules = $resolvedRules; + return $resolvedRules; } /** @@ -122,7 +130,17 @@ private function resolveSet(array $rules): void */ private function resolveSubset(string $setName, bool $setValue): array { - $rules = RuleSets::getSetDefinition($setName)->getRules(); + $ruleSet = RuleSets::getSetDefinition($setName); + + if ($ruleSet instanceof DeprecatedRuleSetDescriptionInterface) { + $messageEnd = [] === $ruleSet->getSuccessorsNames() + ? 'No replacement available' + : \sprintf('Use %s instead', Utils::naturalLanguageJoin($ruleSet->getSuccessorsNames())); + + Utils::triggerDeprecation(new \RuntimeException("Rule set \"{$setName}\" is deprecated. {$messageEnd}.")); + } + + $rules = $ruleSet->getRules(); foreach ($rules as $name => $value) { if (str_starts_with($name, '@')) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php index eb83b6b4a..024248258 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSetInterface.php @@ -38,7 +38,7 @@ public function getRuleConfiguration(string $rule): ?array; /** * Get all rules from rules set. * - * @return array|bool> + * @return array|true> */ public function getRules(): array; diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php index d10ff8c6f..e66ced990 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/RuleSets.php @@ -24,9 +24,9 @@ final class RuleSets { /** - * @var array + * @var null|array */ - private static $setDefinitions; + private static ?array $setDefinitions = null; /** * @return array @@ -38,6 +38,8 @@ public static function getSetDefinitions(): array foreach (Finder::create()->files()->in(__DIR__.'/Sets') as $file) { $class = 'PhpCsFixer\RuleSet\Sets\\'.$file->getBasename('.php'); + + /** @var RuleSetDescriptionInterface */ $set = new $class(); self::$setDefinitions[$set->getName()] = $set; @@ -50,7 +52,7 @@ public static function getSetDefinitions(): array } /** - * @return string[] + * @return list */ public static function getSetDefinitionNames(): array { @@ -62,7 +64,7 @@ public static function getSetDefinition(string $name): RuleSetDescriptionInterfa $definitions = self::getSetDefinitions(); if (!isset($definitions[$name])) { - throw new \InvalidArgumentException(sprintf('Set "%s" does not exist.', $name)); + throw new \InvalidArgumentException(\sprintf('Set "%s" does not exist.', $name)); } return $definitions[$name]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0RiskySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0RiskySet.php index 8794aea6b..3e446037f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0RiskySet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0RiskySet.php @@ -21,9 +21,6 @@ * * PER Coding Style v1.0. * - * @TODO 4.0 Remove this class - * - * @deprecated Use `@PER-CS2.0:risky` instead. * @see https://github.com/php-fig/per-coding-style/blob/1.0.0/spec.md */ final class PERCS1x0RiskySet extends AbstractRuleSetDescription @@ -42,10 +39,6 @@ public function getRules(): array public function getDescription(): string { - return <<<'DESC' - **This ruleset is deprecated** in favour of `@PER-CS2.0:risky`. - - Rules that follow `PER Coding Style 1.0 `_. - DESC; + return 'Rules that follow `PER Coding Style 1.0 `_.'; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0Set.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0Set.php index 4081d1697..3ad0a6fcc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0Set.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS1x0Set.php @@ -21,9 +21,6 @@ * * PER Coding Style v1.0. * - * @TODO 4.0 Remove this class - * - * @deprecated Use `@PER-CS2.0` instead. * @see https://github.com/php-fig/per-coding-style/blob/1.0.0/spec.md */ final class PERCS1x0Set extends AbstractRuleSetDescription @@ -42,10 +39,6 @@ public function getRules(): array public function getDescription(): string { - return <<<'DESC' - **This ruleset is deprecated** in favour of `@PER-CS2.0`. - - Rules that follow `PER Coding Style 1.0 `_. - DESC; + return 'Rules that follow `PER Coding Style 1.0 `_.'; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS2x0Set.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS2x0Set.php index 5a6df0fe9..7acf8e96a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS2x0Set.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERCS2x0Set.php @@ -34,12 +34,74 @@ public function getRules(): array { return [ '@PER-CS1.0' => true, + 'array_indentation' => true, + 'array_syntax' => true, + 'cast_spaces' => true, 'concat_space' => ['spacing' => 'one'], 'function_declaration' => [ 'closure_fn_spacing' => 'none', ], 'method_argument_space' => true, + 'new_with_parentheses' => [ + 'anonymous_class' => false, + ], 'single_line_empty_body' => true, + 'single_space_around_construct' => [ + 'constructs_followed_by_a_single_space' => [ + 'abstract', + 'as', + 'case', + 'catch', + 'class', + 'const', + 'const_import', + 'do', + 'else', + 'elseif', + 'enum', + 'final', + 'finally', + 'for', + 'foreach', + 'function', + 'function_import', + 'if', + 'insteadof', + 'interface', + 'match', + 'named_argument', + 'namespace', + 'new', + 'private', + 'protected', + 'public', + 'readonly', + 'static', + 'switch', + 'trait', + 'try', + 'type_colon', + 'use', + 'use_lambda', + 'while', + ], + 'constructs_preceded_by_a_single_space' => [ + 'as', + 'else', + 'elseif', + 'use_lambda', + ], + ], + 'trailing_comma_in_multiline' => [ + 'after_heredoc' => true, + 'elements' => [ + 'arguments', + 'array_destructuring', + 'arrays', + 'match', + 'parameters', + ], + ], ]; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERRiskySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERRiskySet.php index e700d4c32..9f156c288 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERRiskySet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERRiskySet.php @@ -15,17 +15,18 @@ namespace PhpCsFixer\RuleSet\Sets; use PhpCsFixer\RuleSet\AbstractRuleSetDescription; +use PhpCsFixer\RuleSet\DeprecatedRuleSetDescriptionInterface; /** * @internal * - * @deprecated Use `@PER-CS2.0:risky` instead. + * @deprecated use `@PER-CS:risky` instead * * @TODO 4.0 remove me * * Last updated to PER Coding Style v2.0. */ -final class PERRiskySet extends AbstractRuleSetDescription +final class PERRiskySet extends AbstractRuleSetDescription implements DeprecatedRuleSetDescriptionInterface { public function getName(): string { @@ -35,12 +36,17 @@ public function getName(): string public function getRules(): array { return [ - '@PER-CS2.0:risky' => true, + '@PER-CS:risky' => true, ]; } public function getDescription(): string { - return 'Alias for the PER-CS risky rules. It is recommended you use ``@PER-CS2.0:risky`` instead.'; + return 'Alias for the newest PER-CS risky rules. It is recommended you use ``@PER-CS2.0:risky`` instead if you want to stick with stable ruleset.'; + } + + public function getSuccessorsNames(): array + { + return ['@PER-CS:risky']; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERSet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERSet.php index 3b2d0b804..81de37ded 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERSet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PERSet.php @@ -15,27 +15,33 @@ namespace PhpCsFixer\RuleSet\Sets; use PhpCsFixer\RuleSet\AbstractRuleSetDescription; +use PhpCsFixer\RuleSet\DeprecatedRuleSetDescriptionInterface; /** * @internal * - * @deprecated Use `@PER-CS2.0` instead. + * @deprecated use `@PER-CS` instead * * @TODO 4.0 remove me * * Last updated to PER Coding Style v2.0. */ -final class PERSet extends AbstractRuleSetDescription +final class PERSet extends AbstractRuleSetDescription implements DeprecatedRuleSetDescriptionInterface { public function getRules(): array { return [ - '@PER-CS2.0' => true, + '@PER-CS' => true, ]; } public function getDescription(): string { - return 'Alias for the PER-CS rules. It is recommended you use ``@PER-CS2.0`` instead.'; + return 'Alias for the newest PER-CS rules. It is recommended you use ``@PER-CS2.0`` instead if you want to stick with stable ruleset.'; + } + + public function getSuccessorsNames(): array + { + return ['@PER-CS']; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationRiskySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationRiskySet.php new file mode 100644 index 000000000..3bdbfdfcf --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP82MigrationRiskySet.php @@ -0,0 +1,31 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\RuleSet\Sets; + +use PhpCsFixer\RuleSet\AbstractMigrationSetDescription; + +/** + * @internal + */ +final class PHP82MigrationRiskySet extends AbstractMigrationSetDescription +{ + public function getRules(): array + { + return [ + '@PHP80Migration:risky' => true, + 'phpdoc_readonly_class_comment_to_keyword' => true, + ]; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP83MigrationSet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP83MigrationSet.php new file mode 100644 index 000000000..a2bdfbd93 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP83MigrationSet.php @@ -0,0 +1,30 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\RuleSet\Sets; + +use PhpCsFixer\RuleSet\AbstractMigrationSetDescription; + +/** + * @internal + */ +final class PHP83MigrationSet extends AbstractMigrationSetDescription +{ + public function getRules(): array + { + return [ + '@PHP82Migration' => true, + ]; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP84MigrationSet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP84MigrationSet.php new file mode 100644 index 000000000..480391bda --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHP84MigrationSet.php @@ -0,0 +1,31 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\RuleSet\Sets; + +use PhpCsFixer\RuleSet\AbstractMigrationSetDescription; + +/** + * @internal + */ +final class PHP84MigrationSet extends AbstractMigrationSetDescription +{ + public function getRules(): array + { + return [ + '@PHP83Migration' => true, + 'nullable_type_declaration_for_default_null_value' => true, + ]; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit100MigrationRiskySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit100MigrationRiskySet.php index 433fa7acb..f2092648f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit100MigrationRiskySet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit100MigrationRiskySet.php @@ -24,7 +24,7 @@ final class PHPUnit100MigrationRiskySet extends AbstractMigrationSetDescription public function getRules(): array { return [ - '@PHPUnit84Migration:risky' => true, + '@PHPUnit91Migration:risky' => true, 'php_unit_data_provider_static' => ['force' => true], ]; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit91MigrationRiskySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit91MigrationRiskySet.php new file mode 100644 index 000000000..5f0736d94 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PHPUnit91MigrationRiskySet.php @@ -0,0 +1,31 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\RuleSet\Sets; + +use PhpCsFixer\RuleSet\AbstractMigrationSetDescription; + +/** + * @internal + */ +final class PHPUnit91MigrationRiskySet extends AbstractMigrationSetDescription +{ + public function getRules(): array + { + return [ + '@PHPUnit84Migration:risky' => true, + 'php_unit_assert_new_names' => true, + ]; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php index 322d82cc6..a9f7b5ff4 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR12Set.php @@ -44,6 +44,11 @@ public function getRules(): array 'lowercase_static_reference' => true, 'new_with_parentheses' => true, 'no_blank_lines_after_class_opening' => true, + 'no_extra_blank_lines' => [ + 'tokens' => [ + 'use', // defined in PSR12 ¶3. Declare Statements, Namespace, and Import Statements + ], + ], 'no_leading_import_slash' => true, 'no_whitespace_in_blank_line' => true, 'ordered_class_elements' => [ @@ -62,9 +67,51 @@ public function getRules(): array 'return_type_declaration' => true, 'short_scalar_cast' => true, 'single_import_per_statement' => ['group_to_single_imports' => false], + 'single_space_around_construct' => [ + 'constructs_followed_by_a_single_space' => [ + 'abstract', + 'as', + 'case', + 'catch', + 'class', + 'const_import', + 'do', + 'else', + 'elseif', + 'final', + 'finally', + 'for', + 'foreach', + 'function', + 'function_import', + 'if', + 'insteadof', + 'interface', + 'namespace', + 'new', + 'private', + 'protected', + 'public', + 'static', + 'switch', + 'trait', + 'try', + 'use', + 'use_lambda', + 'while', + ], + 'constructs_preceded_by_a_single_space' => [ + 'as', + 'else', + 'elseif', + 'use_lambda', + ], + ], 'single_trait_insert_per_statement' => true, 'ternary_operator_spaces' => true, - 'unary_operator_spaces' => true, + 'unary_operator_spaces' => [ + 'only_dec_inc' => true, + ], 'visibility_required' => true, ]; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php index 19d023d79..a386da470 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PSR2Set.php @@ -55,6 +55,40 @@ public function getRules(): array ], 'single_import_per_statement' => true, 'single_line_after_imports' => true, + 'single_space_around_construct' => [ + 'constructs_followed_by_a_single_space' => [ + 'abstract', + 'as', + 'case', + 'catch', + 'class', + 'do', + 'else', + 'elseif', + 'final', + 'for', + 'foreach', + 'function', + 'if', + 'interface', + 'namespace', + 'private', + 'protected', + 'public', + 'static', + 'switch', + 'trait', + 'try', + 'use_lambda', + 'while', + ], + 'constructs_preceded_by_a_single_space' => [ + 'as', + 'else', + 'elseif', + 'use_lambda', + ], + ], 'spaces_inside_parentheses' => true, 'statement_indentation' => true, 'switch_case_semicolon_to_colon' => true, diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php index b90dcbad6..9048d242f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerRiskySet.php @@ -47,10 +47,10 @@ public function getRules(): array '@all', ], ], - 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'php_unit_data_provider_name' => true, 'php_unit_data_provider_return_type' => true, + 'php_unit_data_provider_static' => ['force' => true], 'php_unit_strict' => true, 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], 'static_lambda' => true, diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php index f9fa314f8..cb418bebf 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/PhpCsFixerSet.php @@ -26,7 +26,6 @@ public function getRules(): array return [ '@PER-CS' => true, '@Symfony' => true, - 'array_indentation' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', @@ -52,9 +51,11 @@ public function getRules(): array 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'empty_loop_body' => true, - 'escape_implicit_backslashes' => true, 'explicit_indirect_variable' => true, 'explicit_string_variable' => true, + 'fully_qualified_strict_types' => [ + 'import_symbols' => true, + ], 'heredoc_to_nowdoc' => true, 'method_argument_space' => [ 'on_multiline' => 'ensure_fully_multiline', @@ -102,9 +103,11 @@ public function getRules(): array ], 'no_useless_else' => true, 'no_useless_return' => true, - 'nullable_type_declaration_for_default_null_value' => false, + 'no_whitespace_before_comma_in_array' => ['after_heredoc' => true], + 'operator_linebreak' => true, 'ordered_class_elements' => true, 'ordered_types' => true, + 'php_unit_data_provider_method_order' => true, 'php_unit_internal_class' => true, 'php_unit_test_class_requires_covers' => true, 'phpdoc_add_missing_param_annotation' => true, @@ -116,7 +119,10 @@ public function getRules(): array 'return_assignment' => true, 'self_static_accessor' => true, 'single_line_comment_style' => true, + 'single_line_empty_body' => true, 'single_line_throw' => false, + 'string_implicit_backslashes' => true, + 'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['array_destructuring', 'arrays']], 'whitespace_after_comma_in_array' => ['ensure_single_space' => true], ]; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php index bd9221bf1..f60d9cac3 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonyRiskySet.php @@ -55,7 +55,6 @@ public function getRules(): array 'no_homoglyph_names' => true, 'no_php4_constructor' => true, 'no_unneeded_final_method' => true, - 'no_unreachable_default_argument_value' => false, 'no_useless_sprintf' => true, 'non_printable_character' => true, 'ordered_traits' => true, diff --git a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php index d2b1f1773..28af540d7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php +++ b/vendor/friendsofphp/php-cs-fixer/src/RuleSet/Sets/SymfonySet.php @@ -25,9 +25,8 @@ final class SymfonySet extends AbstractRuleSetDescription public function getRules(): array { return [ - '@PSR12' => true, + '@PER-CS2.0' => true, 'align_multiline_comment' => true, - 'array_syntax' => true, 'backtick_to_shell_exec' => true, 'binary_operator_spaces' => true, 'blank_line_before_statement' => [ @@ -39,7 +38,6 @@ public function getRules(): array 'allow_single_line_anonymous_functions' => true, 'allow_single_line_empty_anonymous_classes' => true, ], - 'cast_spaces' => true, 'class_attributes_separation' => [ 'elements' => [ 'method' => 'one', @@ -50,12 +48,13 @@ public function getRules(): array ], 'class_reference_name_casing' => true, 'clean_namespace' => true, - 'concat_space' => true, + 'concat_space' => true, // overrides @PER-CS2.0 'declare_parentheses' => true, 'echo_tag_syntax' => true, 'empty_loop_body' => ['style' => 'braces'], 'empty_loop_condition' => true, 'fully_qualified_strict_types' => true, + 'function_declaration' => true, // overrides @PER-CS2.0 'general_phpdoc_tag_rename' => [ 'replacements' => [ 'inheritDocs' => 'inheritDoc', @@ -73,7 +72,7 @@ public function getRules(): array 'linebreak_after_opening_tag' => true, 'magic_constant_casing' => true, 'magic_method_casing' => true, - 'method_argument_space' => [ + 'method_argument_space' => [ // overrides @PER-CS2.0 'on_multiline' => 'ignore', ], 'native_function_casing' => true, @@ -108,6 +107,7 @@ public function getRules(): array 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_around_offset' => true, 'no_superfluous_phpdoc_tags' => [ + 'allow_hidden_params' => true, 'remove_inheritdoc' => true, ], 'no_trailing_comma_in_singleline' => true, @@ -134,7 +134,8 @@ public function getRules(): array 'no_useless_nullsafe_operator' => true, 'no_whitespace_before_comma_in_array' => true, 'normalize_index_brace' => true, - 'nullable_type_declaration_for_default_null_value' => ['use_nullable_type_declaration' => false], + 'nullable_type_declaration' => true, + 'nullable_type_declaration_for_default_null_value' => true, 'object_operator_without_whitespace' => true, 'operator_linebreak' => [ 'only_booleans' => true, @@ -147,6 +148,10 @@ public function getRules(): array ], 'sort_algorithm' => 'alpha', ], + 'ordered_types' => [ + 'null_adjustment' => 'always_last', + 'sort_algorithm' => 'none', + ], 'php_unit_fqcn_annotation' => true, 'php_unit_method_casing' => true, 'phpdoc_align' => true, @@ -198,6 +203,7 @@ public function getRules(): array 'hash', ], ], + 'single_line_empty_body' => false, // overrides @PER-CS2.0 'single_line_throw' => true, 'single_quote' => true, 'single_space_around_construct' => true, @@ -206,11 +212,23 @@ public function getRules(): array ], 'standardize_increment' => true, 'standardize_not_equals' => true, + 'statement_indentation' => [ + 'stick_comment_to_next_continuous_control_statement' => true, + ], 'switch_continue_to_break' => true, - 'trailing_comma_in_multiline' => true, + 'trailing_comma_in_multiline' => [ + 'after_heredoc' => true, + 'elements' => [ // explicitly omit 'arguments' + 'array_destructuring', + 'arrays', + 'match', + 'parameters', + ], + ], 'trim_array_spaces' => true, 'type_declaration_spaces' => true, 'types_spaces' => true, + 'unary_operator_spaces' => true, 'whitespace_after_comma_in_array' => true, 'yoda_style' => true, ]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Event/AnalysisStarted.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Event/AnalysisStarted.php new file mode 100644 index 000000000..75c9ff7b1 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Event/AnalysisStarted.php @@ -0,0 +1,54 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Event; + +use Symfony\Contracts\EventDispatcher\Event; + +/** + * Event that is fired when Fixer starts analysis. + * + * @author Greg Korba + * + * @internal + */ +final class AnalysisStarted extends Event +{ + public const NAME = 'fixer.analysis_started'; + public const MODE_SEQUENTIAL = 'sequential'; + public const MODE_PARALLEL = 'parallel'; + + /** @var self::MODE_* */ + private string $mode; + private bool $dryRun; + + /** + * @param self::MODE_* $mode + */ + public function __construct(string $mode, bool $dryRun) + { + $this->mode = $mode; + $this->dryRun = $dryRun; + } + + public function getMode(): string + { + return $this->mode; + } + + public function isDryRun(): bool + { + return $this->dryRun; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Event/FileProcessed.php similarity index 58% rename from vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php rename to vendor/friendsofphp/php-cs-fixer/src/Runner/Event/FileProcessed.php index b609da499..b9d4bcda1 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/FixerFileProcessedEvent.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Event/FileProcessed.php @@ -12,7 +12,7 @@ * with this source code in the file LICENSE. */ -namespace PhpCsFixer; +namespace PhpCsFixer\Runner\Event; use Symfony\Contracts\EventDispatcher\Event; @@ -23,7 +23,7 @@ * * @internal */ -final class FixerFileProcessedEvent extends Event +final class FileProcessed extends Event { /** * Event name. @@ -37,15 +37,39 @@ final class FixerFileProcessedEvent extends Event public const STATUS_EXCEPTION = 5; public const STATUS_LINT = 6; + /** + * @var self::STATUS_* + */ private int $status; - public function __construct(int $status) + private ?string $fileRelativePath; + private ?string $fileHash; + + /** + * @param self::STATUS_* $status + */ + public function __construct(int $status, ?string $fileRelativePath = null, ?string $fileHash = null) { $this->status = $status; + $this->fileRelativePath = $fileRelativePath; + $this->fileHash = $fileHash; } + /** + * @return self::STATUS_* + */ public function getStatus(): int { return $this->status; } + + public function getFileRelativePath(): ?string + { + return $this->fileRelativePath; + } + + public function getFileHash(): ?string + { + return $this->fileHash; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingFileIterator.php similarity index 84% rename from vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php rename to vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingFileIterator.php index c07dbbd27..c46cf3d33 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingIterator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/FileCachingLintingFileIterator.php @@ -24,19 +24,11 @@ * * @extends \CachingIterator> */ -final class FileCachingLintingIterator extends \CachingIterator +final class FileCachingLintingFileIterator extends \CachingIterator implements LintingResultAwareFileIteratorInterface { private LinterInterface $linter; - - /** - * @var LintingResultInterface - */ - private $currentResult; - - /** - * @var LintingResultInterface - */ - private $nextResult; + private ?LintingResultInterface $currentResult = null; + private ?LintingResultInterface $nextResult = null; /** * @param \Iterator $iterator @@ -48,7 +40,7 @@ public function __construct(\Iterator $iterator, LinterInterface $linter) $this->linter = $linter; } - public function currentLintingResult(): LintingResultInterface + public function currentLintingResult(): ?LintingResultInterface { return $this->currentResult; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php index c0f736fda..8a5972180 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/FileFilterIterator.php @@ -16,7 +16,7 @@ use PhpCsFixer\Cache\CacheManagerInterface; use PhpCsFixer\FileReader; -use PhpCsFixer\FixerFileProcessedEvent; +use PhpCsFixer\Runner\Event\FileProcessed; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\EventDispatcher\Event; @@ -61,7 +61,7 @@ public function accept(): bool $file = $this->current(); if (!$file instanceof \SplFileInfo) { throw new \RuntimeException( - sprintf( + \sprintf( 'Expected instance of "\SplFileInfo", got "%s".', get_debug_type($file) ) @@ -89,10 +89,7 @@ public function accept(): bool // file that does not need fixing due to cache || !$this->cacheManager->needFixing($file->getPathname(), $content) ) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_SKIPPED) - ); + $this->dispatchEvent(FileProcessed::NAME, new FileProcessed(FileProcessed::STATUS_SKIPPED)); return false; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/LintingFileIterator.php similarity index 89% rename from vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php rename to vendor/friendsofphp/php-cs-fixer/src/Runner/LintingFileIterator.php index 09f5913e3..19bd67710 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/FileLintingIterator.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/LintingFileIterator.php @@ -24,12 +24,9 @@ * * @extends \IteratorIterator> */ -final class FileLintingIterator extends \IteratorIterator +final class LintingFileIterator extends \IteratorIterator implements LintingResultAwareFileIteratorInterface { - /** - * @var LintingResultInterface - */ - private $currentResult; + private ?LintingResultInterface $currentResult = null; private LinterInterface $linter; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/LintingResultAwareFileIteratorInterface.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/LintingResultAwareFileIteratorInterface.php new file mode 100644 index 000000000..1c05bf29d --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/LintingResultAwareFileIteratorInterface.php @@ -0,0 +1,29 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner; + +use PhpCsFixer\Linter\LintingResultInterface; + +/** + * @author Greg Korba + * + * @internal + * + * @extends \Iterator + */ +interface LintingResultAwareFileIteratorInterface extends \Iterator +{ + public function currentLintingResult(): ?LintingResultInterface; +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelAction.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelAction.php new file mode 100644 index 000000000..42585ee28 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelAction.php @@ -0,0 +1,35 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +/** + * @author Greg Korba + * + * @internal + */ +final class ParallelAction +{ + // Actions executed by the runner (main process) + public const RUNNER_REQUEST_ANALYSIS = 'requestAnalysis'; + public const RUNNER_THANK_YOU = 'thankYou'; + + // Actions executed by the worker + public const WORKER_ERROR_REPORT = 'errorReport'; + public const WORKER_GET_FILE_CHUNK = 'getFileChunk'; + public const WORKER_HELLO = 'hello'; + public const WORKER_RESULT = 'result'; + + private function __construct() {} +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfig.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfig.php new file mode 100644 index 000000000..b4886c6bb --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfig.php @@ -0,0 +1,67 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +/** + * @author Greg Korba + * + * @readonly + */ +final class ParallelConfig +{ + /** @internal */ + public const DEFAULT_FILES_PER_PROCESS = 10; + + /** @internal */ + public const DEFAULT_PROCESS_TIMEOUT = 120; + + private int $filesPerProcess; + private int $maxProcesses; + private int $processTimeout; + + /** + * @param positive-int $maxProcesses + * @param positive-int $filesPerProcess + * @param positive-int $processTimeout + */ + public function __construct( + int $maxProcesses = 2, + int $filesPerProcess = self::DEFAULT_FILES_PER_PROCESS, + int $processTimeout = self::DEFAULT_PROCESS_TIMEOUT + ) { + if ($maxProcesses <= 0 || $filesPerProcess <= 0 || $processTimeout <= 0) { + throw new \InvalidArgumentException('Invalid parallelisation configuration: only positive integers are allowed'); + } + + $this->maxProcesses = $maxProcesses; + $this->filesPerProcess = $filesPerProcess; + $this->processTimeout = $processTimeout; + } + + public function getFilesPerProcess(): int + { + return $this->filesPerProcess; + } + + public function getMaxProcesses(): int + { + return $this->maxProcesses; + } + + public function getProcessTimeout(): int + { + return $this->processTimeout; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfigFactory.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfigFactory.php new file mode 100644 index 000000000..5d306d451 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelConfigFactory.php @@ -0,0 +1,61 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +use Fidry\CpuCoreCounter\CpuCoreCounter; +use Fidry\CpuCoreCounter\Finder\DummyCpuCoreFinder; +use Fidry\CpuCoreCounter\Finder\FinderRegistry; + +/** + * @author Dariusz Rumiński + */ +final class ParallelConfigFactory +{ + private static ?CpuCoreCounter $cpuDetector = null; + + private function __construct() {} + + public static function sequential(): ParallelConfig + { + return new ParallelConfig(1); + } + + /** + * @param null|positive-int $filesPerProcess + * @param null|positive-int $processTimeout + * @param null|positive-int $maxProcesses + */ + public static function detect( + ?int $filesPerProcess = null, + ?int $processTimeout = null, + ?int $maxProcesses = null + ): ParallelConfig { + if (null === self::$cpuDetector) { + self::$cpuDetector = new CpuCoreCounter([ + ...FinderRegistry::getDefaultLogicalFinders(), + new DummyCpuCoreFinder(1), + ]); + } + + // Reserve 1 core for the main orchestrating process + $available = self::$cpuDetector->getAvailableForParallelisation(1, $maxProcesses); + + return new ParallelConfig( + $available->availableCpus, + $filesPerProcess ?? ParallelConfig::DEFAULT_FILES_PER_PROCESS, + $processTimeout ?? ParallelConfig::DEFAULT_PROCESS_TIMEOUT + ); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelisationException.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelisationException.php new file mode 100644 index 000000000..8c24e6a4a --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ParallelisationException.php @@ -0,0 +1,30 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +/** + * Common exception for all the errors related to parallelisation. + * + * @author Greg Korba + * + * @internal + */ +final class ParallelisationException extends \RuntimeException +{ + public static function forUnknownIdentifier(ProcessIdentifier $identifier): self + { + return new self('Unknown process identifier: '.$identifier->toString()); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/Process.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/Process.php new file mode 100644 index 000000000..0d5ce5880 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/Process.php @@ -0,0 +1,189 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +use React\ChildProcess\Process as ReactProcess; +use React\EventLoop\LoopInterface; +use React\EventLoop\TimerInterface; +use React\Stream\ReadableStreamInterface; +use React\Stream\WritableStreamInterface; + +/** + * Represents single process that is handled within parallel run. + * Inspired by: + * - https://github.com/phpstan/phpstan-src/blob/9ce425bca5337039fb52c0acf96a20a2b8ace490/src/Parallel/Process.php + * - https://github.com/phpstan/phpstan-src/blob/1477e752b4b5893f323b6d2c43591e68b3d85003/src/Process/ProcessHelper.php. + * + * @author Greg Korba + * + * @internal + */ +final class Process +{ + // Properties required for process instantiation + private string $command; + private LoopInterface $loop; + private int $timeoutSeconds; + + // Properties required for process execution + private ?ReactProcess $process = null; + private ?WritableStreamInterface $in = null; + + /** @var resource */ + private $stdErr; + + /** @var resource */ + private $stdOut; + + /** @var callable(array): void */ + private $onData; + + /** @var callable(\Throwable): void */ + private $onError; + + private ?TimerInterface $timer = null; + + public function __construct(string $command, LoopInterface $loop, int $timeoutSeconds) + { + $this->command = $command; + $this->loop = $loop; + $this->timeoutSeconds = $timeoutSeconds; + } + + /** + * @param callable(array $json): void $onData callback to be called when data is received from the parallelisation operator + * @param callable(\Throwable $exception): void $onError callback to be called when an exception occurs + * @param callable(?int $exitCode, string $output): void $onExit callback to be called when the process exits + */ + public function start(callable $onData, callable $onError, callable $onExit): void + { + $stdOut = tmpfile(); + if (false === $stdOut) { + throw new ParallelisationException('Failed creating temp file for stdOut.'); + } + $this->stdOut = $stdOut; + + $stdErr = tmpfile(); + if (false === $stdErr) { + throw new ParallelisationException('Failed creating temp file for stdErr.'); + } + $this->stdErr = $stdErr; + + $this->onData = $onData; + $this->onError = $onError; + + $this->process = new ReactProcess($this->command, null, null, [ + 1 => $this->stdOut, + 2 => $this->stdErr, + ]); + $this->process->start($this->loop); + $this->process->on('exit', function ($exitCode) use ($onExit): void { + $this->cancelTimer(); + + $output = ''; + rewind($this->stdOut); + $stdOut = stream_get_contents($this->stdOut); + if (\is_string($stdOut)) { + $output .= $stdOut; + } + + rewind($this->stdErr); + $stdErr = stream_get_contents($this->stdErr); + if (\is_string($stdErr)) { + $output .= $stdErr; + } + + $onExit($exitCode, $output); + + fclose($this->stdOut); + fclose($this->stdErr); + }); + } + + /** + * Handles requests from parallelisation operator to its worker (spawned process). + * + * @param array $data + */ + public function request(array $data): void + { + $this->cancelTimer(); // Configured process timeout actually means "chunk timeout" (each request resets timer) + + if (null === $this->in) { + throw new ParallelisationException( + 'Process not connected with parallelisation operator, ensure `bindConnection()` was called' + ); + } + + $this->in->write($data); + $this->timer = $this->loop->addTimer($this->timeoutSeconds, function (): void { + ($this->onError)( + new \Exception( + \sprintf( + 'Child process timed out after %d seconds. Try making it longer using `ParallelConfig`.', + $this->timeoutSeconds + ) + ) + ); + }); + } + + public function quit(): void + { + $this->cancelTimer(); + if (null === $this->process || !$this->process->isRunning()) { + return; + } + + foreach ($this->process->pipes as $pipe) { + $pipe->close(); + } + + if (null === $this->in) { + return; + } + + $this->in->end(); + } + + public function bindConnection(ReadableStreamInterface $out, WritableStreamInterface $in): void + { + $this->in = $in; + + $in->on('error', function (\Throwable $error): void { + ($this->onError)($error); + }); + + $out->on('data', function (array $json): void { + $this->cancelTimer(); + + // Pass everything to the parallelisation operator, it should decide how to handle the data + ($this->onData)($json); + }); + $out->on('error', function (\Throwable $error): void { + ($this->onError)($error); + }); + } + + private function cancelTimer(): void + { + if (null === $this->timer) { + return; + } + + $this->loop->cancelTimer($this->timer); + $this->timer = null; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessFactory.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessFactory.php new file mode 100644 index 000000000..5649e251d --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessFactory.php @@ -0,0 +1,111 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +use PhpCsFixer\Runner\RunnerConfig; +use React\EventLoop\LoopInterface; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Process\PhpExecutableFinder; + +/** + * @author Greg Korba + * + * @readonly + * + * @internal + */ +final class ProcessFactory +{ + private InputInterface $input; + + public function __construct(InputInterface $input) + { + $this->input = $input; + } + + public function create( + LoopInterface $loop, + RunnerConfig $runnerConfig, + ProcessIdentifier $identifier, + int $serverPort + ): Process { + $commandArgs = $this->getCommandArgs($serverPort, $identifier, $runnerConfig); + + return new Process( + implode(' ', $commandArgs), + $loop, + $runnerConfig->getParallelConfig()->getProcessTimeout() + ); + } + + /** + * @private + * + * @return list + */ + public function getCommandArgs(int $serverPort, ProcessIdentifier $identifier, RunnerConfig $runnerConfig): array + { + $phpBinary = (new PhpExecutableFinder())->find(false); + + if (false === $phpBinary) { + throw new ParallelisationException('Cannot find PHP executable.'); + } + + $mainScript = realpath(__DIR__.'/../../../php-cs-fixer'); + if (false === $mainScript + && isset($_SERVER['argv'][0]) + && str_contains($_SERVER['argv'][0], 'php-cs-fixer') + ) { + $mainScript = $_SERVER['argv'][0]; + } + + if (!is_file($mainScript)) { + throw new ParallelisationException('Cannot determine Fixer executable.'); + } + + $commandArgs = [ + escapeshellarg($phpBinary), + escapeshellarg($mainScript), + 'worker', + '--port', + (string) $serverPort, + '--identifier', + escapeshellarg($identifier->toString()), + ]; + + if ($runnerConfig->isDryRun()) { + $commandArgs[] = '--dry-run'; + } + + if (filter_var($this->input->getOption('diff'), FILTER_VALIDATE_BOOLEAN)) { + $commandArgs[] = '--diff'; + } + + if (filter_var($this->input->getOption('stop-on-violation'), FILTER_VALIDATE_BOOLEAN)) { + $commandArgs[] = '--stop-on-violation'; + } + + foreach (['allow-risky', 'config', 'rules', 'using-cache', 'cache-file'] as $option) { + $optionValue = $this->input->getOption($option); + + if (null !== $optionValue) { + $commandArgs[] = "--{$option}"; + $commandArgs[] = escapeshellarg($optionValue); + } + } + + return $commandArgs; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessIdentifier.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessIdentifier.php new file mode 100644 index 000000000..20df38d80 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessIdentifier.php @@ -0,0 +1,55 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +/** + * Represents identifier of single process that is handled within parallel run. + * + * @author Greg Korba + * + * @readonly + * + * @internal + */ +final class ProcessIdentifier +{ + private const IDENTIFIER_PREFIX = 'php-cs-fixer_parallel_'; + + private string $identifier; + + private function __construct(string $identifier) + { + $this->identifier = $identifier; + } + + public function toString(): string + { + return $this->identifier; + } + + public static function create(): self + { + return new self(uniqid(self::IDENTIFIER_PREFIX, true)); + } + + public static function fromRaw(string $identifier): self + { + if (!str_starts_with($identifier, self::IDENTIFIER_PREFIX)) { + throw new ParallelisationException(\sprintf('Invalid process identifier "%s".', $identifier)); + } + + return new self($identifier); + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessPool.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessPool.php new file mode 100644 index 000000000..215023f24 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/ProcessPool.php @@ -0,0 +1,99 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +use React\Socket\ServerInterface; + +/** + * Represents collection of active processes that are being run in parallel. + * Inspired by {@see https://github.com/phpstan/phpstan-src/blob/ed68345a82992775112acc2c2bd639d1bd3a1a02/src/Parallel/ProcessPool.php}. + * + * @author Greg Korba + * + * @internal + */ +final class ProcessPool +{ + /** + * @readonly + */ + private ServerInterface $server; + + /** + * @var null|(callable(): void) + * + * @readonly + */ + private $onServerClose; + + /** + * @var array + */ + private array $processes = []; + + /** + * @param null|(callable(): void) $onServerClose + */ + public function __construct(ServerInterface $server, ?callable $onServerClose = null) + { + $this->server = $server; + $this->onServerClose = $onServerClose; + } + + public function getProcess(ProcessIdentifier $identifier): Process + { + if (!isset($this->processes[$identifier->toString()])) { + throw ParallelisationException::forUnknownIdentifier($identifier); + } + + return $this->processes[$identifier->toString()]; + } + + public function addProcess(ProcessIdentifier $identifier, Process $process): void + { + $this->processes[$identifier->toString()] = $process; + } + + public function endProcessIfKnown(ProcessIdentifier $identifier): void + { + if (!isset($this->processes[$identifier->toString()])) { + return; + } + + $this->endProcess($identifier); + } + + public function endAll(): void + { + foreach (array_keys($this->processes) as $identifier) { + $this->endProcessIfKnown(ProcessIdentifier::fromRaw($identifier)); + } + } + + private function endProcess(ProcessIdentifier $identifier): void + { + $this->getProcess($identifier)->quit(); + + unset($this->processes[$identifier->toString()]); + + if (0 === \count($this->processes)) { + $this->server->close(); + + if (null !== $this->onServerClose) { + ($this->onServerClose)(); + } + } + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/WorkerException.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/WorkerException.php new file mode 100644 index 000000000..714306d36 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Parallel/WorkerException.php @@ -0,0 +1,66 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner\Parallel; + +use Throwable; + +/** + * @author Greg Korba + * + * @internal + */ +final class WorkerException extends \RuntimeException +{ + private string $originalTraceAsString; + + private function __construct(string $message, int $code) + { + parent::__construct($message, $code); + } + + /** + * @param array{ + * class: class-string, + * message: string, + * file: string, + * line: int, + * code: int, + * trace: string + * } $data + */ + public static function fromRaw(array $data): self + { + $exception = new self( + \sprintf('[%s] %s', $data['class'], $data['message']), + $data['code'] + ); + $exception->file = $data['file']; + $exception->line = $data['line']; + $exception->originalTraceAsString = \sprintf( + '## %s(%d)%s%s', + $data['file'], + $data['line'], + PHP_EOL, + $data['trace'] + ); + + return $exception; + } + + public function getOriginalTraceAsString(): string + { + return $this->originalTraceAsString; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php index 7a3bc822b..1d2441ddc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/Runner.php @@ -14,32 +14,60 @@ namespace PhpCsFixer\Runner; +use Clue\React\NDJson\Decoder; +use Clue\React\NDJson\Encoder; use PhpCsFixer\AbstractFixer; use PhpCsFixer\Cache\CacheManagerInterface; use PhpCsFixer\Cache\Directory; use PhpCsFixer\Cache\DirectoryInterface; +use PhpCsFixer\Console\Command\WorkerCommand; use PhpCsFixer\Differ\DifferInterface; use PhpCsFixer\Error\Error; use PhpCsFixer\Error\ErrorsManager; +use PhpCsFixer\Error\SourceExceptionFactory; use PhpCsFixer\FileReader; use PhpCsFixer\Fixer\FixerInterface; -use PhpCsFixer\FixerFileProcessedEvent; use PhpCsFixer\Linter\LinterInterface; use PhpCsFixer\Linter\LintingException; use PhpCsFixer\Linter\LintingResultInterface; +use PhpCsFixer\Preg; +use PhpCsFixer\Runner\Event\AnalysisStarted; +use PhpCsFixer\Runner\Event\FileProcessed; +use PhpCsFixer\Runner\Parallel\ParallelAction; +use PhpCsFixer\Runner\Parallel\ParallelConfig; +use PhpCsFixer\Runner\Parallel\ParallelConfigFactory; +use PhpCsFixer\Runner\Parallel\ParallelisationException; +use PhpCsFixer\Runner\Parallel\ProcessFactory; +use PhpCsFixer\Runner\Parallel\ProcessIdentifier; +use PhpCsFixer\Runner\Parallel\ProcessPool; +use PhpCsFixer\Runner\Parallel\WorkerException; use PhpCsFixer\Tokenizer\Tokens; +use React\EventLoop\StreamSelectLoop; +use React\Socket\ConnectionInterface; +use React\Socket\TcpServer; +use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Filesystem\Exception\IOException; use Symfony\Contracts\EventDispatcher\Event; /** * @author Dariusz Rumiński + * @author Greg Korba + * + * @phpstan-type _RunResult array, diff: string}> */ final class Runner { + /** + * Buffer size used in the NDJSON decoder for communication between main process and workers. + * + * @see https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/pull/8068 + */ + private const PARALLEL_BUFFER_SIZE = 16 * (1_024 * 1_024 /* 1MB */); + private DifferInterface $differ; - private ?DirectoryInterface $directory; + private DirectoryInterface $directory; private ?EventDispatcherInterface $eventDispatcher; @@ -52,9 +80,11 @@ final class Runner private LinterInterface $linter; /** - * @var \Traversable<\SplFileInfo> + * @var null|\Traversable */ - private $finder; + private ?\Traversable $fileIterator = null; + + private int $fileCount; /** * @var list @@ -63,12 +93,18 @@ final class Runner private bool $stopOnViolation; + private ParallelConfig $parallelConfig; + + private ?InputInterface $input; + + private ?string $configFile; + /** - * @param \Traversable<\SplFileInfo> $finder - * @param list $fixers + * @param null|\Traversable $fileIterator + * @param list $fixers */ public function __construct( - \Traversable $finder, + ?\Traversable $fileIterator, array $fixers, DifferInterface $differ, ?EventDispatcherInterface $eventDispatcher, @@ -77,9 +113,16 @@ public function __construct( bool $isDryRun, CacheManagerInterface $cacheManager, ?DirectoryInterface $directory = null, - bool $stopOnViolation = false + bool $stopOnViolation = false, + // @TODO Make these arguments required in 4.0 + ?ParallelConfig $parallelConfig = null, + ?InputInterface $input = null, + ?string $configFile = null ) { - $this->finder = $finder; + // Required only for main process (calculating workers count) + $this->fileCount = null !== $fileIterator ? \count(iterator_to_array($fileIterator)) : 0; + + $this->fileIterator = $fileIterator; $this->fixers = $fixers; $this->differ = $differ; $this->eventDispatcher = $eventDispatcher; @@ -89,26 +132,255 @@ public function __construct( $this->cacheManager = $cacheManager; $this->directory = $directory ?? new Directory(''); $this->stopOnViolation = $stopOnViolation; + $this->parallelConfig = $parallelConfig ?? ParallelConfigFactory::sequential(); + $this->input = $input; + $this->configFile = $configFile; } /** - * @return array, diff: string}> + * @TODO consider to drop this method and make iterator parameter obligatory in constructor, + * more in https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/pull/7777/files#r1590447581 + * + * @param \Traversable $fileIterator + */ + public function setFileIterator(iterable $fileIterator): void + { + $this->fileIterator = $fileIterator; + + // Required only for main process (calculating workers count) + $this->fileCount = \count(iterator_to_array($fileIterator)); + } + + /** + * @return _RunResult */ public function fix(): array { + if (0 === $this->fileCount) { + return []; + } + + // @TODO 4.0: Remove condition and its body, as no longer needed when param will be required in the constructor. + // This is a fallback only in case someone calls `new Runner()` in a custom repo and does not provide v4-ready params in v3-codebase. + if (null === $this->input) { + return $this->fixSequential(); + } + + if ( + 1 === $this->parallelConfig->getMaxProcesses() + || $this->fileCount <= $this->parallelConfig->getFilesPerProcess() + ) { + return $this->fixSequential(); + } + + return $this->fixParallel(); + } + + /** + * Heavily inspired by {@see https://github.com/phpstan/phpstan-src/blob/9ce425bca5337039fb52c0acf96a20a2b8ace490/src/Parallel/ParallelAnalyser.php}. + * + * @return _RunResult + */ + private function fixParallel(): array + { + $this->dispatchEvent(AnalysisStarted::NAME, new AnalysisStarted(AnalysisStarted::MODE_PARALLEL, $this->isDryRun)); + $changed = []; + $streamSelectLoop = new StreamSelectLoop(); + $server = new TcpServer('127.0.0.1:0', $streamSelectLoop); + $serverPort = parse_url($server->getAddress() ?? '', PHP_URL_PORT); + + if (!is_numeric($serverPort)) { + throw new ParallelisationException(\sprintf( + 'Unable to parse server port from "%s"', + $server->getAddress() ?? '' + )); + } - $finder = $this->finder; - $finderIterator = $finder instanceof \IteratorAggregate ? $finder->getIterator() : $finder; - $fileFilteredFileIterator = new FileFilterIterator( - $finderIterator, - $this->eventDispatcher, - $this->cacheManager + $processPool = new ProcessPool($server); + $maxFilesPerProcess = $this->parallelConfig->getFilesPerProcess(); + $fileIterator = $this->getFilteringFileIterator(); + $fileIterator->rewind(); + + $getFileChunk = static function () use ($fileIterator, $maxFilesPerProcess): array { + $files = []; + + while (\count($files) < $maxFilesPerProcess) { + $current = $fileIterator->current(); + + if (null === $current) { + break; + } + + $files[] = $current->getPathname(); + + $fileIterator->next(); + } + + return $files; + }; + + // [REACT] Handle worker's handshake (init connection) + $server->on('connection', static function (ConnectionInterface $connection) use ($processPool, $getFileChunk): void { + $jsonInvalidUtf8Ignore = \defined('JSON_INVALID_UTF8_IGNORE') ? JSON_INVALID_UTF8_IGNORE : 0; + $decoder = new Decoder( + $connection, + true, + 512, + $jsonInvalidUtf8Ignore, + self::PARALLEL_BUFFER_SIZE + ); + $encoder = new Encoder($connection, $jsonInvalidUtf8Ignore); + + // [REACT] Bind connection when worker's process requests "hello" action (enables 2-way communication) + $decoder->on('data', static function (array $data) use ($processPool, $getFileChunk, $decoder, $encoder): void { + if (ParallelAction::WORKER_HELLO !== $data['action']) { + return; + } + + $identifier = ProcessIdentifier::fromRaw($data['identifier']); + $process = $processPool->getProcess($identifier); + $process->bindConnection($decoder, $encoder); + $fileChunk = $getFileChunk(); + + if (0 === \count($fileChunk)) { + $process->request(['action' => ParallelAction::RUNNER_THANK_YOU]); + $processPool->endProcessIfKnown($identifier); + + return; + } + + $process->request(['action' => ParallelAction::RUNNER_REQUEST_ANALYSIS, 'files' => $fileChunk]); + }); + }); + + $processesToSpawn = min( + $this->parallelConfig->getMaxProcesses(), + max( + 1, + (int) ceil($this->fileCount / $this->parallelConfig->getFilesPerProcess()), + ) ); + $processFactory = new ProcessFactory($this->input); + + for ($i = 0; $i < $processesToSpawn; ++$i) { + $identifier = ProcessIdentifier::create(); + $process = $processFactory->create( + $streamSelectLoop, + new RunnerConfig( + $this->isDryRun, + $this->stopOnViolation, + $this->parallelConfig, + $this->configFile + ), + $identifier, + $serverPort, + ); + $processPool->addProcess($identifier, $process); + $process->start( + // [REACT] Handle workers' responses (multiple actions possible) + function (array $workerResponse) use ($processPool, $process, $identifier, $getFileChunk, &$changed): void { + // File analysis result (we want close-to-realtime progress with frequent cache savings) + if (ParallelAction::WORKER_RESULT === $workerResponse['action']) { + // Dispatch an event for each file processed and dispatch its status (required for progress output) + $this->dispatchEvent(FileProcessed::NAME, new FileProcessed($workerResponse['status'])); + + if (isset($workerResponse['fileHash'])) { + $this->cacheManager->setFileHash($workerResponse['file'], $workerResponse['fileHash']); + } + + foreach ($workerResponse['errors'] ?? [] as $error) { + $this->errorsManager->report(new Error( + $error['type'], + $error['filePath'], + null !== $error['source'] + ? SourceExceptionFactory::fromArray($error['source']) + : null, + $error['appliedFixers'], + $error['diff'] + )); + } + + // Pass-back information about applied changes (only if there are any) + if (isset($workerResponse['fixInfo'])) { + $relativePath = $this->directory->getRelativePathTo($workerResponse['file']); + $changed[$relativePath] = $workerResponse['fixInfo']; + + if ($this->stopOnViolation) { + $processPool->endAll(); + + return; + } + } + + return; + } + + if (ParallelAction::WORKER_GET_FILE_CHUNK === $workerResponse['action']) { + // Request another chunk of files, if still available + $fileChunk = $getFileChunk(); + + if (0 === \count($fileChunk)) { + $process->request(['action' => ParallelAction::RUNNER_THANK_YOU]); + $processPool->endProcessIfKnown($identifier); + + return; + } + + $process->request(['action' => ParallelAction::RUNNER_REQUEST_ANALYSIS, 'files' => $fileChunk]); + + return; + } + + if (ParallelAction::WORKER_ERROR_REPORT === $workerResponse['action']) { + throw WorkerException::fromRaw($workerResponse); // @phpstan-ignore-line + } + + throw new ParallelisationException('Unsupported action: '.($workerResponse['action'] ?? 'n/a')); + }, + + // [REACT] Handle errors encountered during worker's execution + static function (\Throwable $error) use ($processPool): void { + $processPool->endAll(); + + throw new ParallelisationException($error->getMessage(), $error->getCode(), $error); + }, + + // [REACT] Handle worker's shutdown + static function ($exitCode, string $output) use ($processPool, $identifier): void { + $processPool->endProcessIfKnown($identifier); + + if (0 === $exitCode || null === $exitCode) { + return; + } + + $errorsReported = Preg::matchAll( + \sprintf('/^(?:%s)([^\n]+)+/m', WorkerCommand::ERROR_PREFIX), + $output, + $matches + ); + + if ($errorsReported > 0) { + throw WorkerException::fromRaw(json_decode($matches[1][0], true)); + } + } + ); + } + + $streamSelectLoop->run(); + + return $changed; + } + + /** + * @return _RunResult + */ + private function fixSequential(): array + { + $this->dispatchEvent(AnalysisStarted::NAME, new AnalysisStarted(AnalysisStarted::MODE_SEQUENTIAL, $this->isDryRun)); - $collection = $this->linter->isAsync() - ? new FileCachingLintingIterator($fileFilteredFileIterator, $this->linter) - : new FileLintingIterator($fileFilteredFileIterator, $this->linter); + $changed = []; + $collection = $this->getLintingFileIterator(); foreach ($collection as $file) { $fixInfo = $this->fixFile($file, $collection->currentLintingResult()); @@ -117,8 +389,8 @@ public function fix(): array Tokens::clearCache(); if (null !== $fixInfo) { - $name = $this->directory->getRelativePathTo($file->__toString()); - $changed[$name] = $fixInfo; + $relativePath = $this->directory->getRelativePathTo($file->__toString()); + $changed[$relativePath] = $fixInfo; if ($this->stopOnViolation) { break; @@ -134,17 +406,17 @@ public function fix(): array */ private function fixFile(\SplFileInfo $file, LintingResultInterface $lintingResult): ?array { - $name = $file->getPathname(); + $filePathname = $file->getPathname(); try { $lintingResult->check(); } catch (LintingException $e) { $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_INVALID) + FileProcessed::NAME, + new FileProcessed(FileProcessed::STATUS_INVALID) ); - $this->errorsManager->report(new Error(Error::TYPE_INVALID, $name, $e)); + $this->errorsManager->report(new Error(Error::TYPE_INVALID, $filePathname, $e)); return null; } @@ -154,8 +426,8 @@ private function fixFile(\SplFileInfo $file, LintingResultInterface $lintingResu $tokens = Tokens::fromCode($old); $oldHash = $tokens->getCodeHash(); - $newHash = $oldHash; $new = $old; + $newHash = $oldHash; $appliedFixers = []; @@ -179,16 +451,13 @@ private function fixFile(\SplFileInfo $file, LintingResultInterface $lintingResu } } } catch (\ParseError $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_LINT) - ); + $this->dispatchEvent(FileProcessed::NAME, new FileProcessed(FileProcessed::STATUS_LINT)); - $this->errorsManager->report(new Error(Error::TYPE_LINT, $name, $e)); + $this->errorsManager->report(new Error(Error::TYPE_LINT, $filePathname, $e)); return null; } catch (\Throwable $e) { - $this->processException($name, $e); + $this->processException($filePathname, $e); return null; } @@ -213,64 +482,61 @@ private function fixFile(\SplFileInfo $file, LintingResultInterface $lintingResu try { $this->linter->lintSource($new)->check(); } catch (LintingException $e) { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_LINT) - ); + $this->dispatchEvent(FileProcessed::NAME, new FileProcessed(FileProcessed::STATUS_LINT)); - $this->errorsManager->report(new Error(Error::TYPE_LINT, $name, $e, $fixInfo['appliedFixers'], $fixInfo['diff'])); + $this->errorsManager->report(new Error(Error::TYPE_LINT, $filePathname, $e, $fixInfo['appliedFixers'], $fixInfo['diff'])); return null; } if (!$this->isDryRun) { - $fileName = $file->getRealPath(); + $fileRealPath = $file->getRealPath(); - if (!file_exists($fileName)) { + if (!file_exists($fileRealPath)) { throw new IOException( - sprintf('Failed to write file "%s" (no longer) exists.', $file->getPathname()), + \sprintf('Failed to write file "%s" (no longer) exists.', $file->getPathname()), 0, null, $file->getPathname() ); } - if (is_dir($fileName)) { + if (is_dir($fileRealPath)) { throw new IOException( - sprintf('Cannot write file "%s" as the location exists as directory.', $fileName), + \sprintf('Cannot write file "%s" as the location exists as directory.', $fileRealPath), 0, null, - $fileName + $fileRealPath ); } - if (!is_writable($fileName)) { + if (!is_writable($fileRealPath)) { throw new IOException( - sprintf('Cannot write to file "%s" as it is not writable.', $fileName), + \sprintf('Cannot write to file "%s" as it is not writable.', $fileRealPath), 0, null, - $fileName + $fileRealPath ); } - if (false === @file_put_contents($fileName, $new)) { + if (false === @file_put_contents($fileRealPath, $new)) { $error = error_get_last(); throw new IOException( - sprintf('Failed to write file "%s", "%s".', $fileName, null !== $error ? $error['message'] : 'no reason available'), + \sprintf('Failed to write file "%s", "%s".', $fileRealPath, null !== $error ? $error['message'] : 'no reason available'), 0, null, - $fileName + $fileRealPath ); } } } - $this->cacheManager->setFile($name, $new); + $this->cacheManager->setFileHash($filePathname, $newHash); $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(null !== $fixInfo ? FixerFileProcessedEvent::STATUS_FIXED : FixerFileProcessedEvent::STATUS_NO_CHANGES) + FileProcessed::NAME, + new FileProcessed(null !== $fixInfo ? FileProcessed::STATUS_FIXED : FileProcessed::STATUS_NO_CHANGES, $filePathname, $newHash) ); return $fixInfo; @@ -281,10 +547,7 @@ private function fixFile(\SplFileInfo $file, LintingResultInterface $lintingResu */ private function processException(string $name, \Throwable $e): void { - $this->dispatchEvent( - FixerFileProcessedEvent::NAME, - new FixerFileProcessedEvent(FixerFileProcessedEvent::STATUS_EXCEPTION) - ); + $this->dispatchEvent(FileProcessed::NAME, new FileProcessed(FileProcessed::STATUS_EXCEPTION)); $this->errorsManager->report(new Error(Error::TYPE_EXCEPTION, $name, $e)); } @@ -297,4 +560,28 @@ private function dispatchEvent(string $name, Event $event): void $this->eventDispatcher->dispatch($event, $name); } + + private function getLintingFileIterator(): LintingResultAwareFileIteratorInterface + { + $fileFilterIterator = $this->getFilteringFileIterator(); + + return $this->linter->isAsync() + ? new FileCachingLintingFileIterator($fileFilterIterator, $this->linter) + : new LintingFileIterator($fileFilterIterator, $this->linter); + } + + private function getFilteringFileIterator(): FileFilterIterator + { + if (null === $this->fileIterator) { + throw new \RuntimeException('File iterator is not configured. Pass paths during Runner initialisation or set them after with `setFileIterator()`.'); + } + + return new FileFilterIterator( + $this->fileIterator instanceof \IteratorAggregate + ? $this->fileIterator->getIterator() + : $this->fileIterator, + $this->eventDispatcher, + $this->cacheManager + ); + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Runner/RunnerConfig.php b/vendor/friendsofphp/php-cs-fixer/src/Runner/RunnerConfig.php new file mode 100644 index 000000000..f95b16cac --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Runner/RunnerConfig.php @@ -0,0 +1,64 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Runner; + +use PhpCsFixer\Runner\Parallel\ParallelConfig; + +/** + * @author Greg Korba + * + * @readonly + * + * @internal + */ +final class RunnerConfig +{ + private bool $isDryRun; + private bool $stopOnViolation; + private ParallelConfig $parallelConfig; + private ?string $configFile; + + public function __construct( + bool $isDryRun, + bool $stopOnViolation, + ParallelConfig $parallelConfig, + ?string $configFile = null + ) { + $this->isDryRun = $isDryRun; + $this->stopOnViolation = $stopOnViolation; + $this->parallelConfig = $parallelConfig; + $this->configFile = $configFile; + } + + public function isDryRun(): bool + { + return $this->isDryRun; + } + + public function shouldStopOnViolation(): bool + { + return $this->stopOnViolation; + } + + public function getParallelConfig(): ParallelConfig + { + return $this->parallelConfig; + } + + public function getConfigFile(): ?string + { + return $this->configFile; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php b/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php index 7ce19091a..d7cdccdd2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php +++ b/vendor/friendsofphp/php-cs-fixer/src/StdinFileInfo.php @@ -58,9 +58,12 @@ public function getExtension(): string return '.php'; } - public function getFileInfo($className = null): \SplFileInfo + /** + * @param null|class-string<\SplFileInfo> $class + */ + public function getFileInfo($class = null): \SplFileInfo { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); + throw new \BadMethodCallException(\sprintf('Method "%s" is not implemented.', __METHOD__)); } public function getFilename(): string @@ -105,9 +108,12 @@ public function getPath(): string return ''; } - public function getPathInfo($className = null): \SplFileInfo + /** + * @param null|class-string<\SplFileInfo> $class + */ + public function getPathInfo($class = null): \SplFileInfo { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); + throw new \BadMethodCallException(\sprintf('Method "%s" is not implemented.', __METHOD__)); } public function getPathname(): string @@ -162,10 +168,6 @@ public function isWritable(): bool public function openFile($openMode = 'r', $useIncludePath = false, $context = null): \SplFileObject { - throw new \BadMethodCallException(sprintf('Method "%s" is not implemented.', __METHOD__)); + throw new \BadMethodCallException(\sprintf('Method "%s" is not implemented.', __METHOD__)); } - - public function setFileClass($className = null): void {} - - public function setInfoClass($className = null): void {} } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AlternativeSyntaxAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AlternativeSyntaxAnalyzer.php index 723d4c950..242aedd7a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AlternativeSyntaxAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AlternativeSyntaxAnalyzer.php @@ -74,6 +74,11 @@ public function findAlternativeSyntaxBlockEnd(Tokens $tokens, int $index): int } $startTokenKind = $tokens[$index]->getId(); + + if (!isset(self::ALTERNATIVE_SYNTAX_BLOCK_EDGES[$startTokenKind])) { + throw new \LogicException(\sprintf('Unknown startTokenKind: %s', $tokens[$index]->toJson())); + } + $endTokenKinds = self::ALTERNATIVE_SYNTAX_BLOCK_EDGES[$startTokenKind]; $findKinds = [[$startTokenKind]]; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AbstractControlCaseStructuresAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AbstractControlCaseStructuresAnalysis.php index a2bc675fd..92efc0741 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AbstractControlCaseStructuresAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AbstractControlCaseStructuresAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ abstract class AbstractControlCaseStructuresAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php index a4e72a706..591c3ee91 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/ArgumentAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ final class ArgumentAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AttributeAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AttributeAnalysis.php new file mode 100644 index 000000000..184015faa --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/AttributeAnalysis.php @@ -0,0 +1,76 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; + +/** + * @readonly + * + * @internal + * + * @phpstan-type _AttributeItem array{start: int, end: int, name: string} + * @phpstan-type _AttributeItems non-empty-list<_AttributeItem> + */ +final class AttributeAnalysis +{ + private int $startIndex; + private int $endIndex; + private int $openingBracketIndex; + private int $closingBracketIndex; + + /** + * @var _AttributeItems + */ + private array $attributes; + + /** + * @param _AttributeItems $attributes + */ + public function __construct(int $startIndex, int $endIndex, int $openingBracketIndex, int $closingBracketIndex, array $attributes) + { + $this->startIndex = $startIndex; + $this->endIndex = $endIndex; + $this->openingBracketIndex = $openingBracketIndex; + $this->closingBracketIndex = $closingBracketIndex; + $this->attributes = $attributes; + } + + public function getStartIndex(): int + { + return $this->startIndex; + } + + public function getEndIndex(): int + { + return $this->endIndex; + } + + public function getOpeningBracketIndex(): int + { + return $this->openingBracketIndex; + } + + public function getClosingBracketIndex(): int + { + return $this->closingBracketIndex; + } + + /** + * @return _AttributeItems + */ + public function getAttributes(): array + { + return $this->attributes; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php index df8c0dc3d..e500bf449 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/CaseAnalysis.php @@ -17,6 +17,8 @@ /** * @author Kuba Werłos * + * @readonly + * * @internal */ final class CaseAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DataProviderAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DataProviderAnalysis.php index 75490d76e..aab64c3fa 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DataProviderAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DataProviderAnalysis.php @@ -14,20 +14,35 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; +use PhpCsFixer\Console\Application; +use PhpCsFixer\Utils; + +/** + * @internal + * + * @readonly + */ final class DataProviderAnalysis { private string $name; private int $nameIndex; - /** @var array */ + /** @var non-empty-list */ private array $usageIndices; /** - * @param array $usageIndices + * @param non-empty-list $usageIndices */ public function __construct(string $name, int $nameIndex, array $usageIndices) { + if ([] === $usageIndices || !array_is_list($usageIndices)) { + Utils::triggerDeprecation(new \InvalidArgumentException(\sprintf( + 'Parameter "usageIndices" should be a non-empty-list. This will be enforced in version %d.0.', + Application::getMajorVersion() + 1 + ))); + } + $this->name = $name; $this->nameIndex = $nameIndex; $this->usageIndices = $usageIndices; @@ -44,7 +59,7 @@ public function getNameIndex(): int } /** - * @return array + * @return non-empty-list */ public function getUsageIndices(): array { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DefaultAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DefaultAnalysis.php index b742b29a0..6ca02898b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DefaultAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/DefaultAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ final class DefaultAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/EnumAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/EnumAnalysis.php index 6260cca17..9c1aa5c5f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/EnumAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/EnumAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ final class EnumAnalysis extends AbstractControlCaseStructuresAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/MatchAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/MatchAnalysis.php index 2ac1b977e..5a3ecf30e 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/MatchAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/MatchAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ final class MatchAnalysis extends AbstractControlCaseStructuresAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php index 6702a1226..7721e270a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ final class NamespaceAnalysis implements StartEndTokenAwareAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php index 59127b2fe..475fa6c06 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/NamespaceUseAnalysis.php @@ -15,7 +15,14 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @author VeeWee + * @author Greg Korba + * + * @readonly + * * @internal + * + * @phpstan-type _ImportType 'class'|'constant'|'function' */ final class NamespaceUseAnalysis implements StartEndTokenAwareAnalysis { @@ -25,6 +32,8 @@ final class NamespaceUseAnalysis implements StartEndTokenAwareAnalysis /** * The fully qualified use namespace. + * + * @var class-string */ private string $fullName; @@ -33,6 +42,11 @@ final class NamespaceUseAnalysis implements StartEndTokenAwareAnalysis */ private string $shortName; + /** + * Is the use statement part of multi-use (`use A, B, C;`, `use A\{B, C};`)? + */ + private bool $isInMulti; + /** * Is the use statement being aliased? */ @@ -48,21 +62,56 @@ final class NamespaceUseAnalysis implements StartEndTokenAwareAnalysis */ private int $endIndex; + /** + * The start index of the single import in the multi-use statement. + */ + private ?int $chunkStartIndex; + + /** + * The end index of the single import in the multi-use statement. + */ + private ?int $chunkEndIndex; + /** * The type of import: class, function or constant. + * + * @var self::TYPE_* */ private int $type; - public function __construct(string $fullName, string $shortName, bool $isAliased, int $startIndex, int $endIndex, int $type) - { + /** + * @param self::TYPE_* $type + * @param class-string $fullName + */ + public function __construct( + int $type, + string $fullName, + string $shortName, + bool $isAliased, + bool $isInMulti, + int $startIndex, + int $endIndex, + ?int $chunkStartIndex = null, + ?int $chunkEndIndex = null + ) { + if (true === $isInMulti && (null === $chunkStartIndex || null === $chunkEndIndex)) { + throw new \LogicException('Chunk start and end index must be set when the import is part of a multi-use statement.'); + } + + $this->type = $type; $this->fullName = $fullName; $this->shortName = $shortName; $this->isAliased = $isAliased; + $this->isInMulti = $isInMulti; $this->startIndex = $startIndex; $this->endIndex = $endIndex; - $this->type = $type; + $this->chunkStartIndex = $chunkStartIndex; + $this->chunkEndIndex = $chunkEndIndex; } + /** + * @return class-string + */ public function getFullName(): string { return $this->fullName; @@ -78,6 +127,11 @@ public function isAliased(): bool return $this->isAliased; } + public function isInMulti(): bool + { + return $this->isInMulti; + } + public function getStartIndex(): int { return $this->startIndex; @@ -88,11 +142,36 @@ public function getEndIndex(): int return $this->endIndex; } + public function getChunkStartIndex(): ?int + { + return $this->chunkStartIndex; + } + + public function getChunkEndIndex(): ?int + { + return $this->chunkEndIndex; + } + + /** + * @return self::TYPE_* + */ public function getType(): int { return $this->type; } + /** + * @return _ImportType + */ + public function getHumanFriendlyType(): string + { + return [ + self::TYPE_CLASS => 'class', + self::TYPE_FUNCTION => 'function', + self::TYPE_CONSTANT => 'constant', + ][$this->type]; + } + public function isClass(): bool { return self::TYPE_CLASS === $this->type; diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php index 0b2f318bb..c00b17776 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/StartEndTokenAwareAnalysis.php @@ -14,6 +14,11 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; +/** + * @internal + * + * @readonly + */ interface StartEndTokenAwareAnalysis { /** diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php index f81b48e2d..ff4f57174 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/SwitchAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ final class SwitchAnalysis extends AbstractControlCaseStructuresAnalysis diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php index a332b2442..fd76075c4 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/Analysis/TypeAnalysis.php @@ -15,6 +15,8 @@ namespace PhpCsFixer\Tokenizer\Analyzer\Analysis; /** + * @readonly + * * @internal */ final class TypeAnalysis implements StartEndTokenAwareAnalysis @@ -26,11 +28,10 @@ final class TypeAnalysis implements StartEndTokenAwareAnalysis * * @see https://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.types * @see https://php.net/manual/en/reserved.other-reserved-words.php - * @see https://php.net/manual/en/language.pseudo-types.php * * @var list */ - private static array $reservedTypes = [ + private const RESERVED_TYPES = [ 'array', 'bool', 'callable', @@ -38,6 +39,7 @@ final class TypeAnalysis implements StartEndTokenAwareAnalysis 'float', 'int', 'iterable', + 'list', 'mixed', 'never', 'null', @@ -53,31 +55,30 @@ final class TypeAnalysis implements StartEndTokenAwareAnalysis private string $name; - private int $startIndex; + private ?int $startIndex; - private int $endIndex; + private ?int $endIndex; private bool $nullable; /** * @param ($startIndex is null ? null : int) $endIndex */ - public function __construct(string $name, int $startIndex = null, int $endIndex = null) + public function __construct(string $name, ?int $startIndex = null, ?int $endIndex = null) { - $this->name = $name; - $this->nullable = false; - if (str_starts_with($name, '?')) { $this->name = substr($name, 1); $this->nullable = true; } elseif (\PHP_VERSION_ID >= 8_00_00) { + $this->name = $name; $this->nullable = \in_array('null', array_map('trim', explode('|', strtolower($name))), true); + } else { + $this->name = $name; + $this->nullable = false; } - if (null !== $startIndex) { - $this->startIndex = $startIndex; - $this->endIndex = $endIndex; - } + $this->startIndex = $startIndex; + $this->endIndex = $endIndex; } public function getName(): string @@ -87,17 +88,25 @@ public function getName(): string public function getStartIndex(): int { + if (null === $this->startIndex) { + throw new \RuntimeException('TypeAnalysis: no start index.'); + } + return $this->startIndex; } public function getEndIndex(): int { + if (null === $this->endIndex) { + throw new \RuntimeException('TypeAnalysis: no end index.'); + } + return $this->endIndex; } public function isReservedType(): bool { - return \in_array(strtolower($this->name), self::$reservedTypes, true); + return \in_array(strtolower($this->name), self::RESERVED_TYPES, true); } public function isNullable(): bool diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php index c67b76bc5..709f83213 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/AttributeAnalyzer.php @@ -14,11 +14,16 @@ namespace PhpCsFixer\Tokenizer\Analyzer; +use PhpCsFixer\Preg; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\AttributeAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Tokens; /** * @internal + * + * @phpstan-import-type _AttributeItems from AttributeAnalysis */ final class AttributeAnalyzer { @@ -67,4 +72,140 @@ public static function isAttribute(Tokens $tokens, int $index): bool return 0 === $count; } + + /** + * Find all consecutive elements that start with #[ and end with ] and the attributes inside. + * + * @return list + */ + public static function collect(Tokens $tokens, int $index): array + { + if (!$tokens[$index]->isGivenKind(T_ATTRIBUTE)) { + throw new \InvalidArgumentException('Given index must point to an attribute.'); + } + + // Rewind to first attribute in group + while ($tokens[$prevIndex = $tokens->getPrevMeaningfulToken($index)]->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { + $index = $tokens->findBlockStart(Tokens::BLOCK_TYPE_ATTRIBUTE, $prevIndex); + } + + /** @var list $elements */ + $elements = []; + + $openingIndex = $index; + do { + $elements[] = $element = self::collectOne($tokens, $openingIndex); + $openingIndex = $tokens->getNextMeaningfulToken($element->getEndIndex()); + } while ($tokens[$openingIndex]->isGivenKind(T_ATTRIBUTE)); + + return $elements; + } + + /** + * Find one element that starts with #[ and ends with ] and the attributes inside. + */ + public static function collectOne(Tokens $tokens, int $index): AttributeAnalysis + { + if (!$tokens[$index]->isGivenKind(T_ATTRIBUTE)) { + throw new \InvalidArgumentException('Given index must point to an attribute.'); + } + + $startIndex = $index; + $prevIndex = $tokens->getPrevMeaningfulToken($index); + + if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(CT::T_ATTRIBUTE_CLOSE)) { + // Include comments/PHPDoc if they are present + $startIndex = $tokens->getNextNonWhitespace($prevIndex); + } + + $closingIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $index); + $endIndex = $tokens->getNextNonWhitespace($closingIndex); + + return new AttributeAnalysis( + $startIndex, + $endIndex - 1, + $index, + $closingIndex, + self::collectAttributes($tokens, $index, $closingIndex), + ); + } + + public static function determineAttributeFullyQualifiedName(Tokens $tokens, string $name, int $index): string + { + if ('\\' === $name[0]) { + return $name; + } + + if (!$tokens[$index]->isGivenKind([T_STRING, T_NS_SEPARATOR])) { + $index = $tokens->getNextTokenOfKind($index, [[T_STRING], [T_NS_SEPARATOR]]); + } + + [$namespaceAnalysis, $namespaceUseAnalyses] = NamespacesAnalyzer::collectNamespaceAnalysis($tokens, $index); + $namespace = $namespaceAnalysis->getFullName(); + $firstTokenOfName = $tokens[$index]->getContent(); + $namespaceUseAnalysis = $namespaceUseAnalyses[$firstTokenOfName] ?? false; + + if ($namespaceUseAnalysis instanceof NamespaceUseAnalysis) { + $namespace = $namespaceUseAnalysis->getFullName(); + + if ($name === $firstTokenOfName) { + return $namespace; + } + + $name = substr((string) strstr($name, '\\'), 1); + } + + return $namespace.'\\'.$name; + } + + /** + * @return _AttributeItems + */ + private static function collectAttributes(Tokens $tokens, int $index, int $closingIndex): array + { + $elements = []; + + do { + $attributeStartIndex = $index + 1; + + $nameStartIndex = $tokens->getNextTokenOfKind($index, [[T_STRING], [T_NS_SEPARATOR]]); + $index = $tokens->getNextTokenOfKind($attributeStartIndex, ['(', ',', [CT::T_ATTRIBUTE_CLOSE]]); + $attributeName = $tokens->generatePartialCode($nameStartIndex, $tokens->getPrevMeaningfulToken($index)); + + // Find closing parentheses, we need to do this in case there's a comma inside the parentheses + if ($tokens[$index]->equals('(')) { + $index = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $index); + $index = $tokens->getNextTokenOfKind($index, [',', [CT::T_ATTRIBUTE_CLOSE]]); + } + + $elements[] = [ + 'start' => $attributeStartIndex, + 'end' => $index - 1, + 'name' => $attributeName, + ]; + + $nextIndex = $index; + + // In case there's a comma right before T_ATTRIBUTE_CLOSE + if ($nextIndex < $closingIndex) { + $nextIndex = $tokens->getNextMeaningfulToken($index); + } + } while ($nextIndex < $closingIndex); + + // End last element at newline if it exists and there's no trailing comma + --$index; + while ($tokens[$index]->isWhitespace()) { + if (Preg::match('/\R/', $tokens[$index]->getContent())) { + $lastElementKey = array_key_last($elements); + $elements[$lastElementKey]['end'] = $index - 1; + + break; + } + --$index; + } + + \assert(array_is_list($elements)); + + return $elements; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php index 492d70493..0f2f7735d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/BlocksAnalyzer.php @@ -24,18 +24,14 @@ */ final class BlocksAnalyzer { - public function isBlock(Tokens $tokens, ?int $openIndex, ?int $closeIndex): bool + public function isBlock(Tokens $tokens, int $openIndex, int $closeIndex): bool { - if (null === $openIndex || null === $closeIndex) { - return false; - } - if (!$tokens->offsetExists($openIndex)) { - return false; + throw new \InvalidArgumentException(\sprintf('Tokex index %d for potential block opening does not exist.', $openIndex)); } if (!$tokens->offsetExists($closeIndex)) { - return false; + throw new \InvalidArgumentException(\sprintf('Token index %d for potential block closure does not exist.', $closeIndex)); } $blockType = $this->getBlockType($tokens[$openIndex]); diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php index 5770d01c3..31e0b051c 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ClassyAnalyzer.php @@ -27,7 +27,7 @@ public function isClassyInvocation(Tokens $tokens, int $index): bool $token = $tokens[$index]; if (!$token->isGivenKind(T_STRING)) { - throw new \LogicException(sprintf('No T_STRING at given index %d, got "%s".', $index, $tokens[$index]->getName())); + throw new \LogicException(\sprintf('No T_STRING at given index %d, got "%s".', $index, $tokens[$index]->getName())); } if ((new Analysis\TypeAnalysis($token->getContent()))->isReservedType()) { diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php index d0d87ef2c..b1dcd7049 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/CommentsAnalyzer.php @@ -73,18 +73,7 @@ public function isBeforeStructuralElement(Tokens $tokens, int $index): bool throw new \InvalidArgumentException('Given index must point to a comment.'); } - $nextIndex = $index; - do { - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - - // @TODO: drop condition when PHP 8.0+ is required - if (\defined('T_ATTRIBUTE')) { - while (null !== $nextIndex && $tokens[$nextIndex]->isGivenKind(T_ATTRIBUTE)) { - $nextIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $nextIndex); - $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); - } - } - } while (null !== $nextIndex && $tokens[$nextIndex]->equals('(')); + $nextIndex = $this->getNextTokenIndex($tokens, $index); if (null === $nextIndex || $tokens[$nextIndex]->equals('}')) { return false; @@ -102,7 +91,7 @@ public function isBeforeStructuralElement(Tokens $tokens, int $index): bool return true; } - if ($this->isValidLanguageConstruct($tokens, $token, $nextIndex)) { + if ($this->isValidVariableAssignment($tokens, $token, $nextIndex)) { return true; } @@ -113,12 +102,30 @@ public function isBeforeStructuralElement(Tokens $tokens, int $index): bool return false; } + /** + * Check if comment at given index precedes return statement. + */ + public function isBeforeReturn(Tokens $tokens, int $index): bool + { + if (!$tokens[$index]->isGivenKind([T_COMMENT, T_DOC_COMMENT])) { + throw new \InvalidArgumentException('Given index must point to a comment.'); + } + + $nextIndex = $this->getNextTokenIndex($tokens, $index); + + if (null === $nextIndex || $tokens[$nextIndex]->equals('}')) { + return false; + } + + return $tokens[$nextIndex]->isGivenKind(T_RETURN); + } + /** * Return array of indices that are part of a comment started at given index. * * @param int $index T_COMMENT index * - * @return list + * @return non-empty-list */ public function getCommentBlockIndices(Tokens $tokens, int $index): array { @@ -251,7 +258,7 @@ private function isValidControl(Tokens $tokens, Token $docsToken, int $controlIn * @param Token $docsToken docs Token * @param int $languageConstructIndex index of variable Token */ - private function isValidLanguageConstruct(Tokens $tokens, Token $docsToken, int $languageConstructIndex): bool + private function isValidVariableAssignment(Tokens $tokens, Token $docsToken, int $languageConstructIndex): bool { static $languageStructures = [ T_LIST, @@ -290,13 +297,33 @@ private function isValidLanguageConstruct(Tokens $tokens, Token $docsToken, int */ private function isValidVariable(Tokens $tokens, int $index): bool { + static $assignmentTypes = [ + '=', + // arithmetic assignments + [T_PLUS_EQUAL, '+='], + [T_MINUS_EQUAL, '-='], + [T_MUL_EQUAL, '*='], + [T_DIV_EQUAL, '/='], + [T_MOD_EQUAL, '%='], + [T_POW_EQUAL, '**='], + // bitwise assignments + [T_AND_EQUAL, '&='], + [T_OR_EQUAL, '|='], + [T_XOR_EQUAL, '^='], + [T_SL_EQUAL, '<<='], + [T_SR_EQUAL, '>>='], + // other assignments + [T_COALESCE_EQUAL, '??='], + [T_CONCAT_EQUAL, '.='], + ]; + if (!$tokens[$index]->isGivenKind(T_VARIABLE)) { return false; } $nextIndex = $tokens->getNextMeaningfulToken($index); - return $tokens[$nextIndex]->equals('='); + return $tokens[$nextIndex]->equalsAny($assignmentTypes); } private function getCommentType(string $content): int @@ -321,4 +348,23 @@ private function getLineBreakCount(Tokens $tokens, int $whiteStart, int $whiteEn return $lineCount; } + + private function getNextTokenIndex(Tokens $tokens, int $startIndex): ?int + { + $nextIndex = $startIndex; + + do { + $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); + + // @TODO: drop condition when PHP 8.0+ is required + if (\defined('T_ATTRIBUTE')) { + while (null !== $nextIndex && $tokens[$nextIndex]->isGivenKind(T_ATTRIBUTE)) { + $nextIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $nextIndex); + $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); + } + } + } while (null !== $nextIndex && $tokens[$nextIndex]->equals('(')); + + return $nextIndex; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ControlCaseStructuresAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ControlCaseStructuresAnalyzer.php index cb7cf9c43..5e075dff7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ControlCaseStructuresAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/ControlCaseStructuresAnalyzer.php @@ -39,7 +39,7 @@ public static function findControlStructures(Tokens $tokens, array $types): \Gen foreach ($types as $type) { if (!\in_array($type, $typesWithCaseOrDefault, true)) { - throw new \InvalidArgumentException(sprintf('Unexpected type "%d".', $type)); + throw new \InvalidArgumentException(\sprintf('Unexpected type "%d".', $type)); } } @@ -235,7 +235,7 @@ private static function buildControlCaseStructureAnalysis(array $analysis): Abst ); } - throw new \InvalidArgumentException(sprintf('Unexpected type "%d".', $analysis['kind'])); + throw new \InvalidArgumentException(\sprintf('Unexpected type "%d".', $analysis['kind'])); } private static function findCaseOpen(Tokens $tokens, int $kind, int $index): int @@ -243,7 +243,10 @@ private static function findCaseOpen(Tokens $tokens, int $kind, int $index): int if (T_SWITCH === $kind) { $ternariesCount = 0; - do { + --$index; + while (true) { + ++$index; + if ($tokens[$index]->equalsAny(['(', '{'])) { // skip constructs $type = Tokens::detectBlockType($tokens[$index]); $index = $tokens->findBlockEnd($type['type'], $index); @@ -264,7 +267,7 @@ private static function findCaseOpen(Tokens $tokens, int $kind, int $index): int --$ternariesCount; } - } while (++$index); + } return $index; } @@ -273,7 +276,7 @@ private static function findCaseOpen(Tokens $tokens, int $kind, int $index): int return $tokens->getNextTokenOfKind($index, ['=', ';']); } - throw new \InvalidArgumentException(sprintf('Unexpected case for type "%d".', $kind)); + throw new \InvalidArgumentException(\sprintf('Unexpected case for type "%d".', $kind)); } private static function findDefaultOpen(Tokens $tokens, int $kind, int $index): int @@ -286,7 +289,7 @@ private static function findDefaultOpen(Tokens $tokens, int $kind, int $index): return $tokens->getNextTokenOfKind($index, [[T_DOUBLE_ARROW]]); } - throw new \InvalidArgumentException(sprintf('Unexpected default for type "%d".', $kind)); + throw new \InvalidArgumentException(\sprintf('Unexpected default for type "%d".', $kind)); } /** diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/DataProviderAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/DataProviderAnalyzer.php index 8d74d7de8..5fb06f3a7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/DataProviderAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/DataProviderAnalyzer.php @@ -26,11 +26,11 @@ */ final class DataProviderAnalyzer { - private const REGEX_CLASS = '(?:\\\\?+'.TypeExpression::REGEX_IDENTIFIER + private const REGEX_CLASS = '(?:\\\?+'.TypeExpression::REGEX_IDENTIFIER .'(\\\\'.TypeExpression::REGEX_IDENTIFIER.')*+)'; /** - * @return array + * @return list */ public function getDataProviders(Tokens $tokens, int $startIndex, int $endIndex): array { @@ -38,23 +38,21 @@ public function getDataProviders(Tokens $tokens, int $startIndex, int $endIndex) $dataProviders = []; foreach ($methods as $methodIndex) { - $docCommentIndex = $tokens->getTokenNotOfKindSibling( - $methodIndex, - -1, - [[T_ABSTRACT], [T_COMMENT], [T_FINAL], [T_FUNCTION], [T_PRIVATE], [T_PROTECTED], [T_PUBLIC], [T_STATIC], [T_WHITESPACE]] - ); - - if (!$tokens[$docCommentIndex]->isGivenKind(T_DOC_COMMENT)) { - continue; - } + $docCommentIndex = $this->getDocCommentIndex($tokens, $methodIndex); - Preg::matchAll('/@dataProvider\h+(('.self::REGEX_CLASS.'::)?'.TypeExpression::REGEX_IDENTIFIER.')/', $tokens[$docCommentIndex]->getContent(), $matches); + if (null !== $docCommentIndex) { + Preg::matchAll( + '/@dataProvider\h+(('.self::REGEX_CLASS.'::)?'.TypeExpression::REGEX_IDENTIFIER.')/', + $tokens[$docCommentIndex]->getContent(), + $matches, + PREG_OFFSET_CAPTURE + ); - /** @var array $matches */ - $matches = $matches[1]; + foreach ($matches[1] as $k => [$matchName]) { + \assert(isset($matches[0][$k])); - foreach ($matches as $dataProviderName) { - $dataProviders[$dataProviderName][] = $docCommentIndex; + $dataProviders[$matchName][] = [$docCommentIndex, $matches[0][$k][1]]; + } } } @@ -98,4 +96,20 @@ private function getMethods(Tokens $tokens, int $startIndex, int $endIndex): arr return $functions; } + + private function getDocCommentIndex(Tokens $tokens, int $index): ?int + { + $docCommentIndex = null; + while (!$tokens[$index]->equalsAny([';', '{', '}', [T_OPEN_TAG]])) { + --$index; + + if ($tokens[$index]->isGivenKind(T_DOC_COMMENT)) { + $docCommentIndex = $index; + + break; + } + } + + return $docCommentIndex; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FullyQualifiedNameAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FullyQualifiedNameAnalyzer.php new file mode 100644 index 000000000..1c694ed6e --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FullyQualifiedNameAnalyzer.php @@ -0,0 +1,103 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Tokenizer\Analyzer; + +use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @internal + */ +final class FullyQualifiedNameAnalyzer +{ + private Tokens $tokens; + + /** + * @var list + */ + private array $namespaceAnalyses = []; + + /** + * @var array> + */ + private array $namespaceUseAnalyses = []; + + public function __construct(Tokens $tokens) + { + $this->tokens = $tokens; + } + + /** + * @param NamespaceUseAnalysis::TYPE_* $importType + */ + public function getFullyQualifiedName(string $name, int $indexInNamespace, int $importType): string + { + return ltrim($this->getFullyQualifiedNameWithPossiblyLeadingSlash($name, $indexInNamespace, $importType), '\\'); + } + + /** + * @param NamespaceUseAnalysis::TYPE_* $importType + */ + private function getFullyQualifiedNameWithPossiblyLeadingSlash(string $name, int $indexInNamespace, int $importType): string + { + if ('\\' === $name[0]) { + return $name; + } + + $namespaceAnalysis = $this->getNamespaceAnalysis($indexInNamespace); + + $this->namespaceUseAnalyses[$namespaceAnalysis->getStartIndex()] ??= (new NamespaceUsesAnalyzer())->getDeclarationsInNamespace($this->tokens, $namespaceAnalysis); + \assert(isset($this->namespaceUseAnalyses[$namespaceAnalysis->getStartIndex()])); + + $declarations = []; + foreach ($this->namespaceUseAnalyses[$namespaceAnalysis->getStartIndex()] as $namespaceUseAnalysis) { + if ($namespaceUseAnalysis->getType() !== $importType) { + continue; + } + $declarations[strtolower($namespaceUseAnalysis->getShortName())] = $namespaceUseAnalysis->getFullName(); + } + + $lowercaseName = strtolower($name); + foreach ($declarations as $lowercaseShortName => $fullName) { + if ($lowercaseName === $lowercaseShortName) { + return $fullName; + } + + if (!str_starts_with($lowercaseName, $lowercaseShortName.'\\')) { + continue; + } + + return $fullName.substr($name, \strlen($lowercaseShortName)); + } + + return $namespaceAnalysis->getFullName().'\\'.$name; + } + + private function getNamespaceAnalysis(int $index): NamespaceAnalysis + { + foreach ($this->namespaceAnalyses as $namespace) { + if ($namespace->getScopeStartIndex() <= $index && $namespace->getScopeEndIndex() >= $index) { + return $namespace; + } + } + + $namespace = (new NamespacesAnalyzer())->getNamespaceAt($this->tokens, $index); + + $this->namespaceAnalyses[] = $namespace; + + return $namespace; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php index 51b2ac03e..601122f8a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/FunctionsAnalyzer.php @@ -40,9 +40,9 @@ public function isGlobalFunctionCall(Tokens $tokens, int $index): bool return false; } - $nextIndex = $tokens->getNextMeaningfulToken($index); + $openParenthesisIndex = $tokens->getNextMeaningfulToken($index); - if (!$tokens[$nextIndex]->equals('(')) { + if (!$tokens[$openParenthesisIndex]->equals('(')) { return false; } @@ -68,7 +68,7 @@ public function isGlobalFunctionCall(Tokens $tokens, int $index): bool return false; } - if ($tokens[$tokens->getNextMeaningfulToken($nextIndex)]->isGivenKind(CT::T_FIRST_CLASS_CALLABLE)) { + if ($tokens[$tokens->getNextMeaningfulToken($openParenthesisIndex)]->isGivenKind(CT::T_FIRST_CLASS_CALLABLE)) { return false; } @@ -76,6 +76,16 @@ public function isGlobalFunctionCall(Tokens $tokens, int $index): bool return true; } + $functionName = strtolower($tokens[$index]->getContent()); + + if ('set' === $functionName) { + $closeParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesisIndex); + $afterCloseParenthesisIndex = $tokens->getNextMeaningfulToken($closeParenthesisIndex); + if ($tokens[$afterCloseParenthesisIndex]->equalsAny(['{', [T_DOUBLE_ARROW]])) { + return false; + } + } + if ($tokens->isChanged() || $tokens->getCodeHash() !== $this->functionsAnalysis['tokens']) { $this->buildFunctionsAnalysis($tokens); } @@ -96,8 +106,6 @@ public function isGlobalFunctionCall(Tokens $tokens, int $index): bool } } - $call = strtolower($tokens[$index]->getContent()); - // check if the call is to a function declared in the same namespace as the call is done, // if the call is already in the global namespace than declared functions are in the same // global namespace and don't need checking @@ -109,7 +117,7 @@ public function isGlobalFunctionCall(Tokens $tokens, int $index): bool continue; } - if (strtolower($tokens[$functionNameIndex]->getContent()) === $call) { + if (strtolower($tokens[$functionNameIndex]->getContent()) === $functionName) { return false; } } @@ -121,7 +129,7 @@ public function isGlobalFunctionCall(Tokens $tokens, int $index): bool continue; } - if ($call !== strtolower($functionUse->getShortName())) { + if ($functionName !== strtolower($functionUse->getShortName())) { continue; } @@ -184,7 +192,7 @@ public function getFunctionReturnType(Tokens $tokens, int $methodIndex): ?TypeAn public function isTheSameClassCall(Tokens $tokens, int $index): bool { if (!$tokens->offsetExists($index)) { - return false; + throw new \InvalidArgumentException(\sprintf('Token index %d does not exist.', $index)); } $operatorIndex = $tokens->getPrevMeaningfulToken($index); @@ -203,7 +211,11 @@ public function isTheSameClassCall(Tokens $tokens, int $index): bool return false; } - return $tokens[$referenceIndex]->equalsAny([[T_VARIABLE, '$this'], [T_STRING, 'self'], [T_STATIC, 'static']], false); + if (!$tokens[$referenceIndex]->equalsAny([[T_VARIABLE, '$this'], [T_STRING, 'self'], [T_STATIC, 'static']], false)) { + return false; + } + + return $tokens[$tokens->getNextMeaningfulToken($index)]->equals('('); } private function buildFunctionsAnalysis(Tokens $tokens): void diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php index 40e9053a5..fea85906f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespaceUsesAnalyzer.php @@ -21,29 +21,34 @@ use PhpCsFixer\Tokenizer\TokensAnalyzer; /** + * @author VeeWee + * @author Greg Korba + * * @internal + * + * @TODO Drop `allowMultiUses` opt-in flag when all fixers are updated and can handle multi-use statements. */ final class NamespaceUsesAnalyzer { /** * @return list */ - public function getDeclarationsFromTokens(Tokens $tokens): array + public function getDeclarationsFromTokens(Tokens $tokens, bool $allowMultiUses = false): array { $tokenAnalyzer = new TokensAnalyzer($tokens); $useIndices = $tokenAnalyzer->getImportUseIndexes(); - return $this->getDeclarations($tokens, $useIndices); + return $this->getDeclarations($tokens, $useIndices, $allowMultiUses); } /** * @return list */ - public function getDeclarationsInNamespace(Tokens $tokens, NamespaceAnalysis $namespace): array + public function getDeclarationsInNamespace(Tokens $tokens, NamespaceAnalysis $namespace, bool $allowMultiUses = false): array { $namespaceUses = []; - foreach ($this->getDeclarationsFromTokens($tokens) as $namespaceUse) { + foreach ($this->getDeclarationsFromTokens($tokens, $allowMultiUses) as $namespaceUse) { if ($namespaceUse->getStartIndex() >= $namespace->getScopeStartIndex() && $namespaceUse->getStartIndex() <= $namespace->getScopeEndIndex()) { $namespaceUses[] = $namespaceUse; } @@ -57,45 +62,124 @@ public function getDeclarationsInNamespace(Tokens $tokens, NamespaceAnalysis $na * * @return list */ - private function getDeclarations(Tokens $tokens, array $useIndices): array + private function getDeclarations(Tokens $tokens, array $useIndices, bool $allowMultiUses = false): array { $uses = []; foreach ($useIndices as $index) { $endIndex = $tokens->getNextTokenOfKind($index, [';', [T_CLOSE_TAG]]); - $analysis = $this->parseDeclaration($tokens, $index, $endIndex); - if (null !== $analysis) { - $uses[] = $analysis; + $declarations = $this->parseDeclarations($index, $endIndex, $tokens); + if (false === $allowMultiUses) { + $declarations = array_filter($declarations, static fn (NamespaceUseAnalysis $declaration) => !$declaration->isInMulti()); + } + + if ([] !== $declarations) { + $uses = array_merge($uses, $declarations); } } return $uses; } - private function parseDeclaration(Tokens $tokens, int $startIndex, int $endIndex): ?NamespaceUseAnalysis + /** + * @return list + */ + private function parseDeclarations(int $startIndex, int $endIndex, Tokens $tokens): array { - $fullName = $shortName = ''; - $aliased = false; + $type = $this->determineImportType($tokens, $startIndex); + $potentialMulti = $tokens->getNextTokenOfKind($startIndex, [',', [CT::T_GROUP_IMPORT_BRACE_OPEN]]); + $multi = null !== $potentialMulti && $potentialMulti < $endIndex; + $index = $tokens->getNextTokenOfKind($startIndex, [[T_STRING], [T_NS_SEPARATOR]]); + $imports = []; + + while (null !== $index && $index <= $endIndex) { + $qualifiedName = $this->getNearestQualifiedName($tokens, $index); + $token = $tokens[$qualifiedName['afterIndex']]; + + if ($token->isGivenKind(CT::T_GROUP_IMPORT_BRACE_OPEN)) { + $groupStart = $groupIndex = $qualifiedName['afterIndex']; + $groupEnd = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_GROUP_IMPORT_BRACE, $groupStart); + + while ($groupIndex < $groupEnd) { + $chunkStart = $tokens->getNextMeaningfulToken($groupIndex); + + // Finish parsing on trailing comma (no more chunks there) + if ($tokens[$chunkStart]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) { + break; + } + + $groupQualifiedName = $this->getNearestQualifiedName($tokens, $chunkStart); + $imports[] = new NamespaceUseAnalysis( + $type, + $qualifiedName['fullName'].$groupQualifiedName['fullName'], // @phpstan-ignore argument.type + $groupQualifiedName['shortName'], + $groupQualifiedName['aliased'], + true, + $startIndex, + $endIndex, + $chunkStart, + $tokens->getPrevMeaningfulToken($groupQualifiedName['afterIndex']) + ); + + $groupIndex = $groupQualifiedName['afterIndex']; + } - $type = NamespaceUseAnalysis::TYPE_CLASS; - for ($i = $startIndex; $i <= $endIndex; ++$i) { - $token = $tokens[$i]; - if ($token->equals(',') || $token->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) { - // do not touch group use declarations until the logic of this is added (for example: `use some\a\{ClassD};`) - // ignore multiple use statements that should be split into few separate statements (for example: `use BarB, BarC as C;`) - return null; - } + $index = $groupIndex; + } elseif ($token->equalsAny([',', ';', [T_CLOSE_TAG]])) { + $previousToken = $tokens->getPrevMeaningfulToken($qualifiedName['afterIndex']); + + if (!$tokens[$previousToken]->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) { + $imports[] = new NamespaceUseAnalysis( + $type, + $qualifiedName['fullName'], + $qualifiedName['shortName'], + $qualifiedName['aliased'], + $multi, + $startIndex, + $endIndex, + $multi ? $index : null, + $multi ? $previousToken : null + ); + } - if ($token->isGivenKind(CT::T_FUNCTION_IMPORT)) { - $type = NamespaceUseAnalysis::TYPE_FUNCTION; - } elseif ($token->isGivenKind(CT::T_CONST_IMPORT)) { - $type = NamespaceUseAnalysis::TYPE_CONSTANT; + $index = $qualifiedName['afterIndex']; } - if ($token->isWhitespace() || $token->isComment() || $token->isGivenKind(T_USE)) { - continue; - } + $index = $tokens->getNextMeaningfulToken($index); + } + + return $imports; + } + + /** + * @return NamespaceUseAnalysis::TYPE_* + */ + private function determineImportType(Tokens $tokens, int $startIndex): int + { + $potentialType = $tokens[$tokens->getNextMeaningfulToken($startIndex)]; + + if ($potentialType->isGivenKind(CT::T_FUNCTION_IMPORT)) { + return NamespaceUseAnalysis::TYPE_FUNCTION; + } + + if ($potentialType->isGivenKind(CT::T_CONST_IMPORT)) { + return NamespaceUseAnalysis::TYPE_CONSTANT; + } + + return NamespaceUseAnalysis::TYPE_CLASS; + } + + /** + * @return array{fullName: class-string, shortName: string, aliased: bool, afterIndex: int} + */ + private function getNearestQualifiedName(Tokens $tokens, int $index): array + { + $fullName = $shortName = ''; + $aliased = false; + + while (null !== $index) { + $token = $tokens[$index]; if ($token->isGivenKind(T_STRING)) { $shortName = $token->getContent(); @@ -106,16 +190,27 @@ private function parseDeclaration(Tokens $tokens, int $startIndex, int $endIndex $fullName .= $token->getContent(); } elseif ($token->isGivenKind(T_AS)) { $aliased = true; + } elseif ($token->equalsAny([ + ',', + ';', + [CT::T_GROUP_IMPORT_BRACE_OPEN], + [CT::T_GROUP_IMPORT_BRACE_CLOSE], + [T_CLOSE_TAG], + ])) { + break; } + + $index = $tokens->getNextMeaningfulToken($index); } - return new NamespaceUseAnalysis( - trim($fullName), - $shortName, - $aliased, - $startIndex, - $endIndex, - $type - ); + /** @var class-string $fqn */ + $fqn = $fullName; + + return [ + 'fullName' => $fqn, + 'shortName' => $shortName, + 'aliased' => $aliased, + 'afterIndex' => $index, + ]; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php index 3890523ae..ed1dacd4a 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/NamespacesAnalyzer.php @@ -15,6 +15,7 @@ namespace PhpCsFixer\Tokenizer\Analyzer; use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; +use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis; use PhpCsFixer\Tokenizer\Tokens; /** @@ -64,8 +65,15 @@ public function getDeclarations(Tokens $tokens): array $index = $scopeEndIndex; } - if (0 === \count($namespaces)) { - $namespaces[] = new NamespaceAnalysis('', '', 0, 0, 0, \count($tokens) - 1); + if (0 === \count($namespaces) && $tokens->isTokenKindFound(T_OPEN_TAG)) { + $namespaces[] = new NamespaceAnalysis( + '', + '', + $openTagIndex = $tokens[0]->isGivenKind(T_INLINE_HTML) ? 1 : 0, + $openTagIndex, + $openTagIndex, + \count($tokens) - 1, + ); } return $namespaces; @@ -74,7 +82,7 @@ public function getDeclarations(Tokens $tokens): array public function getNamespaceAt(Tokens $tokens, int $index): NamespaceAnalysis { if (!$tokens->offsetExists($index)) { - throw new \InvalidArgumentException(sprintf('Token index %d does not exist.', $index)); + throw new \InvalidArgumentException(\sprintf('Token index %d does not exist.', $index)); } foreach ($this->getDeclarations($tokens) as $namespace) { @@ -83,6 +91,26 @@ public function getNamespaceAt(Tokens $tokens, int $index): NamespaceAnalysis } } - throw new \LogicException(sprintf('Unable to get the namespace at index %d.', $index)); + throw new \LogicException(\sprintf('Unable to get the namespace at index %d.', $index)); + } + + /** + * @return array{NamespaceAnalysis, array} + */ + public static function collectNamespaceAnalysis(Tokens $tokens, int $startIndex): array + { + $namespaceAnalysis = (new self())->getNamespaceAt($tokens, $startIndex); + $namespaceUseAnalyses = (new NamespaceUsesAnalyzer())->getDeclarationsInNamespace($tokens, $namespaceAnalysis); + + $uses = []; + foreach ($namespaceUseAnalyses as $use) { + if (!$use->isClass()) { + continue; + } + + $uses[$use->getShortName()] = $use; + } + + return [$namespaceAnalysis, $uses]; } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php new file mode 100644 index 000000000..92595ffd8 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Analyzer/SwitchAnalyzer.php @@ -0,0 +1,71 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Tokenizer\Analyzer; + +use PhpCsFixer\Tokenizer\Analyzer\Analysis\SwitchAnalysis; +use PhpCsFixer\Tokenizer\Tokens; + +/** + * @internal + */ +final class SwitchAnalyzer +{ + /** @var array> */ + private static array $cache = []; + + public static function belongsToSwitch(Tokens $tokens, int $index): bool + { + if (!$tokens[$index]->equals(':')) { + return false; + } + + $collectionHash = $tokens->getCollectionHash(); + + if (!\array_key_exists($collectionHash, self::$cache)) { + self::$cache[$collectionHash] = self::getColonIndicesForSwitch(clone $tokens); + } + + $arr = self::$cache[$collectionHash]; + + return \in_array($index, $arr, true); + } + + /** + * @return list + */ + private static function getColonIndicesForSwitch(Tokens $tokens): array + { + $colonIndices = []; + + /** @var SwitchAnalysis $analysis */ + foreach (ControlCaseStructuresAnalyzer::findControlStructures($tokens, [T_SWITCH]) as $analysis) { + if ($tokens[$analysis->getOpenIndex()]->equals(':')) { + $colonIndices[] = $analysis->getOpenIndex(); + } + + foreach ($analysis->getCases() as $case) { + $colonIndices[] = $case->getColonIndex(); + } + + $defaultAnalysis = $analysis->getDefaultAnalysis(); + + if (null !== $defaultAnalysis) { + $colonIndices[] = $defaultAnalysis->getColonIndex(); + } + } + + return $colonIndices; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php index 0b32ef948..eefe46d3f 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/CT.php @@ -19,45 +19,47 @@ */ final class CT { - public const T_ARRAY_INDEX_CURLY_BRACE_CLOSE = 10001; - public const T_ARRAY_INDEX_CURLY_BRACE_OPEN = 10002; - public const T_ARRAY_SQUARE_BRACE_CLOSE = 10003; - public const T_ARRAY_SQUARE_BRACE_OPEN = 10004; - public const T_ARRAY_TYPEHINT = 10005; - public const T_BRACE_CLASS_INSTANTIATION_CLOSE = 10006; - public const T_BRACE_CLASS_INSTANTIATION_OPEN = 10007; - public const T_CLASS_CONSTANT = 10008; - public const T_CONST_IMPORT = 10009; - public const T_CURLY_CLOSE = 10010; - public const T_DESTRUCTURING_SQUARE_BRACE_CLOSE = 10011; - public const T_DESTRUCTURING_SQUARE_BRACE_OPEN = 10012; - public const T_DOLLAR_CLOSE_CURLY_BRACES = 10013; - public const T_DYNAMIC_PROP_BRACE_CLOSE = 10014; - public const T_DYNAMIC_PROP_BRACE_OPEN = 10015; - public const T_DYNAMIC_VAR_BRACE_CLOSE = 10016; - public const T_DYNAMIC_VAR_BRACE_OPEN = 10017; - public const T_FUNCTION_IMPORT = 10018; - public const T_GROUP_IMPORT_BRACE_CLOSE = 10019; - public const T_GROUP_IMPORT_BRACE_OPEN = 10020; - public const T_NAMESPACE_OPERATOR = 10021; - public const T_NULLABLE_TYPE = 10022; - public const T_RETURN_REF = 10023; - public const T_TYPE_ALTERNATION = 10024; - public const T_TYPE_COLON = 10025; - public const T_USE_LAMBDA = 10026; - public const T_USE_TRAIT = 10027; - public const T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC = 10028; - public const T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED = 10029; - public const T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE = 10030; - public const T_ATTRIBUTE_CLOSE = 10031; - public const T_NAMED_ARGUMENT_NAME = 10032; - public const T_NAMED_ARGUMENT_COLON = 10033; - public const T_FIRST_CLASS_CALLABLE = 10034; - public const T_TYPE_INTERSECTION = 10035; - public const T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN = 10036; - public const T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE = 10037; - public const T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_OPEN = 10038; - public const T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_CLOSE = 10039; + public const T_ARRAY_INDEX_CURLY_BRACE_CLOSE = 10_001; + public const T_ARRAY_INDEX_CURLY_BRACE_OPEN = 10_002; + public const T_ARRAY_SQUARE_BRACE_CLOSE = 10_003; + public const T_ARRAY_SQUARE_BRACE_OPEN = 10_004; + public const T_ARRAY_TYPEHINT = 10_005; + public const T_BRACE_CLASS_INSTANTIATION_CLOSE = 10_006; + public const T_BRACE_CLASS_INSTANTIATION_OPEN = 10_007; + public const T_CLASS_CONSTANT = 10_008; + public const T_CONST_IMPORT = 10_009; + public const T_CURLY_CLOSE = 10_010; + public const T_DESTRUCTURING_SQUARE_BRACE_CLOSE = 10_011; + public const T_DESTRUCTURING_SQUARE_BRACE_OPEN = 10_012; + public const T_DOLLAR_CLOSE_CURLY_BRACES = 10_013; + public const T_DYNAMIC_PROP_BRACE_CLOSE = 10_014; + public const T_DYNAMIC_PROP_BRACE_OPEN = 10_015; + public const T_DYNAMIC_VAR_BRACE_CLOSE = 10_016; + public const T_DYNAMIC_VAR_BRACE_OPEN = 10_017; + public const T_FUNCTION_IMPORT = 10_018; + public const T_GROUP_IMPORT_BRACE_CLOSE = 10_019; + public const T_GROUP_IMPORT_BRACE_OPEN = 10_020; + public const T_NAMESPACE_OPERATOR = 10_021; + public const T_NULLABLE_TYPE = 10_022; + public const T_RETURN_REF = 10_023; + public const T_TYPE_ALTERNATION = 10_024; + public const T_TYPE_COLON = 10_025; + public const T_USE_LAMBDA = 10_026; + public const T_USE_TRAIT = 10_027; + public const T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC = 10_028; + public const T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED = 10_029; + public const T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE = 10_030; + public const T_ATTRIBUTE_CLOSE = 10_031; + public const T_NAMED_ARGUMENT_NAME = 10_032; + public const T_NAMED_ARGUMENT_COLON = 10_033; + public const T_FIRST_CLASS_CALLABLE = 10_034; + public const T_TYPE_INTERSECTION = 10_035; + public const T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN = 10_036; + public const T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE = 10_037; + public const T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_OPEN = 10_038; + public const T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_CLOSE = 10_039; + public const T_PROPERTY_HOOK_BRACE_OPEN = 10_040; + public const T_PROPERTY_HOOK_BRACE_CLOSE = 10_041; private function __construct() {} @@ -65,15 +67,19 @@ private function __construct() {} * Get name for custom token. * * @param int $value custom token value + * + * @return non-empty-string */ public static function getName(int $value): string { if (!self::has($value)) { - throw new \InvalidArgumentException(sprintf('No custom token was found for "%s".', $value)); + throw new \InvalidArgumentException(\sprintf('No custom token was found for "%s".', $value)); } $tokens = self::getMapById(); + \assert(isset($tokens[$value])); + return 'CT::'.$tokens[$value]; } @@ -90,14 +96,14 @@ public static function has(int $value): bool } /** - * @return array + * @return array */ private static function getMapById(): array { static $constants; if (null === $constants) { - $reflection = new \ReflectionClass(__CLASS__); + $reflection = new \ReflectionClass(self::class); $constants = array_flip($reflection->getConstants()); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Processor/ImportProcessor.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Processor/ImportProcessor.php new file mode 100644 index 000000000..46bfe06e2 --- /dev/null +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Processor/ImportProcessor.php @@ -0,0 +1,103 @@ + + * Dariusz Rumiński + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace PhpCsFixer\Tokenizer\Processor; + +use PhpCsFixer\Tokenizer\CT; +use PhpCsFixer\Tokenizer\Token; +use PhpCsFixer\Tokenizer\Tokens; +use PhpCsFixer\WhitespacesFixerConfig; + +/** + * @author Greg Korba + * + * @readonly + */ +final class ImportProcessor +{ + private WhitespacesFixerConfig $whitespacesConfig; + + public function __construct(WhitespacesFixerConfig $whitespacesConfig) + { + $this->whitespacesConfig = $whitespacesConfig; + } + + /** + * @param array{ + * const?: array, + * class?: array, + * function?: array + * } $imports + */ + public function insertImports(Tokens $tokens, array $imports, int $atIndex): void + { + $lineEnding = $this->whitespacesConfig->getLineEnding(); + + if (!$tokens[$atIndex]->isWhitespace() || !str_contains($tokens[$atIndex]->getContent(), "\n")) { + $tokens->insertAt($atIndex, new Token([T_WHITESPACE, $lineEnding])); + } + + foreach ($imports as $type => $typeImports) { + sort($typeImports); + + $items = []; + + foreach ($typeImports as $name) { + $items = array_merge($items, [ + new Token([T_WHITESPACE, $lineEnding]), + new Token([T_USE, 'use']), + new Token([T_WHITESPACE, ' ']), + ]); + + if ('const' === $type) { + $items[] = new Token([CT::T_CONST_IMPORT, 'const']); + $items[] = new Token([T_WHITESPACE, ' ']); + } elseif ('function' === $type) { + $items[] = new Token([CT::T_FUNCTION_IMPORT, 'function']); + $items[] = new Token([T_WHITESPACE, ' ']); + } + + $items = array_merge($items, self::tokenizeName($name)); + $items[] = new Token(';'); + } + + $tokens->insertAt($atIndex, $items); + } + } + + /** + * @param class-string $name + * + * @return list + */ + public static function tokenizeName(string $name): array + { + $parts = explode('\\', $name); + $newTokens = []; + + if ('' === $parts[0]) { + $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); + array_shift($parts); + } + + foreach ($parts as $part) { + $newTokens[] = new Token([T_STRING, $part]); + $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); + } + + array_pop($newTokens); + + return $newTokens; + } +} diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php index 1009717cb..57ad192d6 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Token.php @@ -14,11 +14,15 @@ namespace PhpCsFixer\Tokenizer; +use PhpCsFixer\Utils; + /** * Representation of single token. * As a token prototype you should understand a single element generated by token_get_all. * * @author Dariusz Rumiński + * + * @readonly */ final class Token { @@ -30,18 +34,13 @@ final class Token /** * ID of token prototype, if available. */ - private ?int $id = null; + private ?int $id; /** * If token prototype is an array. */ private bool $isArray; - /** - * Flag is token was changed. - */ - private bool $changed = false; - /** * @param array{int, string}|string $token token prototype */ @@ -49,14 +48,14 @@ public function __construct($token) { if (\is_array($token)) { if (!\is_int($token[0])) { - throw new \InvalidArgumentException(sprintf( + throw new \InvalidArgumentException(\sprintf( 'Id must be an int, got "%s".', get_debug_type($token[0]) )); } if (!\is_string($token[1])) { - throw new \InvalidArgumentException(sprintf( + throw new \InvalidArgumentException(\sprintf( 'Content must be a string, got "%s".', get_debug_type($token[1]) )); @@ -71,9 +70,10 @@ public function __construct($token) $this->content = $token[1]; } elseif (\is_string($token)) { $this->isArray = false; + $this->id = null; $this->content = $token; } else { - throw new \InvalidArgumentException(sprintf('Cannot recognize input value as valid Token prototype, got "%s".', get_debug_type($token))); + throw new \InvalidArgumentException(\sprintf('Cannot recognize input value as valid Token prototype, got "%s".', get_debug_type($token))); } } @@ -209,13 +209,20 @@ public function equalsAny(array $others, bool $caseSensitive = true): bool /** * A helper method used to find out whether a certain input token has to be case-sensitively matched. * - * @param bool|list $caseSensitive global case sensitiveness or an array of booleans, whose keys should match - * the ones used in $sequence. If any is missing, the default case-sensitive - * comparison is used - * @param int $key the key of the token that has to be looked up + * @param array|bool $caseSensitive global case sensitiveness or an array of booleans, whose keys should match + * the ones used in $sequence. If any is missing, the default case-sensitive + * comparison is used + * @param int $key the key of the token that has to be looked up + * + * @deprecated */ public static function isKeyCaseSensitive($caseSensitive, int $key): bool { + Utils::triggerDeprecation(new \InvalidArgumentException(\sprintf( + 'Method "%s" is deprecated and will be removed in the next major version.', + __METHOD__ + ))); + if (\is_array($caseSensitive)) { return $caseSensitive[$key] ?? true; } @@ -224,7 +231,7 @@ public static function isKeyCaseSensitive($caseSensitive, int $key): bool } /** - * @return array{int, string}|string + * @return array{int, non-empty-string}|string */ public function getPrototype() { @@ -232,6 +239,8 @@ public function getPrototype() return $this->content; } + \assert('' !== $this->content); + return [ $this->id, $this->content, @@ -263,7 +272,7 @@ public function getId(): ?int * * It shall be used only for getting the name of token, not for checking it against excepted value. * - * @return null|string token name + * @return null|non-empty-string token name */ public function getName(): ?string { @@ -279,7 +288,7 @@ public function getName(): ?string * * It shall be used only for getting the name of token, not for checking it against excepted value. * - * @return null|string token name + * @return null|non-empty-string token name */ public static function getNameForId(int $id): ?string { @@ -295,7 +304,7 @@ public static function getNameForId(int $id): ?string /** * Generate array containing all keywords that exists in PHP version in use. * - * @return array + * @return list */ public static function getKeywords(): array { @@ -351,6 +360,9 @@ public static function getMagicConstants(): array * Check if token prototype is an array. * * @return bool is array + * + * @phpstan-assert-if-true !=null $this->getId() + * @phpstan-assert-if-true !='' $this->getContent() */ public function isArray(): bool { @@ -359,6 +371,8 @@ public function isArray(): bool /** * Check if token is one of type cast tokens. + * + * @phpstan-assert-if-true !='' $this->getContent() */ public function isCast(): bool { @@ -367,6 +381,8 @@ public function isCast(): bool /** * Check if token is one of classy tokens: T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM. + * + * @phpstan-assert-if-true !='' $this->getContent() */ public function isClassy(): bool { @@ -375,6 +391,8 @@ public function isClassy(): bool /** * Check if token is one of comment tokens: T_COMMENT or T_DOC_COMMENT. + * + * @phpstan-assert-if-true !='' $this->getContent() */ public function isComment(): bool { @@ -385,6 +403,8 @@ public function isComment(): bool /** * Check if token is one of object operator tokens: T_OBJECT_OPERATOR or T_NULLSAFE_OBJECT_OPERATOR. + * + * @phpstan-assert-if-true !='' $this->getContent() */ public function isObjectOperator(): bool { @@ -395,6 +415,8 @@ public function isObjectOperator(): bool * Check if token is one of given kind. * * @param int|list $possibleKind kind or array of kinds + * + * @phpstan-assert-if-true !='' $this->getContent() */ public function isGivenKind($possibleKind): bool { @@ -403,6 +425,8 @@ public function isGivenKind($possibleKind): bool /** * Check if token is a keyword. + * + * @phpstan-assert-if-true !='' $this->getContent() */ public function isKeyword(): bool { @@ -413,6 +437,8 @@ public function isKeyword(): bool /** * Check if token is a native PHP constant: true, false or null. + * + * @phpstan-assert-if-true !='' $this->getContent() */ public function isNativeConstant(): bool { @@ -424,6 +450,8 @@ public function isNativeConstant(): bool /** * Returns if the token is of a Magic constants type. * + * @phpstan-assert-if-true !='' $this->getContent() + * * @see https://php.net/manual/en/language.constants.predefined.php */ public function isMagicConstant(): bool @@ -454,7 +482,7 @@ public function isWhitespace(?string $whitespaces = " \t\n\r\0\x0B"): bool /** * @return array{ * id: int|null, - * name: string|null, + * name: non-empty-string|null, * content: string, * isArray: bool, * changed: bool, @@ -467,10 +495,13 @@ public function toArray(): array 'name' => $this->getName(), 'content' => $this->content, 'isArray' => $this->isArray, - 'changed' => $this->changed, + 'changed' => false, // @TODO v4: remove index ]; } + /** + * @return non-empty-string + */ public function toJson(): string { $jsonResult = json_encode($this->toArray(), JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK); @@ -485,6 +516,8 @@ public function toJson(): string ); } + \assert(false !== $jsonResult); + return $jsonResult; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php index a7e2e9ce6..c4d246424 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Tokens.php @@ -14,9 +14,12 @@ namespace PhpCsFixer\Tokenizer; +use PhpCsFixer\Console\Application; +use PhpCsFixer\Hasher; use PhpCsFixer\Preg; use PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis; use PhpCsFixer\Tokenizer\Analyzer\NamespacesAnalyzer; +use PhpCsFixer\Utils; /** * Collection of code tokens. @@ -48,11 +51,13 @@ class Tokens extends \SplFixedArray public const BLOCK_TYPE_ATTRIBUTE = 11; public const BLOCK_TYPE_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS = 12; public const BLOCK_TYPE_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE = 13; + public const BLOCK_TYPE_COMPLEX_STRING_VARIABLE = 14; + public const BLOCK_TYPE_PROPERTY_HOOK = 15; /** * Static class cache. * - * @var array + * @var array */ private static array $cache = []; @@ -71,10 +76,19 @@ class Tokens extends \SplFixedArray private array $blockEndCache = []; /** - * A MD5 hash of the code string. + * An hash of the code string. + * + * @var ?non-empty-string */ private ?string $codeHash = null; + /** + * An hash of the collection items. + * + * @var ?non-empty-string + */ + private ?string $collectionHash = null; + /** * Flag is collection was changed. * @@ -87,9 +101,9 @@ class Tokens extends \SplFixedArray * * When the token kind is present in this set it means that given token kind * was ever seen inside the collection (but may not be part of it any longer). - * The key is token kind and the value is always true. + * The key is token kind and the value is the number of occurrences. * - * @var array + * @var array> */ private array $foundTokenKinds = []; @@ -111,7 +125,7 @@ public function __clone() /** * Clear cache - one position or all of them. * - * @param null|string $key position to clear, when null clear all + * @param null|non-empty-string $key position to clear, when null clear all */ public static function clearCache(?string $key = null): void { @@ -127,49 +141,58 @@ public static function clearCache(?string $key = null): void /** * Detect type of block. * - * @param Token $token token - * * @return null|array{type: self::BLOCK_TYPE_*, isStart: bool} */ public static function detectBlockType(Token $token): ?array { - foreach (self::getBlockEdgeDefinitions() as $type => $definition) { - if ($token->equals($definition['start'])) { - return ['type' => $type, 'isStart' => true]; - } - - if ($token->equals($definition['end'])) { - return ['type' => $type, 'isStart' => false]; + static $blockEdgeKinds = null; + + if (null === $blockEdgeKinds) { + $blockEdgeKinds = []; + foreach (self::getBlockEdgeDefinitions() as $type => $definition) { + $blockEdgeKinds[ + \is_string($definition['start']) ? $definition['start'] : $definition['start'][0] + ] = ['type' => $type, 'isStart' => true]; + $blockEdgeKinds[ + \is_string($definition['end']) ? $definition['end'] : $definition['end'][0] + ] = ['type' => $type, 'isStart' => false]; } } - return null; + // inlined extractTokenKind() call on the hot path + $tokenKind = $token->isArray() ? $token->getId() : $token->getContent(); + + return $blockEdgeKinds[$tokenKind] ?? null; } /** * Create token collection from array. * - * @param Token[] $array the array to import - * @param ?bool $saveIndices save the numeric indices used in the original array, default is yes + * @param array $array the array to import + * @param ?bool $saveIndices save the numeric indices used in the original array, default is yes */ public static function fromArray($array, $saveIndices = null): self { $tokens = new self(\count($array)); - if ($saveIndices ?? true) { + if (false !== $saveIndices && !array_is_list($array)) { + Utils::triggerDeprecation(new \InvalidArgumentException(\sprintf( + 'Parameter "array" should be a list. This will be enforced in version %d.0.', + Application::getMajorVersion() + 1 + ))); + foreach ($array as $key => $val) { $tokens[$key] = $val; } } else { $index = 0; - foreach ($array as $val) { $tokens[$index++] = $val; } } - $tokens->generateCode(); // regenerate code to calculate code hash $tokens->clearChanged(); + $tokens->generateCode(); // ensure code hash is calculated, so it's registered in cache return $tokens; } @@ -181,14 +204,11 @@ public static function fromArray($array, $saveIndices = null): self */ public static function fromCode(string $code): self { - $codeHash = self::calculateCodeHash($code); + $codeHash = self::calculateHash($code); if (self::hasCache($codeHash)) { $tokens = self::getCache($codeHash); - // generate the code to recalculate the hash - $tokens->generateCode(); - if ($codeHash === $tokens->codeHash) { $tokens->clearEmptyTokens(); $tokens->clearChanged(); @@ -205,67 +225,78 @@ public static function fromCode(string $code): self } /** - * @return array> + * @return array */ public static function getBlockEdgeDefinitions(): array { - $definitions = [ - self::BLOCK_TYPE_CURLY_BRACE => [ - 'start' => '{', - 'end' => '}', - ], - self::BLOCK_TYPE_PARENTHESIS_BRACE => [ - 'start' => '(', - 'end' => ')', - ], - self::BLOCK_TYPE_INDEX_SQUARE_BRACE => [ - 'start' => '[', - 'end' => ']', - ], - self::BLOCK_TYPE_ARRAY_SQUARE_BRACE => [ - 'start' => [CT::T_ARRAY_SQUARE_BRACE_OPEN, '['], - 'end' => [CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']'], - ], - self::BLOCK_TYPE_DYNAMIC_PROP_BRACE => [ - 'start' => [CT::T_DYNAMIC_PROP_BRACE_OPEN, '{'], - 'end' => [CT::T_DYNAMIC_PROP_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_DYNAMIC_VAR_BRACE => [ - 'start' => [CT::T_DYNAMIC_VAR_BRACE_OPEN, '{'], - 'end' => [CT::T_DYNAMIC_VAR_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE => [ - 'start' => [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{'], - 'end' => [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_GROUP_IMPORT_BRACE => [ - 'start' => [CT::T_GROUP_IMPORT_BRACE_OPEN, '{'], - 'end' => [CT::T_GROUP_IMPORT_BRACE_CLOSE, '}'], - ], - self::BLOCK_TYPE_DESTRUCTURING_SQUARE_BRACE => [ - 'start' => [CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '['], - 'end' => [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']'], - ], - self::BLOCK_TYPE_BRACE_CLASS_INSTANTIATION => [ - 'start' => [CT::T_BRACE_CLASS_INSTANTIATION_OPEN, '('], - 'end' => [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE, ')'], - ], - self::BLOCK_TYPE_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS => [ - 'start' => [CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN, '('], - 'end' => [CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE, ')'], - ], - self::BLOCK_TYPE_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE => [ - 'start' => [CT::T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_OPEN, '{'], - 'end' => [CT::T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_CLOSE, '}'], - ], - ]; - - // @TODO: drop condition when PHP 8.0+ is required - if (\defined('T_ATTRIBUTE')) { - $definitions[self::BLOCK_TYPE_ATTRIBUTE] = [ - 'start' => [T_ATTRIBUTE, '#['], - 'end' => [CT::T_ATTRIBUTE_CLOSE, ']'], + static $definitions = null; + if (null === $definitions) { + $definitions = [ + self::BLOCK_TYPE_CURLY_BRACE => [ + 'start' => '{', + 'end' => '}', + ], + self::BLOCK_TYPE_PARENTHESIS_BRACE => [ + 'start' => '(', + 'end' => ')', + ], + self::BLOCK_TYPE_INDEX_SQUARE_BRACE => [ + 'start' => '[', + 'end' => ']', + ], + self::BLOCK_TYPE_ARRAY_SQUARE_BRACE => [ + 'start' => [CT::T_ARRAY_SQUARE_BRACE_OPEN, '['], + 'end' => [CT::T_ARRAY_SQUARE_BRACE_CLOSE, ']'], + ], + self::BLOCK_TYPE_DYNAMIC_PROP_BRACE => [ + 'start' => [CT::T_DYNAMIC_PROP_BRACE_OPEN, '{'], + 'end' => [CT::T_DYNAMIC_PROP_BRACE_CLOSE, '}'], + ], + self::BLOCK_TYPE_DYNAMIC_VAR_BRACE => [ + 'start' => [CT::T_DYNAMIC_VAR_BRACE_OPEN, '{'], + 'end' => [CT::T_DYNAMIC_VAR_BRACE_CLOSE, '}'], + ], + self::BLOCK_TYPE_ARRAY_INDEX_CURLY_BRACE => [ + 'start' => [CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN, '{'], + 'end' => [CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, '}'], + ], + self::BLOCK_TYPE_GROUP_IMPORT_BRACE => [ + 'start' => [CT::T_GROUP_IMPORT_BRACE_OPEN, '{'], + 'end' => [CT::T_GROUP_IMPORT_BRACE_CLOSE, '}'], + ], + self::BLOCK_TYPE_DESTRUCTURING_SQUARE_BRACE => [ + 'start' => [CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN, '['], + 'end' => [CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE, ']'], + ], + self::BLOCK_TYPE_BRACE_CLASS_INSTANTIATION => [ + 'start' => [CT::T_BRACE_CLASS_INSTANTIATION_OPEN, '('], + 'end' => [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE, ')'], + ], + self::BLOCK_TYPE_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS => [ + 'start' => [CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN, '('], + 'end' => [CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE, ')'], + ], + self::BLOCK_TYPE_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE => [ + 'start' => [CT::T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_OPEN, '{'], + 'end' => [CT::T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_CLOSE, '}'], + ], + self::BLOCK_TYPE_COMPLEX_STRING_VARIABLE => [ + 'start' => [T_DOLLAR_OPEN_CURLY_BRACES, '${'], + 'end' => [CT::T_DOLLAR_CLOSE_CURLY_BRACES, '}'], + ], + self::BLOCK_TYPE_PROPERTY_HOOK => [ + 'start' => [CT::T_PROPERTY_HOOK_BRACE_OPEN, '{'], + 'end' => [CT::T_PROPERTY_HOOK_BRACE_CLOSE, '}'], + ], ]; + + // @TODO: drop condition when PHP 8.0+ is required + if (\defined('T_ATTRIBUTE')) { + $definitions[self::BLOCK_TYPE_ATTRIBUTE] = [ + 'start' => [T_ATTRIBUTE, '#['], + 'end' => [CT::T_ATTRIBUTE_CLOSE, ']'], + ]; + } } return $definitions; @@ -276,16 +307,10 @@ public static function getBlockEdgeDefinitions(): array * * @param int $size */ + #[\ReturnTypeWillChange] public function setSize($size): bool { - if ($this->getSize() !== $size) { - $this->changed = true; - $this->namespaceDeclarations = null; - - return parent::setSize($size); - } - - return true; + throw new \RuntimeException('Changing tokens collection size explicitly is not allowed.'); } /** @@ -295,10 +320,28 @@ public function setSize($size): bool */ public function offsetUnset($index): void { - $this->changed = true; - $this->namespaceDeclarations = null; + if (\count($this) - 1 !== $index) { + Utils::triggerDeprecation(new \InvalidArgumentException(\sprintf( + 'Tokens should be a list - only the last index can be unset. This will be enforced in version %d.0.', + Application::getMajorVersion() + 1 + ))); + } + if (isset($this[$index])) { + if (isset($this->blockStartCache[$index])) { + unset($this->blockEndCache[$this->blockStartCache[$index]], $this->blockStartCache[$index]); + } + if (isset($this->blockEndCache[$index])) { + unset($this->blockStartCache[$this->blockEndCache[$index]], $this->blockEndCache[$index]); + } + $this->unregisterFoundToken($this[$index]); + + $this->changed = true; + $this->collectionHash = null; + self::clearCache($this->codeHash); + $this->codeHash = null; + $this->namespaceDeclarations = null; } parent::offsetUnset($index); @@ -314,16 +357,33 @@ public function offsetUnset($index): void */ public function offsetSet($index, $newval): void { - $this->blockStartCache = []; - $this->blockEndCache = []; + if (0 > $index || \count($this) <= $index) { + Utils::triggerDeprecation(new \InvalidArgumentException(\sprintf( + 'Tokens should be a list - index must be within the existing range. This will be enforced in version %d.0.', + Application::getMajorVersion() + 1 + ))); + } - if (!isset($this[$index]) || !$this[$index]->equals($newval)) { - $this->changed = true; - $this->namespaceDeclarations = null; + if (isset($this[$index])) { + if (isset($this->blockStartCache[$index])) { + unset($this->blockEndCache[$this->blockStartCache[$index]], $this->blockStartCache[$index]); + } + if (isset($this->blockEndCache[$index])) { + unset($this->blockStartCache[$this->blockEndCache[$index]], $this->blockEndCache[$index]); + } + } + if (!isset($this[$index]) || !$this[$index]->equals($newval)) { if (isset($this[$index])) { $this->unregisterFoundToken($this[$index]); } + + $this->changed = true; + $this->collectionHash = null; + self::clearCache($this->codeHash); + $this->codeHash = null; + $this->namespaceDeclarations = null; + $this->registerFoundToken($newval); } @@ -345,7 +405,12 @@ public function clearChanged(): void */ public function clearEmptyTokens(): void { - $limit = $this->count(); + // no empty token found, therefore there is no need to override collection + if (!$this->isTokenKindFound('')) { + return; + } + + $limit = \count($this); for ($index = 0; $index < $limit; ++$index) { if ($this->isEmptyAt($index)) { @@ -353,23 +418,38 @@ public function clearEmptyTokens(): void } } - // no empty token found, therefore there is no need to override collection - if ($limit === $index) { - return; - } - for ($count = $index; $index < $limit; ++$index) { if (!$this->isEmptyAt($index)) { // use directly for speed, skip the register of token kinds found etc. - parent::offsetSet($count++, $this[$index]); + $buffer = $this[$count]; + parent::offsetSet($count, $this[$index]); + parent::offsetSet($index, $buffer); + + if (isset($this->blockStartCache[$index])) { + $otherEndIndex = $this->blockStartCache[$index]; + unset($this->blockStartCache[$index]); + $this->blockStartCache[$count] = $otherEndIndex; + $this->blockEndCache[$otherEndIndex] = $count; + } + + if (isset($this->blockEndCache[$index])) { + $otherEndIndex = $this->blockEndCache[$index]; + unset($this->blockEndCache[$index]); + $this->blockStartCache[$otherEndIndex] = $count; + $this->blockEndCache[$count] = $otherEndIndex; + } + + ++$count; } } - // we are moving the tokens, we need to clear the indices Cache - $this->blockStartCache = []; - $this->blockEndCache = []; + // we are moving the tokens, we need to clear the index-based Cache + $this->namespaceDeclarations = null; + $this->foundTokenKinds[''] = 0; + + $this->collectionHash = null; - $this->setSize($count); + $this->updateSizeByTrimmingTrailingEmptyTokens(); } /** @@ -438,7 +518,7 @@ public function ensureWhitespaceAtIndex(int $index, int $indexOffset, string $wh * @param self::BLOCK_TYPE_* $type type of block * @param int $searchIndex index of opening brace * - * @return int index of closing brace + * @return int<0, max> index of closing brace */ public function findBlockEnd(int $type, int $searchIndex): int { @@ -449,7 +529,7 @@ public function findBlockEnd(int $type, int $searchIndex): int * @param self::BLOCK_TYPE_* $type type of block * @param int $searchIndex index of closing brace * - * @return int index of opening brace + * @return int<0, max> index of opening brace */ public function findBlockStart(int $type, int $searchIndex): int { @@ -457,16 +537,16 @@ public function findBlockStart(int $type, int $searchIndex): int } /** - * @param int|list $possibleKind kind or array of kinds - * @param int $start optional offset - * @param null|int $end optional limit + * @param int|non-empty-list $possibleKind kind or array of kinds + * @param int $start optional offset + * @param null|int $end optional limit * - * @return array>|array + * @return ($possibleKind is int ? array, Token> : array, Token>>) */ public function findGivenKind($possibleKind, int $start = 0, ?int $end = null): array { if (null === $end) { - $end = $this->count(); + $end = \count($this); } $elements = []; @@ -493,7 +573,9 @@ public function findGivenKind($possibleKind, int $start = 0, ?int $end = null): public function generateCode(): string { $code = $this->generatePartialCode(0, \count($this) - 1); - $this->changeCodeHash(self::calculateCodeHash($code)); + if (null === $this->codeHash) { + $this->changeCodeHash(self::calculateHash($code)); // ensure code hash is calculated, so it's registered in cache + } return $code; } @@ -520,9 +602,37 @@ public function generatePartialCode(int $start, int $end): string */ public function getCodeHash(): string { + if (null === $this->codeHash) { + $code = $this->generatePartialCode(0, \count($this) - 1); + $this->changeCodeHash(self::calculateHash($code)); // ensure code hash is calculated, so it's registered in cache + } + return $this->codeHash; } + /** + * @return non-empty-string + * + * @internal + */ + public function getCollectionHash(): string + { + if (null === $this->collectionHash) { + $this->collectionHash = self::calculateHash( + $this->getCodeHash() + .'#' + .\count($this) + .'#' + .implode( + '', + array_map(static fn (?Token $token): ?int => null !== $token ? $token->getId() : null, $this->toArray()) + ) + ); + } + + return $this->collectionHash; + } + /** * Get index for closest next token which is non whitespace. * @@ -561,7 +671,6 @@ public function getNonWhitespaceSibling(int $index, int $direction, ?string $whi { while (true) { $index += $direction; - if (!$this->offsetExists($index)) { return null; } @@ -616,7 +725,6 @@ public function getTokenOfKindSibling(int $index, int $direction, array $tokens while (true) { $index += $direction; - if (!$this->offsetExists($index)) { return null; } @@ -684,7 +792,6 @@ public function getNonEmptySibling(int $index, int $direction): ?int { while (true) { $index += $direction; - if (!$this->offsetExists($index)) { return null; } @@ -718,14 +825,14 @@ public function getPrevMeaningfulToken(int $index): ?int /** * Find a sequence of meaningful tokens and returns the array of their locations. * - * @param list $sequence an array of token (kinds) - * @param int $start start index, defaulting to the start of the file - * @param null|int $end end index, defaulting to the end of the file - * @param array|bool $caseSensitive global case sensitiveness or a list of booleans, whose keys should match - * the ones used in $sequence. If any is missing, the default case-sensitive - * comparison is used + * @param non-empty-list $sequence an array of token (kinds) + * @param int $start start index, defaulting to the start of the file + * @param null|int $end end index, defaulting to the end of the file + * @param array|bool $caseSensitive global case sensitiveness or a list of booleans, whose keys should match + * the ones used in $sequence. If any is missing, the default case-sensitive + * comparison is used * - * @return null|array an array containing the tokens matching the sequence elements, indexed by their position + * @return null|non-empty-array, Token> an array containing the tokens matching the sequence elements, indexed by their position */ public function findSequence(array $sequence, int $start = 0, ?int $end = null, $caseSensitive = true): ?array { @@ -757,11 +864,11 @@ public function findSequence(array $sequence, int $start = 0, ?int $end = null, } if ($token->isGivenKind($nonMeaningFullKind)) { - throw new \InvalidArgumentException(sprintf('Non-meaningful token at position: "%s".', $key)); + throw new \InvalidArgumentException(\sprintf('Non-meaningful token at position: "%s".', $key)); } if ('' === $token->getContent()) { - throw new \InvalidArgumentException(sprintf('Non-meaningful (empty) token at position: "%s".', $key)); + throw new \InvalidArgumentException(\sprintf('Non-meaningful (empty) token at position: "%s".', $key)); } } @@ -773,10 +880,10 @@ public function findSequence(array $sequence, int $start = 0, ?int $end = null, // remove the first token from the sequence, so we can freely iterate through the sequence after a match to // the first one is found - $key = key($sequence); - $firstCs = Token::isKeyCaseSensitive($caseSensitive, $key); - $firstToken = $sequence[$key]; - unset($sequence[$key]); + $firstKey = array_key_first($sequence); + $firstCs = self::isKeyCaseSensitive($caseSensitive, $firstKey); + $firstToken = $sequence[$firstKey]; + unset($sequence[$firstKey]); // begin searching for the first token in the sequence (start included) $index = $start - 1; @@ -803,7 +910,7 @@ public function findSequence(array $sequence, int $start = 0, ?int $end = null, return null; } - if (!$this[$currIdx]->equals($token, Token::isKeyCaseSensitive($caseSensitive, $key))) { + if (!$this[$currIdx]->equals($token, self::isKeyCaseSensitive($caseSensitive, $key))) { // not a match, restart the outer loop continue 2; } @@ -864,19 +971,23 @@ public function insertSlices(array $slices): void return; } - $oldSize = \count($this); $this->changed = true; + $this->collectionHash = null; + self::clearCache($this->codeHash); + $this->codeHash = null; $this->namespaceDeclarations = null; $this->blockStartCache = []; $this->blockEndCache = []; - $this->setSize($oldSize + $itemsCount); + + $oldSize = \count($this); + $this->updateSizeByIncreasingToNewSize($oldSize + $itemsCount); krsort($slices); - $farthestSliceIndex = key($slices); + $farthestSliceIndex = array_key_first($slices); // We check only the farthest index, if it's within the size of collection, other indices will be valid too. if (!\is_int($farthestSliceIndex) || $farthestSliceIndex > $oldSize) { - throw new \OutOfBoundsException(sprintf('Cannot insert index "%s" outside of collection.', $farthestSliceIndex)); + throw new \OutOfBoundsException(\sprintf('Cannot insert index "%s" outside of collection.', $farthestSliceIndex)); } $previousSliceIndex = $oldSize; @@ -885,14 +996,14 @@ public function insertSlices(array $slices): void // that way we get around additional overhead this class adds with overridden offset* methods. foreach ($slices as $index => $slice) { if (!\is_int($index) || $index < 0) { - throw new \OutOfBoundsException(sprintf('Invalid index "%s".', $index)); + throw new \OutOfBoundsException(\sprintf('Invalid index "%s".', $index)); } $slice = \is_array($slice) || $slice instanceof self ? $slice : [$slice]; $sliceCount = \count($slice); for ($i = $previousSliceIndex - 1; $i >= $index; --$i) { - parent::offsetSet($i + $itemsCount, parent::offsetGet($i)); + parent::offsetSet($i + $itemsCount, $this[$i]); } $previousSliceIndex = $index; @@ -996,12 +1107,9 @@ public function setCode(string $code): void return; } - // clear memory - $this->setSize(0); - + $this->updateSizeToZero(); // clear memory $tokens = token_get_all($code, TOKEN_PARSE); - - $this->setSize(\count($tokens)); + $this->updateSizeByIncreasingToNewSize(\count($tokens)); // pre-allocate collection size foreach ($tokens as $index => $token) { $this[$index] = new Token($token); @@ -1009,19 +1117,19 @@ public function setCode(string $code): void $this->applyTransformers(); - $this->foundTokenKinds = []; - - foreach ($this as $token) { - $this->registerFoundToken($token); - } - if (\PHP_VERSION_ID < 8_00_00) { $this->rewind(); } - $this->changeCodeHash(self::calculateCodeHash($code)); $this->changed = true; + $this->collectionHash = null; + self::clearCache($this->codeHash); + $this->codeHash = null; $this->namespaceDeclarations = null; + $this->blockStartCache = []; + $this->blockEndCache = []; + + $this->changeCodeHash(self::calculateHash($code)); // ensure code hash is calculated, so it's registered in cache } public function toJson(): string @@ -1047,7 +1155,7 @@ public function toJson(): string public function isAllTokenKindsFound(array $tokenKinds): bool { foreach ($tokenKinds as $tokenKind) { - if (!isset($this->foundTokenKinds[$tokenKind])) { + if (0 === ($this->foundTokenKinds[$tokenKind] ?? 0)) { return false; } } @@ -1063,7 +1171,7 @@ public function isAllTokenKindsFound(array $tokenKinds): bool public function isAnyTokenKindsFound(array $tokenKinds): bool { foreach ($tokenKinds as $tokenKind) { - if (isset($this->foundTokenKinds[$tokenKind])) { + if (0 !== ($this->foundTokenKinds[$tokenKind] ?? 0)) { return true; } } @@ -1078,7 +1186,7 @@ public function isAnyTokenKindsFound(array $tokenKinds): bool */ public function isTokenKindFound($tokenKind): bool { - return isset($this->foundTokenKinds[$tokenKind]); + return 0 !== ($this->foundTokenKinds[$tokenKind] ?? 0); } /** @@ -1107,19 +1215,12 @@ public function clearRange(int $indexStart, int $indexEnd): void */ public function isMonolithicPhp(): bool { - if (0 === $this->count()) { - return false; - } - - if ($this->countTokenKind(T_INLINE_HTML) > 1) { + if (1 !== ($this->countTokenKind(T_OPEN_TAG) + $this->countTokenKind(T_OPEN_TAG_WITH_ECHO))) { return false; } - if (1 === $this->countTokenKind(T_INLINE_HTML)) { - return Preg::match('/^#!.+$/', $this[0]->getContent()); - } - - return 1 === ($this->countTokenKind(T_OPEN_TAG) + $this->countTokenKind(T_OPEN_TAG_WITH_ECHO)); + return 0 === $this->countTokenKind(T_INLINE_HTML) + || (1 === $this->countTokenKind(T_INLINE_HTML) && Preg::match('/^#!.+$/', $this[0]->getContent())); } /** @@ -1198,6 +1299,50 @@ protected function applyTransformers(): void $transformers->transform($this); } + private function updateSizeByIncreasingToNewSize(int $size): void + { + $currentSize = \count($this); + if ($currentSize >= $size) { + throw new \LogicException(\sprintf('Cannot use called method to decrease collection size (%d -> %d).', $currentSize, $size)); + } + parent::setSize($size); + } + + private function updateSizeToZero(): void + { + $currentSize = \count($this); + if (0 === $currentSize) { + return; + } + + $this->changed = true; + $this->collectionHash = null; + self::clearCache($this->codeHash); + $this->codeHash = null; + $this->namespaceDeclarations = null; + $this->blockStartCache = []; + $this->blockEndCache = []; + + parent::setSize(0); + } + + private function updateSizeByTrimmingTrailingEmptyTokens(): void + { + $currentSize = \count($this); + + if (0 === $currentSize) { + return; + } + + $lastIndex = $currentSize - 1; + + while ($lastIndex >= 0 && $this->isEmptyAt($lastIndex)) { + --$lastIndex; + } + + parent::setSize($lastIndex + 1); + } + /** * @param -1|1 $direction */ @@ -1236,14 +1381,14 @@ private function removeWhitespaceSafely(int $index, int $direction, ?string $whi * @param int $searchIndex index of starting brace * @param bool $findEnd if method should find block's end or start * - * @return int index of opposite brace + * @return int<0, max> index of opposite brace */ private function findOppositeBlockEdge(int $type, int $searchIndex, bool $findEnd): int { $blockEdgeDefinitions = self::getBlockEdgeDefinitions(); if (!isset($blockEdgeDefinitions[$type])) { - throw new \InvalidArgumentException(sprintf('Invalid param type: "%s".', $type)); + throw new \InvalidArgumentException(\sprintf('Invalid param type: "%s".', $type)); } if ($findEnd && isset($this->blockStartCache[$searchIndex])) { @@ -1257,7 +1402,7 @@ private function findOppositeBlockEdge(int $type, int $searchIndex, bool $findEn $startEdge = $blockEdgeDefinitions[$type]['start']; $endEdge = $blockEdgeDefinitions[$type]['end']; $startIndex = $searchIndex; - $endIndex = $this->count() - 1; + $endIndex = \count($this) - 1; $indexOffset = 1; if (!$findEnd) { @@ -1267,7 +1412,7 @@ private function findOppositeBlockEdge(int $type, int $searchIndex, bool $findEn } if (!$this[$startIndex]->equals($startEdge)) { - throw new \InvalidArgumentException(sprintf('Invalid param $startIndex - not a proper block "%s".', $findEnd ? 'start' : 'end')); + throw new \InvalidArgumentException(\sprintf('Invalid param $startIndex - not a proper block "%s".', $findEnd ? 'start' : 'end')); } $blockLevel = 0; @@ -1291,7 +1436,7 @@ private function findOppositeBlockEdge(int $type, int $searchIndex, bool $findEn } if (!$this[$index]->equals($endEdge)) { - throw new \UnexpectedValueException(sprintf('Missing block "%s".', $findEnd ? 'end' : 'start')); + throw new \UnexpectedValueException(\sprintf('Missing block "%s".', $findEnd ? 'end' : 'start')); } if ($startIndex < $index) { @@ -1306,22 +1451,22 @@ private function findOppositeBlockEdge(int $type, int $searchIndex, bool $findEn } /** - * Calculate hash for code. + * @return non-empty-string */ - private static function calculateCodeHash(string $code): string + private static function calculateHash(string $code): string { - return CodeHasher::calculateCodeHash($code); + return Hasher::calculate($code); } /** * Get cache value for given key. * - * @param string $key item key + * @param non-empty-string $key item key */ private static function getCache(string $key): self { if (!self::hasCache($key)) { - throw new \OutOfBoundsException(sprintf('Unknown cache key: "%s".', $key)); + throw new \OutOfBoundsException(\sprintf('Unknown cache key: "%s".', $key)); } return self::$cache[$key]; @@ -1330,7 +1475,7 @@ private static function getCache(string $key): self /** * Check if given key exists in cache. * - * @param string $key item key + * @param non-empty-string $key item key */ private static function hasCache(string $key): bool { @@ -1338,8 +1483,8 @@ private static function hasCache(string $key): bool } /** - * @param string $key item key - * @param Tokens $value item value + * @param non-empty-string $key item key + * @param Tokens $value item value */ private static function setCache(string $key, self $value): void { @@ -1351,7 +1496,7 @@ private static function setCache(string $key, self $value): void * * Remove old cache and set new one. * - * @param string $codeHash new code hash + * @param non-empty-string $codeHash new code hash */ private function changeCodeHash(string $codeHash): void { @@ -1365,15 +1510,11 @@ private function changeCodeHash(string $codeHash): void /** * Register token as found. - * - * @param array{int}|string|Token $token token prototype */ - private function registerFoundToken($token): void + private function registerFoundToken(Token $token): void { // inlined extractTokenKind() call on the hot path - $tokenKind = $token instanceof Token - ? ($token->isArray() ? $token->getId() : $token->getContent()) - : (\is_array($token) ? $token[0] : $token); + $tokenKind = $token->isArray() ? $token->getId() : $token->getContent(); $this->foundTokenKinds[$tokenKind] ??= 0; ++$this->foundTokenKinds[$tokenKind]; @@ -1381,21 +1522,14 @@ private function registerFoundToken($token): void /** * Unregister token as not found. - * - * @param array{int}|string|Token $token token prototype */ - private function unregisterFoundToken($token): void + private function unregisterFoundToken(Token $token): void { // inlined extractTokenKind() call on the hot path - $tokenKind = $token instanceof Token - ? ($token->isArray() ? $token->getId() : $token->getContent()) - : (\is_array($token) ? $token[0] : $token); + $tokenKind = $token->isArray() ? $token->getId() : $token->getContent(); - if (1 === $this->foundTokenKinds[$tokenKind]) { - unset($this->foundTokenKinds[$tokenKind]); - } else { - --$this->foundTokenKinds[$tokenKind]; - } + \assert(($this->foundTokenKinds[$tokenKind] ?? 0) > 0); + --$this->foundTokenKinds[$tokenKind]; } /** @@ -1419,7 +1553,6 @@ private function getTokenNotOfKind(int $index, int $direction, callable $filter) { while (true) { $index += $direction; - if (!$this->offsetExists($index)) { return null; } @@ -1431,4 +1564,21 @@ private function getTokenNotOfKind(int $index, int $direction, callable $filter) return $index; } } + + /** + * A helper method used to find out whether a certain input token has to be case-sensitively matched. + * + * @param array|bool $caseSensitive global case sensitiveness or an array of booleans, whose keys should match + * the ones used in $sequence. If any is missing, the default case-sensitive + * comparison is used + * @param int $key the key of the token that has to be looked up + */ + private static function isKeyCaseSensitive($caseSensitive, int $key): bool + { + if (\is_array($caseSensitive)) { + return $caseSensitive[$key] ?? true; + } + + return $caseSensitive; + } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php index 18ee04071..346a948d2 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/TokensAnalyzer.php @@ -26,6 +26,8 @@ * @author Gregor Harlan * * @internal + * + * @phpstan-type _ClassyElementType 'case'|'const'|'method'|'property'|'trait_import' */ final class TokensAnalyzer { @@ -34,17 +36,21 @@ final class TokensAnalyzer */ private Tokens $tokens; - private ?GotoLabelAnalyzer $gotoLabelAnalyzer = null; + /** + * @readonly + */ + private GotoLabelAnalyzer $gotoLabelAnalyzer; public function __construct(Tokens $tokens) { $this->tokens = $tokens; + $this->gotoLabelAnalyzer = new GotoLabelAnalyzer(); } /** * Get indices of methods and properties in classy code (classes, interfaces and traits). * - * @return array + * @return array */ public function getClassyElements(): array { @@ -74,7 +80,7 @@ public function getClassyElements(): array public function getClassyModifiers(int $index): array { if (!$this->tokens[$index]->isClassy()) { - throw new \InvalidArgumentException(sprintf('Not an "classy" at given index %d.', $index)); + throw new \InvalidArgumentException(\sprintf('Not an "classy" at given index %d.', $index)); } $readOnlyPossible = \defined('T_READONLY'); // @TODO: drop condition when PHP 8.2+ is required @@ -157,7 +163,7 @@ public function isArray(int $index): bool public function isArrayMultiLine(int $index): bool { if (!$this->isArray($index)) { - throw new \InvalidArgumentException(sprintf('Not an array at given index %d.', $index)); + throw new \InvalidArgumentException(\sprintf('Not an array at given index %d.', $index)); } $tokens = $this->tokens; @@ -176,7 +182,7 @@ public function isBlockMultiline(Tokens $tokens, int $index): bool $blockType = Tokens::detectBlockType($tokens[$index]); if (null === $blockType || !$blockType['isStart']) { - throw new \InvalidArgumentException(sprintf('Not an block start at given index %d.', $index)); + throw new \InvalidArgumentException(\sprintf('Not an block start at given index %d.', $index)); } $endIndex = $tokens->findBlockEnd($blockType['type'], $index); @@ -211,7 +217,7 @@ public function isBlockMultiline(Tokens $tokens, int $index): bool public function getMethodAttributes(int $index): array { if (!$this->tokens[$index]->isGivenKind(T_FUNCTION)) { - throw new \LogicException(sprintf('No T_FUNCTION at given index %d, got "%s".', $index, $this->tokens[$index]->getName())); + throw new \LogicException(\sprintf('No T_FUNCTION at given index %d, got "%s".', $index, $this->tokens[$index]->getName())); } $attributes = [ @@ -277,7 +283,7 @@ public function getMethodAttributes(int $index): array public function isAnonymousClass(int $index): bool { if (!$this->tokens[$index]->isClassy()) { - throw new \LogicException(sprintf('No classy token at given index %d.', $index)); + throw new \LogicException(\sprintf('No classy token at given index %d.', $index)); } if (!$this->tokens[$index]->isGivenKind(T_CLASS)) { @@ -304,7 +310,7 @@ public function isAnonymousClass(int $index): bool public function isLambda(int $index): bool { if (!$this->tokens[$index]->isGivenKind([T_FUNCTION, T_FN])) { - throw new \LogicException(sprintf('No T_FUNCTION or T_FN at given index %d, got "%s".', $index, $this->tokens[$index]->getName())); + throw new \LogicException(\sprintf('No T_FUNCTION or T_FN at given index %d, got "%s".', $index, $this->tokens[$index]->getName())); } $startParenthesisIndex = $this->tokens->getNextMeaningfulToken($index); @@ -322,7 +328,7 @@ public function isLambda(int $index): bool public function getLastTokenIndexOfArrowFunction(int $index): int { if (!$this->tokens[$index]->isGivenKind(T_FN)) { - throw new \InvalidArgumentException(sprintf('Not an "arrow function" at given index %d.', $index)); + throw new \InvalidArgumentException(\sprintf('Not an "arrow function" at given index %d.', $index)); } $stopTokens = [')', ']', ',', ';', [T_CLOSE_TAG]]; @@ -359,29 +365,54 @@ public function getLastTokenIndexOfArrowFunction(int $index): int public function isConstantInvocation(int $index): bool { if (!$this->tokens[$index]->isGivenKind(T_STRING)) { - throw new \LogicException(sprintf('No T_STRING at given index %d, got "%s".', $index, $this->tokens[$index]->getName())); + throw new \LogicException(\sprintf('No T_STRING at given index %d, got "%s".', $index, $this->tokens[$index]->getName())); } $nextIndex = $this->tokens->getNextMeaningfulToken($index); if ( $this->tokens[$nextIndex]->equalsAny(['(', '{']) - || $this->tokens[$nextIndex]->isGivenKind([T_AS, T_DOUBLE_COLON, T_ELLIPSIS, T_NS_SEPARATOR, CT::T_RETURN_REF, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION, T_VARIABLE]) + || $this->tokens[$nextIndex]->isGivenKind([T_DOUBLE_COLON, T_ELLIPSIS, T_NS_SEPARATOR, CT::T_RETURN_REF, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION, T_VARIABLE]) ) { return false; } + // handle foreach( FOO as $_ ) {} + if ($this->tokens[$nextIndex]->isGivenKind(T_AS)) { + $prevIndex = $this->tokens->getPrevMeaningfulToken($index); + + if (!$this->tokens[$prevIndex]->equals('(')) { + return false; + } + } + $prevIndex = $this->tokens->getPrevMeaningfulToken($index); - if ($this->tokens[$prevIndex]->isGivenKind([T_AS, T_CLASS, T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_GOTO, CT::T_GROUP_IMPORT_BRACE_OPEN, T_INTERFACE, T_TRAIT, CT::T_TYPE_COLON, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION]) || $this->tokens[$prevIndex]->isObjectOperator()) { + if ($this->tokens[$prevIndex]->isGivenKind(Token::getClassyTokenKinds())) { + return false; + } + + if ($this->tokens[$prevIndex]->isGivenKind([T_AS, T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_GOTO, CT::T_GROUP_IMPORT_BRACE_OPEN, CT::T_TYPE_COLON, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION]) || $this->tokens[$prevIndex]->isObjectOperator()) { return false; } - while ($this->tokens[$prevIndex]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_NS_SEPARATOR, T_STRING])) { + if ( + $this->tokens[$prevIndex]->isGivenKind(T_CASE) + && \defined('T_ENUM') + && $this->tokens->isAllTokenKindsFound([T_ENUM]) + ) { + $enumSwitchIndex = $this->tokens->getPrevTokenOfKind($index, [[T_SWITCH], [T_ENUM]]); + + if (!$this->tokens[$enumSwitchIndex]->isGivenKind(T_SWITCH)) { + return false; + } + } + + while ($this->tokens[$prevIndex]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_NS_SEPARATOR, T_STRING, CT::T_ARRAY_TYPEHINT])) { $prevIndex = $this->tokens->getPrevMeaningfulToken($prevIndex); } - if ($this->tokens[$prevIndex]->isGivenKind([CT::T_CONST_IMPORT, T_EXTENDS, CT::T_FUNCTION_IMPORT, T_IMPLEMENTS, T_INSTANCEOF, T_INSTEADOF, T_NAMESPACE, T_NEW, CT::T_NULLABLE_TYPE, CT::T_TYPE_COLON, T_USE, CT::T_USE_TRAIT])) { + if ($this->tokens[$prevIndex]->isGivenKind([CT::T_CONST_IMPORT, T_EXTENDS, CT::T_FUNCTION_IMPORT, T_IMPLEMENTS, T_INSTANCEOF, T_INSTEADOF, T_NAMESPACE, T_NEW, CT::T_NULLABLE_TYPE, CT::T_TYPE_COLON, T_USE, CT::T_USE_TRAIT, CT::T_TYPE_INTERSECTION, CT::T_TYPE_ALTERNATION, T_CONST, CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE])) { return false; } @@ -425,10 +456,6 @@ public function isConstantInvocation(int $index): bool // check for goto label if ($this->tokens[$nextIndex]->equals(':')) { - if (null === $this->gotoLabelAnalyzer) { - $this->gotoLabelAnalyzer = new GotoLabelAnalyzer(); - } - if ($this->gotoLabelAnalyzer->belongsToGoToLabel($this->tokens, $nextIndex)) { return false; } @@ -552,13 +579,15 @@ public function isUnaryPredecessorOperator(int $index): bool ';', '{', '}', + [T_DOUBLE_ARROW], + [T_FN], [T_FUNCTION], [T_OPEN_TAG], [T_OPEN_TAG_WITH_ECHO], ]; $prevToken = $tokens[$tokens->getPrevTokenOfKind($index, $searchTokens)]; - return $prevToken->isGivenKind(T_FUNCTION); + return $prevToken->isGivenKind([T_FN, T_FUNCTION]); } /** @@ -653,7 +682,7 @@ public function isWhilePartOfDoWhile(int $index): bool $token = $tokens[$index]; if (!$token->isGivenKind(T_WHILE)) { - throw new \LogicException(sprintf('No T_WHILE at given index %d, got "%s".', $index, $token->getName())); + throw new \LogicException(\sprintf('No T_WHILE at given index %d, got "%s".', $index, $token->getName())); } $endIndex = $tokens->getPrevMeaningfulToken($index); @@ -676,7 +705,7 @@ public function isEnumCase(int $caseIndex): bool $token = $tokens[$caseIndex]; if (!$token->isGivenKind(T_CASE)) { - throw new \LogicException(sprintf( + throw new \LogicException(\sprintf( 'No T_CASE given at index %d, got %s instead.', $caseIndex, $token->getName() ?? $token->getContent() @@ -723,7 +752,7 @@ public function isSuperGlobal(int $index): bool * * @param int $classIndex classy index * - * @return array{int, array} + * @return array{int, array} */ private function findClassyElements(int $classIndex, int $index): array { @@ -827,6 +856,12 @@ private function findClassyElements(int $classIndex, int $index): array continue; } + if ($token->isGivenKind(CT::T_PROPERTY_HOOK_BRACE_OPEN)) { + $index = $this->tokens->getNextTokenOfKind($index, [[CT::T_PROPERTY_HOOK_BRACE_CLOSE]]); + + continue; + } + if ($token->isGivenKind(T_FUNCTION)) { $elements[$index] = [ 'classIndex' => $classIndex, diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceTransformer.php index e4f374ad6..1f2731592 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceTransformer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/BraceTransformer.php @@ -28,7 +28,8 @@ * - in `$foo->{$bar}` into CT::T_DYNAMIC_PROP_BRACE_OPEN and CT::T_DYNAMIC_PROP_BRACE_CLOSE, * - in `${$foo}` into CT::T_DYNAMIC_VAR_BRACE_OPEN and CT::T_DYNAMIC_VAR_BRACE_CLOSE, * - in `$array{$index}` into CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN and CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, - * - in `use some\a\{ClassA, ClassB, ClassC as C}` into CT::T_GROUP_IMPORT_BRACE_OPEN, CT::T_GROUP_IMPORT_BRACE_CLOSE. + * - in `use some\a\{ClassA, ClassB, ClassC as C}` into CT::T_GROUP_IMPORT_BRACE_OPEN, CT::T_GROUP_IMPORT_BRACE_CLOSE, + * - in `class PropertyHooks { public string $bar _{_ set(string $value) { } _}_` into CT::T_PROPERTY_HOOK_BRACE_OPEN, CT::T_PROPERTY_HOOK_BRACE_CLOSE. * * @author Dariusz Rumiński * @@ -43,13 +44,14 @@ public function getRequiredPhpVersionId(): int public function process(Tokens $tokens, Token $token, int $index): void { - $this->transformIntoCurlyCloseBrace($tokens, $token, $index); - $this->transformIntoDollarCloseBrace($tokens, $token, $index); - $this->transformIntoDynamicPropBraces($tokens, $token, $index); - $this->transformIntoDynamicVarBraces($tokens, $token, $index); - $this->transformIntoCurlyIndexBraces($tokens, $token, $index); - $this->transformIntoGroupUseBraces($tokens, $token, $index); - $this->transformIntoDynamicClassConstantFetchBraces($tokens, $token, $index); + $this->transformIntoCurlyCloseBrace($tokens, $index); + $this->transformIntoDollarCloseBrace($tokens, $index); + $this->transformIntoDynamicPropBraces($tokens, $index); + $this->transformIntoDynamicVarBraces($tokens, $index); + $this->transformIntoPropertyHookBraces($tokens, $index); + $this->transformIntoCurlyIndexBraces($tokens, $index); + $this->transformIntoGroupUseBraces($tokens, $index); + $this->transformIntoDynamicClassConstantFetchBraces($tokens, $index); } public function getCustomTokens(): array @@ -67,6 +69,8 @@ public function getCustomTokens(): array CT::T_GROUP_IMPORT_BRACE_CLOSE, CT::T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_OPEN, CT::T_DYNAMIC_CLASS_CONSTANT_FETCH_CURLY_BRACE_CLOSE, + CT::T_PROPERTY_HOOK_BRACE_OPEN, + CT::T_PROPERTY_HOOK_BRACE_CLOSE, ]; } @@ -75,8 +79,10 @@ public function getCustomTokens(): array * * This should be done at very beginning of curly braces transformations. */ - private function transformIntoCurlyCloseBrace(Tokens $tokens, Token $token, int $index): void + private function transformIntoCurlyCloseBrace(Tokens $tokens, int $index): void { + $token = $tokens[$index]; + if (!$token->isGivenKind(T_CURLY_OPEN)) { return; } @@ -96,16 +102,20 @@ private function transformIntoCurlyCloseBrace(Tokens $tokens, Token $token, int $tokens[$index] = new Token([CT::T_CURLY_CLOSE, '}']); } - private function transformIntoDollarCloseBrace(Tokens $tokens, Token $token, int $index): void + private function transformIntoDollarCloseBrace(Tokens $tokens, int $index): void { + $token = $tokens[$index]; + if ($token->isGivenKind(T_DOLLAR_OPEN_CURLY_BRACES)) { $nextIndex = $tokens->getNextTokenOfKind($index, ['}']); $tokens[$nextIndex] = new Token([CT::T_DOLLAR_CLOSE_CURLY_BRACES, '}']); } } - private function transformIntoDynamicPropBraces(Tokens $tokens, Token $token, int $index): void + private function transformIntoDynamicPropBraces(Tokens $tokens, int $index): void { + $token = $tokens[$index]; + if (!$token->isObjectOperator()) { return; } @@ -121,8 +131,10 @@ private function transformIntoDynamicPropBraces(Tokens $tokens, Token $token, in $tokens[$closeIndex] = new Token([CT::T_DYNAMIC_PROP_BRACE_CLOSE, '}']); } - private function transformIntoDynamicVarBraces(Tokens $tokens, Token $token, int $index): void + private function transformIntoDynamicVarBraces(Tokens $tokens, int $index): void { + $token = $tokens[$index]; + if (!$token->equals('$')) { return; } @@ -145,8 +157,55 @@ private function transformIntoDynamicVarBraces(Tokens $tokens, Token $token, int $tokens[$closeIndex] = new Token([CT::T_DYNAMIC_VAR_BRACE_CLOSE, '}']); } - private function transformIntoCurlyIndexBraces(Tokens $tokens, Token $token, int $index): void + private function transformIntoPropertyHookBraces(Tokens $tokens, int $index): void + { + if (\PHP_VERSION_ID < 8_04_00) { + return; // @TODO: drop condition when PHP 8.4+ is required or majority of the users are using 8.4+ + } + + $token = $tokens[$index]; + + if (!$token->equals('{')) { + return; + } + + $nextIndex = $tokens->getNextMeaningfulToken($index); + + // @TODO: drop condition when PHP 8.0+ is required + if (\defined('T_ATTRIBUTE')) { + // skip attributes + while ($tokens[$nextIndex]->isGivenKind(T_ATTRIBUTE)) { + $nextIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $nextIndex); + $nextIndex = $tokens->getNextMeaningfulToken($nextIndex); + } + } + + if (!$tokens[$nextIndex]->equalsAny([ + [T_STRING, 'get'], + [T_STRING, 'set'], + ])) { + return; + } + + $closeIndex = $this->naivelyFindCurlyBlockEnd($tokens, $index); + + $tokens[$index] = new Token([CT::T_PROPERTY_HOOK_BRACE_OPEN, '{']); + $tokens[$closeIndex] = new Token([CT::T_PROPERTY_HOOK_BRACE_CLOSE, '}']); + } + + private function transformIntoCurlyIndexBraces(Tokens $tokens, int $index): void { + // Support for fetching array index with braces syntax (`$arr{$index}`) + // was deprecated in 7.4 and removed in 8.0. However, the PHP's behaviour + // differs between 8.0-8.3 (fatal error in runtime) and 8.4 (parse error). + // + // @TODO Do not replace `CT::T_ARRAY_INDEX_CURLY_BRACE_*` for 8.0-8.3, as further optimization + if (\PHP_VERSION_ID >= 8_04_00) { + return; + } + + $token = $tokens[$index]; + if (!$token->equals('{')) { return; } @@ -185,8 +244,10 @@ private function transformIntoCurlyIndexBraces(Tokens $tokens, Token $token, int $tokens[$closeIndex] = new Token([CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE, '}']); } - private function transformIntoGroupUseBraces(Tokens $tokens, Token $token, int $index): void + private function transformIntoGroupUseBraces(Tokens $tokens, int $index): void { + $token = $tokens[$index]; + if (!$token->equals('{')) { return; } @@ -203,12 +264,14 @@ private function transformIntoGroupUseBraces(Tokens $tokens, Token $token, int $ $tokens[$closeIndex] = new Token([CT::T_GROUP_IMPORT_BRACE_CLOSE, '}']); } - private function transformIntoDynamicClassConstantFetchBraces(Tokens $tokens, Token $token, int $index): void + private function transformIntoDynamicClassConstantFetchBraces(Tokens $tokens, int $index): void { if (\PHP_VERSION_ID < 8_03_00) { return; // @TODO: drop condition when PHP 8.3+ is required or majority of the users are using 8.3+ } + $token = $tokens[$index]; + if (!$token->equals('{')) { return; } @@ -250,11 +313,11 @@ private function transformIntoDynamicClassConstantFetchBraces(Tokens $tokens, To private function naivelyFindCurlyBlockEnd(Tokens $tokens, int $startIndex): int { if (!$tokens->offsetExists($startIndex)) { - throw new \OutOfBoundsException(sprintf('Unavailable index: "%s".', $startIndex)); + throw new \OutOfBoundsException(\sprintf('Unavailable index: "%s".', $startIndex)); } if ('{' !== $tokens[$startIndex]->getContent()) { - throw new \InvalidArgumentException(sprintf('Wrong start index: "%s".', $startIndex)); + throw new \InvalidArgumentException(\sprintf('Wrong start index: "%s".', $startIndex)); } $blockLevel = 1; @@ -273,7 +336,7 @@ private function naivelyFindCurlyBlockEnd(Tokens $tokens, int $startIndex): int if (0 === $blockLevel) { if (!$token->equals('}')) { - throw new \UnexpectedValueException(sprintf('Detected block end for index: "%s" was already transformed into other token type: "%s".', $startIndex, $token->getName())); + throw new \UnexpectedValueException(\sprintf('Detected block end for index: "%s" was already transformed into other token type: "%s".', $startIndex, $token->getName())); } return $index; @@ -281,6 +344,6 @@ private function naivelyFindCurlyBlockEnd(Tokens $tokens, int $startIndex): int } } - throw new \UnexpectedValueException(sprintf('Missing block end for index: "%s".', $startIndex)); + throw new \UnexpectedValueException(\sprintf('Missing block end for index: "%s".', $startIndex)); } } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php index b0521954e..ed8353c8d 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformer/NameQualifiedTransformer.php @@ -15,6 +15,7 @@ namespace PhpCsFixer\Tokenizer\Transformer; use PhpCsFixer\Tokenizer\AbstractTransformer; +use PhpCsFixer\Tokenizer\Processor\ImportProcessor; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; @@ -51,38 +52,15 @@ public function getCustomTokens(): array private function transformQualified(Tokens $tokens, Token $token, int $index): void { - $parts = explode('\\', $token->getContent()); - $newTokens = []; - - if ('' === $parts[0]) { - $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); - array_shift($parts); - } - - foreach ($parts as $part) { - $newTokens[] = new Token([T_STRING, $part]); - $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - - array_pop($newTokens); + $newTokens = ImportProcessor::tokenizeName($token->getContent()); $tokens->overrideRange($index, $index, $newTokens); } private function transformRelative(Tokens $tokens, Token $token, int $index): void { - $parts = explode('\\', $token->getContent()); - $newTokens = [ - new Token([T_NAMESPACE, array_shift($parts)]), - new Token([T_NS_SEPARATOR, '\\']), - ]; - - foreach ($parts as $part) { - $newTokens[] = new Token([T_STRING, $part]); - $newTokens[] = new Token([T_NS_SEPARATOR, '\\']); - } - - array_pop($newTokens); + $newTokens = ImportProcessor::tokenizeName($token->getContent()); + $newTokens[0] = new Token([T_NAMESPACE, 'namespace']); $tokens->overrideRange($index, $index, $newTokens); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformers.php b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformers.php index e87455382..e5650659b 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformers.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Tokenizer/Transformers.php @@ -101,7 +101,7 @@ private function findBuiltInTransformers(): iterable /** @var SplFileInfo $file */ foreach (Finder::create()->files()->in(__DIR__.'/Transformer') as $file) { $relativeNamespace = $file->getRelativePath(); - $class = __NAMESPACE__.'\\Transformer\\'.('' !== $relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php'); + $class = __NAMESPACE__.'\Transformer\\'.('' !== $relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php'); yield new $class(); } diff --git a/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php b/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php index cab29e451..68aa519ee 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php +++ b/vendor/friendsofphp/php-cs-fixer/src/ToolInfo.php @@ -32,12 +32,9 @@ final class ToolInfo implements ToolInfoInterface /** * @var null|array{name: string, version: string, dist: array{reference?: string}} */ - private $composerInstallationDetails; + private ?array $composerInstallationDetails = null; - /** - * @var null|bool - */ - private $isInstalledByComposer; + private ?bool $isInstalledByComposer = null; public function getComposerInstallationDetails(): array { @@ -48,6 +45,7 @@ public function getComposerInstallationDetails(): array if (null === $this->composerInstallationDetails) { $composerInstalled = json_decode(file_get_contents($this->getComposerInstalledFile()), true, 512, JSON_THROW_ON_ERROR); + /** @var list $packages */ $packages = $composerInstalled['packages'] ?? $composerInstalled; foreach ($packages as $package) { @@ -98,9 +96,18 @@ public function isInstalledByComposer(): bool return $this->isInstalledByComposer; } + /** + * Determines if the tool is run inside our pre-built Docker image. + * The `/fixer/` path comes from our Dockerfile, tool is installed there and added to global PATH via symlinked binary. + */ + public function isRunInsideDocker(): bool + { + return str_starts_with(__FILE__, '/fixer/') && is_file('/.dockerenv'); + } + public function getPharDownloadUri(string $version): string { - return sprintf( + return \sprintf( 'https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/releases/download/%s/php-cs-fixer.phar', $version ); diff --git a/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php b/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php index 5124292b8..bc2a5e0b7 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php +++ b/vendor/friendsofphp/php-cs-fixer/src/ToolInfoInterface.php @@ -32,5 +32,7 @@ public function isInstalledAsPhar(): bool; public function isInstalledByComposer(): bool; + public function isRunInsideDocker(): bool; + public function getPharDownloadUri(string $version): string; } diff --git a/vendor/friendsofphp/php-cs-fixer/src/Utils.php b/vendor/friendsofphp/php-cs-fixer/src/Utils.php index b89d4e186..89f6c43fc 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/Utils.php +++ b/vendor/friendsofphp/php-cs-fixer/src/Utils.php @@ -43,7 +43,7 @@ private function __construct() */ public static function camelCaseToUnderscore(string $string): string { - return mb_strtolower(Preg::replace('/(?isWhitespace()) { - throw new \InvalidArgumentException(sprintf('The given token must be whitespace, got "%s".', $token->getName())); + throw new \InvalidArgumentException(\sprintf('The given token must be whitespace, got "%s".', $token->getName())); } $str = strrchr( @@ -74,11 +74,14 @@ public static function calculateTrailingWhitespaceIndent(Token $token): string * * Stability is ensured by using Schwartzian transform. * - * @param mixed[] $elements - * @param callable $getComparedValue a callable that takes a single element and returns the value to compare - * @param callable $compareValues a callable that compares two values + * @template T + * @template R * - * @return mixed[] + * @param list $elements + * @param callable(T): R $getComparedValue a callable that takes a single element and returns the value to compare + * @param callable(R, R): int $compareValues a callable that compares two values + * + * @return list */ public static function stableSort(array $elements, callable $getComparedValue, callable $compareValues): array { @@ -102,9 +105,9 @@ public static function stableSort(array $elements, callable $getComparedValue, c /** * Sort fixers by their priorities. * - * @param FixerInterface[] $fixers + * @param list $fixers * - * @return FixerInterface[] + * @return list */ public static function sortFixers(array $fixers): array { @@ -120,7 +123,7 @@ public static function sortFixers(array $fixers): array /** * Join names in natural language using specified wrapper (double quote by default). * - * @param string[] $names + * @param list $names * * @throws \InvalidArgumentException */ @@ -134,7 +137,7 @@ public static function naturalLanguageJoin(array $names, string $wrapper = '"'): throw new \InvalidArgumentException('Wrapper should be a single-char string or empty.'); } - $names = array_map(static fn (string $name): string => sprintf('%2$s%1$s%2$s', $name, $wrapper), $names); + $names = array_map(static fn (string $name): string => \sprintf('%2$s%1$s%2$s', $name, $wrapper), $names); $last = array_pop($names); @@ -148,7 +151,7 @@ public static function naturalLanguageJoin(array $names, string $wrapper = '"'): /** * Join names in natural language wrapped in backticks, e.g. `a`, `b` and `c`. * - * @param string[] $names + * @param list $names * * @throws \InvalidArgumentException */ @@ -157,9 +160,17 @@ public static function naturalLanguageJoinWithBackticks(array $names): string return self::naturalLanguageJoin($names, '`'); } + public static function isFutureModeEnabled(): bool + { + return filter_var( + getenv('PHP_CS_FIXER_FUTURE_MODE'), + FILTER_VALIDATE_BOOL + ); + } + public static function triggerDeprecation(\Exception $futureException): void { - if (getenv('PHP_CS_FIXER_FUTURE_MODE')) { + if (self::isFutureModeEnabled()) { throw new \RuntimeException( 'Your are using something deprecated, see previous exception. Aborting execution because `PHP_CS_FIXER_FUTURE_MODE` environment variable is set.', 0, @@ -184,6 +195,14 @@ public static function getTriggeredDeprecations(): array return $triggeredDeprecations; } + public static function convertArrayTypeToList(string $type): string + { + $parts = explode('[]', $type); + $count = \count($parts) - 1; + + return str_repeat('list<', $count).$parts[0].str_repeat('>', $count); + } + /** * @param mixed $value */ @@ -205,7 +224,7 @@ private static function scalarToString($value): string } /** - * @param array $value + * @param array $value */ private static function arrayToString(array $value): string { diff --git a/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php b/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php index e558fd6b9..c908c4f16 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php +++ b/vendor/friendsofphp/php-cs-fixer/src/WhitespacesFixerConfig.php @@ -16,13 +16,21 @@ /** * @author Dariusz Rumiński + * + * @readonly */ final class WhitespacesFixerConfig { + /** @var non-empty-string */ private string $indent; + /** @var non-empty-string */ private string $lineEnding; + /** + * @param non-empty-string $indent + * @param non-empty-string $lineEnding + */ public function __construct(string $indent = ' ', string $lineEnding = "\n") { if (!\in_array($indent, [' ', ' ', "\t"], true)) { @@ -37,11 +45,17 @@ public function __construct(string $indent = ' ', string $lineEnding = "\n") $this->lineEnding = $lineEnding; } + /** + * @return non-empty-string + */ public function getIndent(): string { return $this->indent; } + /** + * @return non-empty-string + */ public function getLineEnding(): string { return $this->lineEnding; diff --git a/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php b/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php index 36265a885..b54dae5fb 100644 --- a/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php +++ b/vendor/friendsofphp/php-cs-fixer/src/WordMatcher.php @@ -17,17 +17,19 @@ /** * @author Dariusz Rumiński * + * @readonly + * * @internal */ final class WordMatcher { /** - * @var string[] + * @var list */ private array $candidates; /** - * @param string[] $candidates + * @param list $candidates */ public function __construct(array $candidates) { diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar index 95932296f170ef2c407e81a0b0abf0daabb102a3..e8532568cb2b21469ee2200aafde21415ef15c86 100755 GIT binary patch delta 468124 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 ^4$pchk|GFh^<_v=%(G$gpZ0haibeq=-X@Ia> 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�TC{zmqR|#z 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
Q%XsMgY5$^yD@y&TR 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 Contains no other changes, so it's actually fully compatible with the v0.6.0 release. + +## 0.6.0 (2019-07-04) + +* Feature / BC break: Add support for `getMultiple()`, `setMultiple()`, `deleteMultiple()`, `clear()` and `has()` + supporting multiple cache items (inspired by PSR-16). + (#32 by @krlv and #37 by @clue) + +* Documentation for TTL precision with millisecond accuracy or below and + use high-resolution timer for cache TTL on PHP 7.3+. + (#35 and #38 by @clue) + +* Improve API documentation and allow legacy HHVM to fail in Travis CI config. + (#34 and #36 by @clue) + +* Prefix all global functions calls with \ to skip the look up and resolve process and go straight to the global function. + (#31 by @WyriHaximus) + +## 0.5.0 (2018-06-25) + +* Improve documentation by describing what is expected of a class implementing `CacheInterface`. + (#21, #22, #23, #27 by @WyriHaximus) + +* Implemented (optional) Least Recently Used (LRU) cache algorithm for `ArrayCache`. + (#26 by @clue) + +* Added support for cache expiration (TTL). + (#29 by @clue and @WyriHaximus) + +* Renamed `remove` to `delete` making it more in line with `PSR-16`. + (#30 by @clue) + +## 0.4.2 (2017-12-20) + +* Improve documentation with usage and installation instructions + (#10 by @clue) + +* Improve test suite by adding PHPUnit to `require-dev` and + add forward compatibility with PHPUnit 5 and PHPUnit 6 and + sanitize Composer autoload paths + (#14 by @shaunbramley and #12 and #18 by @clue) + +## 0.4.1 (2016-02-25) + +* Repository maintenance, split off from main repo, improve test suite and documentation +* First class support for PHP7 and HHVM (#9 by @clue) +* Adjust compatibility to 5.3 (#7 by @clue) + +## 0.4.0 (2014-02-02) + +* BC break: Bump minimum PHP version to PHP 5.4, remove 5.3 specific hacks +* BC break: Update to React/Promise 2.0 +* Dependency: Autoloading and filesystem structure now PSR-4 instead of PSR-0 + +## 0.3.2 (2013-05-10) + +* Version bump + +## 0.3.0 (2013-04-14) + +* Version bump + +## 0.2.6 (2012-12-26) + +* Feature: New cache component, used by DNS diff --git a/vendor/react/cache/LICENSE b/vendor/react/cache/LICENSE new file mode 100644 index 000000000..d6f8901f9 --- /dev/null +++ b/vendor/react/cache/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/react/cache/README.md b/vendor/react/cache/README.md new file mode 100644 index 000000000..7a86be9cf --- /dev/null +++ b/vendor/react/cache/README.md @@ -0,0 +1,367 @@ +# Cache + +[![CI status](https://github.com/reactphp/cache/actions/workflows/ci.yml/badge.svg)](https://github.com/reactphp/cache/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/cache?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/cache) + +Async, [Promise](https://github.com/reactphp/promise)-based cache interface +for [ReactPHP](https://reactphp.org/). + +The cache component provides a +[Promise](https://github.com/reactphp/promise)-based +[`CacheInterface`](#cacheinterface) and an in-memory [`ArrayCache`](#arraycache) +implementation of that. +This allows consumers to type hint against the interface and third parties to +provide alternate implementations. +This project is heavily inspired by +[PSR-16: Common Interface for Caching Libraries](https://www.php-fig.org/psr/psr-16/), +but uses an interface more suited for async, non-blocking applications. + +**Table of Contents** + +* [Usage](#usage) + * [CacheInterface](#cacheinterface) + * [get()](#get) + * [set()](#set) + * [delete()](#delete) + * [getMultiple()](#getmultiple) + * [setMultiple()](#setmultiple) + * [deleteMultiple()](#deletemultiple) + * [clear()](#clear) + * [has()](#has) + * [ArrayCache](#arraycache) +* [Common usage](#common-usage) + * [Fallback get](#fallback-get) + * [Fallback-get-and-set](#fallback-get-and-set) +* [Install](#install) +* [Tests](#tests) +* [License](#license) + +## Usage + +### CacheInterface + +The `CacheInterface` describes the main interface of this component. +This allows consumers to type hint against the interface and third parties to +provide alternate implementations. + +#### get() + +The `get(string $key, mixed $default = null): PromiseInterface` method can be used to +retrieve an item from the cache. + +This method will resolve with the cached value on success or with the +given `$default` value when no item can be found or when an error occurs. +Similarly, an expired cache item (once the time-to-live is expired) is +considered a cache miss. + +```php +$cache + ->get('foo') + ->then('var_dump'); +``` + +This example fetches the value of the key `foo` and passes it to the +`var_dump` function. You can use any of the composition provided by +[promises](https://github.com/reactphp/promise). + +#### set() + +The `set(string $key, mixed $value, ?float $ttl = null): PromiseInterface` method can be used to +store an item in the cache. + +This method will resolve with `true` on success or `false` when an error +occurs. If the cache implementation has to go over the network to store +it, it may take a while. + +The optional `$ttl` parameter sets the maximum time-to-live in seconds +for this cache item. If this parameter is omitted (or `null`), the item +will stay in the cache for as long as the underlying implementation +supports. Trying to access an expired cache item results in a cache miss, +see also [`get()`](#get). + +```php +$cache->set('foo', 'bar', 60); +``` + +This example eventually sets the value of the key `foo` to `bar`. If it +already exists, it is overridden. + +This interface does not enforce any particular TTL resolution, so special +care may have to be taken if you rely on very high precision with +millisecond accuracy or below. Cache implementations SHOULD work on a +best effort basis and SHOULD provide at least second accuracy unless +otherwise noted. Many existing cache implementations are known to provide +microsecond or millisecond accuracy, but it's generally not recommended +to rely on this high precision. + +This interface suggests that cache implementations SHOULD use a monotonic +time source if available. Given that a monotonic time source is only +available as of PHP 7.3 by default, cache implementations MAY fall back +to using wall-clock time. +While this does not affect many common use cases, this is an important +distinction for programs that rely on a high time precision or on systems +that are subject to discontinuous time adjustments (time jumps). +This means that if you store a cache item with a TTL of 30s and then +adjust your system time forward by 20s, the cache item SHOULD still +expire in 30s. + +#### delete() + +The `delete(string $key): PromiseInterface` method can be used to +delete an item from the cache. + +This method will resolve with `true` on success or `false` when an error +occurs. When no item for `$key` is found in the cache, it also resolves +to `true`. If the cache implementation has to go over the network to +delete it, it may take a while. + +```php +$cache->delete('foo'); +``` + +This example eventually deletes the key `foo` from the cache. As with +`set()`, this may not happen instantly and a promise is returned to +provide guarantees whether or not the item has been removed from cache. + +#### getMultiple() + +The `getMultiple(string[] $keys, mixed $default = null): PromiseInterface` method can be used to +retrieve multiple cache items by their unique keys. + +This method will resolve with an array of cached values on success or with the +given `$default` value when an item can not be found or when an error occurs. +Similarly, an expired cache item (once the time-to-live is expired) is +considered a cache miss. + +```php +$cache->getMultiple(array('name', 'age'))->then(function (array $values) { + $name = $values['name'] ?? 'User'; + $age = $values['age'] ?? 'n/a'; + + echo $name . ' is ' . $age . PHP_EOL; +}); +``` + +This example fetches the cache items for the `name` and `age` keys and +prints some example output. You can use any of the composition provided +by [promises](https://github.com/reactphp/promise). + +#### setMultiple() + +The `setMultiple(array $values, ?float $ttl = null): PromiseInterface` method can be used to +persist a set of key => value pairs in the cache, with an optional TTL. + +This method will resolve with `true` on success or `false` when an error +occurs. If the cache implementation has to go over the network to store +it, it may take a while. + +The optional `$ttl` parameter sets the maximum time-to-live in seconds +for these cache items. If this parameter is omitted (or `null`), these items +will stay in the cache for as long as the underlying implementation +supports. Trying to access an expired cache items results in a cache miss, +see also [`getMultiple()`](#getmultiple). + +```php +$cache->setMultiple(array('foo' => 1, 'bar' => 2), 60); +``` + +This example eventually sets the list of values - the key `foo` to `1` value +and the key `bar` to `2`. If some of the keys already exist, they are overridden. + +#### deleteMultiple() + +The `setMultiple(string[] $keys): PromiseInterface` method can be used to +delete multiple cache items in a single operation. + +This method will resolve with `true` on success or `false` when an error +occurs. When no items for `$keys` are found in the cache, it also resolves +to `true`. If the cache implementation has to go over the network to +delete it, it may take a while. + +```php +$cache->deleteMultiple(array('foo', 'bar, 'baz')); +``` + +This example eventually deletes keys `foo`, `bar` and `baz` from the cache. +As with `setMultiple()`, this may not happen instantly and a promise is returned to +provide guarantees whether or not the item has been removed from cache. + +#### clear() + +The `clear(): PromiseInterface` method can be used to +wipe clean the entire cache. + +This method will resolve with `true` on success or `false` when an error +occurs. If the cache implementation has to go over the network to +delete it, it may take a while. + +```php +$cache->clear(); +``` + +This example eventually deletes all keys from the cache. As with `deleteMultiple()`, +this may not happen instantly and a promise is returned to provide guarantees +whether or not all the items have been removed from cache. + +#### has() + +The `has(string $key): PromiseInterface` method can be used to +determine whether an item is present in the cache. + +This method will resolve with `true` on success or `false` when no item can be found +or when an error occurs. Similarly, an expired cache item (once the time-to-live +is expired) is considered a cache miss. + +```php +$cache + ->has('foo') + ->then('var_dump'); +``` + +This example checks if the value of the key `foo` is set in the cache and passes +the result to the `var_dump` function. You can use any of the composition provided by +[promises](https://github.com/reactphp/promise). + +NOTE: It is recommended that has() is only to be used for cache warming type purposes +and not to be used within your live applications operations for get/set, as this method +is subject to a race condition where your has() will return true and immediately after, +another script can remove it making the state of your app out of date. + +### ArrayCache + +The `ArrayCache` provides an in-memory implementation of the [`CacheInterface`](#cacheinterface). + +```php +$cache = new ArrayCache(); + +$cache->set('foo', 'bar'); +``` + +Its constructor accepts an optional `?int $limit` parameter to limit the +maximum number of entries to store in the LRU cache. If you add more +entries to this instance, it will automatically take care of removing +the one that was least recently used (LRU). + +For example, this snippet will overwrite the first value and only store +the last two entries: + +```php +$cache = new ArrayCache(2); + +$cache->set('foo', '1'); +$cache->set('bar', '2'); +$cache->set('baz', '3'); +``` + +This cache implementation is known to rely on wall-clock time to schedule +future cache expiration times when using any version before PHP 7.3, +because a monotonic time source is only available as of PHP 7.3 (`hrtime()`). +While this does not affect many common use cases, this is an important +distinction for programs that rely on a high time precision or on systems +that are subject to discontinuous time adjustments (time jumps). +This means that if you store a cache item with a TTL of 30s on PHP < 7.3 +and then adjust your system time forward by 20s, the cache item may +expire in 10s. See also [`set()`](#set) for more details. + +## Common usage + +### Fallback get + +A common use case of caches is to attempt fetching a cached value and as a +fallback retrieve it from the original data source if not found. Here is an +example of that: + +```php +$cache + ->get('foo') + ->then(function ($result) { + if ($result === null) { + return getFooFromDb(); + } + + return $result; + }) + ->then('var_dump'); +``` + +First an attempt is made to retrieve the value of `foo`. A callback function is +registered that will call `getFooFromDb` when the resulting value is null. +`getFooFromDb` is a function (can be any PHP callable) that will be called if the +key does not exist in the cache. + +`getFooFromDb` can handle the missing key by returning a promise for the +actual value from the database (or any other data source). As a result, this +chain will correctly fall back, and provide the value in both cases. + +### Fallback get and set + +To expand on the fallback get example, often you want to set the value on the +cache after fetching it from the data source. + +```php +$cache + ->get('foo') + ->then(function ($result) { + if ($result === null) { + return $this->getAndCacheFooFromDb(); + } + + return $result; + }) + ->then('var_dump'); + +public function getAndCacheFooFromDb() +{ + return $this->db + ->get('foo') + ->then(array($this, 'cacheFooFromDb')); +} + +public function cacheFooFromDb($foo) +{ + $this->cache->set('foo', $foo); + + return $foo; +} +``` + +By using chaining you can easily conditionally cache the value if it is +fetched from the database. + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](https://semver.org/). +This will install the latest supported version: + +```bash +composer require react/cache:^1.2 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 8+ and +HHVM. +It's *highly recommended to use PHP 7+* for this project. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +## License + +MIT, see [LICENSE file](LICENSE). diff --git a/vendor/react/cache/composer.json b/vendor/react/cache/composer.json new file mode 100644 index 000000000..153439a25 --- /dev/null +++ b/vendor/react/cache/composer.json @@ -0,0 +1,45 @@ +{ + "name": "react/cache", + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": ["cache", "caching", "promise", "ReactPHP"], + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "homepage": "https://clue.engineering/", + "email": "christian@clue.engineering" + }, + { + "name": "Cees-Jan Kiewiet", + "homepage": "https://wyrihaximus.net/", + "email": "reactphp@ceesjankiewiet.nl" + }, + { + "name": "Jan Sorgalla", + "homepage": "https://sorgalla.com/", + "email": "jsorgalla@gmail.com" + }, + { + "name": "Chris Boden", + "homepage": "https://cboden.dev/", + "email": "cboden@gmail.com" + } + ], + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "React\\Tests\\Cache\\": "tests/" + } + } +} diff --git a/vendor/react/cache/src/ArrayCache.php b/vendor/react/cache/src/ArrayCache.php new file mode 100644 index 000000000..81f25effa --- /dev/null +++ b/vendor/react/cache/src/ArrayCache.php @@ -0,0 +1,181 @@ +set('foo', 'bar'); + * ``` + * + * Its constructor accepts an optional `?int $limit` parameter to limit the + * maximum number of entries to store in the LRU cache. If you add more + * entries to this instance, it will automatically take care of removing + * the one that was least recently used (LRU). + * + * For example, this snippet will overwrite the first value and only store + * the last two entries: + * + * ```php + * $cache = new ArrayCache(2); + * + * $cache->set('foo', '1'); + * $cache->set('bar', '2'); + * $cache->set('baz', '3'); + * ``` + * + * This cache implementation is known to rely on wall-clock time to schedule + * future cache expiration times when using any version before PHP 7.3, + * because a monotonic time source is only available as of PHP 7.3 (`hrtime()`). + * While this does not affect many common use cases, this is an important + * distinction for programs that rely on a high time precision or on systems + * that are subject to discontinuous time adjustments (time jumps). + * This means that if you store a cache item with a TTL of 30s on PHP < 7.3 + * and then adjust your system time forward by 20s, the cache item may + * expire in 10s. See also [`set()`](#set) for more details. + * + * @param int|null $limit maximum number of entries to store in the LRU cache + */ + public function __construct($limit = null) + { + $this->limit = $limit; + + // prefer high-resolution timer, available as of PHP 7.3+ + $this->supportsHighResolution = \function_exists('hrtime'); + } + + public function get($key, $default = null) + { + // delete key if it is already expired => below will detect this as a cache miss + if (isset($this->expires[$key]) && $this->now() - $this->expires[$key] > 0) { + unset($this->data[$key], $this->expires[$key]); + } + + if (!\array_key_exists($key, $this->data)) { + return Promise\resolve($default); + } + + // remove and append to end of array to keep track of LRU info + $value = $this->data[$key]; + unset($this->data[$key]); + $this->data[$key] = $value; + + return Promise\resolve($value); + } + + public function set($key, $value, $ttl = null) + { + // unset before setting to ensure this entry will be added to end of array (LRU info) + unset($this->data[$key]); + $this->data[$key] = $value; + + // sort expiration times if TTL is given (first will expire first) + unset($this->expires[$key]); + if ($ttl !== null) { + $this->expires[$key] = $this->now() + $ttl; + \asort($this->expires); + } + + // ensure size limit is not exceeded or remove first entry from array + if ($this->limit !== null && \count($this->data) > $this->limit) { + // first try to check if there's any expired entry + // expiration times are sorted, so we can simply look at the first one + \reset($this->expires); + $key = \key($this->expires); + + // check to see if the first in the list of expiring keys is already expired + // if the first key is not expired, we have to overwrite by using LRU info + if ($key === null || $this->now() - $this->expires[$key] < 0) { + \reset($this->data); + $key = \key($this->data); + } + unset($this->data[$key], $this->expires[$key]); + } + + return Promise\resolve(true); + } + + public function delete($key) + { + unset($this->data[$key], $this->expires[$key]); + + return Promise\resolve(true); + } + + public function getMultiple(array $keys, $default = null) + { + $values = array(); + + foreach ($keys as $key) { + $values[$key] = $this->get($key, $default); + } + + return Promise\all($values); + } + + public function setMultiple(array $values, $ttl = null) + { + foreach ($values as $key => $value) { + $this->set($key, $value, $ttl); + } + + return Promise\resolve(true); + } + + public function deleteMultiple(array $keys) + { + foreach ($keys as $key) { + unset($this->data[$key], $this->expires[$key]); + } + + return Promise\resolve(true); + } + + public function clear() + { + $this->data = array(); + $this->expires = array(); + + return Promise\resolve(true); + } + + public function has($key) + { + // delete key if it is already expired + if (isset($this->expires[$key]) && $this->now() - $this->expires[$key] > 0) { + unset($this->data[$key], $this->expires[$key]); + } + + if (!\array_key_exists($key, $this->data)) { + return Promise\resolve(false); + } + + // remove and append to end of array to keep track of LRU info + $value = $this->data[$key]; + unset($this->data[$key]); + $this->data[$key] = $value; + + return Promise\resolve(true); + } + + /** + * @return float + */ + private function now() + { + return $this->supportsHighResolution ? \hrtime(true) * 1e-9 : \microtime(true); + } +} diff --git a/vendor/react/cache/src/CacheInterface.php b/vendor/react/cache/src/CacheInterface.php new file mode 100644 index 000000000..8e51c190c --- /dev/null +++ b/vendor/react/cache/src/CacheInterface.php @@ -0,0 +1,194 @@ +get('foo') + * ->then('var_dump'); + * ``` + * + * This example fetches the value of the key `foo` and passes it to the + * `var_dump` function. You can use any of the composition provided by + * [promises](https://github.com/reactphp/promise). + * + * @param string $key + * @param mixed $default Default value to return for cache miss or null if not given. + * @return PromiseInterface + */ + public function get($key, $default = null); + + /** + * Stores an item in the cache. + * + * This method will resolve with `true` on success or `false` when an error + * occurs. If the cache implementation has to go over the network to store + * it, it may take a while. + * + * The optional `$ttl` parameter sets the maximum time-to-live in seconds + * for this cache item. If this parameter is omitted (or `null`), the item + * will stay in the cache for as long as the underlying implementation + * supports. Trying to access an expired cache item results in a cache miss, + * see also [`get()`](#get). + * + * ```php + * $cache->set('foo', 'bar', 60); + * ``` + * + * This example eventually sets the value of the key `foo` to `bar`. If it + * already exists, it is overridden. + * + * This interface does not enforce any particular TTL resolution, so special + * care may have to be taken if you rely on very high precision with + * millisecond accuracy or below. Cache implementations SHOULD work on a + * best effort basis and SHOULD provide at least second accuracy unless + * otherwise noted. Many existing cache implementations are known to provide + * microsecond or millisecond accuracy, but it's generally not recommended + * to rely on this high precision. + * + * This interface suggests that cache implementations SHOULD use a monotonic + * time source if available. Given that a monotonic time source is only + * available as of PHP 7.3 by default, cache implementations MAY fall back + * to using wall-clock time. + * While this does not affect many common use cases, this is an important + * distinction for programs that rely on a high time precision or on systems + * that are subject to discontinuous time adjustments (time jumps). + * This means that if you store a cache item with a TTL of 30s and then + * adjust your system time forward by 20s, the cache item SHOULD still + * expire in 30s. + * + * @param string $key + * @param mixed $value + * @param ?float $ttl + * @return PromiseInterface Returns a promise which resolves to `true` on success or `false` on error + */ + public function set($key, $value, $ttl = null); + + /** + * Deletes an item from the cache. + * + * This method will resolve with `true` on success or `false` when an error + * occurs. When no item for `$key` is found in the cache, it also resolves + * to `true`. If the cache implementation has to go over the network to + * delete it, it may take a while. + * + * ```php + * $cache->delete('foo'); + * ``` + * + * This example eventually deletes the key `foo` from the cache. As with + * `set()`, this may not happen instantly and a promise is returned to + * provide guarantees whether or not the item has been removed from cache. + * + * @param string $key + * @return PromiseInterface Returns a promise which resolves to `true` on success or `false` on error + */ + public function delete($key); + + /** + * Retrieves multiple cache items by their unique keys. + * + * This method will resolve with an array of cached values on success or with the + * given `$default` value when an item can not be found or when an error occurs. + * Similarly, an expired cache item (once the time-to-live is expired) is + * considered a cache miss. + * + * ```php + * $cache->getMultiple(array('name', 'age'))->then(function (array $values) { + * $name = $values['name'] ?? 'User'; + * $age = $values['age'] ?? 'n/a'; + * + * echo $name . ' is ' . $age . PHP_EOL; + * }); + * ``` + * + * This example fetches the cache items for the `name` and `age` keys and + * prints some example output. You can use any of the composition provided + * by [promises](https://github.com/reactphp/promise). + * + * @param string[] $keys A list of keys that can obtained in a single operation. + * @param mixed $default Default value to return for keys that do not exist. + * @return PromiseInterface Returns a promise which resolves to an `array` of cached values + */ + public function getMultiple(array $keys, $default = null); + + /** + * Persists a set of key => value pairs in the cache, with an optional TTL. + * + * This method will resolve with `true` on success or `false` when an error + * occurs. If the cache implementation has to go over the network to store + * it, it may take a while. + * + * The optional `$ttl` parameter sets the maximum time-to-live in seconds + * for these cache items. If this parameter is omitted (or `null`), these items + * will stay in the cache for as long as the underlying implementation + * supports. Trying to access an expired cache items results in a cache miss, + * see also [`get()`](#get). + * + * ```php + * $cache->setMultiple(array('foo' => 1, 'bar' => 2), 60); + * ``` + * + * This example eventually sets the list of values - the key `foo` to 1 value + * and the key `bar` to 2. If some of the keys already exist, they are overridden. + * + * @param array $values A list of key => value pairs for a multiple-set operation. + * @param ?float $ttl Optional. The TTL value of this item. + * @return PromiseInterface Returns a promise which resolves to `true` on success or `false` on error + */ + public function setMultiple(array $values, $ttl = null); + + /** + * Deletes multiple cache items in a single operation. + * + * @param string[] $keys A list of string-based keys to be deleted. + * @return PromiseInterface Returns a promise which resolves to `true` on success or `false` on error + */ + public function deleteMultiple(array $keys); + + /** + * Wipes clean the entire cache. + * + * @return PromiseInterface Returns a promise which resolves to `true` on success or `false` on error + */ + public function clear(); + + /** + * Determines whether an item is present in the cache. + * + * This method will resolve with `true` on success or `false` when no item can be found + * or when an error occurs. Similarly, an expired cache item (once the time-to-live + * is expired) is considered a cache miss. + * + * ```php + * $cache + * ->has('foo') + * ->then('var_dump'); + * ``` + * + * This example checks if the value of the key `foo` is set in the cache and passes + * the result to the `var_dump` function. You can use any of the composition provided by + * [promises](https://github.com/reactphp/promise). + * + * NOTE: It is recommended that has() is only to be used for cache warming type purposes + * and not to be used within your live applications operations for get/set, as this method + * is subject to a race condition where your has() will return true and immediately after, + * another script can remove it making the state of your app out of date. + * + * @param string $key The cache item key. + * @return PromiseInterface Returns a promise which resolves to `true` on success or `false` on error + */ + public function has($key); +} diff --git a/vendor/react/child-process/CHANGELOG.md b/vendor/react/child-process/CHANGELOG.md new file mode 100644 index 000000000..5ad759d44 --- /dev/null +++ b/vendor/react/child-process/CHANGELOG.md @@ -0,0 +1,176 @@ +# Changelog + +## 0.6.6 (2025-01-01) + +This is a compatibility release that contains backported features from the `0.7.x` branch. +Once v0.7 is released, it will be the way forward for this project. + +* Feature: Improve PHP 8.4+ support by avoiding implicitly nullable types. + (#114 by @clue) + +* Improve test suite to run tests on latest PHP versions and report failed assertions. + (#113 by @clue) + +## 0.6.5 (2022-09-16) + +* Feature: Full support for PHP 8.1 and PHP 8.2 release. + (#91 by @SimonFrings and #99 by @WyriHaximus) + +* Feature / Fix: Improve error reporting when custom error handler is used. + (#94 by @clue) + +* Minor documentation improvements. + (#92 by @SimonFrings and #95 by @nhedger) + +* Improve test suite, skip failing tests on bugged versions and fix legacy HHVM build. + (#96 and #98 by @clue and #93 by @SimonFrings) + +## 0.6.4 (2021-10-12) + +* Feature / Fix: Skip sigchild check if `phpinfo()` has been disabled. + (#89 by @clue) + +* Fix: Fix detecting closed socket pipes on PHP 8. + (#90 by @clue) + +## 0.6.3 (2021-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop). + +* Feature: Simplify usage by supporting new [default loop](https://reactphp.org/event-loop/#loop). + (#87 by @clue) + + ```php + // old (still supported) + $process = new React\ChildProcess\Process($command); + $process->start($loop); + + // new (using default loop) + $process = new React\ChildProcess\Process($command); + $process->start(); + ``` + +## 0.6.2 (2021-02-05) + +* Feature: Support PHP 8 and add non-blocking I/O support on Windows with PHP 8. + (#85 by @clue) + +* Minor documentation improvements. + (#78 by @WyriHaximus and #80 by @gdejong) + +* Improve test suite and add `.gitattributes` to exclude dev files from exports. + Run tests on PHPUnit 9, switch to GitHub actions and clean up test suite. + (#75 by @reedy, #81 by @gdejong, #82 by @SimonFrings and #84 by @clue) + +## 0.6.1 (2019-02-15) + +* Feature / Fix: Improve error reporting when spawning child process fails. + (#73 by @clue) + +## 0.6.0 (2019-01-14) + +A major feature release with some minor API improvements! +This project now has limited Windows support and supports passing custom pipes +and file descriptors to the child process. + +This update involves a few minor BC breaks. We've tried hard to avoid BC breaks +where possible and minimize impact otherwise. We expect that most consumers of +this package will actually not be affected by any BC breaks, see below for more +details. + +* Feature / BC break: Support passing custom pipes and file descriptors to child process, + expose all standard I/O pipes in an array and remove unused Windows-only options. + (#62, #64 and #65 by @clue) + + > BC note: The optional `$options` parameter in the `Process` constructor + has been removed and a new `$fds` parameter has been added instead. The + previous `$options` parameter was Windows-only, available options were not + documented or referenced anywhere else in this library, so its actual + impact is expected to be relatively small. See the documentation and the + following changelog entry if you're looking for Windows support. + +* Feature: Support spawning child process on Windows without process I/O pipes. + (#67 by @clue) + +* Feature / BC break: Improve sigchild compatibility and support explicit configuration. + (#63 by @clue) + + ```php + // advanced: not recommended by default + Process::setSigchildEnabled(true); + ``` + + > BC note: The old public sigchild methods have been removed, but its + practical impact is believed to be relatively small due to the automatic detection. + +* Improve performance by prefixing all global functions calls with \ to skip + the look up and resolve process and go straight to the global function. + (#68 by @WyriHaximus) + +* Minor documentation improvements and docblock updates. + (#59 by @iamluc and #69 by @CharlotteDunois) + +* Improve test suite to test against PHP7.2 and PHP 7.3, improve HHVM compatibility, + add forward compatibility with PHPUnit 7 and run tests on Windows via Travis CI. + (#66 and #71 by @clue) + +## 0.5.2 (2018-01-18) + +* Feature: Detect "exit" immediately if last process pipe is closed + (#58 by @clue) + + This introduces a simple check to see if the program is already known to be + closed when the last process pipe is closed instead of relying on a periodic + timer. This simple change improves "exit" detection significantly for most + programs and does not cause a noticeable penalty for more advanced use cases. + +* Fix forward compatibility with upcoming EventLoop releases + (#56 by @clue) + +## 0.5.1 (2017-12-22) + +* Fix: Update Stream dependency to work around SEGFAULT in legacy PHP < 5.4.28 + and PHP < 5.5.12 + (#50 and #52 by @clue) + +* Improve test suite by simplifying test bootstrapping logic via Composer and + adding forward compatibility with PHPUnit 6 + (#53, #54 and #55 by @clue) + +## 0.5.0 (2017-08-15) + +* Forward compatibility: react/event-loop 1.0 and 0.5, react/stream 0.7.2 and 1.0, and Événement 3.0 + (#38 and #44 by @WyriHaximus, and #46 by @clue) +* Windows compatibility: Documentate that windows isn't supported in 0.5 unless used from within WSL + (#41 and #47 by @WyriHaximus) +* Documentation: Termination examples + (#42 by @clue) +* BC: Throw LogicException in Process instanciating when on Windows or when proc_open is missing (was `RuntimeException`) + (#49 by @mdrost) + +## 0.4.3 (2017-03-14) + +* Ease getting started by improving documentation and adding examples + (#33 and #34 by @clue) + +* First class support for PHP 5.3 through PHP 7.1 and HHVM + (#29 by @clue and #32 by @WyriHaximus) + +## 0.4.2 (2017-03-10) + +* Feature: Forward compatibility with Stream v0.5 + (#26 by @clue) + +* Improve test suite by removing AppVeyor and adding PHPUnit to `require-dev` + (#27 and #28 by @clue) + +## 0.4.1 (2016-08-01) + +* Standalone component +* Test against PHP 7 and HHVM, report test coverage, AppVeyor tests +* Wait for stdout and stderr to close before watching for process exit + (#18 by @mbonneau) + +## 0.4.0 (2014-02-02) + +* Feature: Added ChildProcess to run async child processes within the event loop (@jmikola) diff --git a/vendor/react/child-process/LICENSE b/vendor/react/child-process/LICENSE new file mode 100644 index 000000000..d6f8901f9 --- /dev/null +++ b/vendor/react/child-process/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/react/child-process/README.md b/vendor/react/child-process/README.md new file mode 100644 index 000000000..bea720412 --- /dev/null +++ b/vendor/react/child-process/README.md @@ -0,0 +1,619 @@ +# ChildProcess + +[![CI status](https://github.com/reactphp/child-process/actions/workflows/ci.yml/badge.svg)](https://github.com/reactphp/child-process/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/child-process?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/child-process) + +Event-driven library for executing child processes with +[ReactPHP](https://reactphp.org/). + +This library integrates [Program Execution](http://php.net/manual/en/book.exec.php) +with the [EventLoop](https://github.com/reactphp/event-loop). +Child processes launched may be signaled and will emit an +`exit` event upon termination. +Additionally, process I/O streams (i.e. STDIN, STDOUT, STDERR) are exposed +as [Streams](https://github.com/reactphp/stream). + +**Table of contents** + +* [Quickstart example](#quickstart-example) +* [Process](#process) + * [Stream Properties](#stream-properties) + * [Command](#command) + * [Termination](#termination) + * [Custom pipes](#custom-pipes) + * [Sigchild Compatibility](#sigchild-compatibility) + * [Windows Compatibility](#windows-compatibility) +* [Install](#install) +* [Tests](#tests) +* [License](#license) + +## Quickstart example + +```php +$process = new React\ChildProcess\Process('echo foo'); +$process->start(); + +$process->stdout->on('data', function ($chunk) { + echo $chunk; +}); + +$process->on('exit', function($exitCode, $termSignal) { + echo 'Process exited with code ' . $exitCode . PHP_EOL; +}); +``` + +See also the [examples](examples). + +## Process + +### Stream Properties + +Once a process is started, its I/O streams will be constructed as instances of +`React\Stream\ReadableStreamInterface` and `React\Stream\WritableStreamInterface`. +Before `start()` is called, these properties are not set. Once a process terminates, +the streams will become closed but not unset. + +Following common Unix conventions, this library will start each child process +with the three pipes matching the standard I/O streams as given below by default. +You can use the named references for common use cases or access these as an +array with all three pipes. + +* `$stdin` or `$pipes[0]` is a `WritableStreamInterface` +* `$stdout` or `$pipes[1]` is a `ReadableStreamInterface` +* `$stderr` or `$pipes[2]` is a `ReadableStreamInterface` + +Note that this default configuration may be overridden by explicitly passing +[custom pipes](#custom-pipes), in which case they may not be set or be assigned +different values. In particular, note that [Windows support](#windows-compatibility) +is limited in that it doesn't support non-blocking STDIO pipes. The `$pipes` +array will always contain references to all pipes as configured and the standard +I/O references will always be set to reference the pipes matching the above +conventions. See [custom pipes](#custom-pipes) for more details. + +Because each of these implement the underlying +[`ReadableStreamInterface`](https://github.com/reactphp/stream#readablestreaminterface) or +[`WritableStreamInterface`](https://github.com/reactphp/stream#writablestreaminterface), +you can use any of their events and methods as usual: + +```php +$process = new Process($command); +$process->start(); + +$process->stdout->on('data', function ($chunk) { + echo $chunk; +}); + +$process->stdout->on('end', function () { + echo 'ended'; +}); + +$process->stdout->on('error', function (Exception $e) { + echo 'error: ' . $e->getMessage(); +}); + +$process->stdout->on('close', function () { + echo 'closed'; +}); + +$process->stdin->write($data); +$process->stdin->end($data = null); +// … +``` + +For more details, see the +[`ReadableStreamInterface`](https://github.com/reactphp/stream#readablestreaminterface) and +[`WritableStreamInterface`](https://github.com/reactphp/stream#writablestreaminterface). + +### Command + +The `Process` class allows you to pass any kind of command line string: + +```php +$process = new Process('echo test'); +$process->start(); +``` + +The command line string usually consists of a whitespace-separated list with +your main executable bin and any number of arguments. Special care should be +taken to escape or quote any arguments, escpecially if you pass any user input +along. Likewise, keep in mind that especially on Windows, it is rather common to +have path names containing spaces and other special characters. If you want to +run a binary like this, you will have to ensure this is quoted as a single +argument using `escapeshellarg()` like this: + +```php +$bin = 'C:\\Program files (x86)\\PHP\\php.exe'; +$file = 'C:\\Users\\me\\Desktop\\Application\\main.php'; + +$process = new Process(escapeshellarg($bin) . ' ' . escapeshellarg($file)); +$process->start(); +``` + +By default, PHP will launch processes by wrapping the given command line string +in a `sh` command on Unix, so that the first example will actually execute +`sh -c echo test` under the hood on Unix. On Windows, it will not launch +processes by wrapping them in a shell. + +This is a very useful feature because it does not only allow you to pass single +commands, but actually allows you to pass any kind of shell command line and +launch multiple sub-commands using command chains (with `&&`, `||`, `;` and +others) and allows you to redirect STDIO streams (with `2>&1` and family). +This can be used to pass complete command lines and receive the resulting STDIO +streams from the wrapping shell command like this: + +```php +$process = new Process('echo run && demo || echo failed'); +$process->start(); +``` + +> Note that [Windows support](#windows-compatibility) is limited in that it + doesn't support STDIO streams at all and also that processes will not be run + in a wrapping shell by default. If you want to run a shell built-in function + such as `echo hello` or `sleep 10`, you may have to prefix your command line + with an explicit shell like `cmd /c echo hello`. + +In other words, the underlying shell is responsible for managing this command +line and launching the individual sub-commands and connecting their STDIO +streams as appropriate. +This implies that the `Process` class will only receive the resulting STDIO +streams from the wrapping shell, which will thus contain the complete +input/output with no way to discern the input/output of single sub-commands. + +If you want to discern the output of single sub-commands, you may want to +implement some higher-level protocol logic, such as printing an explicit +boundary between each sub-command like this: + +```php +$process = new Process('cat first && echo --- && cat second'); +$process->start(); +``` + +As an alternative, considering launching one process at a time and listening on +its `exit` event to conditionally start the next process in the chain. +This will give you an opportunity to configure the subsequent process I/O streams: + +```php +$first = new Process('cat first'); +$first->start(); + +$first->on('exit', function () { + $second = new Process('cat second'); + $second->start(); +}); +``` + +Keep in mind that PHP uses the shell wrapper for ALL command lines on Unix. +While this may seem reasonable for more complex command lines, this actually +also applies to running the most simple single command: + +```php +$process = new Process('yes'); +$process->start(); +``` + +This will actually spawn a command hierarchy similar to this on Unix: + +``` +5480 … \_ php example.php +5481 … \_ sh -c yes +5482 … \_ yes +``` + +This means that trying to get the underlying process PID or sending signals +will actually target the wrapping shell, which may not be the desired result +in many cases. + +If you do not want this wrapping shell process to show up, you can simply +prepend the command string with `exec` on Unix platforms, which will cause the +wrapping shell process to be replaced by our process: + +```php +$process = new Process('exec yes'); +$process->start(); +``` + +This will show a resulting command hierarchy similar to this: + +``` +5480 … \_ php example.php +5481 … \_ yes +``` + +This means that trying to get the underlying process PID and sending signals +will now target the actual command as expected. + +Note that in this case, the command line will not be run in a wrapping shell. +This implies that when using `exec`, there's no way to pass command lines such +as those containing command chains or redirected STDIO streams. + +As a rule of thumb, most commands will likely run just fine with the wrapping +shell. +If you pass a complete command line (or are unsure), you SHOULD most likely keep +the wrapping shell. +If you're running on Unix and you want to pass an invidual command only, you MAY +want to consider prepending the command string with `exec` to avoid the wrapping shell. + +### Termination + +The `exit` event will be emitted whenever the process is no longer running. +Event listeners will receive the exit code and termination signal as two +arguments: + +```php +$process = new Process('sleep 10'); +$process->start(); + +$process->on('exit', function ($code, $term) { + if ($term === null) { + echo 'exit with code ' . $code . PHP_EOL; + } else { + echo 'terminated with signal ' . $term . PHP_EOL; + } +}); +``` + +Note that `$code` is `null` if the process has terminated, but the exit +code could not be determined (for example +[sigchild compatibility](#sigchild-compatibility) was disabled). +Similarly, `$term` is `null` unless the process has terminated in response to +an uncaught signal sent to it. +This is not a limitation of this project, but actual how exit codes and signals +are exposed on POSIX systems, for more details see also +[here](https://unix.stackexchange.com/questions/99112/default-exit-code-when-process-is-terminated). + +It's also worth noting that process termination depends on all file descriptors +being closed beforehand. +This means that all [process pipes](#stream-properties) will emit a `close` +event before the `exit` event and that no more `data` events will arrive after +the `exit` event. +Accordingly, if either of these pipes is in a paused state (`pause()` method +or internally due to a `pipe()` call), this detection may not trigger. + +The `terminate(?int $signal = null): bool` method can be used to send the +process a signal (SIGTERM by default). +Depending on which signal you send to the process and whether it has a signal +handler registered, this can be used to either merely signal a process or even +forcefully terminate it. + +```php +$process->terminate(SIGUSR1); +``` + +Keep the above section in mind if you want to forcefully terminate a process. +If your process spawn sub-processes or implicitly uses the +[wrapping shell mentioned above](#command), its file descriptors may be +inherited to child processes and terminating the main process may not +necessarily terminate the whole process tree. +It is highly suggested that you explicitly `close()` all process pipes +accordingly when terminating a process: + +```php +$process = new Process('sleep 10'); +$process->start(); + +Loop::addTimer(2.0, function () use ($process) { + foreach ($process->pipes as $pipe) { + $pipe->close(); + } + $process->terminate(); +}); +``` + +For many simple programs these seamingly complicated steps can also be avoided +by prefixing the command line with `exec` to avoid the wrapping shell and its +inherited process pipes as [mentioned above](#command). + +```php +$process = new Process('exec sleep 10'); +$process->start(); + +Loop::addTimer(2.0, function () use ($process) { + $process->terminate(); +}); +``` + +Many command line programs also wait for data on `STDIN` and terminate cleanly +when this pipe is closed. +For example, the following can be used to "soft-close" a `cat` process: + +```php +$process = new Process('cat'); +$process->start(); + +Loop::addTimer(2.0, function () use ($process) { + $process->stdin->end(); +}); +``` + +While process pipes and termination may seem confusing to newcomers, the above +properties actually allow some fine grained control over process termination, +such as first trying a soft-close and then applying a force-close after a +timeout. + +### Custom pipes + +Following common Unix conventions, this library will start each child process +with the three pipes matching the standard I/O streams by default. For more +advanced use cases it may be useful to pass in custom pipes, such as explicitly +passing additional file descriptors (FDs) or overriding default process pipes. + +Note that passing custom pipes is considered advanced usage and requires a +more in-depth understanding of Unix file descriptors and how they are inherited +to child processes and shared in multi-processing applications. + +If you do not want to use the default standard I/O pipes, you can explicitly +pass an array containing the file descriptor specification to the constructor +like this: + +```php +$fds = array( + // standard I/O pipes for stdin/stdout/stderr + 0 => array('pipe', 'r'), + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w'), + + // example FDs for files or open resources + 4 => array('file', '/dev/null', 'r'), + 6 => fopen('log.txt','a'), + 8 => STDERR, + + // example FDs for sockets + 10 => fsockopen('localhost', 8080), + 12 => stream_socket_server('tcp://0.0.0.0:4711') +); + +$process = new Process($cmd, null, null, $fds); +$process->start(); +``` + +Unless your use case has special requirements that demand otherwise, you're +highly recommended to (at least) pass in the standard I/O pipes as given above. +The file descriptor specification accepts arguments in the exact same format +as the underlying [`proc_open()`](http://php.net/proc_open) function. + +Once the process is started, the `$pipes` array will always contain references to +all pipes as configured and the standard I/O references will always be set to +reference the pipes matching common Unix conventions. This library supports any +number of pipes and additional file descriptors, but many common applications +being run as a child process will expect that the parent process properly +assigns these file descriptors. + +### Sigchild Compatibility + +Internally, this project uses a work-around to improve compatibility when PHP +has been compiled with the `--enable-sigchild` option. This should not affect most +installations as this configure option is not used by default and many +distributions (such as Debian and Ubuntu) are known to not use this by default. +Some installations that use [Oracle OCI8](http://php.net/manual/en/book.oci8.php) +may use this configure option to circumvent `defunct` processes. + +When PHP has been compiled with the `--enable-sigchild` option, a child process' +exit code cannot be reliably determined via `proc_close()` or `proc_get_status()`. +To work around this, we execute the child process with an additional pipe and +use that to retrieve its exit code. + +This work-around incurs some overhead, so we only trigger this when necessary +and when we detect that PHP has been compiled with the `--enable-sigchild` option. +Because PHP does not provide a way to reliably detect this option, we try to +inspect output of PHP's configure options from the `phpinfo()` function. + +The static `setSigchildEnabled(bool $sigchild): void` method can be used to +explicitly enable or disable this behavior like this: + +```php +// advanced: not recommended by default +Process::setSigchildEnabled(true); +``` + +Note that all processes instantiated after this method call will be affected. +If this work-around is disabled on an affected PHP installation, the `exit` +event may receive `null` instead of the actual exit code as described above. +Similarly, some distributions are known to omit the configure options from +`phpinfo()`, so automatic detection may fail to enable this work-around in some +cases. You may then enable this explicitly as given above. + +**Note:** The original functionality was taken from Symfony's +[Process](https://github.com/symfony/process) compoment. + +### Windows Compatibility + +Due to platform constraints, this library provides only limited support for +spawning child processes on Windows. In particular, PHP does not allow accessing +standard I/O pipes on Windows without blocking. As such, this project will not +allow constructing a child process with the default process pipes and will +instead throw a `LogicException` on Windows by default: + +```php +// throws LogicException on Windows +$process = new Process('ping example.com'); +$process->start(); +``` + +There are a number of alternatives and workarounds as detailed below if you want +to run a child process on Windows, each with its own set of pros and cons: + +* As of PHP 8, you can start the child process with `socket` pair descriptors + in place of normal standard I/O pipes like this: + + ```php + $process = new Process( + 'ping example.com', + null, + null, + [ + ['socket'], + ['socket'], + ['socket'] + ] + ); + $process->start(); + + $process->stdout->on('data', function ($chunk) { + echo $chunk; + }); + ``` + + These `socket` pairs support non-blocking process I/O on any platform, + including Windows. However, not all programs accept stdio sockets. + +* This package does work on + [`Windows Subsystem for Linux`](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux) + (or WSL) without issues. When you are in control over how your application is + deployed, we recommend [installing WSL](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide) + when you want to run this package on Windows. + +* If you only care about the exit code of a child process to check if its + execution was successful, you can use [custom pipes](#custom-pipes) to omit + any standard I/O pipes like this: + + ```php + $process = new Process('ping example.com', null, null, array()); + $process->start(); + + $process->on('exit', function ($exitcode) { + echo 'exit with ' . $exitcode . PHP_EOL; + }); + ``` + + Similarly, this is also useful if your child process communicates over + sockets with remote servers or even your parent process using the + [Socket component](https://github.com/reactphp/socket). This is usually + considered the best alternative if you have control over how your child + process communicates with the parent process. + +* If you only care about command output after the child process has been + executed, you can use [custom pipes](#custom-pipes) to configure file + handles to be passed to the child process instead of pipes like this: + + ```php + $process = new Process('ping example.com', null, null, array( + array('file', 'nul', 'r'), + $stdout = tmpfile(), + array('file', 'nul', 'w') + )); + $process->start(); + + $process->on('exit', function ($exitcode) use ($stdout) { + echo 'exit with ' . $exitcode . PHP_EOL; + + // rewind to start and then read full file (demo only, this is blocking). + // reading from shared file is only safe if you have some synchronization in place + // or after the child process has terminated. + rewind($stdout); + echo stream_get_contents($stdout); + fclose($stdout); + }); + ``` + + Note that this example uses `tmpfile()`/`fopen()` for illustration purposes only. + This should not be used in a truly async program because the filesystem is + inherently blocking and each call could potentially take several seconds. + See also the [Filesystem component](https://github.com/reactphp/filesystem) as an + alternative. + +* If you want to access command output as it happens in a streaming fashion, + you can use redirection to spawn an additional process to forward your + standard I/O streams to a socket and use [custom pipes](#custom-pipes) to + omit any actual standard I/O pipes like this: + + ```php + $server = new React\Socket\Server('127.0.0.1:0'); + $server->on('connection', function (React\Socket\ConnectionInterface $connection) { + $connection->on('data', function ($chunk) { + echo $chunk; + }); + }); + + $command = 'ping example.com | foobar ' . escapeshellarg($server->getAddress()); + $process = new Process($command, null, null, array()); + $process->start(); + + $process->on('exit', function ($exitcode) use ($server) { + $server->close(); + echo 'exit with ' . $exitcode . PHP_EOL; + }); + ``` + + Note how this will spawn another fictional `foobar` helper program to consume + the standard output from the actual child process. This is in fact similar + to the above recommendation of using socket connections in the child process, + but in this case does not require modification of the actual child process. + + In this example, the fictional `foobar` helper program can be implemented by + simply consuming all data from standard input and forwarding it to a socket + connection like this: + + ```php + $socket = stream_socket_client($argv[1]); + do { + fwrite($socket, $data = fread(STDIN, 8192)); + } while (isset($data[0])); + ``` + + Accordingly, this example can also be run with plain PHP without having to + rely on any external helper program like this: + + ```php + $code = '$s=stream_socket_client($argv[1]);do{fwrite($s,$d=fread(STDIN, 8192));}while(isset($d[0]));'; + $command = 'ping example.com | php -r ' . escapeshellarg($code) . ' ' . escapeshellarg($server->getAddress()); + $process = new Process($command, null, null, array()); + $process->start(); + ``` + + See also [example #23](examples/23-forward-socket.php). + + Note that this is for illustration purposes only and you may want to implement + some proper error checks and/or socket verification in actual production use + if you do not want to risk other processes connecting to the server socket. + In this case, we suggest looking at the excellent + [createprocess-windows](https://github.com/cubiclesoft/createprocess-windows). + +Additionally, note that the [command](#command) given to the `Process` will be +passed to the underlying Windows-API +([`CreateProcess`](https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessa)) +as-is and the process will not be launched in a wrapping shell by default. In +particular, this means that shell built-in functions such as `echo hello` or +`sleep 10` may have to be prefixed with an explicit shell command like this: + +```php +$process = new Process('cmd /c echo hello', null, null, $pipes); +$process->start(); +``` + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This will install the latest supported version: + +```bash +composer require react/child-process:^0.6.6 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 8+ and HHVM. +It's *highly recommended to use the latest supported PHP version* for this project. + +See above note for limited [Windows Compatibility](#windows-compatibility). + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org/): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +## License + +MIT, see [LICENSE file](LICENSE). diff --git a/vendor/react/child-process/composer.json b/vendor/react/child-process/composer.json new file mode 100644 index 000000000..fba70b881 --- /dev/null +++ b/vendor/react/child-process/composer.json @@ -0,0 +1,49 @@ +{ + "name": "react/child-process", + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": ["process", "event-driven", "ReactPHP"], + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "homepage": "https://clue.engineering/", + "email": "christian@clue.engineering" + }, + { + "name": "Cees-Jan Kiewiet", + "homepage": "https://wyrihaximus.net/", + "email": "reactphp@ceesjankiewiet.nl" + }, + { + "name": "Jan Sorgalla", + "homepage": "https://sorgalla.com/", + "email": "jsorgalla@gmail.com" + }, + { + "name": "Chris Boden", + "homepage": "https://cboden.dev/", + "email": "cboden@gmail.com" + } + ], + "require": { + "php": ">=5.3.0", + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "React\\Tests\\ChildProcess\\": "tests/" + } + } +} diff --git a/vendor/react/child-process/src/Process.php b/vendor/react/child-process/src/Process.php new file mode 100644 index 000000000..7af5de75c --- /dev/null +++ b/vendor/react/child-process/src/Process.php @@ -0,0 +1,585 @@ +start(); + * + * $process->on('exit', function ($code, $term) { + * if ($term === null) { + * echo 'exit with code ' . $code . PHP_EOL; + * } else { + * echo 'terminated with signal ' . $term . PHP_EOL; + * } + * }); + * ``` + * + * Note that `$code` is `null` if the process has terminated, but the exit + * code could not be determined (for example + * [sigchild compatibility](#sigchild-compatibility) was disabled). + * Similarly, `$term` is `null` unless the process has terminated in response to + * an uncaught signal sent to it. + * This is not a limitation of this project, but actual how exit codes and signals + * are exposed on POSIX systems, for more details see also + * [here](https://unix.stackexchange.com/questions/99112/default-exit-code-when-process-is-terminated). + * + * It's also worth noting that process termination depends on all file descriptors + * being closed beforehand. + * This means that all [process pipes](#stream-properties) will emit a `close` + * event before the `exit` event and that no more `data` events will arrive after + * the `exit` event. + * Accordingly, if either of these pipes is in a paused state (`pause()` method + * or internally due to a `pipe()` call), this detection may not trigger. + */ +class Process extends EventEmitter +{ + /** + * @var WritableStreamInterface|null|DuplexStreamInterface|ReadableStreamInterface + */ + public $stdin; + + /** + * @var ReadableStreamInterface|null|DuplexStreamInterface|WritableStreamInterface + */ + public $stdout; + + /** + * @var ReadableStreamInterface|null|DuplexStreamInterface|WritableStreamInterface + */ + public $stderr; + + /** + * Array with all process pipes (once started) + * + * Unless explicitly configured otherwise during construction, the following + * standard I/O pipes will be assigned by default: + * - 0: STDIN (`WritableStreamInterface`) + * - 1: STDOUT (`ReadableStreamInterface`) + * - 2: STDERR (`ReadableStreamInterface`) + * + * @var array + */ + public $pipes = array(); + + private $cmd; + private $cwd; + private $env; + private $fds; + + private $enhanceSigchildCompatibility; + private $sigchildPipe; + + private $process; + private $status; + private $exitCode; + private $fallbackExitCode; + private $stopSignal; + private $termSignal; + + private static $sigchild; + + /** + * Constructor. + * + * @param string $cmd Command line to run + * @param null|string $cwd Current working directory or null to inherit + * @param null|array $env Environment variables or null to inherit + * @param null|array $fds File descriptors to allocate for this process (or null = default STDIO streams) + * @throws \LogicException On windows or when proc_open() is not installed + */ + public function __construct($cmd, $cwd = null, $env = null, $fds = null) + { + if ($env !== null && !\is_array($env)) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #3 ($env) expected null|array'); + } + if ($fds !== null && !\is_array($fds)) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #4 ($fds) expected null|array'); + } + if (!\function_exists('proc_open')) { + throw new \LogicException('The Process class relies on proc_open(), which is not available on your PHP installation.'); + } + + $this->cmd = $cmd; + $this->cwd = $cwd; + + if (null !== $env) { + $this->env = array(); + foreach ($env as $key => $value) { + $this->env[(binary) $key] = (binary) $value; + } + } + + if ($fds === null) { + $fds = array( + array('pipe', 'r'), // stdin + array('pipe', 'w'), // stdout + array('pipe', 'w'), // stderr + ); + } + + if (\DIRECTORY_SEPARATOR === '\\') { + foreach ($fds as $fd) { + if (isset($fd[0]) && $fd[0] === 'pipe') { + throw new \LogicException('Process pipes are not supported on Windows due to their blocking nature on Windows'); + } + } + } + + $this->fds = $fds; + $this->enhanceSigchildCompatibility = self::isSigchildEnabled(); + } + + /** + * Start the process. + * + * After the process is started, the standard I/O streams will be constructed + * and available via public properties. + * + * This method takes an optional `LoopInterface|null $loop` parameter that can be used to + * pass the event loop instance to use for this process. You can use a `null` value + * here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). + * This value SHOULD NOT be given unless you're sure you want to explicitly use a + * given event loop instance. + * + * @param ?LoopInterface $loop Loop interface for stream construction + * @param float $interval Interval to periodically monitor process state (seconds) + * @throws \RuntimeException If the process is already running or fails to start + */ + public function start($loop = null, $interval = 0.1) + { + if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #1 ($loop) expected null|React\EventLoop\LoopInterface'); + } + if ($this->isRunning()) { + throw new \RuntimeException('Process is already running'); + } + + $loop = $loop ?: Loop::get(); + $cmd = $this->cmd; + $fdSpec = $this->fds; + $sigchild = null; + + // Read exit code through fourth pipe to work around --enable-sigchild + if ($this->enhanceSigchildCompatibility) { + $fdSpec[] = array('pipe', 'w'); + \end($fdSpec); + $sigchild = \key($fdSpec); + + // make sure this is fourth or higher (do not mess with STDIO) + if ($sigchild < 3) { + $fdSpec[3] = $fdSpec[$sigchild]; + unset($fdSpec[$sigchild]); + $sigchild = 3; + } + + $cmd = \sprintf('(%s) ' . $sigchild . '>/dev/null; code=$?; echo $code >&' . $sigchild . '; exit $code', $cmd); + } + + // on Windows, we do not launch the given command line in a shell (cmd.exe) by default and omit any error dialogs + // the cmd.exe shell can explicitly be given as part of the command as detailed in both documentation and tests + $options = array(); + if (\DIRECTORY_SEPARATOR === '\\') { + $options['bypass_shell'] = true; + $options['suppress_errors'] = true; + } + + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errstr) { + // Match errstr from PHP's warning message. + // proc_open(/dev/does-not-exist): Failed to open stream: No such file or directory + $errstr = $error; + }); + + $pipes = array(); + $this->process = @\proc_open($cmd, $fdSpec, $pipes, $this->cwd, $this->env, $options); + + \restore_error_handler(); + + if (!\is_resource($this->process)) { + throw new \RuntimeException('Unable to launch a new process: ' . $errstr); + } + + // count open process pipes and await close event for each to drain buffers before detecting exit + $that = $this; + $closeCount = 0; + $streamCloseHandler = function () use (&$closeCount, $loop, $interval, $that) { + $closeCount--; + + if ($closeCount > 0) { + return; + } + + // process already closed => report immediately + if (!$that->isRunning()) { + $that->close(); + $that->emit('exit', array($that->getExitCode(), $that->getTermSignal())); + return; + } + + // close not detected immediately => check regularly + $loop->addPeriodicTimer($interval, function ($timer) use ($that, $loop) { + if (!$that->isRunning()) { + $loop->cancelTimer($timer); + $that->close(); + $that->emit('exit', array($that->getExitCode(), $that->getTermSignal())); + } + }); + }; + + if ($sigchild !== null) { + $this->sigchildPipe = $pipes[$sigchild]; + unset($pipes[$sigchild]); + } + + foreach ($pipes as $n => $fd) { + // use open mode from stream meta data or fall back to pipe open mode for legacy HHVM + $meta = \stream_get_meta_data($fd); + $mode = $meta['mode'] === '' ? ($this->fds[$n][1] === 'r' ? 'w' : 'r') : $meta['mode']; + + if ($mode === 'r+') { + $stream = new DuplexResourceStream($fd, $loop); + $stream->on('close', $streamCloseHandler); + $closeCount++; + } elseif ($mode === 'w') { + $stream = new WritableResourceStream($fd, $loop); + } else { + $stream = new ReadableResourceStream($fd, $loop); + $stream->on('close', $streamCloseHandler); + $closeCount++; + } + $this->pipes[$n] = $stream; + } + + $this->stdin = isset($this->pipes[0]) ? $this->pipes[0] : null; + $this->stdout = isset($this->pipes[1]) ? $this->pipes[1] : null; + $this->stderr = isset($this->pipes[2]) ? $this->pipes[2] : null; + + // immediately start checking for process exit when started without any I/O pipes + if (!$closeCount) { + $streamCloseHandler(); + } + } + + /** + * Close the process. + * + * This method should only be invoked via the periodic timer that monitors + * the process state. + */ + public function close() + { + if ($this->process === null) { + return; + } + + foreach ($this->pipes as $pipe) { + $pipe->close(); + } + + if ($this->enhanceSigchildCompatibility) { + $this->pollExitCodePipe(); + $this->closeExitCodePipe(); + } + + $exitCode = \proc_close($this->process); + $this->process = null; + + if ($this->exitCode === null && $exitCode !== -1) { + $this->exitCode = $exitCode; + } + + if ($this->exitCode === null && $this->status['exitcode'] !== -1) { + $this->exitCode = $this->status['exitcode']; + } + + if ($this->exitCode === null && $this->fallbackExitCode !== null) { + $this->exitCode = $this->fallbackExitCode; + $this->fallbackExitCode = null; + } + } + + /** + * Terminate the process with an optional signal. + * + * @param int $signal Optional signal (default: SIGTERM) + * @return bool Whether the signal was sent successfully + */ + public function terminate($signal = null) + { + if ($this->process === null) { + return false; + } + + if ($signal !== null) { + return \proc_terminate($this->process, $signal); + } + + return \proc_terminate($this->process); + } + + /** + * Get the command string used to launch the process. + * + * @return string + */ + public function getCommand() + { + return $this->cmd; + } + + /** + * Get the exit code returned by the process. + * + * This value is only meaningful if isRunning() has returned false. Null + * will be returned if the process is still running. + * + * Null may also be returned if the process has terminated, but the exit + * code could not be determined (e.g. sigchild compatibility was disabled). + * + * @return int|null + */ + public function getExitCode() + { + return $this->exitCode; + } + + /** + * Get the process ID. + * + * @return int|null + */ + public function getPid() + { + $status = $this->getCachedStatus(); + + return $status !== null ? $status['pid'] : null; + } + + /** + * Get the signal that caused the process to stop its execution. + * + * This value is only meaningful if isStopped() has returned true. Null will + * be returned if the process was never stopped. + * + * @return int|null + */ + public function getStopSignal() + { + return $this->stopSignal; + } + + /** + * Get the signal that caused the process to terminate its execution. + * + * This value is only meaningful if isTerminated() has returned true. Null + * will be returned if the process was never terminated. + * + * @return int|null + */ + public function getTermSignal() + { + return $this->termSignal; + } + + /** + * Return whether the process is still running. + * + * @return bool + */ + public function isRunning() + { + if ($this->process === null) { + return false; + } + + $status = $this->getFreshStatus(); + + return $status !== null ? $status['running'] : false; + } + + /** + * Return whether the process has been stopped by a signal. + * + * @return bool + */ + public function isStopped() + { + $status = $this->getFreshStatus(); + + return $status !== null ? $status['stopped'] : false; + } + + /** + * Return whether the process has been terminated by an uncaught signal. + * + * @return bool + */ + public function isTerminated() + { + $status = $this->getFreshStatus(); + + return $status !== null ? $status['signaled'] : false; + } + + /** + * Return whether PHP has been compiled with the '--enable-sigchild' option. + * + * @see \Symfony\Component\Process\Process::isSigchildEnabled() + * @return bool + */ + public final static function isSigchildEnabled() + { + if (null !== self::$sigchild) { + return self::$sigchild; + } + + if (!\function_exists('phpinfo')) { + return self::$sigchild = false; // @codeCoverageIgnore + } + + \ob_start(); + \phpinfo(INFO_GENERAL); + + return self::$sigchild = false !== \strpos(\ob_get_clean(), '--enable-sigchild'); + } + + /** + * Enable or disable sigchild compatibility mode. + * + * Sigchild compatibility mode is required to get the exit code and + * determine the success of a process when PHP has been compiled with + * the --enable-sigchild option. + * + * @param bool $sigchild + * @return void + */ + public final static function setSigchildEnabled($sigchild) + { + self::$sigchild = (bool) $sigchild; + } + + /** + * Check the fourth pipe for an exit code. + * + * This should only be used if --enable-sigchild compatibility was enabled. + */ + private function pollExitCodePipe() + { + if ($this->sigchildPipe === null) { + return; + } + + $r = array($this->sigchildPipe); + $w = $e = null; + + $n = @\stream_select($r, $w, $e, 0); + + if (1 !== $n) { + return; + } + + $data = \fread($r[0], 8192); + + if (\strlen($data) > 0) { + $this->fallbackExitCode = (int) $data; + } + } + + /** + * Close the fourth pipe used to relay an exit code. + * + * This should only be used if --enable-sigchild compatibility was enabled. + */ + private function closeExitCodePipe() + { + if ($this->sigchildPipe === null) { + return; + } + + \fclose($this->sigchildPipe); + $this->sigchildPipe = null; + } + + /** + * Return the cached process status. + * + * @return array + */ + private function getCachedStatus() + { + if ($this->status === null) { + $this->updateStatus(); + } + + return $this->status; + } + + /** + * Return the updated process status. + * + * @return array + */ + private function getFreshStatus() + { + $this->updateStatus(); + + return $this->status; + } + + /** + * Update the process status, stop/term signals, and exit code. + * + * Stop/term signals are only updated if the process is currently stopped or + * signaled, respectively. Otherwise, signal values will remain as-is so the + * corresponding getter methods may be used at a later point in time. + */ + private function updateStatus() + { + if ($this->process === null) { + return; + } + + $this->status = \proc_get_status($this->process); + + if ($this->status === false) { + throw new \UnexpectedValueException('proc_get_status() failed'); + } + + if ($this->status['stopped']) { + $this->stopSignal = $this->status['stopsig']; + } + + if ($this->status['signaled']) { + $this->termSignal = $this->status['termsig']; + } + + if (!$this->status['running'] && -1 !== $this->status['exitcode']) { + $this->exitCode = $this->status['exitcode']; + } + } +} diff --git a/vendor/react/dns/CHANGELOG.md b/vendor/react/dns/CHANGELOG.md new file mode 100644 index 000000000..bc1055fc0 --- /dev/null +++ b/vendor/react/dns/CHANGELOG.md @@ -0,0 +1,452 @@ +# Changelog + +## 1.13.0 (2024-06-13) + +* Feature: Improve PHP 8.4+ support by avoiding implicitly nullable type declarations. + (#224 by @WyriHaximus) + +## 1.12.0 (2023-11-29) + +* Feature: Full PHP 8.3 compatibility. + (#217 by @sergiy-petrov) + +* Update test environment and avoid unhandled promise rejections. + (#215, #216 and #218 by @clue) + +## 1.11.0 (2023-06-02) + +* Feature: Include timeout logic to avoid dependency on reactphp/promise-timer. + (#213 by @clue) + +* Improve test suite and project setup and report failed assertions. + (#210 by @clue, #212 by @WyriHaximus and #209 and #211 by @SimonFrings) + +## 1.10.0 (2022-09-08) + +* Feature: Full support for PHP 8.2 release. + (#201 by @clue and #207 by @WyriHaximus) + +* Feature: Optimize forward compatibility with Promise v3, avoid hitting autoloader. + (#202 by @clue) + +* Feature / Fix: Improve error reporting when custom error handler is used. + (#197 by @clue) + +* Fix: Fix invalid references in exception stack trace. + (#191 by @clue) + +* Minor documentation improvements. + (#195 by @SimonFrings and #203 by @nhedger) + +* Improve test suite, update to use default loop and new reactphp/async package. + (#204, #205 and #206 by @clue and #196 by @SimonFrings) + +## 1.9.0 (2021-12-20) + +* Feature: Full support for PHP 8.1 release and prepare PHP 8.2 compatibility + by refactoring `Parser` to avoid assigning dynamic properties. + (#188 and #186 by @clue and #184 by @SimonFrings) + +* Feature: Avoid dependency on `ext-filter`. + (#185 by @clue) + +* Feature / Fix: Skip invalid nameserver entries from `resolv.conf` and ignore IPv6 zone IDs. + (#187 by @clue) + +* Feature / Fix: Reduce socket read chunk size for queries over TCP/IP. + (#189 by @clue) + +## 1.8.0 (2021-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop). + +* Feature: Simplify usage by supporting new [default loop](https://reactphp.org/event-loop/#loop). + (#182 by @clue) + + ```php + // old (still supported) + $factory = new React\Dns\Resolver\Factory(); + $resolver = $factory->create($config, $loop); + + // new (using default loop) + $factory = new React\Dns\Resolver\Factory(); + $resolver = $factory->create($config); + ``` + +## 1.7.0 (2021-06-25) + +* Feature: Update DNS `Factory` to accept complete `Config` object. + Add new `FallbackExecutor` and use fallback DNS servers when `Config` lists multiple servers. + (#179 and #180 by @clue) + + ```php + // old (still supported) + $config = React\Dns\Config\Config::loadSystemConfigBlocking(); + $server = $config->nameservers ? reset($config->nameservers) : '8.8.8.8'; + $resolver = $factory->create($server, $loop); + + // new + $config = React\Dns\Config\Config::loadSystemConfigBlocking(); + if (!$config->nameservers) { + $config->nameservers[] = '8.8.8.8'; + } + $resolver = $factory->create($config, $loop); + ``` + +## 1.6.0 (2021-06-21) + +* Feature: Add support for legacy `SPF` record type. + (#178 by @akondas and @clue) + +* Fix: Fix integer overflow for TCP/IP chunk size on 32 bit platforms. + (#177 by @clue) + +## 1.5.0 (2021-03-05) + +* Feature: Improve error reporting when query fails, include domain and query type and DNS server address where applicable. + (#174 by @clue) + +* Feature: Improve error handling when sending data to DNS server fails (macOS). + (#171 and #172 by @clue) + +* Fix: Improve DNS response parser to limit recursion for compressed labels. + (#169 by @clue) + +* Improve test suite, use GitHub actions for continuous integration (CI). + (#170 by @SimonFrings) + +## 1.4.0 (2020-09-18) + +* Feature: Support upcoming PHP 8. + (#168 by @clue) + +* Improve test suite and update to PHPUnit 9.3. + (#164 by @clue, #165 and #166 by @SimonFrings and #167 by @WyriHaximus) + +## 1.3.0 (2020-07-10) + +* Feature: Forward compatibility with react/promise v3. + (#153 by @WyriHaximus) + +* Feature: Support parsing `OPT` records (EDNS0). + (#157 by @clue) + +* Fix: Avoid PHP warnings due to lack of args in exception trace on PHP 7.4. + (#160 by @clue) + +* Improve test suite and add `.gitattributes` to exclude dev files from exports. + Run tests on PHPUnit 9 and PHP 7.4 and clean up test suite. + (#154 by @reedy, #156 by @clue and #163 by @SimonFrings) + +## 1.2.0 (2019-08-15) + +* Feature: Add `TcpTransportExecutor` to send DNS queries over TCP/IP connection, + add `SelectiveTransportExecutor` to retry with TCP if UDP is truncated and + automatically select transport protocol when no explicit `udp://` or `tcp://` scheme is given in `Factory`. + (#145, #146, #147 and #148 by @clue) + +* Feature: Support escaping literal dots and special characters in domain names. + (#144 by @clue) + +## 1.1.0 (2019-07-18) + +* Feature: Support parsing `CAA` and `SSHFP` records. + (#141 and #142 by @clue) + +* Feature: Add `ResolverInterface` as common interface for `Resolver` class. + (#139 by @clue) + +* Fix: Add missing private property definitions and + remove unneeded dependency on `react/stream`. + (#140 and #143 by @clue) + +## 1.0.0 (2019-07-11) + +* First stable LTS release, now following [SemVer](https://semver.org/). + We'd like to emphasize that this component is production ready and battle-tested. + We plan to support all long-term support (LTS) releases for at least 24 months, + so you have a rock-solid foundation to build on top of. + +This update involves a number of BC breaks due to dropped support for +deprecated functionality and some internal API cleanup. We've tried hard to +avoid BC breaks where possible and minimize impact otherwise. We expect that +most consumers of this package will actually not be affected by any BC +breaks, see below for more details: + +* BC break: Delete all deprecated APIs, use `Query` objects for `Message` questions + instead of nested arrays and increase code coverage to 100%. + (#130 by @clue) + +* BC break: Move `$nameserver` from `ExecutorInterface` to `UdpTransportExecutor`, + remove advanced/internal `UdpTransportExecutor` args for `Parser`/`BinaryDumper` and + add API documentation for `ExecutorInterface`. + (#135, #137 and #138 by @clue) + +* BC break: Replace `HeaderBag` attributes with simple `Message` properties. + (#132 by @clue) + +* BC break: Mark all `Record` attributes as required, add documentation vs `Query`. + (#136 by @clue) + +* BC break: Mark all classes as final to discourage inheritance + (#134 by @WyriHaximus) + +## 0.4.19 (2019-07-10) + +* Feature: Avoid garbage references when DNS resolution rejects on legacy PHP <= 5.6. + (#133 by @clue) + +## 0.4.18 (2019-09-07) + +* Feature / Fix: Implement `CachingExecutor` using cache TTL, deprecate old `CachedExecutor`, + respect TTL from response records when caching and do not cache truncated responses. + (#129 by @clue) + +* Feature: Limit cache size to 256 last responses by default. + (#127 by @clue) + +* Feature: Cooperatively resolve hosts to avoid running same query concurrently. + (#125 by @clue) + +## 0.4.17 (2019-04-01) + +* Feature: Support parsing `authority` and `additional` records from DNS response. + (#123 by @clue) + +* Feature: Support dumping records as part of outgoing binary DNS message. + (#124 by @clue) + +* Feature: Forward compatibility with upcoming Cache v0.6 and Cache v1.0 + (#121 by @clue) + +* Improve test suite to add forward compatibility with PHPUnit 7, + test against PHP 7.3 and use legacy PHPUnit 5 on legacy HHVM. + (#122 by @clue) + +## 0.4.16 (2018-11-11) + +* Feature: Improve promise cancellation for DNS lookup retries and clean up any garbage references. + (#118 by @clue) + +* Fix: Reject parsing malformed DNS response messages such as incomplete DNS response messages, + malformed record data or malformed compressed domain name labels. + (#115 and #117 by @clue) + +* Fix: Fix interpretation of TTL as UINT32 with most significant bit unset. + (#116 by @clue) + +* Fix: Fix caching advanced MX/SRV/TXT/SOA structures. + (#112 by @clue) + +## 0.4.15 (2018-07-02) + +* Feature: Add `resolveAll()` method to support custom query types in `Resolver`. + (#110 by @clue and @WyriHaximus) + + ```php + $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then(function ($ips) { + echo 'IPv6 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL; + }); + ``` + +* Feature: Support parsing `NS`, `TXT`, `MX`, `SOA` and `SRV` records. + (#104, #105, #106, #107 and #108 by @clue) + +* Feature: Add support for `Message::TYPE_ANY` and parse unknown types as binary data. + (#104 by @clue) + +* Feature: Improve error messages for failed queries and improve documentation. + (#109 by @clue) + +* Feature: Add reverse DNS lookup example. + (#111 by @clue) + +## 0.4.14 (2018-06-26) + +* Feature: Add `UdpTransportExecutor`, validate incoming DNS response messages + to avoid cache poisoning attacks and deprecate legacy `Executor`. + (#101 and #103 by @clue) + +* Feature: Forward compatibility with Cache 0.5 + (#102 by @clue) + +* Deprecate legacy `Query::$currentTime` and binary parser data attributes to clean up and simplify API. + (#99 by @clue) + +## 0.4.13 (2018-02-27) + +* Add `Config::loadSystemConfigBlocking()` to load default system config + and support parsing DNS config on all supported platforms + (`/etc/resolv.conf` on Unix/Linux/Mac and WMIC on Windows) + (#92, #93, #94 and #95 by @clue) + + ```php + $config = Config::loadSystemConfigBlocking(); + $server = $config->nameservers ? reset($config->nameservers) : '8.8.8.8'; + ``` + +* Remove unneeded cyclic dependency on react/socket + (#96 by @clue) + +## 0.4.12 (2018-01-14) + +* Improve test suite by adding forward compatibility with PHPUnit 6, + test against PHP 7.2, fix forward compatibility with upcoming EventLoop releases, + add test group to skip integration tests relying on internet connection + and add minor documentation improvements. + (#85 and #87 by @carusogabriel, #88 and #89 by @clue and #83 by @jsor) + +## 0.4.11 (2017-08-25) + +* Feature: Support resolving from default hosts file + (#75, #76 and #77 by @clue) + + This means that resolving hosts such as `localhost` will now work as + expected across all platforms with no changes required: + + ```php + $resolver->resolve('localhost')->then(function ($ip) { + echo 'IP: ' . $ip; + }); + ``` + + The new `HostsExecutor` exists for advanced usage and is otherwise used + internally for this feature. + +## 0.4.10 (2017-08-10) + +* Feature: Forward compatibility with EventLoop v1.0 and v0.5 and + lock minimum dependencies and work around circular dependency for tests + (#70 and #71 by @clue) + +* Fix: Work around DNS timeout issues for Windows users + (#74 by @clue) + +* Documentation and examples for advanced usage + (#66 by @WyriHaximus) + +* Remove broken TCP code, do not retry with invalid TCP query + (#73 by @clue) + +* Improve test suite by fixing HHVM build for now again and ignore future HHVM build errors and + lock Travis distro so new defaults will not break the build and + fix failing tests for PHP 7.1 + (#68 by @WyriHaximus and #69 and #72 by @clue) + +## 0.4.9 (2017-05-01) + +* Feature: Forward compatibility with upcoming Socket v1.0 and v0.8 + (#61 by @clue) + +## 0.4.8 (2017-04-16) + +* Feature: Add support for the AAAA record type to the protocol parser + (#58 by @othillo) + +* Feature: Add support for the PTR record type to the protocol parser + (#59 by @othillo) + +## 0.4.7 (2017-03-31) + +* Feature: Forward compatibility with upcoming Socket v0.6 and v0.7 component + (#57 by @clue) + +## 0.4.6 (2017-03-11) + +* Fix: Fix DNS timeout issues for Windows users and add forward compatibility + with Stream v0.5 and upcoming v0.6 + (#53 by @clue) + +* Improve test suite by adding PHPUnit to `require-dev` + (#54 by @clue) + +## 0.4.5 (2017-03-02) + +* Fix: Ensure we ignore the case of the answer + (#51 by @WyriHaximus) + +* Feature: Add `TimeoutExecutor` and simplify internal APIs to allow internal + code re-use for upcoming versions. + (#48 and #49 by @clue) + +## 0.4.4 (2017-02-13) + +* Fix: Fix handling connection and stream errors + (#45 by @clue) + +* Feature: Add examples and forward compatibility with upcoming Socket v0.5 component + (#46 and #47 by @clue) + +## 0.4.3 (2016-07-31) + +* Feature: Allow for cache adapter injection (#38 by @WyriHaximus) + + ```php + $factory = new React\Dns\Resolver\Factory(); + + $cache = new MyCustomCacheInstance(); + $resolver = $factory->createCached('8.8.8.8', $loop, $cache); + ``` + +* Feature: Support Promise cancellation (#35 by @clue) + + ```php + $promise = $resolver->resolve('reactphp.org'); + + $promise->cancel(); + ``` + +## 0.4.2 (2016-02-24) + +* Repository maintenance, split off from main repo, improve test suite and documentation +* First class support for PHP7 and HHVM (#34 by @clue) +* Adjust compatibility to 5.3 (#30 by @clue) + +## 0.4.1 (2014-04-13) + +* Bug fix: Fixed PSR-4 autoload path (@marcj/WyriHaximus) + +## 0.4.0 (2014-02-02) + +* BC break: Bump minimum PHP version to PHP 5.4, remove 5.3 specific hacks +* BC break: Update to React/Promise 2.0 +* Bug fix: Properly resolve CNAME aliases +* Dependency: Autoloading and filesystem structure now PSR-4 instead of PSR-0 +* Bump React dependencies to v0.4 + +## 0.3.2 (2013-05-10) + +* Feature: Support default port for IPv6 addresses (@clue) + +## 0.3.0 (2013-04-14) + +* Bump React dependencies to v0.3 + +## 0.2.6 (2012-12-26) + +* Feature: New cache component, used by DNS + +## 0.2.5 (2012-11-26) + +* Version bump + +## 0.2.4 (2012-11-18) + +* Feature: Change to promise-based API (@jsor) + +## 0.2.3 (2012-11-14) + +* Version bump + +## 0.2.2 (2012-10-28) + +* Feature: DNS executor timeout handling (@arnaud-lb) +* Feature: DNS retry executor (@arnaud-lb) + +## 0.2.1 (2012-10-14) + +* Minor adjustments to DNS parser + +## 0.2.0 (2012-09-10) + +* Feature: DNS resolver diff --git a/vendor/react/dns/LICENSE b/vendor/react/dns/LICENSE new file mode 100644 index 000000000..d6f8901f9 --- /dev/null +++ b/vendor/react/dns/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/react/dns/README.md b/vendor/react/dns/README.md new file mode 100644 index 000000000..9f83a944d --- /dev/null +++ b/vendor/react/dns/README.md @@ -0,0 +1,453 @@ +# DNS + +[![CI status](https://github.com/reactphp/dns/actions/workflows/ci.yml/badge.svg)](https://github.com/reactphp/dns/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/dns?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/dns) + +Async DNS resolver for [ReactPHP](https://reactphp.org/). + +The main point of the DNS component is to provide async DNS resolution. +However, it is really a toolkit for working with DNS messages, and could +easily be used to create a DNS server. + +**Table of contents** + +* [Basic usage](#basic-usage) +* [Caching](#caching) + * [Custom cache adapter](#custom-cache-adapter) +* [ResolverInterface](#resolverinterface) + * [resolve()](#resolve) + * [resolveAll()](#resolveall) +* [Advanced usage](#advanced-usage) + * [UdpTransportExecutor](#udptransportexecutor) + * [TcpTransportExecutor](#tcptransportexecutor) + * [SelectiveTransportExecutor](#selectivetransportexecutor) + * [HostsFileExecutor](#hostsfileexecutor) +* [Install](#install) +* [Tests](#tests) +* [License](#license) +* [References](#references) + +## Basic usage + +The most basic usage is to just create a resolver through the resolver +factory. All you need to give it is a nameserver, then you can start resolving +names, baby! + +```php +$config = React\Dns\Config\Config::loadSystemConfigBlocking(); +if (!$config->nameservers) { + $config->nameservers[] = '8.8.8.8'; +} + +$factory = new React\Dns\Resolver\Factory(); +$dns = $factory->create($config); + +$dns->resolve('igor.io')->then(function ($ip) { + echo "Host: $ip\n"; +}); +``` + +See also the [first example](examples). + +The `Config` class can be used to load the system default config. This is an +operation that may access the filesystem and block. Ideally, this method should +thus be executed only once before the loop starts and not repeatedly while it is +running. +Note that this class may return an *empty* configuration if the system config +can not be loaded. As such, you'll likely want to apply a default nameserver +as above if none can be found. + +> Note that the factory loads the hosts file from the filesystem once when + creating the resolver instance. + Ideally, this method should thus be executed only once before the loop starts + and not repeatedly while it is running. + +But there's more. + +## Caching + +You can cache results by configuring the resolver to use a `CachedExecutor`: + +```php +$config = React\Dns\Config\Config::loadSystemConfigBlocking(); +if (!$config->nameservers) { + $config->nameservers[] = '8.8.8.8'; +} + +$factory = new React\Dns\Resolver\Factory(); +$dns = $factory->createCached($config); + +$dns->resolve('igor.io')->then(function ($ip) { + echo "Host: $ip\n"; +}); + +... + +$dns->resolve('igor.io')->then(function ($ip) { + echo "Host: $ip\n"; +}); +``` + +If the first call returns before the second, only one query will be executed. +The second result will be served from an in memory cache. +This is particularly useful for long running scripts where the same hostnames +have to be looked up multiple times. + +See also the [third example](examples). + +### Custom cache adapter + +By default, the above will use an in memory cache. + +You can also specify a custom cache implementing [`CacheInterface`](https://github.com/reactphp/cache) to handle the record cache instead: + +```php +$cache = new React\Cache\ArrayCache(); +$factory = new React\Dns\Resolver\Factory(); +$dns = $factory->createCached('8.8.8.8', null, $cache); +``` + +See also the wiki for possible [cache implementations](https://github.com/reactphp/react/wiki/Users#cache-implementations). + +## ResolverInterface + + + +### resolve() + +The `resolve(string $domain): PromiseInterface` method can be used to +resolve the given $domain name to a single IPv4 address (type `A` query). + +```php +$resolver->resolve('reactphp.org')->then(function ($ip) { + echo 'IP for reactphp.org is ' . $ip . PHP_EOL; +}); +``` + +This is one of the main methods in this package. It sends a DNS query +for the given $domain name to your DNS server and returns a single IP +address on success. + +If the DNS server sends a DNS response message that contains more than +one IP address for this query, it will randomly pick one of the IP +addresses from the response. If you want the full list of IP addresses +or want to send a different type of query, you should use the +[`resolveAll()`](#resolveall) method instead. + +If the DNS server sends a DNS response message that indicates an error +code, this method will reject with a `RecordNotFoundException`. Its +message and code can be used to check for the response code. + +If the DNS communication fails and the server does not respond with a +valid response message, this message will reject with an `Exception`. + +Pending DNS queries can be cancelled by cancelling its pending promise like so: + +```php +$promise = $resolver->resolve('reactphp.org'); + +$promise->cancel(); +``` + +### resolveAll() + +The `resolveAll(string $host, int $type): PromiseInterface` method can be used to +resolve all record values for the given $domain name and query $type. + +```php +$resolver->resolveAll('reactphp.org', Message::TYPE_A)->then(function ($ips) { + echo 'IPv4 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL; +}); + +$resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then(function ($ips) { + echo 'IPv6 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL; +}); +``` + +This is one of the main methods in this package. It sends a DNS query +for the given $domain name to your DNS server and returns a list with all +record values on success. + +If the DNS server sends a DNS response message that contains one or more +records for this query, it will return a list with all record values +from the response. You can use the `Message::TYPE_*` constants to control +which type of query will be sent. Note that this method always returns a +list of record values, but each record value type depends on the query +type. For example, it returns the IPv4 addresses for type `A` queries, +the IPv6 addresses for type `AAAA` queries, the hostname for type `NS`, +`CNAME` and `PTR` queries and structured data for other queries. See also +the `Record` documentation for more details. + +If the DNS server sends a DNS response message that indicates an error +code, this method will reject with a `RecordNotFoundException`. Its +message and code can be used to check for the response code. + +If the DNS communication fails and the server does not respond with a +valid response message, this message will reject with an `Exception`. + +Pending DNS queries can be cancelled by cancelling its pending promise like so: + +```php +$promise = $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA); + +$promise->cancel(); +``` + +## Advanced Usage + +### UdpTransportExecutor + +The `UdpTransportExecutor` can be used to +send DNS queries over a UDP transport. + +This is the main class that sends a DNS query to your DNS server and is used +internally by the `Resolver` for the actual message transport. + +For more advanced usages one can utilize this class directly. +The following example looks up the `IPv6` address for `igor.io`. + +```php +$executor = new UdpTransportExecutor('8.8.8.8:53'); + +$executor->query( + new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) +)->then(function (Message $message) { + foreach ($message->answers as $answer) { + echo 'IPv6: ' . $answer->data . PHP_EOL; + } +}, 'printf'); +``` + +See also the [fourth example](examples). + +Note that this executor does not implement a timeout, so you will very likely +want to use this in combination with a `TimeoutExecutor` like this: + +```php +$executor = new TimeoutExecutor( + new UdpTransportExecutor($nameserver), + 3.0 +); +``` + +Also note that this executor uses an unreliable UDP transport and that it +does not implement any retry logic, so you will likely want to use this in +combination with a `RetryExecutor` like this: + +```php +$executor = new RetryExecutor( + new TimeoutExecutor( + new UdpTransportExecutor($nameserver), + 3.0 + ) +); +``` + +Note that this executor is entirely async and as such allows you to execute +any number of queries concurrently. You should probably limit the number of +concurrent queries in your application or you're very likely going to face +rate limitations and bans on the resolver end. For many common applications, +you may want to avoid sending the same query multiple times when the first +one is still pending, so you will likely want to use this in combination with +a `CoopExecutor` like this: + +```php +$executor = new CoopExecutor( + new RetryExecutor( + new TimeoutExecutor( + new UdpTransportExecutor($nameserver), + 3.0 + ) + ) +); +``` + +> Internally, this class uses PHP's UDP sockets and does not take advantage + of [react/datagram](https://github.com/reactphp/datagram) purely for + organizational reasons to avoid a cyclic dependency between the two + packages. Higher-level components should take advantage of the Datagram + component instead of reimplementing this socket logic from scratch. + +### TcpTransportExecutor + +The `TcpTransportExecutor` class can be used to +send DNS queries over a TCP/IP stream transport. + +This is one of the main classes that send a DNS query to your DNS server. + +For more advanced usages one can utilize this class directly. +The following example looks up the `IPv6` address for `reactphp.org`. + +```php +$executor = new TcpTransportExecutor('8.8.8.8:53'); + +$executor->query( + new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) +)->then(function (Message $message) { + foreach ($message->answers as $answer) { + echo 'IPv6: ' . $answer->data . PHP_EOL; + } +}, 'printf'); +``` + +See also [example #92](examples). + +Note that this executor does not implement a timeout, so you will very likely +want to use this in combination with a `TimeoutExecutor` like this: + +```php +$executor = new TimeoutExecutor( + new TcpTransportExecutor($nameserver), + 3.0 +); +``` + +Unlike the `UdpTransportExecutor`, this class uses a reliable TCP/IP +transport, so you do not necessarily have to implement any retry logic. + +Note that this executor is entirely async and as such allows you to execute +queries concurrently. The first query will establish a TCP/IP socket +connection to the DNS server which will be kept open for a short period. +Additional queries will automatically reuse this existing socket connection +to the DNS server, will pipeline multiple requests over this single +connection and will keep an idle connection open for a short period. The +initial TCP/IP connection overhead may incur a slight delay if you only send +occasional queries – when sending a larger number of concurrent queries over +an existing connection, it becomes increasingly more efficient and avoids +creating many concurrent sockets like the UDP-based executor. You may still +want to limit the number of (concurrent) queries in your application or you +may be facing rate limitations and bans on the resolver end. For many common +applications, you may want to avoid sending the same query multiple times +when the first one is still pending, so you will likely want to use this in +combination with a `CoopExecutor` like this: + +```php +$executor = new CoopExecutor( + new TimeoutExecutor( + new TcpTransportExecutor($nameserver), + 3.0 + ) +); +``` + +> Internally, this class uses PHP's TCP/IP sockets and does not take advantage + of [react/socket](https://github.com/reactphp/socket) purely for + organizational reasons to avoid a cyclic dependency between the two + packages. Higher-level components should take advantage of the Socket + component instead of reimplementing this socket logic from scratch. + +### SelectiveTransportExecutor + +The `SelectiveTransportExecutor` class can be used to +Send DNS queries over a UDP or TCP/IP stream transport. + +This class will automatically choose the correct transport protocol to send +a DNS query to your DNS server. It will always try to send it over the more +efficient UDP transport first. If this query yields a size related issue +(truncated messages), it will retry over a streaming TCP/IP transport. + +For more advanced usages one can utilize this class directly. +The following example looks up the `IPv6` address for `reactphp.org`. + +```php +$executor = new SelectiveTransportExecutor($udpExecutor, $tcpExecutor); + +$executor->query( + new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) +)->then(function (Message $message) { + foreach ($message->answers as $answer) { + echo 'IPv6: ' . $answer->data . PHP_EOL; + } +}, 'printf'); +``` + +Note that this executor only implements the logic to select the correct +transport for the given DNS query. Implementing the correct transport logic, +implementing timeouts and any retry logic is left up to the given executors, +see also [`UdpTransportExecutor`](#udptransportexecutor) and +[`TcpTransportExecutor`](#tcptransportexecutor) for more details. + +Note that this executor is entirely async and as such allows you to execute +any number of queries concurrently. You should probably limit the number of +concurrent queries in your application or you're very likely going to face +rate limitations and bans on the resolver end. For many common applications, +you may want to avoid sending the same query multiple times when the first +one is still pending, so you will likely want to use this in combination with +a `CoopExecutor` like this: + +```php +$executor = new CoopExecutor( + new SelectiveTransportExecutor( + $datagramExecutor, + $streamExecutor + ) +); +``` + +### HostsFileExecutor + +Note that the above `UdpTransportExecutor` class always performs an actual DNS query. +If you also want to take entries from your hosts file into account, you may +use this code: + +```php +$hosts = \React\Dns\Config\HostsFile::loadFromPathBlocking(); + +$executor = new UdpTransportExecutor('8.8.8.8:53'); +$executor = new HostsFileExecutor($hosts, $executor); + +$executor->query( + new Query('localhost', Message::TYPE_A, Message::CLASS_IN) +); +``` + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](https://semver.org/). +This will install the latest supported version: + +```bash +composer require react/dns:^1.13 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 8+ and +HHVM. +It's *highly recommended to use the latest supported PHP version* for this project. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org/): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +The test suite also contains a number of functional integration tests that rely +on a stable internet connection. +If you do not want to run these, they can simply be skipped like this: + +```bash +vendor/bin/phpunit --exclude-group internet +``` + +## License + +MIT, see [LICENSE file](LICENSE). + +## References + +* [RFC 1034](https://tools.ietf.org/html/rfc1034) Domain Names - Concepts and Facilities +* [RFC 1035](https://tools.ietf.org/html/rfc1035) Domain Names - Implementation and Specification diff --git a/vendor/react/dns/composer.json b/vendor/react/dns/composer.json new file mode 100644 index 000000000..4fe5c0da2 --- /dev/null +++ b/vendor/react/dns/composer.json @@ -0,0 +1,49 @@ +{ + "name": "react/dns", + "description": "Async DNS resolver for ReactPHP", + "keywords": ["dns", "dns-resolver", "ReactPHP", "async"], + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "homepage": "https://clue.engineering/", + "email": "christian@clue.engineering" + }, + { + "name": "Cees-Jan Kiewiet", + "homepage": "https://wyrihaximus.net/", + "email": "reactphp@ceesjankiewiet.nl" + }, + { + "name": "Jan Sorgalla", + "homepage": "https://sorgalla.com/", + "email": "jsorgalla@gmail.com" + }, + { + "name": "Chris Boden", + "homepage": "https://cboden.dev/", + "email": "cboden@gmail.com" + } + ], + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "React\\Tests\\Dns\\": "tests/" + } + } +} diff --git a/vendor/react/dns/src/BadServerException.php b/vendor/react/dns/src/BadServerException.php new file mode 100644 index 000000000..3d95213f4 --- /dev/null +++ b/vendor/react/dns/src/BadServerException.php @@ -0,0 +1,7 @@ + `fe80:1`) + if (strpos($ip, ':') !== false && ($pos = strpos($ip, '%')) !== false) { + $ip = substr($ip, 0, $pos); + } + + if (@inet_pton($ip) !== false) { + $config->nameservers[] = $ip; + } + } + + return $config; + } + + /** + * Loads the DNS configurations from Windows's WMIC (from the given command or default command) + * + * Note that this method blocks while loading the given command and should + * thus be used with care! While this should be relatively fast for normal + * WMIC commands, it remains unknown if this may block under certain + * circumstances. In particular, this method should only be executed before + * the loop starts, not while it is running. + * + * Note that this method will only try to execute the given command try to + * parse its output, irrespective of whether this command exists. In + * particular, this command is only available on Windows. Currently, this + * will only parse valid nameserver entries from the command output and will + * ignore all other output without complaining. + * + * Note that the previous section implies that this may return an empty + * `Config` object if no valid nameserver entries can be found. + * + * @param ?string $command (advanced) should not be given (NULL) unless you know what you're doing + * @return self + * @link https://ss64.com/nt/wmic.html + */ + public static function loadWmicBlocking($command = null) + { + $contents = shell_exec($command === null ? 'wmic NICCONFIG get "DNSServerSearchOrder" /format:CSV' : $command); + preg_match_all('/(?<=[{;,"])([\da-f.:]{4,})(?=[};,"])/i', $contents, $matches); + + $config = new self(); + $config->nameservers = $matches[1]; + + return $config; + } + + public $nameservers = array(); +} diff --git a/vendor/react/dns/src/Config/HostsFile.php b/vendor/react/dns/src/Config/HostsFile.php new file mode 100644 index 000000000..1060231a2 --- /dev/null +++ b/vendor/react/dns/src/Config/HostsFile.php @@ -0,0 +1,153 @@ +contents = $contents; + } + + /** + * Returns all IPs for the given hostname + * + * @param string $name + * @return string[] + */ + public function getIpsForHost($name) + { + $name = strtolower($name); + + $ips = array(); + foreach (preg_split('/\r?\n/', $this->contents) as $line) { + $parts = preg_split('/\s+/', $line); + $ip = array_shift($parts); + if ($parts && array_search($name, $parts) !== false) { + // remove IPv6 zone ID (`fe80::1%lo0` => `fe80:1`) + if (strpos($ip, ':') !== false && ($pos = strpos($ip, '%')) !== false) { + $ip = substr($ip, 0, $pos); + } + + if (@inet_pton($ip) !== false) { + $ips[] = $ip; + } + } + } + + return $ips; + } + + /** + * Returns all hostnames for the given IPv4 or IPv6 address + * + * @param string $ip + * @return string[] + */ + public function getHostsForIp($ip) + { + // check binary representation of IP to avoid string case and short notation + $ip = @inet_pton($ip); + if ($ip === false) { + return array(); + } + + $names = array(); + foreach (preg_split('/\r?\n/', $this->contents) as $line) { + $parts = preg_split('/\s+/', $line, -1, PREG_SPLIT_NO_EMPTY); + $addr = (string) array_shift($parts); + + // remove IPv6 zone ID (`fe80::1%lo0` => `fe80:1`) + if (strpos($addr, ':') !== false && ($pos = strpos($addr, '%')) !== false) { + $addr = substr($addr, 0, $pos); + } + + if (@inet_pton($addr) === $ip) { + foreach ($parts as $part) { + $names[] = $part; + } + } + } + + return $names; + } +} diff --git a/vendor/react/dns/src/Model/Message.php b/vendor/react/dns/src/Model/Message.php new file mode 100644 index 000000000..bac2b10d0 --- /dev/null +++ b/vendor/react/dns/src/Model/Message.php @@ -0,0 +1,230 @@ +id = self::generateId(); + $request->rd = true; + $request->questions[] = $query; + + return $request; + } + + /** + * Creates a new response message for the given query with the given answer records + * + * @param Query $query + * @param Record[] $answers + * @return self + */ + public static function createResponseWithAnswersForQuery(Query $query, array $answers) + { + $response = new Message(); + $response->id = self::generateId(); + $response->qr = true; + $response->rd = true; + + $response->questions[] = $query; + + foreach ($answers as $record) { + $response->answers[] = $record; + } + + return $response; + } + + /** + * generates a random 16 bit message ID + * + * This uses a CSPRNG so that an outside attacker that is sending spoofed + * DNS response messages can not guess the message ID to avoid possible + * cache poisoning attacks. + * + * The `random_int()` function is only available on PHP 7+ or when + * https://github.com/paragonie/random_compat is installed. As such, using + * the latest supported PHP version is highly recommended. This currently + * falls back to a less secure random number generator on older PHP versions + * in the hope that this system is properly protected against outside + * attackers, for example by using one of the common local DNS proxy stubs. + * + * @return int + * @see self::getId() + * @codeCoverageIgnore + */ + private static function generateId() + { + if (function_exists('random_int')) { + return random_int(0, 0xffff); + } + return mt_rand(0, 0xffff); + } + + /** + * The 16 bit message ID + * + * The response message ID has to match the request message ID. This allows + * the receiver to verify this is the correct response message. An outside + * attacker may try to inject fake responses by "guessing" the message ID, + * so this should use a proper CSPRNG to avoid possible cache poisoning. + * + * @var int 16 bit message ID + * @see self::generateId() + */ + public $id = 0; + + /** + * @var bool Query/Response flag, query=false or response=true + */ + public $qr = false; + + /** + * @var int specifies the kind of query (4 bit), see self::OPCODE_* constants + * @see self::OPCODE_QUERY + */ + public $opcode = self::OPCODE_QUERY; + + /** + * + * @var bool Authoritative Answer + */ + public $aa = false; + + /** + * @var bool TrunCation + */ + public $tc = false; + + /** + * @var bool Recursion Desired + */ + public $rd = false; + + /** + * @var bool Recursion Available + */ + public $ra = false; + + /** + * @var int response code (4 bit), see self::RCODE_* constants + * @see self::RCODE_OK + */ + public $rcode = Message::RCODE_OK; + + /** + * An array of Query objects + * + * ```php + * $questions = array( + * new Query( + * 'reactphp.org', + * Message::TYPE_A, + * Message::CLASS_IN + * ) + * ); + * ``` + * + * @var Query[] + */ + public $questions = array(); + + /** + * @var Record[] + */ + public $answers = array(); + + /** + * @var Record[] + */ + public $authority = array(); + + /** + * @var Record[] + */ + public $additional = array(); +} diff --git a/vendor/react/dns/src/Model/Record.php b/vendor/react/dns/src/Model/Record.php new file mode 100644 index 000000000..c20403f52 --- /dev/null +++ b/vendor/react/dns/src/Model/Record.php @@ -0,0 +1,153 @@ +name = $name; + $this->type = $type; + $this->class = $class; + $this->ttl = $ttl; + $this->data = $data; + } +} diff --git a/vendor/react/dns/src/Protocol/BinaryDumper.php b/vendor/react/dns/src/Protocol/BinaryDumper.php new file mode 100644 index 000000000..6f4030f63 --- /dev/null +++ b/vendor/react/dns/src/Protocol/BinaryDumper.php @@ -0,0 +1,199 @@ +headerToBinary($message); + $data .= $this->questionToBinary($message->questions); + $data .= $this->recordsToBinary($message->answers); + $data .= $this->recordsToBinary($message->authority); + $data .= $this->recordsToBinary($message->additional); + + return $data; + } + + /** + * @param Message $message + * @return string + */ + private function headerToBinary(Message $message) + { + $data = ''; + + $data .= pack('n', $message->id); + + $flags = 0x00; + $flags = ($flags << 1) | ($message->qr ? 1 : 0); + $flags = ($flags << 4) | $message->opcode; + $flags = ($flags << 1) | ($message->aa ? 1 : 0); + $flags = ($flags << 1) | ($message->tc ? 1 : 0); + $flags = ($flags << 1) | ($message->rd ? 1 : 0); + $flags = ($flags << 1) | ($message->ra ? 1 : 0); + $flags = ($flags << 3) | 0; // skip unused zero bit + $flags = ($flags << 4) | $message->rcode; + + $data .= pack('n', $flags); + + $data .= pack('n', count($message->questions)); + $data .= pack('n', count($message->answers)); + $data .= pack('n', count($message->authority)); + $data .= pack('n', count($message->additional)); + + return $data; + } + + /** + * @param Query[] $questions + * @return string + */ + private function questionToBinary(array $questions) + { + $data = ''; + + foreach ($questions as $question) { + $data .= $this->domainNameToBinary($question->name); + $data .= pack('n*', $question->type, $question->class); + } + + return $data; + } + + /** + * @param Record[] $records + * @return string + */ + private function recordsToBinary(array $records) + { + $data = ''; + + foreach ($records as $record) { + /* @var $record Record */ + switch ($record->type) { + case Message::TYPE_A: + case Message::TYPE_AAAA: + $binary = \inet_pton($record->data); + break; + case Message::TYPE_CNAME: + case Message::TYPE_NS: + case Message::TYPE_PTR: + $binary = $this->domainNameToBinary($record->data); + break; + case Message::TYPE_TXT: + case Message::TYPE_SPF: + $binary = $this->textsToBinary($record->data); + break; + case Message::TYPE_MX: + $binary = \pack( + 'n', + $record->data['priority'] + ); + $binary .= $this->domainNameToBinary($record->data['target']); + break; + case Message::TYPE_SRV: + $binary = \pack( + 'n*', + $record->data['priority'], + $record->data['weight'], + $record->data['port'] + ); + $binary .= $this->domainNameToBinary($record->data['target']); + break; + case Message::TYPE_SOA: + $binary = $this->domainNameToBinary($record->data['mname']); + $binary .= $this->domainNameToBinary($record->data['rname']); + $binary .= \pack( + 'N*', + $record->data['serial'], + $record->data['refresh'], + $record->data['retry'], + $record->data['expire'], + $record->data['minimum'] + ); + break; + case Message::TYPE_CAA: + $binary = \pack( + 'C*', + $record->data['flag'], + \strlen($record->data['tag']) + ); + $binary .= $record->data['tag']; + $binary .= $record->data['value']; + break; + case Message::TYPE_SSHFP: + $binary = \pack( + 'CCH*', + $record->data['algorithm'], + $record->data['type'], + $record->data['fingerprint'] + ); + break; + case Message::TYPE_OPT: + $binary = ''; + foreach ($record->data as $opt => $value) { + if ($opt === Message::OPT_TCP_KEEPALIVE && $value !== null) { + $value = \pack('n', round($value * 10)); + } + $binary .= \pack('n*', $opt, \strlen((string) $value)) . $value; + } + break; + default: + // RDATA is already stored as binary value for unknown record types + $binary = $record->data; + } + + $data .= $this->domainNameToBinary($record->name); + $data .= \pack('nnNn', $record->type, $record->class, $record->ttl, \strlen($binary)); + $data .= $binary; + } + + return $data; + } + + /** + * @param string[] $texts + * @return string + */ + private function textsToBinary(array $texts) + { + $data = ''; + foreach ($texts as $text) { + $data .= \chr(\strlen($text)) . $text; + } + return $data; + } + + /** + * @param string $host + * @return string + */ + private function domainNameToBinary($host) + { + if ($host === '') { + return "\0"; + } + + // break up domain name at each dot that is not preceeded by a backslash (escaped notation) + return $this->textsToBinary( + \array_map( + 'stripcslashes', + \preg_split( + '/(?parse($data, 0); + if ($message === null) { + throw new InvalidArgumentException('Unable to parse binary message'); + } + + return $message; + } + + /** + * @param string $data + * @param int $consumed + * @return ?Message + */ + private function parse($data, $consumed) + { + if (!isset($data[12 - 1])) { + return null; + } + + list($id, $fields, $qdCount, $anCount, $nsCount, $arCount) = array_values(unpack('n*', substr($data, 0, 12))); + + $message = new Message(); + $message->id = $id; + $message->rcode = $fields & 0xf; + $message->ra = (($fields >> 7) & 1) === 1; + $message->rd = (($fields >> 8) & 1) === 1; + $message->tc = (($fields >> 9) & 1) === 1; + $message->aa = (($fields >> 10) & 1) === 1; + $message->opcode = ($fields >> 11) & 0xf; + $message->qr = (($fields >> 15) & 1) === 1; + $consumed += 12; + + // parse all questions + for ($i = $qdCount; $i > 0; --$i) { + list($question, $consumed) = $this->parseQuestion($data, $consumed); + if ($question === null) { + return null; + } else { + $message->questions[] = $question; + } + } + + // parse all answer records + for ($i = $anCount; $i > 0; --$i) { + list($record, $consumed) = $this->parseRecord($data, $consumed); + if ($record === null) { + return null; + } else { + $message->answers[] = $record; + } + } + + // parse all authority records + for ($i = $nsCount; $i > 0; --$i) { + list($record, $consumed) = $this->parseRecord($data, $consumed); + if ($record === null) { + return null; + } else { + $message->authority[] = $record; + } + } + + // parse all additional records + for ($i = $arCount; $i > 0; --$i) { + list($record, $consumed) = $this->parseRecord($data, $consumed); + if ($record === null) { + return null; + } else { + $message->additional[] = $record; + } + } + + return $message; + } + + /** + * @param string $data + * @param int $consumed + * @return array + */ + private function parseQuestion($data, $consumed) + { + list($labels, $consumed) = $this->readLabels($data, $consumed); + + if ($labels === null || !isset($data[$consumed + 4 - 1])) { + return array(null, null); + } + + list($type, $class) = array_values(unpack('n*', substr($data, $consumed, 4))); + $consumed += 4; + + return array( + new Query( + implode('.', $labels), + $type, + $class + ), + $consumed + ); + } + + /** + * @param string $data + * @param int $consumed + * @return array An array with a parsed Record on success or array with null if data is invalid/incomplete + */ + private function parseRecord($data, $consumed) + { + list($name, $consumed) = $this->readDomain($data, $consumed); + + if ($name === null || !isset($data[$consumed + 10 - 1])) { + return array(null, null); + } + + list($type, $class) = array_values(unpack('n*', substr($data, $consumed, 4))); + $consumed += 4; + + list($ttl) = array_values(unpack('N', substr($data, $consumed, 4))); + $consumed += 4; + + // TTL is a UINT32 that must not have most significant bit set for BC reasons + if ($ttl < 0 || $ttl >= 1 << 31) { + $ttl = 0; + } + + list($rdLength) = array_values(unpack('n', substr($data, $consumed, 2))); + $consumed += 2; + + if (!isset($data[$consumed + $rdLength - 1])) { + return array(null, null); + } + + $rdata = null; + $expected = $consumed + $rdLength; + + if (Message::TYPE_A === $type) { + if ($rdLength === 4) { + $rdata = inet_ntop(substr($data, $consumed, $rdLength)); + $consumed += $rdLength; + } + } elseif (Message::TYPE_AAAA === $type) { + if ($rdLength === 16) { + $rdata = inet_ntop(substr($data, $consumed, $rdLength)); + $consumed += $rdLength; + } + } elseif (Message::TYPE_CNAME === $type || Message::TYPE_PTR === $type || Message::TYPE_NS === $type) { + list($rdata, $consumed) = $this->readDomain($data, $consumed); + } elseif (Message::TYPE_TXT === $type || Message::TYPE_SPF === $type) { + $rdata = array(); + while ($consumed < $expected) { + $len = ord($data[$consumed]); + $rdata[] = (string)substr($data, $consumed + 1, $len); + $consumed += $len + 1; + } + } elseif (Message::TYPE_MX === $type) { + if ($rdLength > 2) { + list($priority) = array_values(unpack('n', substr($data, $consumed, 2))); + list($target, $consumed) = $this->readDomain($data, $consumed + 2); + + $rdata = array( + 'priority' => $priority, + 'target' => $target + ); + } + } elseif (Message::TYPE_SRV === $type) { + if ($rdLength > 6) { + list($priority, $weight, $port) = array_values(unpack('n*', substr($data, $consumed, 6))); + list($target, $consumed) = $this->readDomain($data, $consumed + 6); + + $rdata = array( + 'priority' => $priority, + 'weight' => $weight, + 'port' => $port, + 'target' => $target + ); + } + } elseif (Message::TYPE_SSHFP === $type) { + if ($rdLength > 2) { + list($algorithm, $hash) = \array_values(\unpack('C*', \substr($data, $consumed, 2))); + $fingerprint = \bin2hex(\substr($data, $consumed + 2, $rdLength - 2)); + $consumed += $rdLength; + + $rdata = array( + 'algorithm' => $algorithm, + 'type' => $hash, + 'fingerprint' => $fingerprint + ); + } + } elseif (Message::TYPE_SOA === $type) { + list($mname, $consumed) = $this->readDomain($data, $consumed); + list($rname, $consumed) = $this->readDomain($data, $consumed); + + if ($mname !== null && $rname !== null && isset($data[$consumed + 20 - 1])) { + list($serial, $refresh, $retry, $expire, $minimum) = array_values(unpack('N*', substr($data, $consumed, 20))); + $consumed += 20; + + $rdata = array( + 'mname' => $mname, + 'rname' => $rname, + 'serial' => $serial, + 'refresh' => $refresh, + 'retry' => $retry, + 'expire' => $expire, + 'minimum' => $minimum + ); + } + } elseif (Message::TYPE_OPT === $type) { + $rdata = array(); + while (isset($data[$consumed + 4 - 1])) { + list($code, $length) = array_values(unpack('n*', substr($data, $consumed, 4))); + $value = (string) substr($data, $consumed + 4, $length); + if ($code === Message::OPT_TCP_KEEPALIVE && $value === '') { + $value = null; + } elseif ($code === Message::OPT_TCP_KEEPALIVE && $length === 2) { + list($value) = array_values(unpack('n', $value)); + $value = round($value * 0.1, 1); + } elseif ($code === Message::OPT_TCP_KEEPALIVE) { + break; + } + $rdata[$code] = $value; + $consumed += 4 + $length; + } + } elseif (Message::TYPE_CAA === $type) { + if ($rdLength > 3) { + list($flag, $tagLength) = array_values(unpack('C*', substr($data, $consumed, 2))); + + if ($tagLength > 0 && $rdLength - 2 - $tagLength > 0) { + $tag = substr($data, $consumed + 2, $tagLength); + $value = substr($data, $consumed + 2 + $tagLength, $rdLength - 2 - $tagLength); + $consumed += $rdLength; + + $rdata = array( + 'flag' => $flag, + 'tag' => $tag, + 'value' => $value + ); + } + } + } else { + // unknown types simply parse rdata as an opaque binary string + $rdata = substr($data, $consumed, $rdLength); + $consumed += $rdLength; + } + + // ensure parsing record data consumes expact number of bytes indicated in record length + if ($consumed !== $expected || $rdata === null) { + return array(null, null); + } + + return array( + new Record($name, $type, $class, $ttl, $rdata), + $consumed + ); + } + + private function readDomain($data, $consumed) + { + list ($labels, $consumed) = $this->readLabels($data, $consumed); + + if ($labels === null) { + return array(null, null); + } + + // use escaped notation for each label part, then join using dots + return array( + \implode( + '.', + \array_map( + function ($label) { + return \addcslashes($label, "\0..\40.\177"); + }, + $labels + ) + ), + $consumed + ); + } + + /** + * @param string $data + * @param int $consumed + * @param int $compressionDepth maximum depth for compressed labels to avoid unreasonable recursion + * @return array + */ + private function readLabels($data, $consumed, $compressionDepth = 127) + { + $labels = array(); + + while (true) { + if (!isset($data[$consumed])) { + return array(null, null); + } + + $length = \ord($data[$consumed]); + + // end of labels reached + if ($length === 0) { + $consumed += 1; + break; + } + + // first two bits set? this is a compressed label (14 bit pointer offset) + if (($length & 0xc0) === 0xc0 && isset($data[$consumed + 1]) && $compressionDepth) { + $offset = ($length & ~0xc0) << 8 | \ord($data[$consumed + 1]); + if ($offset >= $consumed) { + return array(null, null); + } + + $consumed += 2; + list($newLabels) = $this->readLabels($data, $offset, $compressionDepth - 1); + + if ($newLabels === null) { + return array(null, null); + } + + $labels = array_merge($labels, $newLabels); + break; + } + + // length MUST be 0-63 (6 bits only) and data has to be large enough + if ($length & 0xc0 || !isset($data[$consumed + $length - 1])) { + return array(null, null); + } + + $labels[] = substr($data, $consumed + 1, $length); + $consumed += $length + 1; + } + + return array($labels, $consumed); + } +} diff --git a/vendor/react/dns/src/Query/CachingExecutor.php b/vendor/react/dns/src/Query/CachingExecutor.php new file mode 100644 index 000000000..e530b24c4 --- /dev/null +++ b/vendor/react/dns/src/Query/CachingExecutor.php @@ -0,0 +1,88 @@ +executor = $executor; + $this->cache = $cache; + } + + public function query(Query $query) + { + $id = $query->name . ':' . $query->type . ':' . $query->class; + $cache = $this->cache; + $that = $this; + $executor = $this->executor; + + $pending = $cache->get($id); + return new Promise(function ($resolve, $reject) use ($query, $id, $cache, $executor, &$pending, $that) { + $pending->then( + function ($message) use ($query, $id, $cache, $executor, &$pending, $that) { + // return cached response message on cache hit + if ($message !== null) { + return $message; + } + + // perform DNS lookup if not already cached + return $pending = $executor->query($query)->then( + function (Message $message) use ($cache, $id, $that) { + // DNS response message received => store in cache when not truncated and return + if (!$message->tc) { + $cache->set($id, $message, $that->ttl($message)); + } + + return $message; + } + ); + } + )->then($resolve, function ($e) use ($reject, &$pending) { + $reject($e); + $pending = null; + }); + }, function ($_, $reject) use (&$pending, $query) { + $reject(new \RuntimeException('DNS query for ' . $query->describe() . ' has been cancelled')); + $pending->cancel(); + $pending = null; + }); + } + + /** + * @param Message $message + * @return int + * @internal + */ + public function ttl(Message $message) + { + // select TTL from answers (should all be the same), use smallest value if available + // @link https://tools.ietf.org/html/rfc2181#section-5.2 + $ttl = null; + foreach ($message->answers as $answer) { + if ($ttl === null || $answer->ttl < $ttl) { + $ttl = $answer->ttl; + } + } + + if ($ttl === null) { + $ttl = self::TTL; + } + + return $ttl; + } +} diff --git a/vendor/react/dns/src/Query/CancellationException.php b/vendor/react/dns/src/Query/CancellationException.php new file mode 100644 index 000000000..5432b36fe --- /dev/null +++ b/vendor/react/dns/src/Query/CancellationException.php @@ -0,0 +1,7 @@ +executor = $base; + } + + public function query(Query $query) + { + $key = $this->serializeQueryToIdentity($query); + if (isset($this->pending[$key])) { + // same query is already pending, so use shared reference to pending query + $promise = $this->pending[$key]; + ++$this->counts[$key]; + } else { + // no such query pending, so start new query and keep reference until it's fulfilled or rejected + $promise = $this->executor->query($query); + $this->pending[$key] = $promise; + $this->counts[$key] = 1; + + $pending =& $this->pending; + $counts =& $this->counts; + $promise->then(function () use ($key, &$pending, &$counts) { + unset($pending[$key], $counts[$key]); + }, function () use ($key, &$pending, &$counts) { + unset($pending[$key], $counts[$key]); + }); + } + + // Return a child promise awaiting the pending query. + // Cancelling this child promise should only cancel the pending query + // when no other child promise is awaiting the same query. + $pending =& $this->pending; + $counts =& $this->counts; + return new Promise(function ($resolve, $reject) use ($promise) { + $promise->then($resolve, $reject); + }, function () use (&$promise, $key, $query, &$pending, &$counts) { + if (--$counts[$key] < 1) { + unset($pending[$key], $counts[$key]); + $promise->cancel(); + $promise = null; + } + throw new \RuntimeException('DNS query for ' . $query->describe() . ' has been cancelled'); + }); + } + + private function serializeQueryToIdentity(Query $query) + { + return sprintf('%s:%s:%s', $query->name, $query->type, $query->class); + } +} diff --git a/vendor/react/dns/src/Query/ExecutorInterface.php b/vendor/react/dns/src/Query/ExecutorInterface.php new file mode 100644 index 000000000..0bc3945f1 --- /dev/null +++ b/vendor/react/dns/src/Query/ExecutorInterface.php @@ -0,0 +1,43 @@ +query($query)->then( + * function (React\Dns\Model\Message $response) { + * // response message successfully received + * var_dump($response->rcode, $response->answers); + * }, + * function (Exception $error) { + * // failed to query due to $error + * } + * ); + * ``` + * + * The returned Promise MUST be implemented in such a way that it can be + * cancelled when it is still pending. Cancelling a pending promise MUST + * reject its value with an Exception. It SHOULD clean up any underlying + * resources and references as applicable. + * + * ```php + * $promise = $executor->query($query); + * + * $promise->cancel(); + * ``` + * + * @param Query $query + * @return \React\Promise\PromiseInterface<\React\Dns\Model\Message> + * resolves with response message on success or rejects with an Exception on error + */ + public function query(Query $query); +} diff --git a/vendor/react/dns/src/Query/FallbackExecutor.php b/vendor/react/dns/src/Query/FallbackExecutor.php new file mode 100644 index 000000000..83bd360bd --- /dev/null +++ b/vendor/react/dns/src/Query/FallbackExecutor.php @@ -0,0 +1,49 @@ +executor = $executor; + $this->fallback = $fallback; + } + + public function query(Query $query) + { + $cancelled = false; + $fallback = $this->fallback; + $promise = $this->executor->query($query); + + return new Promise(function ($resolve, $reject) use (&$promise, $fallback, $query, &$cancelled) { + $promise->then($resolve, function (\Exception $e1) use ($fallback, $query, $resolve, $reject, &$cancelled, &$promise) { + // reject if primary resolution rejected due to cancellation + if ($cancelled) { + $reject($e1); + return; + } + + // start fallback query if primary query rejected + $promise = $fallback->query($query)->then($resolve, function (\Exception $e2) use ($e1, $reject) { + $append = $e2->getMessage(); + if (($pos = strpos($append, ':')) !== false) { + $append = substr($append, $pos + 2); + } + + // reject with combined error message if both queries fail + $reject(new \RuntimeException($e1->getMessage() . '. ' . $append)); + }); + }); + }, function () use (&$promise, &$cancelled) { + // cancel pending query (primary or fallback) + $cancelled = true; + $promise->cancel(); + }); + } +} diff --git a/vendor/react/dns/src/Query/HostsFileExecutor.php b/vendor/react/dns/src/Query/HostsFileExecutor.php new file mode 100644 index 000000000..d6e2d9347 --- /dev/null +++ b/vendor/react/dns/src/Query/HostsFileExecutor.php @@ -0,0 +1,89 @@ +hosts = $hosts; + $this->fallback = $fallback; + } + + public function query(Query $query) + { + if ($query->class === Message::CLASS_IN && ($query->type === Message::TYPE_A || $query->type === Message::TYPE_AAAA)) { + // forward lookup for type A or AAAA + $records = array(); + $expectsColon = $query->type === Message::TYPE_AAAA; + foreach ($this->hosts->getIpsForHost($query->name) as $ip) { + // ensure this is an IPv4/IPV6 address according to query type + if ((strpos($ip, ':') !== false) === $expectsColon) { + $records[] = new Record($query->name, $query->type, $query->class, 0, $ip); + } + } + + if ($records) { + return Promise\resolve( + Message::createResponseWithAnswersForQuery($query, $records) + ); + } + } elseif ($query->class === Message::CLASS_IN && $query->type === Message::TYPE_PTR) { + // reverse lookup: extract IPv4 or IPv6 from special `.arpa` domain + $ip = $this->getIpFromHost($query->name); + + if ($ip !== null) { + $records = array(); + foreach ($this->hosts->getHostsForIp($ip) as $host) { + $records[] = new Record($query->name, $query->type, $query->class, 0, $host); + } + + if ($records) { + return Promise\resolve( + Message::createResponseWithAnswersForQuery($query, $records) + ); + } + } + } + + return $this->fallback->query($query); + } + + private function getIpFromHost($host) + { + if (substr($host, -13) === '.in-addr.arpa') { + // IPv4: read as IP and reverse bytes + $ip = @inet_pton(substr($host, 0, -13)); + if ($ip === false || isset($ip[4])) { + return null; + } + + return inet_ntop(strrev($ip)); + } elseif (substr($host, -9) === '.ip6.arpa') { + // IPv6: replace dots, reverse nibbles and interpret as hexadecimal string + $ip = @inet_ntop(pack('H*', strrev(str_replace('.', '', substr($host, 0, -9))))); + if ($ip === false) { + return null; + } + + return $ip; + } else { + return null; + } + } +} diff --git a/vendor/react/dns/src/Query/Query.php b/vendor/react/dns/src/Query/Query.php new file mode 100644 index 000000000..a3dcfb582 --- /dev/null +++ b/vendor/react/dns/src/Query/Query.php @@ -0,0 +1,69 @@ +name = $name; + $this->type = $type; + $this->class = $class; + } + + /** + * Describes the hostname and query type/class for this query + * + * The output format is supposed to be human readable and is subject to change. + * The format is inspired by RFC 3597 when handling unkown types/classes. + * + * @return string "example.com (A)" or "example.com (CLASS0 TYPE1234)" + * @link https://tools.ietf.org/html/rfc3597 + */ + public function describe() + { + $class = $this->class !== Message::CLASS_IN ? 'CLASS' . $this->class . ' ' : ''; + + $type = 'TYPE' . $this->type; + $ref = new \ReflectionClass('React\Dns\Model\Message'); + foreach ($ref->getConstants() as $name => $value) { + if ($value === $this->type && \strpos($name, 'TYPE_') === 0) { + $type = \substr($name, 5); + break; + } + } + + return $this->name . ' (' . $class . $type . ')'; + } +} diff --git a/vendor/react/dns/src/Query/RetryExecutor.php b/vendor/react/dns/src/Query/RetryExecutor.php new file mode 100644 index 000000000..880609b22 --- /dev/null +++ b/vendor/react/dns/src/Query/RetryExecutor.php @@ -0,0 +1,85 @@ +executor = $executor; + $this->retries = $retries; + } + + public function query(Query $query) + { + return $this->tryQuery($query, $this->retries); + } + + public function tryQuery(Query $query, $retries) + { + $deferred = new Deferred(function () use (&$promise) { + if ($promise instanceof PromiseInterface && \method_exists($promise, 'cancel')) { + $promise->cancel(); + } + }); + + $success = function ($value) use ($deferred, &$errorback) { + $errorback = null; + $deferred->resolve($value); + }; + + $executor = $this->executor; + $errorback = function ($e) use ($deferred, &$promise, $query, $success, &$errorback, &$retries, $executor) { + if (!$e instanceof TimeoutException) { + $errorback = null; + $deferred->reject($e); + } elseif ($retries <= 0) { + $errorback = null; + $deferred->reject($e = new \RuntimeException( + 'DNS query for ' . $query->describe() . ' failed: too many retries', + 0, + $e + )); + + // avoid garbage references by replacing all closures in call stack. + // what a lovely piece of code! + $r = new \ReflectionProperty('Exception', 'trace'); + $r->setAccessible(true); + $trace = $r->getValue($e); + + // Exception trace arguments are not available on some PHP 7.4 installs + // @codeCoverageIgnoreStart + foreach ($trace as $ti => $one) { + if (isset($one['args'])) { + foreach ($one['args'] as $ai => $arg) { + if ($arg instanceof \Closure) { + $trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')'; + } + } + } + } + // @codeCoverageIgnoreEnd + $r->setValue($e, $trace); + } else { + --$retries; + $promise = $executor->query($query)->then( + $success, + $errorback + ); + } + }; + + $promise = $this->executor->query($query)->then( + $success, + $errorback + ); + + return $deferred->promise(); + } +} diff --git a/vendor/react/dns/src/Query/SelectiveTransportExecutor.php b/vendor/react/dns/src/Query/SelectiveTransportExecutor.php new file mode 100644 index 000000000..0f0ca5d08 --- /dev/null +++ b/vendor/react/dns/src/Query/SelectiveTransportExecutor.php @@ -0,0 +1,85 @@ +query( + * new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) + * )->then(function (Message $message) { + * foreach ($message->answers as $answer) { + * echo 'IPv6: ' . $answer->data . PHP_EOL; + * } + * }, 'printf'); + * ``` + * + * Note that this executor only implements the logic to select the correct + * transport for the given DNS query. Implementing the correct transport logic, + * implementing timeouts and any retry logic is left up to the given executors, + * see also [`UdpTransportExecutor`](#udptransportexecutor) and + * [`TcpTransportExecutor`](#tcptransportexecutor) for more details. + * + * Note that this executor is entirely async and as such allows you to execute + * any number of queries concurrently. You should probably limit the number of + * concurrent queries in your application or you're very likely going to face + * rate limitations and bans on the resolver end. For many common applications, + * you may want to avoid sending the same query multiple times when the first + * one is still pending, so you will likely want to use this in combination with + * a `CoopExecutor` like this: + * + * ```php + * $executor = new CoopExecutor( + * new SelectiveTransportExecutor( + * $datagramExecutor, + * $streamExecutor + * ) + * ); + * ``` + */ +class SelectiveTransportExecutor implements ExecutorInterface +{ + private $datagramExecutor; + private $streamExecutor; + + public function __construct(ExecutorInterface $datagramExecutor, ExecutorInterface $streamExecutor) + { + $this->datagramExecutor = $datagramExecutor; + $this->streamExecutor = $streamExecutor; + } + + public function query(Query $query) + { + $stream = $this->streamExecutor; + $pending = $this->datagramExecutor->query($query); + + return new Promise(function ($resolve, $reject) use (&$pending, $stream, $query) { + $pending->then( + $resolve, + function ($e) use (&$pending, $stream, $query, $resolve, $reject) { + if ($e->getCode() === (\defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90)) { + $pending = $stream->query($query)->then($resolve, $reject); + } else { + $reject($e); + } + } + ); + }, function () use (&$pending) { + $pending->cancel(); + $pending = null; + }); + } +} diff --git a/vendor/react/dns/src/Query/TcpTransportExecutor.php b/vendor/react/dns/src/Query/TcpTransportExecutor.php new file mode 100644 index 000000000..669fd012f --- /dev/null +++ b/vendor/react/dns/src/Query/TcpTransportExecutor.php @@ -0,0 +1,382 @@ +query( + * new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) + * )->then(function (Message $message) { + * foreach ($message->answers as $answer) { + * echo 'IPv6: ' . $answer->data . PHP_EOL; + * } + * }, 'printf'); + * ``` + * + * See also [example #92](examples). + * + * Note that this executor does not implement a timeout, so you will very likely + * want to use this in combination with a `TimeoutExecutor` like this: + * + * ```php + * $executor = new TimeoutExecutor( + * new TcpTransportExecutor($nameserver), + * 3.0 + * ); + * ``` + * + * Unlike the `UdpTransportExecutor`, this class uses a reliable TCP/IP + * transport, so you do not necessarily have to implement any retry logic. + * + * Note that this executor is entirely async and as such allows you to execute + * queries concurrently. The first query will establish a TCP/IP socket + * connection to the DNS server which will be kept open for a short period. + * Additional queries will automatically reuse this existing socket connection + * to the DNS server, will pipeline multiple requests over this single + * connection and will keep an idle connection open for a short period. The + * initial TCP/IP connection overhead may incur a slight delay if you only send + * occasional queries – when sending a larger number of concurrent queries over + * an existing connection, it becomes increasingly more efficient and avoids + * creating many concurrent sockets like the UDP-based executor. You may still + * want to limit the number of (concurrent) queries in your application or you + * may be facing rate limitations and bans on the resolver end. For many common + * applications, you may want to avoid sending the same query multiple times + * when the first one is still pending, so you will likely want to use this in + * combination with a `CoopExecutor` like this: + * + * ```php + * $executor = new CoopExecutor( + * new TimeoutExecutor( + * new TcpTransportExecutor($nameserver), + * 3.0 + * ) + * ); + * ``` + * + * > Internally, this class uses PHP's TCP/IP sockets and does not take advantage + * of [react/socket](https://github.com/reactphp/socket) purely for + * organizational reasons to avoid a cyclic dependency between the two + * packages. Higher-level components should take advantage of the Socket + * component instead of reimplementing this socket logic from scratch. + */ +class TcpTransportExecutor implements ExecutorInterface +{ + private $nameserver; + private $loop; + private $parser; + private $dumper; + + /** + * @var ?resource + */ + private $socket; + + /** + * @var Deferred[] + */ + private $pending = array(); + + /** + * @var string[] + */ + private $names = array(); + + /** + * Maximum idle time when socket is current unused (i.e. no pending queries outstanding) + * + * If a new query is to be sent during the idle period, we can reuse the + * existing socket without having to wait for a new socket connection. + * This uses a rather small, hard-coded value to not keep any unneeded + * sockets open and to not keep the loop busy longer than needed. + * + * A future implementation may take advantage of `edns-tcp-keepalive` to keep + * the socket open for longer periods. This will likely require explicit + * configuration because this may consume additional resources and also keep + * the loop busy for longer than expected in some applications. + * + * @var float + * @link https://tools.ietf.org/html/rfc7766#section-6.2.1 + * @link https://tools.ietf.org/html/rfc7828 + */ + private $idlePeriod = 0.001; + + /** + * @var ?\React\EventLoop\TimerInterface + */ + private $idleTimer; + + private $writeBuffer = ''; + private $writePending = false; + + private $readBuffer = ''; + private $readPending = false; + + /** @var string */ + private $readChunk = 0xffff; + + /** + * @param string $nameserver + * @param ?LoopInterface $loop + */ + public function __construct($nameserver, $loop = null) + { + if (\strpos($nameserver, '[') === false && \substr_count($nameserver, ':') >= 2 && \strpos($nameserver, '://') === false) { + // several colons, but not enclosed in square brackets => enclose IPv6 address in square brackets + $nameserver = '[' . $nameserver . ']'; + } + + $parts = \parse_url((\strpos($nameserver, '://') === false ? 'tcp://' : '') . $nameserver); + if (!isset($parts['scheme'], $parts['host']) || $parts['scheme'] !== 'tcp' || @\inet_pton(\trim($parts['host'], '[]')) === false) { + throw new \InvalidArgumentException('Invalid nameserver address given'); + } + + if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); + } + + $this->nameserver = 'tcp://' . $parts['host'] . ':' . (isset($parts['port']) ? $parts['port'] : 53); + $this->loop = $loop ?: Loop::get(); + $this->parser = new Parser(); + $this->dumper = new BinaryDumper(); + } + + public function query(Query $query) + { + $request = Message::createRequestForQuery($query); + + // keep shuffing message ID to avoid using the same message ID for two pending queries at the same time + while (isset($this->pending[$request->id])) { + $request->id = \mt_rand(0, 0xffff); // @codeCoverageIgnore + } + + $queryData = $this->dumper->toBinary($request); + $length = \strlen($queryData); + if ($length > 0xffff) { + return \React\Promise\reject(new \RuntimeException( + 'DNS query for ' . $query->describe() . ' failed: Query too large for TCP transport' + )); + } + + $queryData = \pack('n', $length) . $queryData; + + if ($this->socket === null) { + // create async TCP/IP connection (may take a while) + $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT); + if ($socket === false) { + return \React\Promise\reject(new \RuntimeException( + 'DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', + $errno + )); + } + + // set socket to non-blocking and wait for it to become writable (connection success/rejected) + \stream_set_blocking($socket, false); + if (\function_exists('stream_set_chunk_size')) { + \stream_set_chunk_size($socket, $this->readChunk); // @codeCoverageIgnore + } + $this->socket = $socket; + } + + if ($this->idleTimer !== null) { + $this->loop->cancelTimer($this->idleTimer); + $this->idleTimer = null; + } + + // wait for socket to become writable to actually write out data + $this->writeBuffer .= $queryData; + if (!$this->writePending) { + $this->writePending = true; + $this->loop->addWriteStream($this->socket, array($this, 'handleWritable')); + } + + $names =& $this->names; + $that = $this; + $deferred = new Deferred(function () use ($that, &$names, $request) { + // remove from list of pending names, but remember pending query + $name = $names[$request->id]; + unset($names[$request->id]); + $that->checkIdle(); + + throw new CancellationException('DNS query for ' . $name . ' has been cancelled'); + }); + + $this->pending[$request->id] = $deferred; + $this->names[$request->id] = $query->describe(); + + return $deferred->promise(); + } + + /** + * @internal + */ + public function handleWritable() + { + if ($this->readPending === false) { + $name = @\stream_socket_get_name($this->socket, true); + if ($name === false) { + // Connection failed? Check socket error if available for underlying errno/errstr. + // @codeCoverageIgnoreStart + if (\function_exists('socket_import_stream')) { + $socket = \socket_import_stream($this->socket); + $errno = \socket_get_option($socket, \SOL_SOCKET, \SO_ERROR); + $errstr = \socket_strerror($errno); + } else { + $errno = \defined('SOCKET_ECONNREFUSED') ? \SOCKET_ECONNREFUSED : 111; + $errstr = 'Connection refused'; + } + // @codeCoverageIgnoreEnd + + $this->closeError('Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno); + return; + } + + $this->readPending = true; + $this->loop->addReadStream($this->socket, array($this, 'handleRead')); + } + + $errno = 0; + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { + // Match errstr from PHP's warning message. + // fwrite(): Send of 327712 bytes failed with errno=32 Broken pipe + \preg_match('/errno=(\d+) (.+)/', $error, $m); + $errno = isset($m[1]) ? (int) $m[1] : 0; + $errstr = isset($m[2]) ? $m[2] : $error; + }); + + $written = \fwrite($this->socket, $this->writeBuffer); + + \restore_error_handler(); + + if ($written === false || $written === 0) { + $this->closeError( + 'Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', + $errno + ); + return; + } + + if (isset($this->writeBuffer[$written])) { + $this->writeBuffer = \substr($this->writeBuffer, $written); + } else { + $this->loop->removeWriteStream($this->socket); + $this->writePending = false; + $this->writeBuffer = ''; + } + } + + /** + * @internal + */ + public function handleRead() + { + // read one chunk of data from the DNS server + // any error is fatal, this is a stream of TCP/IP data + $chunk = @\fread($this->socket, $this->readChunk); + if ($chunk === false || $chunk === '') { + $this->closeError('Connection to DNS server ' . $this->nameserver . ' lost'); + return; + } + + // reassemble complete message by concatenating all chunks. + $this->readBuffer .= $chunk; + + // response message header contains at least 12 bytes + while (isset($this->readBuffer[11])) { + // read response message length from first 2 bytes and ensure we have length + data in buffer + list(, $length) = \unpack('n', $this->readBuffer); + if (!isset($this->readBuffer[$length + 1])) { + return; + } + + $data = \substr($this->readBuffer, 2, $length); + $this->readBuffer = (string)substr($this->readBuffer, $length + 2); + + try { + $response = $this->parser->parseMessage($data); + } catch (\Exception $e) { + // reject all pending queries if we received an invalid message from remote server + $this->closeError('Invalid message received from DNS server ' . $this->nameserver); + return; + } + + // reject all pending queries if we received an unexpected response ID or truncated response + if (!isset($this->pending[$response->id]) || $response->tc) { + $this->closeError('Invalid response message received from DNS server ' . $this->nameserver); + return; + } + + $deferred = $this->pending[$response->id]; + unset($this->pending[$response->id], $this->names[$response->id]); + + $deferred->resolve($response); + + $this->checkIdle(); + } + } + + /** + * @internal + * @param string $reason + * @param int $code + */ + public function closeError($reason, $code = 0) + { + $this->readBuffer = ''; + if ($this->readPending) { + $this->loop->removeReadStream($this->socket); + $this->readPending = false; + } + + $this->writeBuffer = ''; + if ($this->writePending) { + $this->loop->removeWriteStream($this->socket); + $this->writePending = false; + } + + if ($this->idleTimer !== null) { + $this->loop->cancelTimer($this->idleTimer); + $this->idleTimer = null; + } + + @\fclose($this->socket); + $this->socket = null; + + foreach ($this->names as $id => $name) { + $this->pending[$id]->reject(new \RuntimeException( + 'DNS query for ' . $name . ' failed: ' . $reason, + $code + )); + } + $this->pending = $this->names = array(); + } + + /** + * @internal + */ + public function checkIdle() + { + if ($this->idleTimer === null && !$this->names) { + $that = $this; + $this->idleTimer = $this->loop->addTimer($this->idlePeriod, function () use ($that) { + $that->closeError('Idle timeout'); + }); + } + } +} diff --git a/vendor/react/dns/src/Query/TimeoutException.php b/vendor/react/dns/src/Query/TimeoutException.php new file mode 100644 index 000000000..109b0a9d0 --- /dev/null +++ b/vendor/react/dns/src/Query/TimeoutException.php @@ -0,0 +1,7 @@ +executor = $executor; + $this->loop = $loop ?: Loop::get(); + $this->timeout = $timeout; + } + + public function query(Query $query) + { + $promise = $this->executor->query($query); + + $loop = $this->loop; + $time = $this->timeout; + return new Promise(function ($resolve, $reject) use ($loop, $time, $promise, $query) { + $timer = null; + $promise = $promise->then(function ($v) use (&$timer, $loop, $resolve) { + if ($timer) { + $loop->cancelTimer($timer); + } + $timer = false; + $resolve($v); + }, function ($v) use (&$timer, $loop, $reject) { + if ($timer) { + $loop->cancelTimer($timer); + } + $timer = false; + $reject($v); + }); + + // promise already resolved => no need to start timer + if ($timer === false) { + return; + } + + // start timeout timer which will cancel the pending promise + $timer = $loop->addTimer($time, function () use ($time, &$promise, $reject, $query) { + $reject(new TimeoutException( + 'DNS query for ' . $query->describe() . ' timed out' + )); + + // Cancel pending query to clean up any underlying resources and references. + // Avoid garbage references in call stack by passing pending promise by reference. + assert(\method_exists($promise, 'cancel')); + $promise->cancel(); + $promise = null; + }); + }, function () use (&$promise) { + // Cancelling this promise will cancel the pending query, thus triggering the rejection logic above. + // Avoid garbage references in call stack by passing pending promise by reference. + assert(\method_exists($promise, 'cancel')); + $promise->cancel(); + $promise = null; + }); + } +} diff --git a/vendor/react/dns/src/Query/UdpTransportExecutor.php b/vendor/react/dns/src/Query/UdpTransportExecutor.php new file mode 100644 index 000000000..a8cbfafa2 --- /dev/null +++ b/vendor/react/dns/src/Query/UdpTransportExecutor.php @@ -0,0 +1,221 @@ +query( + * new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) + * )->then(function (Message $message) { + * foreach ($message->answers as $answer) { + * echo 'IPv6: ' . $answer->data . PHP_EOL; + * } + * }, 'printf'); + * ``` + * + * See also the [fourth example](examples). + * + * Note that this executor does not implement a timeout, so you will very likely + * want to use this in combination with a `TimeoutExecutor` like this: + * + * ```php + * $executor = new TimeoutExecutor( + * new UdpTransportExecutor($nameserver), + * 3.0 + * ); + * ``` + * + * Also note that this executor uses an unreliable UDP transport and that it + * does not implement any retry logic, so you will likely want to use this in + * combination with a `RetryExecutor` like this: + * + * ```php + * $executor = new RetryExecutor( + * new TimeoutExecutor( + * new UdpTransportExecutor($nameserver), + * 3.0 + * ) + * ); + * ``` + * + * Note that this executor is entirely async and as such allows you to execute + * any number of queries concurrently. You should probably limit the number of + * concurrent queries in your application or you're very likely going to face + * rate limitations and bans on the resolver end. For many common applications, + * you may want to avoid sending the same query multiple times when the first + * one is still pending, so you will likely want to use this in combination with + * a `CoopExecutor` like this: + * + * ```php + * $executor = new CoopExecutor( + * new RetryExecutor( + * new TimeoutExecutor( + * new UdpTransportExecutor($nameserver), + * 3.0 + * ) + * ) + * ); + * ``` + * + * > Internally, this class uses PHP's UDP sockets and does not take advantage + * of [react/datagram](https://github.com/reactphp/datagram) purely for + * organizational reasons to avoid a cyclic dependency between the two + * packages. Higher-level components should take advantage of the Datagram + * component instead of reimplementing this socket logic from scratch. + */ +final class UdpTransportExecutor implements ExecutorInterface +{ + private $nameserver; + private $loop; + private $parser; + private $dumper; + + /** + * maximum UDP packet size to send and receive + * + * @var int + */ + private $maxPacketSize = 512; + + /** + * @param string $nameserver + * @param ?LoopInterface $loop + */ + public function __construct($nameserver, $loop = null) + { + if (\strpos($nameserver, '[') === false && \substr_count($nameserver, ':') >= 2 && \strpos($nameserver, '://') === false) { + // several colons, but not enclosed in square brackets => enclose IPv6 address in square brackets + $nameserver = '[' . $nameserver . ']'; + } + + $parts = \parse_url((\strpos($nameserver, '://') === false ? 'udp://' : '') . $nameserver); + if (!isset($parts['scheme'], $parts['host']) || $parts['scheme'] !== 'udp' || @\inet_pton(\trim($parts['host'], '[]')) === false) { + throw new \InvalidArgumentException('Invalid nameserver address given'); + } + + if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); + } + + $this->nameserver = 'udp://' . $parts['host'] . ':' . (isset($parts['port']) ? $parts['port'] : 53); + $this->loop = $loop ?: Loop::get(); + $this->parser = new Parser(); + $this->dumper = new BinaryDumper(); + } + + public function query(Query $query) + { + $request = Message::createRequestForQuery($query); + + $queryData = $this->dumper->toBinary($request); + if (isset($queryData[$this->maxPacketSize])) { + return \React\Promise\reject(new \RuntimeException( + 'DNS query for ' . $query->describe() . ' failed: Query too large for UDP transport', + \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90 + )); + } + + // UDP connections are instant, so try connection without a loop or timeout + $errno = 0; + $errstr = ''; + $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0); + if ($socket === false) { + return \React\Promise\reject(new \RuntimeException( + 'DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', + $errno + )); + } + + // set socket to non-blocking and immediately try to send (fill write buffer) + \stream_set_blocking($socket, false); + + \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { + // Write may potentially fail, but most common errors are already caught by connection check above. + // Among others, macOS is known to report here when trying to send to broadcast address. + // This can also be reproduced by writing data exceeding `stream_set_chunk_size()` to a server refusing UDP data. + // fwrite(): send of 8192 bytes failed with errno=111 Connection refused + \preg_match('/errno=(\d+) (.+)/', $error, $m); + $errno = isset($m[1]) ? (int) $m[1] : 0; + $errstr = isset($m[2]) ? $m[2] : $error; + }); + + $written = \fwrite($socket, $queryData); + + \restore_error_handler(); + + if ($written !== \strlen($queryData)) { + return \React\Promise\reject(new \RuntimeException( + 'DNS query for ' . $query->describe() . ' failed: Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', + $errno + )); + } + + $loop = $this->loop; + $deferred = new Deferred(function () use ($loop, $socket, $query) { + // cancellation should remove socket from loop and close socket + $loop->removeReadStream($socket); + \fclose($socket); + + throw new CancellationException('DNS query for ' . $query->describe() . ' has been cancelled'); + }); + + $max = $this->maxPacketSize; + $parser = $this->parser; + $nameserver = $this->nameserver; + $loop->addReadStream($socket, function ($socket) use ($loop, $deferred, $query, $parser, $request, $max, $nameserver) { + // try to read a single data packet from the DNS server + // ignoring any errors, this is uses UDP packets and not a stream of data + $data = @\fread($socket, $max); + if ($data === false) { + return; + } + + try { + $response = $parser->parseMessage($data); + } catch (\Exception $e) { + // ignore and await next if we received an invalid message from remote server + // this may as well be a fake response from an attacker (possible DOS) + return; + } + + // ignore and await next if we received an unexpected response ID + // this may as well be a fake response from an attacker (possible cache poisoning) + if ($response->id !== $request->id) { + return; + } + + // we only react to the first valid message, so remove socket from loop and close + $loop->removeReadStream($socket); + \fclose($socket); + + if ($response->tc) { + $deferred->reject(new \RuntimeException( + 'DNS query for ' . $query->describe() . ' failed: The DNS server ' . $nameserver . ' returned a truncated result for a UDP query', + \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90 + )); + return; + } + + $deferred->resolve($response); + }); + + return $deferred->promise(); + } +} diff --git a/vendor/react/dns/src/RecordNotFoundException.php b/vendor/react/dns/src/RecordNotFoundException.php new file mode 100644 index 000000000..3b7027428 --- /dev/null +++ b/vendor/react/dns/src/RecordNotFoundException.php @@ -0,0 +1,7 @@ +decorateHostsFileExecutor($this->createExecutor($config, $loop ?: Loop::get())); + + return new Resolver($executor); + } + + /** + * Creates a cached DNS resolver instance for the given DNS config and cache + * + * As of v1.7.0 it's recommended to pass a `Config` object instead of a + * single nameserver address. If the given config contains more than one DNS + * nameserver, all DNS nameservers will be used in order. The primary DNS + * server will always be used first before falling back to the secondary or + * tertiary DNS server. + * + * @param Config|string $config DNS Config object (recommended) or single nameserver address + * @param ?LoopInterface $loop + * @param ?CacheInterface $cache + * @return \React\Dns\Resolver\ResolverInterface + * @throws \InvalidArgumentException for invalid DNS server address + * @throws \UnderflowException when given DNS Config object has an empty list of nameservers + */ + public function createCached($config, $loop = null, $cache = null) + { + if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); + } + + if ($cache !== null && !$cache instanceof CacheInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #3 ($cache) expected null|React\Cache\CacheInterface'); + } + + // default to keeping maximum of 256 responses in cache unless explicitly given + if (!($cache instanceof CacheInterface)) { + $cache = new ArrayCache(256); + } + + $executor = $this->createExecutor($config, $loop ?: Loop::get()); + $executor = new CachingExecutor($executor, $cache); + $executor = $this->decorateHostsFileExecutor($executor); + + return new Resolver($executor); + } + + /** + * Tries to load the hosts file and decorates the given executor on success + * + * @param ExecutorInterface $executor + * @return ExecutorInterface + * @codeCoverageIgnore + */ + private function decorateHostsFileExecutor(ExecutorInterface $executor) + { + try { + $executor = new HostsFileExecutor( + HostsFile::loadFromPathBlocking(), + $executor + ); + } catch (\RuntimeException $e) { + // ignore this file if it can not be loaded + } + + // Windows does not store localhost in hosts file by default but handles this internally + // To compensate for this, we explicitly use hard-coded defaults for localhost + if (DIRECTORY_SEPARATOR === '\\') { + $executor = new HostsFileExecutor( + new HostsFile("127.0.0.1 localhost\n::1 localhost"), + $executor + ); + } + + return $executor; + } + + /** + * @param Config|string $nameserver + * @param LoopInterface $loop + * @return CoopExecutor + * @throws \InvalidArgumentException for invalid DNS server address + * @throws \UnderflowException when given DNS Config object has an empty list of nameservers + */ + private function createExecutor($nameserver, LoopInterface $loop) + { + if ($nameserver instanceof Config) { + if (!$nameserver->nameservers) { + throw new \UnderflowException('Empty config with no DNS servers'); + } + + // Hard-coded to check up to 3 DNS servers to match default limits in place in most systems (see MAXNS config). + // Note to future self: Recursion isn't too hard, but how deep do we really want to go? + $primary = reset($nameserver->nameservers); + $secondary = next($nameserver->nameservers); + $tertiary = next($nameserver->nameservers); + + if ($tertiary !== false) { + // 3 DNS servers given => nest first with fallback for second and third + return new CoopExecutor( + new RetryExecutor( + new FallbackExecutor( + $this->createSingleExecutor($primary, $loop), + new FallbackExecutor( + $this->createSingleExecutor($secondary, $loop), + $this->createSingleExecutor($tertiary, $loop) + ) + ) + ) + ); + } elseif ($secondary !== false) { + // 2 DNS servers given => fallback from first to second + return new CoopExecutor( + new RetryExecutor( + new FallbackExecutor( + $this->createSingleExecutor($primary, $loop), + $this->createSingleExecutor($secondary, $loop) + ) + ) + ); + } else { + // 1 DNS server given => use single executor + $nameserver = $primary; + } + } + + return new CoopExecutor(new RetryExecutor($this->createSingleExecutor($nameserver, $loop))); + } + + /** + * @param string $nameserver + * @param LoopInterface $loop + * @return ExecutorInterface + * @throws \InvalidArgumentException for invalid DNS server address + */ + private function createSingleExecutor($nameserver, LoopInterface $loop) + { + $parts = \parse_url($nameserver); + + if (isset($parts['scheme']) && $parts['scheme'] === 'tcp') { + $executor = $this->createTcpExecutor($nameserver, $loop); + } elseif (isset($parts['scheme']) && $parts['scheme'] === 'udp') { + $executor = $this->createUdpExecutor($nameserver, $loop); + } else { + $executor = new SelectiveTransportExecutor( + $this->createUdpExecutor($nameserver, $loop), + $this->createTcpExecutor($nameserver, $loop) + ); + } + + return $executor; + } + + /** + * @param string $nameserver + * @param LoopInterface $loop + * @return TimeoutExecutor + * @throws \InvalidArgumentException for invalid DNS server address + */ + private function createTcpExecutor($nameserver, LoopInterface $loop) + { + return new TimeoutExecutor( + new TcpTransportExecutor($nameserver, $loop), + 5.0, + $loop + ); + } + + /** + * @param string $nameserver + * @param LoopInterface $loop + * @return TimeoutExecutor + * @throws \InvalidArgumentException for invalid DNS server address + */ + private function createUdpExecutor($nameserver, LoopInterface $loop) + { + return new TimeoutExecutor( + new UdpTransportExecutor( + $nameserver, + $loop + ), + 5.0, + $loop + ); + } +} diff --git a/vendor/react/dns/src/Resolver/Resolver.php b/vendor/react/dns/src/Resolver/Resolver.php new file mode 100644 index 000000000..92926f3f1 --- /dev/null +++ b/vendor/react/dns/src/Resolver/Resolver.php @@ -0,0 +1,147 @@ +executor = $executor; + } + + public function resolve($domain) + { + return $this->resolveAll($domain, Message::TYPE_A)->then(function (array $ips) { + return $ips[array_rand($ips)]; + }); + } + + public function resolveAll($domain, $type) + { + $query = new Query($domain, $type, Message::CLASS_IN); + $that = $this; + + return $this->executor->query( + $query + )->then(function (Message $response) use ($query, $that) { + return $that->extractValues($query, $response); + }); + } + + /** + * [Internal] extract all resource record values from response for this query + * + * @param Query $query + * @param Message $response + * @return array + * @throws RecordNotFoundException when response indicates an error or contains no data + * @internal + */ + public function extractValues(Query $query, Message $response) + { + // reject if response code indicates this is an error response message + $code = $response->rcode; + if ($code !== Message::RCODE_OK) { + switch ($code) { + case Message::RCODE_FORMAT_ERROR: + $message = 'Format Error'; + break; + case Message::RCODE_SERVER_FAILURE: + $message = 'Server Failure'; + break; + case Message::RCODE_NAME_ERROR: + $message = 'Non-Existent Domain / NXDOMAIN'; + break; + case Message::RCODE_NOT_IMPLEMENTED: + $message = 'Not Implemented'; + break; + case Message::RCODE_REFUSED: + $message = 'Refused'; + break; + default: + $message = 'Unknown error response code ' . $code; + } + throw new RecordNotFoundException( + 'DNS query for ' . $query->describe() . ' returned an error response (' . $message . ')', + $code + ); + } + + $answers = $response->answers; + $addresses = $this->valuesByNameAndType($answers, $query->name, $query->type); + + // reject if we did not receive a valid answer (domain is valid, but no record for this type could be found) + if (0 === count($addresses)) { + throw new RecordNotFoundException( + 'DNS query for ' . $query->describe() . ' did not return a valid answer (NOERROR / NODATA)' + ); + } + + return array_values($addresses); + } + + /** + * @param \React\Dns\Model\Record[] $answers + * @param string $name + * @param int $type + * @return array + */ + private function valuesByNameAndType(array $answers, $name, $type) + { + // return all record values for this name and type (if any) + $named = $this->filterByName($answers, $name); + $records = $this->filterByType($named, $type); + if ($records) { + return $this->mapRecordData($records); + } + + // no matching records found? check if there are any matching CNAMEs instead + $cnameRecords = $this->filterByType($named, Message::TYPE_CNAME); + if ($cnameRecords) { + $cnames = $this->mapRecordData($cnameRecords); + foreach ($cnames as $cname) { + $records = array_merge( + $records, + $this->valuesByNameAndType($answers, $cname, $type) + ); + } + } + + return $records; + } + + private function filterByName(array $answers, $name) + { + return $this->filterByField($answers, 'name', $name); + } + + private function filterByType(array $answers, $type) + { + return $this->filterByField($answers, 'type', $type); + } + + private function filterByField(array $answers, $field, $value) + { + $value = strtolower($value); + return array_filter($answers, function ($answer) use ($field, $value) { + return $value === strtolower($answer->$field); + }); + } + + private function mapRecordData(array $records) + { + return array_map(function ($record) { + return $record->data; + }, $records); + } +} diff --git a/vendor/react/dns/src/Resolver/ResolverInterface.php b/vendor/react/dns/src/Resolver/ResolverInterface.php new file mode 100644 index 000000000..555a1cb13 --- /dev/null +++ b/vendor/react/dns/src/Resolver/ResolverInterface.php @@ -0,0 +1,94 @@ +resolve('reactphp.org')->then(function ($ip) { + * echo 'IP for reactphp.org is ' . $ip . PHP_EOL; + * }); + * ``` + * + * This is one of the main methods in this package. It sends a DNS query + * for the given $domain name to your DNS server and returns a single IP + * address on success. + * + * If the DNS server sends a DNS response message that contains more than + * one IP address for this query, it will randomly pick one of the IP + * addresses from the response. If you want the full list of IP addresses + * or want to send a different type of query, you should use the + * [`resolveAll()`](#resolveall) method instead. + * + * If the DNS server sends a DNS response message that indicates an error + * code, this method will reject with a `RecordNotFoundException`. Its + * message and code can be used to check for the response code. + * + * If the DNS communication fails and the server does not respond with a + * valid response message, this message will reject with an `Exception`. + * + * Pending DNS queries can be cancelled by cancelling its pending promise like so: + * + * ```php + * $promise = $resolver->resolve('reactphp.org'); + * + * $promise->cancel(); + * ``` + * + * @param string $domain + * @return \React\Promise\PromiseInterface + * resolves with a single IP address on success or rejects with an Exception on error. + */ + public function resolve($domain); + + /** + * Resolves all record values for the given $domain name and query $type. + * + * ```php + * $resolver->resolveAll('reactphp.org', Message::TYPE_A)->then(function ($ips) { + * echo 'IPv4 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL; + * }); + * + * $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then(function ($ips) { + * echo 'IPv6 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL; + * }); + * ``` + * + * This is one of the main methods in this package. It sends a DNS query + * for the given $domain name to your DNS server and returns a list with all + * record values on success. + * + * If the DNS server sends a DNS response message that contains one or more + * records for this query, it will return a list with all record values + * from the response. You can use the `Message::TYPE_*` constants to control + * which type of query will be sent. Note that this method always returns a + * list of record values, but each record value type depends on the query + * type. For example, it returns the IPv4 addresses for type `A` queries, + * the IPv6 addresses for type `AAAA` queries, the hostname for type `NS`, + * `CNAME` and `PTR` queries and structured data for other queries. See also + * the `Record` documentation for more details. + * + * If the DNS server sends a DNS response message that indicates an error + * code, this method will reject with a `RecordNotFoundException`. Its + * message and code can be used to check for the response code. + * + * If the DNS communication fails and the server does not respond with a + * valid response message, this message will reject with an `Exception`. + * + * Pending DNS queries can be cancelled by cancelling its pending promise like so: + * + * ```php + * $promise = $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA); + * + * $promise->cancel(); + * ``` + * + * @param string $domain + * @return \React\Promise\PromiseInterface + * Resolves with all record values on success or rejects with an Exception on error. + */ + public function resolveAll($domain, $type); +} diff --git a/vendor/react/event-loop/CHANGELOG.md b/vendor/react/event-loop/CHANGELOG.md new file mode 100644 index 000000000..e634b12ea --- /dev/null +++ b/vendor/react/event-loop/CHANGELOG.md @@ -0,0 +1,468 @@ +# Changelog + +## 1.5.0 (2023-11-13) + +* Feature: Improve performance by using `spl_object_id()` on PHP 7.2+. + (#267 by @samsonasik) + +* Feature: Full PHP 8.3 compatibility. + (#269 by @clue) + +* Update tests for `ext-uv` on PHP 8+ and legacy PHP. + (#270 by @clue and #268 by @SimonFrings) + +## 1.4.0 (2023-05-05) + +* Feature: Improve performance of `Loop` by avoiding unneeded method calls. + (#266 by @clue) + +* Feature: Support checking `EINTR` constant from `ext-pcntl` without `ext-sockets`. + (#265 by @clue) + +* Minor documentation improvements. + (#254 by @nhedger) + +* Improve test suite, run tests on PHP 8.2 and report failed assertions. + (#258 by @WyriHaximus, #264 by @clue and #251, #261 and #262 by @SimonFrings) + +## 1.3.0 (2022-03-17) + +* Feature: Improve default `StreamSelectLoop` to report any warnings for invalid streams. + (#245 by @clue) + +* Feature: Improve performance of `StreamSelectLoop` when no timers are scheduled. + (#246 by @clue) + +* Fix: Fix periodic timer with zero interval for `ExtEvLoop` and legacy `ExtLibevLoop`. + (#243 by @lucasnetau) + +* Minor documentation improvements, update PHP version references. + (#240, #248 and #250 by @SimonFrings, #241 by @dbu and #249 by @clue) + +* Improve test suite and test against PHP 8.1. + (#238 by @WyriHaximus and #242 by @clue) + +## 1.2.0 (2021-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop). + +* Feature: Introduce new concept of default loop with the new `Loop` class. + (#226 by @WyriHaximus, #229, #231 and #232 by @clue) + + The `Loop` class exists as a convenient global accessor for the event loop. + It provides all methods that exist on the `LoopInterface` as static methods and + will automatically execute the loop at the end of the program: + + ```php + $timer = Loop::addPeriodicTimer(0.1, function () { + echo 'Tick' . PHP_EOL; + }); + + Loop::addTimer(1.0, function () use ($timer) { + Loop::cancelTimer($timer); + echo 'Done' . PHP_EOL; + }); + ``` + + The explicit loop instructions are still valid and may still be useful in some applications, + especially for a transition period towards the more concise style. + The `Loop::get()` method can be used to get the currently active event loop instance. + + ```php + // deprecated + $loop = React\EventLoop\Factory::create(); + + // new + $loop = React\EventLoop\Loop::get(); + ``` + +* Minor documentation improvements and mark legacy extensions as deprecated. + (#234 by @SimonFrings, #214 by @WyriHaximus and #233 and #235 by @nhedger) + +* Improve test suite, use GitHub actions for continuous integration (CI), + update PHPUnit config and run tests on PHP 8. + (#212 and #215 by @SimonFrings and #230 by @clue) + +## 1.1.1 (2020-01-01) + +* Fix: Fix reporting connection refused errors with `ExtUvLoop` on Linux and `StreamSelectLoop` on Windows. + (#207 and #208 by @clue) + +* Fix: Fix unsupported EventConfig and `SEGFAULT` on shutdown with `ExtEventLoop` on Windows. + (#205 by @clue) + +* Fix: Prevent interval overflow for timers very far in the future with `ExtUvLoop`. + (#196 by @PabloKowalczyk) + +* Fix: Check PCNTL functions for signal support instead of PCNTL extension with `StreamSelectLoop`. + (#195 by @clue) + +* Add `.gitattributes` to exclude dev files from exports. + (#201 by @reedy) + +* Improve test suite to fix testing `ExtUvLoop` on Travis, + fix Travis CI builds, do not install `libuv` on legacy PHP setups, + fix failing test cases due to inaccurate timers, + run tests on Windows via Travis CI and + run tests on PHP 7.4 and simplify test matrix and test setup. + (#197 by @WyriHaximus and #202, #203, #204 and #209 by @clue) + +## 1.1.0 (2019-02-07) + +* New UV based event loop (ext-uv). + (#112 by @WyriHaximus) + +* Use high resolution timer on PHP 7.3+. + (#182 by @clue) + +* Improve PCNTL signals by using async signal dispatching if available. + (#179 by @CharlotteDunois) + +* Improve test suite and test suite set up. + (#174 by @WyriHaximus, #181 by @clue) + +* Fix PCNTL signals edge case. + (#183 by @clue) + +## 1.0.0 (2018-07-11) + +* First stable LTS release, now following [SemVer](https://semver.org/). + We'd like to emphasize that this component is production ready and battle-tested. + We plan to support all long-term support (LTS) releases for at least 24 months, + so you have a rock-solid foundation to build on top of. + +> Contains no other changes, so it's actually fully compatible with the v0.5.3 release. + +## 0.5.3 (2018-07-09) + +* Improve performance by importing global functions. + (#167 by @Ocramius) + +* Improve test suite by simplifying test bootstrap by using dev autoloader. + (#169 by @lcobucci) + +* Minor internal changes to improved backward compatibility with PHP 5.3. + (#166 by @Donatello-za) + +## 0.5.2 (2018-04-24) + +* Feature: Improve memory consumption and runtime performance for `StreamSelectLoop` timers. + (#164 by @clue) + +* Improve test suite by removing I/O dependency at `StreamSelectLoopTest` to fix Mac OS X tests. + (#161 by @nawarian) + +## 0.5.1 (2018-04-09) + +* Feature: New `ExtEvLoop` (PECL ext-ev) (#148 by @kaduev13) + +## 0.5.0 (2018-04-05) + +A major feature release with a significant documentation overhaul and long overdue API cleanup! + +This update involves a number of BC breaks due to dropped support for deprecated +functionality. We've tried hard to avoid BC breaks where possible and minimize +impact otherwise. We expect that most consumers of this package will actually +not be affected by any BC breaks, see below for more details. + +We realize that the changes listed below may seem overwhelming, but we've tried +to be very clear about any possible BC breaks. Don't worry: In fact, all ReactPHP +components are already compatible and support both this new release as well as +providing backwards compatibility with the last release. + +* Feature / BC break: Add support for signal handling via new + `LoopInterface::addSignal()` and `LoopInterface::removeSignal()` methods. + (#104 by @WyriHaximus and #111 and #150 by @clue) + + ```php + $loop->addSignal(SIGINT, function () { + echo 'CTRL-C'; + }); + ``` + +* Feature: Significant documentation updates for `LoopInterface` and `Factory`. + (#100, #119, #126, #127, #159 and #160 by @clue, #113 by @WyriHaximus and #81 and #91 by @jsor) + +* Feature: Add examples to ease getting started + (#99, #100 and #125 by @clue, #59 by @WyriHaximus and #143 by @jsor) + +* Feature: Documentation for advanced timer concepts, such as monotonic time source vs wall-clock time + and high precision timers with millisecond accuracy or below. + (#130 and #157 by @clue) + +* Feature: Documentation for advanced stream concepts, such as edge-triggered event listeners + and stream buffers and allow throwing Exception if stream resource is not supported. + (#129 and #158 by @clue) + +* Feature: Throw `BadMethodCallException` on manual loop creation when required extension isn't installed. + (#153 by @WyriHaximus) + +* Feature / BC break: First class support for legacy PHP 5.3 through PHP 7.2 and HHVM + and remove all `callable` type hints for consistency reasons. + (#141 and #151 by @clue) + +* BC break: Documentation for timer API and clean up unneeded timer API. + (#102 by @clue) + + Remove `TimerInterface::cancel()`, use `LoopInterface::cancelTimer()` instead: + + ```php + // old (method invoked on timer instance) + $timer->cancel(); + + // already supported before: invoke method on loop instance + $loop->cancelTimer($timer); + ``` + + Remove unneeded `TimerInterface::setData()` and `TimerInterface::getData()`, + use closure binding to add arbitrary data to timer instead: + + ```php + // old (limited setData() and getData() only allows single variable) + $name = 'Tester'; + $timer = $loop->addTimer(1.0, function ($timer) { + echo 'Hello ' . $timer->getData() . PHP_EOL; + }); + $timer->setData($name); + + // already supported before: closure binding allows any number of variables + $name = 'Tester'; + $loop->addTimer(1.0, function () use ($name) { + echo 'Hello ' . $name . PHP_EOL; + }); + ``` + + Remove unneeded `TimerInterface::getLoop()`, use closure binding instead: + + ```php + // old (getLoop() called on timer instance) + $loop->addTimer(0.1, function ($timer) { + $timer->getLoop()->stop(); + }); + + // already supported before: use closure binding as usual + $loop->addTimer(0.1, function () use ($loop) { + $loop->stop(); + }); + ``` + +* BC break: Remove unneeded `LoopInterface::isTimerActive()` and + `TimerInterface::isActive()` to reduce API surface. + (#133 by @clue) + + ```php + // old (method on timer instance or on loop instance) + $timer->isActive(); + $loop->isTimerActive($timer); + ``` + +* BC break: Move `TimerInterface` one level up to `React\EventLoop\TimerInterface`. + (#138 by @WyriHaximus) + + ```php + // old (notice obsolete "Timer" namespace) + assert($timer instanceof React\EventLoop\Timer\TimerInterface); + + // new + assert($timer instanceof React\EventLoop\TimerInterface); + ``` + +* BC break: Remove unneeded `LoopInterface::nextTick()` (and internal `NextTickQueue`), + use `LoopInterface::futureTick()` instead. + (#30 by @clue) + + ```php + // old (removed) + $loop->nextTick(function () { + echo 'tick'; + }); + + // already supported before + $loop->futureTick(function () { + echo 'tick'; + }); + ``` + +* BC break: Remove unneeded `$loop` argument for `LoopInterface::futureTick()` + (and fix internal cyclic dependency). + (#103 by @clue) + + ```php + // old ($loop gets passed by default) + $loop->futureTick(function ($loop) { + $loop->stop(); + }); + + // already supported before: use closure binding as usual + $loop->futureTick(function () use ($loop) { + $loop->stop(); + }); + ``` + +* BC break: Remove unneeded `LoopInterface::tick()`. + (#72 by @jsor) + + ```php + // old (removed) + $loop->tick(); + + // suggested work around for testing purposes only + $loop->futureTick(function () use ($loop) { + $loop->stop(); + }); + ``` + +* BC break: Documentation for advanced stream API and clean up unneeded stream API. + (#110 by @clue) + + Remove unneeded `$loop` argument for `LoopInterface::addReadStream()` + and `LoopInterface::addWriteStream()`, use closure binding instead: + + ```php + // old ($loop gets passed by default) + $loop->addReadStream($stream, function ($stream, $loop) { + $loop->removeReadStream($stream); + }); + + // already supported before: use closure binding as usual + $loop->addReadStream($stream, function ($stream) use ($loop) { + $loop->removeReadStream($stream); + }); + ``` + +* BC break: Remove unneeded `LoopInterface::removeStream()` method, + use `LoopInterface::removeReadStream()` and `LoopInterface::removeWriteStream()` instead. + (#118 by @clue) + + ```php + // old + $loop->removeStream($stream); + + // already supported before + $loop->removeReadStream($stream); + $loop->removeWriteStream($stream); + ``` + +* BC break: Rename `LibEventLoop` to `ExtLibeventLoop` and `LibEvLoop` to `ExtLibevLoop` + for consistent naming for event loop implementations. + (#128 by @clue) + +* BC break: Remove optional `EventBaseConfig` argument from `ExtEventLoop` + and make its `FEATURE_FDS` enabled by default. + (#156 by @WyriHaximus) + +* BC break: Mark all classes as final to discourage inheritance. + (#131 by @clue) + +* Fix: Fix `ExtEventLoop` to keep track of stream resources (refcount) + (#123 by @clue) + +* Fix: Ensure large timer interval does not overflow on 32bit systems + (#132 by @clue) + +* Fix: Fix separately removing readable and writable side of stream when closing + (#139 by @clue) + +* Fix: Properly clean up event watchers for `ext-event` and `ext-libev` + (#149 by @clue) + +* Fix: Minor code cleanup and remove unneeded references + (#145 by @seregazhuk) + +* Fix: Discourage outdated `ext-libevent` on PHP 7 + (#62 by @cboden) + +* Improve test suite by adding forward compatibility with PHPUnit 6 and PHPUnit 5, + lock Travis distro so new defaults will not break the build, + improve test suite to be less fragile and increase test timeouts, + test against PHP 7.2 and reduce fwrite() call length to one chunk. + (#106 and #144 by @clue, #120 and #124 by @carusogabriel, #147 by nawarian and #92 by @kelunik) + +* A number of changes were originally planned for this release but have been backported + to the last `v0.4.3` already: #74, #76, #79, #81 (refs #65, #66, #67), #88 and #93 + +## 0.4.3 (2017-04-27) + +* Bug fix: Bugfix in the usage sample code #57 (@dandelionred) +* Improvement: Remove branch-alias definition #53 (@WyriHaximus) +* Improvement: StreamSelectLoop: Use fresh time so Timers added during stream events are accurate #51 (@andrewminerd) +* Improvement: Avoid deprecation warnings in test suite due to deprecation of getMock() in PHPUnit #68 (@martinschroeder) +* Improvement: Add PHPUnit 4.8 to require-dev #69 (@shaunbramley) +* Improvement: Increase test timeouts for HHVM and unify timeout handling #70 (@clue) +* Improvement: Travis improvements (backported from #74) #75 (@clue) +* Improvement: Test suite now uses socket pairs instead of memory streams #66 (@martinschroeder) +* Improvement: StreamSelectLoop: Test suite uses signal constant names in data provider #67 (@martinschroeder) +* Improvement: ExtEventLoop: No longer suppress all errors #65 (@mamciek) +* Improvement: Readme cleanup #89 (@jsor) +* Improvement: Restructure and improve README #90 (@jsor) +* Bug fix: StreamSelectLoop: Fix erroneous zero-time sleep (backport to 0.4) #94 (@jsor) + +## 0.4.2 (2016-03-07) + +* Bug fix: No longer error when signals sent to StreamSelectLoop +* Support HHVM and PHP7 (@ondrejmirtes, @cebe) +* Feature: Added support for EventConfig for ExtEventLoop (@steverhoades) +* Bug fix: Fixed an issue loading loop extension libs via autoloader (@czarpino) + +## 0.4.1 (2014-04-13) + +* Bug fix: null timeout in StreamSelectLoop causing 100% CPU usage (@clue) +* Bug fix: v0.3.4 changes merged for v0.4.1 + +## 0.4.0 (2014-02-02) + +* Feature: Added `EventLoopInterface::nextTick()`, implemented in all event loops (@jmalloc) +* Feature: Added `EventLoopInterface::futureTick()`, implemented in all event loops (@jmalloc) +* Feature: Added `ExtEventLoop` implementation using pecl/event (@jmalloc) +* BC break: Bump minimum PHP version to PHP 5.4, remove 5.3 specific hacks +* BC break: New method: `EventLoopInterface::nextTick()` +* BC break: New method: `EventLoopInterface::futureTick()` +* Dependency: Autoloading and filesystem structure now PSR-4 instead of PSR-0 + +## 0.3.5 (2016-12-28) + +This is a compatibility release that eases upgrading to the v0.4 release branch. +You should consider upgrading to the v0.4 release branch. + +* Feature: Cap min timer interval at 1µs, thus improving compatibility with v0.4 + (#47 by @clue) + +## 0.3.4 (2014-03-30) + +* Bug fix: Changed StreamSelectLoop to use non-blocking behavior on tick() (@astephens25) + +## 0.3.3 (2013-07-08) + +* Bug fix: No error on removing non-existent streams (@clue) +* Bug fix: Do not silently remove feof listeners in `LibEvLoop` + +## 0.3.0 (2013-04-14) + +* BC break: New timers API (@nrk) +* BC break: Remove check on return value from stream callbacks (@nrk) + +## 0.2.7 (2013-01-05) + +* Bug fix: Fix libevent timers with PHP 5.3 +* Bug fix: Fix libevent timer cancellation (@nrk) + +## 0.2.6 (2012-12-26) + +* Bug fix: Plug memory issue in libevent timers (@cameronjacobson) +* Bug fix: Correctly pause LibEvLoop on stop() + +## 0.2.3 (2012-11-14) + +* Feature: LibEvLoop, integration of `php-libev` + +## 0.2.0 (2012-09-10) + +* Version bump + +## 0.1.1 (2012-07-12) + +* Version bump + +## 0.1.0 (2012-07-11) + +* First tagged release diff --git a/vendor/react/event-loop/LICENSE b/vendor/react/event-loop/LICENSE new file mode 100644 index 000000000..d6f8901f9 --- /dev/null +++ b/vendor/react/event-loop/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/react/event-loop/README.md b/vendor/react/event-loop/README.md new file mode 100644 index 000000000..88a3e18b8 --- /dev/null +++ b/vendor/react/event-loop/README.md @@ -0,0 +1,930 @@ +# EventLoop + +[![CI status](https://github.com/reactphp/event-loop/actions/workflows/ci.yml/badge.svg)](https://github.com/reactphp/event-loop/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/event-loop?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/event-loop) + +[ReactPHP](https://reactphp.org/)'s core reactor event loop that libraries can use for evented I/O. + +In order for async based libraries to be interoperable, they need to use the +same event loop. This component provides a common `LoopInterface` that any +library can target. This allows them to be used in the same loop, with one +single [`run()`](#run) call that is controlled by the user. + +**Table of contents** + +* [Quickstart example](#quickstart-example) +* [Usage](#usage) + * [Loop](#loop) + * [Loop methods](#loop-methods) + * [Loop autorun](#loop-autorun) + * [get()](#get) + * [~~Factory~~](#factory) + * [~~create()~~](#create) + * [Loop implementations](#loop-implementations) + * [StreamSelectLoop](#streamselectloop) + * [ExtEventLoop](#exteventloop) + * [ExtEvLoop](#extevloop) + * [ExtUvLoop](#extuvloop) + * [~~ExtLibeventLoop~~](#extlibeventloop) + * [~~ExtLibevLoop~~](#extlibevloop) + * [LoopInterface](#loopinterface) + * [run()](#run) + * [stop()](#stop) + * [addTimer()](#addtimer) + * [addPeriodicTimer()](#addperiodictimer) + * [cancelTimer()](#canceltimer) + * [futureTick()](#futuretick) + * [addSignal()](#addsignal) + * [removeSignal()](#removesignal) + * [addReadStream()](#addreadstream) + * [addWriteStream()](#addwritestream) + * [removeReadStream()](#removereadstream) + * [removeWriteStream()](#removewritestream) +* [Install](#install) +* [Tests](#tests) +* [License](#license) +* [More](#more) + +## Quickstart example + +Here is an async HTTP server built with just the event loop. + +```php +addPeriodicTimer(0.1, function () { + echo 'Tick' . PHP_EOL; +}); + +$loop->addTimer(1.0, function () use ($loop, $timer) { + $loop->cancelTimer($timer); + echo 'Done' . PHP_EOL; +}); + +$loop->run(); +``` + +While the former is more concise, the latter is more explicit. +In both cases, the program would perform the exact same steps. + +1. The event loop instance is created at the beginning of the program. This is + implicitly done the first time you call the [`Loop` class](#loop) or + explicitly when using the deprecated [`Factory::create()` method](#create) + (or manually instantiating any of the [loop implementations](#loop-implementations)). +2. The event loop is used directly or passed as an instance to library and + application code. In this example, a periodic timer is registered with the + event loop which simply outputs `Tick` every fraction of a second until another + timer stops the periodic timer after a second. +3. The event loop is run at the end of the program. This is automatically done + when using the [`Loop` class](#loop) or explicitly with a single [`run()`](#run) + call at the end of the program. + +As of `v1.2.0`, we highly recommend using the [`Loop` class](#loop). +The explicit loop instructions are still valid and may still be useful in some +applications, especially for a transition period towards the more concise style. + +### Loop + +The `Loop` class exists as a convenient global accessor for the event loop. + +#### Loop methods + +The `Loop` class provides all methods that exist on the [`LoopInterface`](#loopinterface) +as static methods: + +* [run()](#run) +* [stop()](#stop) +* [addTimer()](#addtimer) +* [addPeriodicTimer()](#addperiodictimer) +* [cancelTimer()](#canceltimer) +* [futureTick()](#futuretick) +* [addSignal()](#addsignal) +* [removeSignal()](#removesignal) +* [addReadStream()](#addreadstream) +* [addWriteStream()](#addwritestream) +* [removeReadStream()](#removereadstream) +* [removeWriteStream()](#removewritestream) + +If you're working with the event loop in your application code, it's often +easiest to directly interface with the static methods defined on the `Loop` class +like this: + +```php +use React\EventLoop\Loop; + +$timer = Loop::addPeriodicTimer(0.1, function () { + echo 'Tick' . PHP_EOL; +}); + +Loop::addTimer(1.0, function () use ($timer) { + Loop::cancelTimer($timer); + echo 'Done' . PHP_EOL; +}); +``` + +On the other hand, if you're familiar with object-oriented programming (OOP) and +dependency injection (DI), you may want to inject an event loop instance and +invoke instance methods on the `LoopInterface` like this: + +```php +use React\EventLoop\Loop; +use React\EventLoop\LoopInterface; + +class Greeter +{ + private $loop; + + public function __construct(LoopInterface $loop) + { + $this->loop = $loop; + } + + public function greet(string $name) + { + $this->loop->addTimer(1.0, function () use ($name) { + echo 'Hello ' . $name . '!' . PHP_EOL; + }); + } +} + +$greeter = new Greeter(Loop::get()); +$greeter->greet('Alice'); +$greeter->greet('Bob'); +``` + +Each static method call will be forwarded as-is to the underlying event loop +instance by using the [`Loop::get()`](#get) call internally. +See [`LoopInterface`](#loopinterface) for more details about available methods. + +#### Loop autorun + +When using the `Loop` class, it will automatically execute the loop at the end of +the program. This means the following example will schedule a timer and will +automatically execute the program until the timer event fires: + +```php +use React\EventLoop\Loop; + +Loop::addTimer(1.0, function () { + echo 'Hello' . PHP_EOL; +}); +``` + +As of `v1.2.0`, we highly recommend using the `Loop` class this way and omitting any +explicit [`run()`](#run) calls. For BC reasons, the explicit [`run()`](#run) +method is still valid and may still be useful in some applications, especially +for a transition period towards the more concise style. + +If you don't want the `Loop` to run automatically, you can either explicitly +[`run()`](#run) or [`stop()`](#stop) it. This can be useful if you're using +a global exception handler like this: + +```php +use React\EventLoop\Loop; + +Loop::addTimer(10.0, function () { + echo 'Never happens'; +}); + +set_exception_handler(function (Throwable $e) { + echo 'Error: ' . $e->getMessage() . PHP_EOL; + Loop::stop(); +}); + +throw new RuntimeException('Demo'); +``` + +#### get() + +The `get(): LoopInterface` method can be used to +get the currently active event loop instance. + +This method will always return the same event loop instance throughout the +lifetime of your application. + +```php +use React\EventLoop\Loop; +use React\EventLoop\LoopInterface; + +$loop = Loop::get(); + +assert($loop instanceof LoopInterface); +assert($loop === Loop::get()); +``` + +This is particularly useful if you're using object-oriented programming (OOP) +and dependency injection (DI). In this case, you may want to inject an event +loop instance and invoke instance methods on the `LoopInterface` like this: + +```php +use React\EventLoop\Loop; +use React\EventLoop\LoopInterface; + +class Greeter +{ + private $loop; + + public function __construct(LoopInterface $loop) + { + $this->loop = $loop; + } + + public function greet(string $name) + { + $this->loop->addTimer(1.0, function () use ($name) { + echo 'Hello ' . $name . '!' . PHP_EOL; + }); + } +} + +$greeter = new Greeter(Loop::get()); +$greeter->greet('Alice'); +$greeter->greet('Bob'); +``` + +See [`LoopInterface`](#loopinterface) for more details about available methods. + +### ~~Factory~~ + +> Deprecated since v1.2.0, see [`Loop` class](#loop) instead. + +The deprecated `Factory` class exists as a convenient way to pick the best available +[event loop implementation](#loop-implementations). + +#### ~~create()~~ + +> Deprecated since v1.2.0, see [`Loop::get()`](#get) instead. + +The deprecated `create(): LoopInterface` method can be used to +create a new event loop instance: + +```php +// deprecated +$loop = React\EventLoop\Factory::create(); + +// new +$loop = React\EventLoop\Loop::get(); +``` + +This method always returns an instance implementing [`LoopInterface`](#loopinterface), +the actual [event loop implementation](#loop-implementations) is an implementation detail. + +This method should usually only be called once at the beginning of the program. + +### Loop implementations + +In addition to the [`LoopInterface`](#loopinterface), there are a number of +event loop implementations provided. + +All of the event loops support these features: + +* File descriptor polling +* One-off timers +* Periodic timers +* Deferred execution on future loop tick + +For most consumers of this package, the underlying event loop implementation is +an implementation detail. +You should use the [`Loop` class](#loop) to automatically create a new instance. + +Advanced! If you explicitly need a certain event loop implementation, you can +manually instantiate one of the following classes. +Note that you may have to install the required PHP extensions for the respective +event loop implementation first or they will throw a `BadMethodCallException` on creation. + +#### StreamSelectLoop + +A `stream_select()` based event loop. + +This uses the [`stream_select()`](https://www.php.net/manual/en/function.stream-select.php) +function and is the only implementation that works out of the box with PHP. + +This event loop works out of the box on PHP 5.3 through PHP 8+ and HHVM. +This means that no installation is required and this library works on all +platforms and supported PHP versions. +Accordingly, the [`Loop` class](#loop) and the deprecated [`Factory`](#factory) +will use this event loop by default if you do not install any of the event loop +extensions listed below. + +Under the hood, it does a simple `select` system call. +This system call is limited to the maximum file descriptor number of +`FD_SETSIZE` (platform dependent, commonly 1024) and scales with `O(m)` +(`m` being the maximum file descriptor number passed). +This means that you may run into issues when handling thousands of streams +concurrently and you may want to look into using one of the alternative +event loop implementations listed below in this case. +If your use case is among the many common use cases that involve handling only +dozens or a few hundred streams at once, then this event loop implementation +performs really well. + +If you want to use signal handling (see also [`addSignal()`](#addsignal) below), +this event loop implementation requires `ext-pcntl`. +This extension is only available for Unix-like platforms and does not support +Windows. +It is commonly installed as part of many PHP distributions. +If this extension is missing (or you're running on Windows), signal handling is +not supported and throws a `BadMethodCallException` instead. + +This event loop is known to rely on wall-clock time to schedule future timers +when using any version before PHP 7.3, because a monotonic time source is +only available as of PHP 7.3 (`hrtime()`). +While this does not affect many common use cases, this is an important +distinction for programs that rely on a high time precision or on systems +that are subject to discontinuous time adjustments (time jumps). +This means that if you schedule a timer to trigger in 30s on PHP < 7.3 and +then adjust your system time forward by 20s, the timer may trigger in 10s. +See also [`addTimer()`](#addtimer) for more details. + +#### ExtEventLoop + +An `ext-event` based event loop. + +This uses the [`event` PECL extension](https://pecl.php.net/package/event), +that provides an interface to `libevent` library. +`libevent` itself supports a number of system-specific backends (epoll, kqueue). + +This loop is known to work with PHP 5.4 through PHP 8+. + +#### ExtEvLoop + +An `ext-ev` based event loop. + +This loop uses the [`ev` PECL extension](https://pecl.php.net/package/ev), +that provides an interface to `libev` library. +`libev` itself supports a number of system-specific backends (epoll, kqueue). + + +This loop is known to work with PHP 5.4 through PHP 8+. + +#### ExtUvLoop + +An `ext-uv` based event loop. + +This loop uses the [`uv` PECL extension](https://pecl.php.net/package/uv), +that provides an interface to `libuv` library. +`libuv` itself supports a number of system-specific backends (epoll, kqueue). + +This loop is known to work with PHP 7+. + +#### ~~ExtLibeventLoop~~ + +> Deprecated since v1.2.0, use [`ExtEventLoop`](#exteventloop) instead. + +An `ext-libevent` based event loop. + +This uses the [`libevent` PECL extension](https://pecl.php.net/package/libevent), +that provides an interface to `libevent` library. +`libevent` itself supports a number of system-specific backends (epoll, kqueue). + +This event loop does only work with PHP 5. +An [unofficial update](https://github.com/php/pecl-event-libevent/pull/2) for +PHP 7 does exist, but it is known to cause regular crashes due to `SEGFAULT`s. +To reiterate: Using this event loop on PHP 7 is not recommended. +Accordingly, neither the [`Loop` class](#loop) nor the deprecated +[`Factory` class](#factory) will try to use this event loop on PHP 7. + +This event loop is known to trigger a readable listener only if +the stream *becomes* readable (edge-triggered) and may not trigger if the +stream has already been readable from the beginning. +This also implies that a stream may not be recognized as readable when data +is still left in PHP's internal stream buffers. +As such, it's recommended to use `stream_set_read_buffer($stream, 0);` +to disable PHP's internal read buffer in this case. +See also [`addReadStream()`](#addreadstream) for more details. + +#### ~~ExtLibevLoop~~ + +> Deprecated since v1.2.0, use [`ExtEvLoop`](#extevloop) instead. + +An `ext-libev` based event loop. + +This uses an [unofficial `libev` extension](https://github.com/m4rw3r/php-libev), +that provides an interface to `libev` library. +`libev` itself supports a number of system-specific backends (epoll, kqueue). + +This loop does only work with PHP 5. +An update for PHP 7 is [unlikely](https://github.com/m4rw3r/php-libev/issues/8) +to happen any time soon. + +### LoopInterface + +#### run() + +The `run(): void` method can be used to +run the event loop until there are no more tasks to perform. + +For many applications, this method is the only directly visible +invocation on the event loop. +As a rule of thumb, it is usually recommended to attach everything to the +same loop instance and then run the loop once at the bottom end of the +application. + +```php +$loop->run(); +``` + +This method will keep the loop running until there are no more tasks +to perform. In other words: This method will block until the last +timer, stream and/or signal has been removed. + +Likewise, it is imperative to ensure the application actually invokes +this method once. Adding listeners to the loop and missing to actually +run it will result in the application exiting without actually waiting +for any of the attached listeners. + +This method MUST NOT be called while the loop is already running. +This method MAY be called more than once after it has explicitly been +[`stop()`ped](#stop) or after it automatically stopped because it +previously did no longer have anything to do. + +#### stop() + +The `stop(): void` method can be used to +instruct a running event loop to stop. + +This method is considered advanced usage and should be used with care. +As a rule of thumb, it is usually recommended to let the loop stop +only automatically when it no longer has anything to do. + +This method can be used to explicitly instruct the event loop to stop: + +```php +$loop->addTimer(3.0, function () use ($loop) { + $loop->stop(); +}); +``` + +Calling this method on a loop instance that is not currently running or +on a loop instance that has already been stopped has no effect. + +#### addTimer() + +The `addTimer(float $interval, callable $callback): TimerInterface` method can be used to +enqueue a callback to be invoked once after the given interval. + +The second parameter MUST be a timer callback function that accepts +the timer instance as its only parameter. +If you don't use the timer instance inside your timer callback function +you MAY use a function which has no parameters at all. + +The timer callback function MUST NOT throw an `Exception`. +The return value of the timer callback function will be ignored and has +no effect, so for performance reasons you're recommended to not return +any excessive data structures. + +This method returns a timer instance. The same timer instance will also be +passed into the timer callback function as described above. +You can invoke [`cancelTimer`](#canceltimer) to cancel a pending timer. +Unlike [`addPeriodicTimer()`](#addperiodictimer), this method will ensure +the callback will be invoked only once after the given interval. + +```php +$loop->addTimer(0.8, function () { + echo 'world!' . PHP_EOL; +}); + +$loop->addTimer(0.3, function () { + echo 'hello '; +}); +``` + +See also [example #1](examples). + +If you want to access any variables within your callback function, you +can bind arbitrary data to a callback closure like this: + +```php +function hello($name, LoopInterface $loop) +{ + $loop->addTimer(1.0, function () use ($name) { + echo "hello $name\n"; + }); +} + +hello('Tester', $loop); +``` + +This interface does not enforce any particular timer resolution, so +special care may have to be taken if you rely on very high precision with +millisecond accuracy or below. Event loop implementations SHOULD work on +a best effort basis and SHOULD provide at least millisecond accuracy +unless otherwise noted. Many existing event loop implementations are +known to provide microsecond accuracy, but it's generally not recommended +to rely on this high precision. + +Similarly, the execution order of timers scheduled to execute at the +same time (within its possible accuracy) is not guaranteed. + +This interface suggests that event loop implementations SHOULD use a +monotonic time source if available. Given that a monotonic time source is +only available as of PHP 7.3 by default, event loop implementations MAY +fall back to using wall-clock time. +While this does not affect many common use cases, this is an important +distinction for programs that rely on a high time precision or on systems +that are subject to discontinuous time adjustments (time jumps). +This means that if you schedule a timer to trigger in 30s and then adjust +your system time forward by 20s, the timer SHOULD still trigger in 30s. +See also [event loop implementations](#loop-implementations) for more details. + +#### addPeriodicTimer() + +The `addPeriodicTimer(float $interval, callable $callback): TimerInterface` method can be used to +enqueue a callback to be invoked repeatedly after the given interval. + +The second parameter MUST be a timer callback function that accepts +the timer instance as its only parameter. +If you don't use the timer instance inside your timer callback function +you MAY use a function which has no parameters at all. + +The timer callback function MUST NOT throw an `Exception`. +The return value of the timer callback function will be ignored and has +no effect, so for performance reasons you're recommended to not return +any excessive data structures. + +This method returns a timer instance. The same timer instance will also be +passed into the timer callback function as described above. +Unlike [`addTimer()`](#addtimer), this method will ensure the callback +will be invoked infinitely after the given interval or until you invoke +[`cancelTimer`](#canceltimer). + +```php +$timer = $loop->addPeriodicTimer(0.1, function () { + echo 'tick!' . PHP_EOL; +}); + +$loop->addTimer(1.0, function () use ($loop, $timer) { + $loop->cancelTimer($timer); + echo 'Done' . PHP_EOL; +}); +``` + +See also [example #2](examples). + +If you want to limit the number of executions, you can bind +arbitrary data to a callback closure like this: + +```php +function hello($name, LoopInterface $loop) +{ + $n = 3; + $loop->addPeriodicTimer(1.0, function ($timer) use ($name, $loop, &$n) { + if ($n > 0) { + --$n; + echo "hello $name\n"; + } else { + $loop->cancelTimer($timer); + } + }); +} + +hello('Tester', $loop); +``` + +This interface does not enforce any particular timer resolution, so +special care may have to be taken if you rely on very high precision with +millisecond accuracy or below. Event loop implementations SHOULD work on +a best effort basis and SHOULD provide at least millisecond accuracy +unless otherwise noted. Many existing event loop implementations are +known to provide microsecond accuracy, but it's generally not recommended +to rely on this high precision. + +Similarly, the execution order of timers scheduled to execute at the +same time (within its possible accuracy) is not guaranteed. + +This interface suggests that event loop implementations SHOULD use a +monotonic time source if available. Given that a monotonic time source is +only available as of PHP 7.3 by default, event loop implementations MAY +fall back to using wall-clock time. +While this does not affect many common use cases, this is an important +distinction for programs that rely on a high time precision or on systems +that are subject to discontinuous time adjustments (time jumps). +This means that if you schedule a timer to trigger in 30s and then adjust +your system time forward by 20s, the timer SHOULD still trigger in 30s. +See also [event loop implementations](#loop-implementations) for more details. + +Additionally, periodic timers may be subject to timer drift due to +re-scheduling after each invocation. As such, it's generally not +recommended to rely on this for high precision intervals with millisecond +accuracy or below. + +#### cancelTimer() + +The `cancelTimer(TimerInterface $timer): void` method can be used to +cancel a pending timer. + +See also [`addPeriodicTimer()`](#addperiodictimer) and [example #2](examples). + +Calling this method on a timer instance that has not been added to this +loop instance or on a timer that has already been cancelled has no effect. + +#### futureTick() + +The `futureTick(callable $listener): void` method can be used to +schedule a callback to be invoked on a future tick of the event loop. + +This works very much similar to timers with an interval of zero seconds, +but does not require the overhead of scheduling a timer queue. + +The tick callback function MUST be able to accept zero parameters. + +The tick callback function MUST NOT throw an `Exception`. +The return value of the tick callback function will be ignored and has +no effect, so for performance reasons you're recommended to not return +any excessive data structures. + +If you want to access any variables within your callback function, you +can bind arbitrary data to a callback closure like this: + +```php +function hello($name, LoopInterface $loop) +{ + $loop->futureTick(function () use ($name) { + echo "hello $name\n"; + }); +} + +hello('Tester', $loop); +``` + +Unlike timers, tick callbacks are guaranteed to be executed in the order +they are enqueued. +Also, once a callback is enqueued, there's no way to cancel this operation. + +This is often used to break down bigger tasks into smaller steps (a form +of cooperative multitasking). + +```php +$loop->futureTick(function () { + echo 'b'; +}); +$loop->futureTick(function () { + echo 'c'; +}); +echo 'a'; +``` + +See also [example #3](examples). + +#### addSignal() + +The `addSignal(int $signal, callable $listener): void` method can be used to +register a listener to be notified when a signal has been caught by this process. + +This is useful to catch user interrupt signals or shutdown signals from +tools like `supervisor` or `systemd`. + +The second parameter MUST be a listener callback function that accepts +the signal as its only parameter. +If you don't use the signal inside your listener callback function +you MAY use a function which has no parameters at all. + +The listener callback function MUST NOT throw an `Exception`. +The return value of the listener callback function will be ignored and has +no effect, so for performance reasons you're recommended to not return +any excessive data structures. + +```php +$loop->addSignal(SIGINT, function (int $signal) { + echo 'Caught user interrupt signal' . PHP_EOL; +}); +``` + +See also [example #4](examples). + +Signaling is only available on Unix-like platforms, Windows isn't +supported due to operating system limitations. +This method may throw a `BadMethodCallException` if signals aren't +supported on this platform, for example when required extensions are +missing. + +**Note: A listener can only be added once to the same signal, any +attempts to add it more than once will be ignored.** + +#### removeSignal() + +The `removeSignal(int $signal, callable $listener): void` method can be used to +remove a previously added signal listener. + +```php +$loop->removeSignal(SIGINT, $listener); +``` + +Any attempts to remove listeners that aren't registered will be ignored. + +#### addReadStream() + +> Advanced! Note that this low-level API is considered advanced usage. + Most use cases should probably use the higher-level + [readable Stream API](https://github.com/reactphp/stream#readablestreaminterface) + instead. + +The `addReadStream(resource $stream, callable $callback): void` method can be used to +register a listener to be notified when a stream is ready to read. + +The first parameter MUST be a valid stream resource that supports +checking whether it is ready to read by this loop implementation. +A single stream resource MUST NOT be added more than once. +Instead, either call [`removeReadStream()`](#removereadstream) first or +react to this event with a single listener and then dispatch from this +listener. This method MAY throw an `Exception` if the given resource type +is not supported by this loop implementation. + +The second parameter MUST be a listener callback function that accepts +the stream resource as its only parameter. +If you don't use the stream resource inside your listener callback function +you MAY use a function which has no parameters at all. + +The listener callback function MUST NOT throw an `Exception`. +The return value of the listener callback function will be ignored and has +no effect, so for performance reasons you're recommended to not return +any excessive data structures. + +If you want to access any variables within your callback function, you +can bind arbitrary data to a callback closure like this: + +```php +$loop->addReadStream($stream, function ($stream) use ($name) { + echo $name . ' said: ' . fread($stream); +}); +``` + +See also [example #11](examples). + +You can invoke [`removeReadStream()`](#removereadstream) to remove the +read event listener for this stream. + +The execution order of listeners when multiple streams become ready at +the same time is not guaranteed. + +Some event loop implementations are known to only trigger the listener if +the stream *becomes* readable (edge-triggered) and may not trigger if the +stream has already been readable from the beginning. +This also implies that a stream may not be recognized as readable when data +is still left in PHP's internal stream buffers. +As such, it's recommended to use `stream_set_read_buffer($stream, 0);` +to disable PHP's internal read buffer in this case. + +#### addWriteStream() + +> Advanced! Note that this low-level API is considered advanced usage. + Most use cases should probably use the higher-level + [writable Stream API](https://github.com/reactphp/stream#writablestreaminterface) + instead. + +The `addWriteStream(resource $stream, callable $callback): void` method can be used to +register a listener to be notified when a stream is ready to write. + +The first parameter MUST be a valid stream resource that supports +checking whether it is ready to write by this loop implementation. +A single stream resource MUST NOT be added more than once. +Instead, either call [`removeWriteStream()`](#removewritestream) first or +react to this event with a single listener and then dispatch from this +listener. This method MAY throw an `Exception` if the given resource type +is not supported by this loop implementation. + +The second parameter MUST be a listener callback function that accepts +the stream resource as its only parameter. +If you don't use the stream resource inside your listener callback function +you MAY use a function which has no parameters at all. + +The listener callback function MUST NOT throw an `Exception`. +The return value of the listener callback function will be ignored and has +no effect, so for performance reasons you're recommended to not return +any excessive data structures. + +If you want to access any variables within your callback function, you +can bind arbitrary data to a callback closure like this: + +```php +$loop->addWriteStream($stream, function ($stream) use ($name) { + fwrite($stream, 'Hello ' . $name); +}); +``` + +See also [example #12](examples). + +You can invoke [`removeWriteStream()`](#removewritestream) to remove the +write event listener for this stream. + +The execution order of listeners when multiple streams become ready at +the same time is not guaranteed. + +#### removeReadStream() + +The `removeReadStream(resource $stream): void` method can be used to +remove the read event listener for the given stream. + +Removing a stream from the loop that has already been removed or trying +to remove a stream that was never added or is invalid has no effect. + +#### removeWriteStream() + +The `removeWriteStream(resource $stream): void` method can be used to +remove the write event listener for the given stream. + +Removing a stream from the loop that has already been removed or trying +to remove a stream that was never added or is invalid has no effect. + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](https://semver.org/). +This will install the latest supported version: + +```bash +composer require react/event-loop:^1.5 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 8+ and +HHVM. +It's *highly recommended to use the latest supported PHP version* for this project. + +Installing any of the event loop extensions is suggested, but entirely optional. +See also [event loop implementations](#loop-implementations) for more details. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org/): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +## License + +MIT, see [LICENSE file](LICENSE). + +## More + +* See our [Stream component](https://github.com/reactphp/stream) for more + information on how streams are used in real-world applications. +* See our [users wiki](https://github.com/reactphp/react/wiki/Users) and the + [dependents on Packagist](https://packagist.org/packages/react/event-loop/dependents) + for a list of packages that use the EventLoop in real-world applications. diff --git a/vendor/react/event-loop/composer.json b/vendor/react/event-loop/composer.json new file mode 100644 index 000000000..25a41fe17 --- /dev/null +++ b/vendor/react/event-loop/composer.json @@ -0,0 +1,47 @@ +{ + "name": "react/event-loop", + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": ["event-loop", "asynchronous"], + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "homepage": "https://clue.engineering/", + "email": "christian@clue.engineering" + }, + { + "name": "Cees-Jan Kiewiet", + "homepage": "https://wyrihaximus.net/", + "email": "reactphp@ceesjankiewiet.nl" + }, + { + "name": "Jan Sorgalla", + "homepage": "https://sorgalla.com/", + "email": "jsorgalla@gmail.com" + }, + { + "name": "Chris Boden", + "homepage": "https://cboden.dev/", + "email": "cboden@gmail.com" + } + ], + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "React\\Tests\\EventLoop\\": "tests/" + } + } +} diff --git a/vendor/react/event-loop/src/ExtEvLoop.php b/vendor/react/event-loop/src/ExtEvLoop.php new file mode 100644 index 000000000..a3fcec682 --- /dev/null +++ b/vendor/react/event-loop/src/ExtEvLoop.php @@ -0,0 +1,253 @@ +loop = new EvLoop(); + $this->futureTickQueue = new FutureTickQueue(); + $this->timers = new SplObjectStorage(); + $this->signals = new SignalsHandler(); + } + + public function addReadStream($stream, $listener) + { + $key = (int)$stream; + + if (isset($this->readStreams[$key])) { + return; + } + + $callback = $this->getStreamListenerClosure($stream, $listener); + $event = $this->loop->io($stream, Ev::READ, $callback); + $this->readStreams[$key] = $event; + } + + /** + * @param resource $stream + * @param callable $listener + * + * @return \Closure + */ + private function getStreamListenerClosure($stream, $listener) + { + return function () use ($stream, $listener) { + \call_user_func($listener, $stream); + }; + } + + public function addWriteStream($stream, $listener) + { + $key = (int)$stream; + + if (isset($this->writeStreams[$key])) { + return; + } + + $callback = $this->getStreamListenerClosure($stream, $listener); + $event = $this->loop->io($stream, Ev::WRITE, $callback); + $this->writeStreams[$key] = $event; + } + + public function removeReadStream($stream) + { + $key = (int)$stream; + + if (!isset($this->readStreams[$key])) { + return; + } + + $this->readStreams[$key]->stop(); + unset($this->readStreams[$key]); + } + + public function removeWriteStream($stream) + { + $key = (int)$stream; + + if (!isset($this->writeStreams[$key])) { + return; + } + + $this->writeStreams[$key]->stop(); + unset($this->writeStreams[$key]); + } + + public function addTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, false); + + $that = $this; + $timers = $this->timers; + $callback = function () use ($timer, $timers, $that) { + \call_user_func($timer->getCallback(), $timer); + + if ($timers->contains($timer)) { + $that->cancelTimer($timer); + } + }; + + $event = $this->loop->timer($timer->getInterval(), 0.0, $callback); + $this->timers->attach($timer, $event); + + return $timer; + } + + public function addPeriodicTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, true); + + $callback = function () use ($timer) { + \call_user_func($timer->getCallback(), $timer); + }; + + $event = $this->loop->timer($timer->getInterval(), $timer->getInterval(), $callback); + $this->timers->attach($timer, $event); + + return $timer; + } + + public function cancelTimer(TimerInterface $timer) + { + if (!isset($this->timers[$timer])) { + return; + } + + $event = $this->timers[$timer]; + $event->stop(); + $this->timers->detach($timer); + } + + public function futureTick($listener) + { + $this->futureTickQueue->add($listener); + } + + public function run() + { + $this->running = true; + + while ($this->running) { + $this->futureTickQueue->tick(); + + $hasPendingCallbacks = !$this->futureTickQueue->isEmpty(); + $wasJustStopped = !$this->running; + $nothingLeftToDo = !$this->readStreams + && !$this->writeStreams + && !$this->timers->count() + && $this->signals->isEmpty(); + + $flags = Ev::RUN_ONCE; + if ($wasJustStopped || $hasPendingCallbacks) { + $flags |= Ev::RUN_NOWAIT; + } elseif ($nothingLeftToDo) { + break; + } + + $this->loop->run($flags); + } + } + + public function stop() + { + $this->running = false; + } + + public function __destruct() + { + /** @var TimerInterface $timer */ + foreach ($this->timers as $timer) { + $this->cancelTimer($timer); + } + + foreach ($this->readStreams as $key => $stream) { + $this->removeReadStream($key); + } + + foreach ($this->writeStreams as $key => $stream) { + $this->removeWriteStream($key); + } + } + + public function addSignal($signal, $listener) + { + $this->signals->add($signal, $listener); + + if (!isset($this->signalEvents[$signal])) { + $this->signalEvents[$signal] = $this->loop->signal($signal, function() use ($signal) { + $this->signals->call($signal); + }); + } + } + + public function removeSignal($signal, $listener) + { + $this->signals->remove($signal, $listener); + + if (isset($this->signalEvents[$signal])) { + $this->signalEvents[$signal]->stop(); + unset($this->signalEvents[$signal]); + } + } +} diff --git a/vendor/react/event-loop/src/ExtEventLoop.php b/vendor/react/event-loop/src/ExtEventLoop.php new file mode 100644 index 000000000..b162a4029 --- /dev/null +++ b/vendor/react/event-loop/src/ExtEventLoop.php @@ -0,0 +1,275 @@ +requireFeatures(\EventConfig::FEATURE_FDS); + } + + $this->eventBase = new EventBase($config); + $this->futureTickQueue = new FutureTickQueue(); + $this->timerEvents = new SplObjectStorage(); + $this->signals = new SignalsHandler(); + + $this->createTimerCallback(); + $this->createStreamCallback(); + } + + public function __destruct() + { + // explicitly clear all references to Event objects to prevent SEGFAULTs on Windows + foreach ($this->timerEvents as $timer) { + $this->timerEvents->detach($timer); + } + + $this->readEvents = array(); + $this->writeEvents = array(); + } + + public function addReadStream($stream, $listener) + { + $key = (int) $stream; + if (isset($this->readListeners[$key])) { + return; + } + + $event = new Event($this->eventBase, $stream, Event::PERSIST | Event::READ, $this->streamCallback); + $event->add(); + $this->readEvents[$key] = $event; + $this->readListeners[$key] = $listener; + + // ext-event does not increase refcount on stream resources for PHP 7+ + // manually keep track of stream resource to prevent premature garbage collection + if (\PHP_VERSION_ID >= 70000) { + $this->readRefs[$key] = $stream; + } + } + + public function addWriteStream($stream, $listener) + { + $key = (int) $stream; + if (isset($this->writeListeners[$key])) { + return; + } + + $event = new Event($this->eventBase, $stream, Event::PERSIST | Event::WRITE, $this->streamCallback); + $event->add(); + $this->writeEvents[$key] = $event; + $this->writeListeners[$key] = $listener; + + // ext-event does not increase refcount on stream resources for PHP 7+ + // manually keep track of stream resource to prevent premature garbage collection + if (\PHP_VERSION_ID >= 70000) { + $this->writeRefs[$key] = $stream; + } + } + + public function removeReadStream($stream) + { + $key = (int) $stream; + + if (isset($this->readEvents[$key])) { + $this->readEvents[$key]->free(); + unset( + $this->readEvents[$key], + $this->readListeners[$key], + $this->readRefs[$key] + ); + } + } + + public function removeWriteStream($stream) + { + $key = (int) $stream; + + if (isset($this->writeEvents[$key])) { + $this->writeEvents[$key]->free(); + unset( + $this->writeEvents[$key], + $this->writeListeners[$key], + $this->writeRefs[$key] + ); + } + } + + public function addTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, false); + + $this->scheduleTimer($timer); + + return $timer; + } + + public function addPeriodicTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, true); + + $this->scheduleTimer($timer); + + return $timer; + } + + public function cancelTimer(TimerInterface $timer) + { + if ($this->timerEvents->contains($timer)) { + $this->timerEvents[$timer]->free(); + $this->timerEvents->detach($timer); + } + } + + public function futureTick($listener) + { + $this->futureTickQueue->add($listener); + } + + public function addSignal($signal, $listener) + { + $this->signals->add($signal, $listener); + + if (!isset($this->signalEvents[$signal])) { + $this->signalEvents[$signal] = Event::signal($this->eventBase, $signal, array($this->signals, 'call')); + $this->signalEvents[$signal]->add(); + } + } + + public function removeSignal($signal, $listener) + { + $this->signals->remove($signal, $listener); + + if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) { + $this->signalEvents[$signal]->free(); + unset($this->signalEvents[$signal]); + } + } + + public function run() + { + $this->running = true; + + while ($this->running) { + $this->futureTickQueue->tick(); + + $flags = EventBase::LOOP_ONCE; + if (!$this->running || !$this->futureTickQueue->isEmpty()) { + $flags |= EventBase::LOOP_NONBLOCK; + } elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) { + break; + } + + $this->eventBase->loop($flags); + } + } + + public function stop() + { + $this->running = false; + } + + /** + * Schedule a timer for execution. + * + * @param TimerInterface $timer + */ + private function scheduleTimer(TimerInterface $timer) + { + $flags = Event::TIMEOUT; + + if ($timer->isPeriodic()) { + $flags |= Event::PERSIST; + } + + $event = new Event($this->eventBase, -1, $flags, $this->timerCallback, $timer); + $this->timerEvents[$timer] = $event; + + $event->add($timer->getInterval()); + } + + /** + * Create a callback used as the target of timer events. + * + * A reference is kept to the callback for the lifetime of the loop + * to prevent "Cannot destroy active lambda function" fatal error from + * the event extension. + */ + private function createTimerCallback() + { + $timers = $this->timerEvents; + $this->timerCallback = function ($_, $__, $timer) use ($timers) { + \call_user_func($timer->getCallback(), $timer); + + if (!$timer->isPeriodic() && $timers->contains($timer)) { + $this->cancelTimer($timer); + } + }; + } + + /** + * Create a callback used as the target of stream events. + * + * A reference is kept to the callback for the lifetime of the loop + * to prevent "Cannot destroy active lambda function" fatal error from + * the event extension. + */ + private function createStreamCallback() + { + $read =& $this->readListeners; + $write =& $this->writeListeners; + $this->streamCallback = function ($stream, $flags) use (&$read, &$write) { + $key = (int) $stream; + + if (Event::READ === (Event::READ & $flags) && isset($read[$key])) { + \call_user_func($read[$key], $stream); + } + + if (Event::WRITE === (Event::WRITE & $flags) && isset($write[$key])) { + \call_user_func($write[$key], $stream); + } + }; + } +} diff --git a/vendor/react/event-loop/src/ExtLibevLoop.php b/vendor/react/event-loop/src/ExtLibevLoop.php new file mode 100644 index 000000000..c303fdd5c --- /dev/null +++ b/vendor/react/event-loop/src/ExtLibevLoop.php @@ -0,0 +1,201 @@ +loop = new EventLoop(); + $this->futureTickQueue = new FutureTickQueue(); + $this->timerEvents = new SplObjectStorage(); + $this->signals = new SignalsHandler(); + } + + public function addReadStream($stream, $listener) + { + if (isset($this->readEvents[(int) $stream])) { + return; + } + + $callback = function () use ($stream, $listener) { + \call_user_func($listener, $stream); + }; + + $event = new IOEvent($callback, $stream, IOEvent::READ); + $this->loop->add($event); + + $this->readEvents[(int) $stream] = $event; + } + + public function addWriteStream($stream, $listener) + { + if (isset($this->writeEvents[(int) $stream])) { + return; + } + + $callback = function () use ($stream, $listener) { + \call_user_func($listener, $stream); + }; + + $event = new IOEvent($callback, $stream, IOEvent::WRITE); + $this->loop->add($event); + + $this->writeEvents[(int) $stream] = $event; + } + + public function removeReadStream($stream) + { + $key = (int) $stream; + + if (isset($this->readEvents[$key])) { + $this->readEvents[$key]->stop(); + $this->loop->remove($this->readEvents[$key]); + unset($this->readEvents[$key]); + } + } + + public function removeWriteStream($stream) + { + $key = (int) $stream; + + if (isset($this->writeEvents[$key])) { + $this->writeEvents[$key]->stop(); + $this->loop->remove($this->writeEvents[$key]); + unset($this->writeEvents[$key]); + } + } + + public function addTimer($interval, $callback) + { + $timer = new Timer( $interval, $callback, false); + + $that = $this; + $timers = $this->timerEvents; + $callback = function () use ($timer, $timers, $that) { + \call_user_func($timer->getCallback(), $timer); + + if ($timers->contains($timer)) { + $that->cancelTimer($timer); + } + }; + + $event = new TimerEvent($callback, $timer->getInterval()); + $this->timerEvents->attach($timer, $event); + $this->loop->add($event); + + return $timer; + } + + public function addPeriodicTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, true); + + $callback = function () use ($timer) { + \call_user_func($timer->getCallback(), $timer); + }; + + $event = new TimerEvent($callback, $timer->getInterval(), $timer->getInterval()); + $this->timerEvents->attach($timer, $event); + $this->loop->add($event); + + return $timer; + } + + public function cancelTimer(TimerInterface $timer) + { + if (isset($this->timerEvents[$timer])) { + $this->loop->remove($this->timerEvents[$timer]); + $this->timerEvents->detach($timer); + } + } + + public function futureTick($listener) + { + $this->futureTickQueue->add($listener); + } + + public function addSignal($signal, $listener) + { + $this->signals->add($signal, $listener); + + if (!isset($this->signalEvents[$signal])) { + $signals = $this->signals; + $this->signalEvents[$signal] = new SignalEvent(function () use ($signals, $signal) { + $signals->call($signal); + }, $signal); + $this->loop->add($this->signalEvents[$signal]); + } + } + + public function removeSignal($signal, $listener) + { + $this->signals->remove($signal, $listener); + + if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) { + $this->signalEvents[$signal]->stop(); + $this->loop->remove($this->signalEvents[$signal]); + unset($this->signalEvents[$signal]); + } + } + + public function run() + { + $this->running = true; + + while ($this->running) { + $this->futureTickQueue->tick(); + + $flags = EventLoop::RUN_ONCE; + if (!$this->running || !$this->futureTickQueue->isEmpty()) { + $flags |= EventLoop::RUN_NOWAIT; + } elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) { + break; + } + + $this->loop->run($flags); + } + } + + public function stop() + { + $this->running = false; + } +} diff --git a/vendor/react/event-loop/src/ExtLibeventLoop.php b/vendor/react/event-loop/src/ExtLibeventLoop.php new file mode 100644 index 000000000..099293a4f --- /dev/null +++ b/vendor/react/event-loop/src/ExtLibeventLoop.php @@ -0,0 +1,285 @@ +eventBase = \event_base_new(); + $this->futureTickQueue = new FutureTickQueue(); + $this->timerEvents = new SplObjectStorage(); + $this->signals = new SignalsHandler(); + + $this->createTimerCallback(); + $this->createStreamCallback(); + } + + public function addReadStream($stream, $listener) + { + $key = (int) $stream; + if (isset($this->readListeners[$key])) { + return; + } + + $event = \event_new(); + \event_set($event, $stream, \EV_PERSIST | \EV_READ, $this->streamCallback); + \event_base_set($event, $this->eventBase); + \event_add($event); + + $this->readEvents[$key] = $event; + $this->readListeners[$key] = $listener; + } + + public function addWriteStream($stream, $listener) + { + $key = (int) $stream; + if (isset($this->writeListeners[$key])) { + return; + } + + $event = \event_new(); + \event_set($event, $stream, \EV_PERSIST | \EV_WRITE, $this->streamCallback); + \event_base_set($event, $this->eventBase); + \event_add($event); + + $this->writeEvents[$key] = $event; + $this->writeListeners[$key] = $listener; + } + + public function removeReadStream($stream) + { + $key = (int) $stream; + + if (isset($this->readListeners[$key])) { + $event = $this->readEvents[$key]; + \event_del($event); + \event_free($event); + + unset( + $this->readEvents[$key], + $this->readListeners[$key] + ); + } + } + + public function removeWriteStream($stream) + { + $key = (int) $stream; + + if (isset($this->writeListeners[$key])) { + $event = $this->writeEvents[$key]; + \event_del($event); + \event_free($event); + + unset( + $this->writeEvents[$key], + $this->writeListeners[$key] + ); + } + } + + public function addTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, false); + + $this->scheduleTimer($timer); + + return $timer; + } + + public function addPeriodicTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, true); + + $this->scheduleTimer($timer); + + return $timer; + } + + public function cancelTimer(TimerInterface $timer) + { + if ($this->timerEvents->contains($timer)) { + $event = $this->timerEvents[$timer]; + \event_del($event); + \event_free($event); + + $this->timerEvents->detach($timer); + } + } + + public function futureTick($listener) + { + $this->futureTickQueue->add($listener); + } + + public function addSignal($signal, $listener) + { + $this->signals->add($signal, $listener); + + if (!isset($this->signalEvents[$signal])) { + $this->signalEvents[$signal] = \event_new(); + \event_set($this->signalEvents[$signal], $signal, \EV_PERSIST | \EV_SIGNAL, array($this->signals, 'call')); + \event_base_set($this->signalEvents[$signal], $this->eventBase); + \event_add($this->signalEvents[$signal]); + } + } + + public function removeSignal($signal, $listener) + { + $this->signals->remove($signal, $listener); + + if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) { + \event_del($this->signalEvents[$signal]); + \event_free($this->signalEvents[$signal]); + unset($this->signalEvents[$signal]); + } + } + + public function run() + { + $this->running = true; + + while ($this->running) { + $this->futureTickQueue->tick(); + + $flags = \EVLOOP_ONCE; + if (!$this->running || !$this->futureTickQueue->isEmpty()) { + $flags |= \EVLOOP_NONBLOCK; + } elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) { + break; + } + + \event_base_loop($this->eventBase, $flags); + } + } + + public function stop() + { + $this->running = false; + } + + /** + * Schedule a timer for execution. + * + * @param TimerInterface $timer + */ + private function scheduleTimer(TimerInterface $timer) + { + $this->timerEvents[$timer] = $event = \event_timer_new(); + + \event_timer_set($event, $this->timerCallback, $timer); + \event_base_set($event, $this->eventBase); + \event_add($event, $timer->getInterval() * self::MICROSECONDS_PER_SECOND); + } + + /** + * Create a callback used as the target of timer events. + * + * A reference is kept to the callback for the lifetime of the loop + * to prevent "Cannot destroy active lambda function" fatal error from + * the event extension. + */ + private function createTimerCallback() + { + $that = $this; + $timers = $this->timerEvents; + $this->timerCallback = function ($_, $__, $timer) use ($timers, $that) { + \call_user_func($timer->getCallback(), $timer); + + // Timer already cancelled ... + if (!$timers->contains($timer)) { + return; + } + + // Reschedule periodic timers ... + if ($timer->isPeriodic()) { + \event_add( + $timers[$timer], + $timer->getInterval() * ExtLibeventLoop::MICROSECONDS_PER_SECOND + ); + + // Clean-up one shot timers ... + } else { + $that->cancelTimer($timer); + } + }; + } + + /** + * Create a callback used as the target of stream events. + * + * A reference is kept to the callback for the lifetime of the loop + * to prevent "Cannot destroy active lambda function" fatal error from + * the event extension. + */ + private function createStreamCallback() + { + $read =& $this->readListeners; + $write =& $this->writeListeners; + $this->streamCallback = function ($stream, $flags) use (&$read, &$write) { + $key = (int) $stream; + + if (\EV_READ === (\EV_READ & $flags) && isset($read[$key])) { + \call_user_func($read[$key], $stream); + } + + if (\EV_WRITE === (\EV_WRITE & $flags) && isset($write[$key])) { + \call_user_func($write[$key], $stream); + } + }; + } +} diff --git a/vendor/react/event-loop/src/ExtUvLoop.php b/vendor/react/event-loop/src/ExtUvLoop.php new file mode 100644 index 000000000..4434720df --- /dev/null +++ b/vendor/react/event-loop/src/ExtUvLoop.php @@ -0,0 +1,342 @@ +uv = \uv_loop_new(); + $this->futureTickQueue = new FutureTickQueue(); + $this->timers = new SplObjectStorage(); + $this->streamListener = $this->createStreamListener(); + $this->signals = new SignalsHandler(); + } + + /** + * Returns the underlying ext-uv event loop. (Internal ReactPHP use only.) + * + * @internal + * + * @return resource + */ + public function getUvLoop() + { + return $this->uv; + } + + /** + * {@inheritdoc} + */ + public function addReadStream($stream, $listener) + { + if (isset($this->readStreams[(int) $stream])) { + return; + } + + $this->readStreams[(int) $stream] = $listener; + $this->addStream($stream); + } + + /** + * {@inheritdoc} + */ + public function addWriteStream($stream, $listener) + { + if (isset($this->writeStreams[(int) $stream])) { + return; + } + + $this->writeStreams[(int) $stream] = $listener; + $this->addStream($stream); + } + + /** + * {@inheritdoc} + */ + public function removeReadStream($stream) + { + if (!isset($this->streamEvents[(int) $stream])) { + return; + } + + unset($this->readStreams[(int) $stream]); + $this->removeStream($stream); + } + + /** + * {@inheritdoc} + */ + public function removeWriteStream($stream) + { + if (!isset($this->streamEvents[(int) $stream])) { + return; + } + + unset($this->writeStreams[(int) $stream]); + $this->removeStream($stream); + } + + /** + * {@inheritdoc} + */ + public function addTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, false); + + $that = $this; + $timers = $this->timers; + $callback = function () use ($timer, $timers, $that) { + \call_user_func($timer->getCallback(), $timer); + + if ($timers->contains($timer)) { + $that->cancelTimer($timer); + } + }; + + $event = \uv_timer_init($this->uv); + $this->timers->attach($timer, $event); + \uv_timer_start( + $event, + $this->convertFloatSecondsToMilliseconds($interval), + 0, + $callback + ); + + return $timer; + } + + /** + * {@inheritdoc} + */ + public function addPeriodicTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, true); + + $callback = function () use ($timer) { + \call_user_func($timer->getCallback(), $timer); + }; + + $interval = $this->convertFloatSecondsToMilliseconds($interval); + $event = \uv_timer_init($this->uv); + $this->timers->attach($timer, $event); + \uv_timer_start( + $event, + $interval, + (int) $interval === 0 ? 1 : $interval, + $callback + ); + + return $timer; + } + + /** + * {@inheritdoc} + */ + public function cancelTimer(TimerInterface $timer) + { + if (isset($this->timers[$timer])) { + @\uv_timer_stop($this->timers[$timer]); + $this->timers->detach($timer); + } + } + + /** + * {@inheritdoc} + */ + public function futureTick($listener) + { + $this->futureTickQueue->add($listener); + } + + public function addSignal($signal, $listener) + { + $this->signals->add($signal, $listener); + + if (!isset($this->signalEvents[$signal])) { + $signals = $this->signals; + $this->signalEvents[$signal] = \uv_signal_init($this->uv); + \uv_signal_start($this->signalEvents[$signal], function () use ($signals, $signal) { + $signals->call($signal); + }, $signal); + } + } + + public function removeSignal($signal, $listener) + { + $this->signals->remove($signal, $listener); + + if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) { + \uv_signal_stop($this->signalEvents[$signal]); + unset($this->signalEvents[$signal]); + } + } + + /** + * {@inheritdoc} + */ + public function run() + { + $this->running = true; + + while ($this->running) { + $this->futureTickQueue->tick(); + + $hasPendingCallbacks = !$this->futureTickQueue->isEmpty(); + $wasJustStopped = !$this->running; + $nothingLeftToDo = !$this->readStreams + && !$this->writeStreams + && !$this->timers->count() + && $this->signals->isEmpty(); + + // Use UV::RUN_ONCE when there are only I/O events active in the loop and block until one of those triggers, + // otherwise use UV::RUN_NOWAIT. + // @link http://docs.libuv.org/en/v1.x/loop.html#c.uv_run + $flags = \UV::RUN_ONCE; + if ($wasJustStopped || $hasPendingCallbacks) { + $flags = \UV::RUN_NOWAIT; + } elseif ($nothingLeftToDo) { + break; + } + + \uv_run($this->uv, $flags); + } + } + + /** + * {@inheritdoc} + */ + public function stop() + { + $this->running = false; + } + + private function addStream($stream) + { + if (!isset($this->streamEvents[(int) $stream])) { + $this->streamEvents[(int)$stream] = \uv_poll_init_socket($this->uv, $stream); + } + + if ($this->streamEvents[(int) $stream] !== false) { + $this->pollStream($stream); + } + } + + private function removeStream($stream) + { + if (!isset($this->streamEvents[(int) $stream])) { + return; + } + + if (!isset($this->readStreams[(int) $stream]) + && !isset($this->writeStreams[(int) $stream])) { + \uv_poll_stop($this->streamEvents[(int) $stream]); + \uv_close($this->streamEvents[(int) $stream]); + unset($this->streamEvents[(int) $stream]); + return; + } + + $this->pollStream($stream); + } + + private function pollStream($stream) + { + if (!isset($this->streamEvents[(int) $stream])) { + return; + } + + $flags = 0; + if (isset($this->readStreams[(int) $stream])) { + $flags |= \UV::READABLE; + } + + if (isset($this->writeStreams[(int) $stream])) { + $flags |= \UV::WRITABLE; + } + + \uv_poll_start($this->streamEvents[(int) $stream], $flags, $this->streamListener); + } + + /** + * Create a stream listener + * + * @return callable Returns a callback + */ + private function createStreamListener() + { + $callback = function ($event, $status, $events, $stream) { + // libuv automatically stops polling on error, re-enable polling to match other loop implementations + if ($status !== 0) { + $this->pollStream($stream); + + // libuv may report no events on error, but this should still invoke stream listeners to report closed connections + // re-enable both readable and writable, correct listeners will be checked below anyway + if ($events === 0) { + $events = \UV::READABLE | \UV::WRITABLE; + } + } + + if (isset($this->readStreams[(int) $stream]) && ($events & \UV::READABLE)) { + \call_user_func($this->readStreams[(int) $stream], $stream); + } + + if (isset($this->writeStreams[(int) $stream]) && ($events & \UV::WRITABLE)) { + \call_user_func($this->writeStreams[(int) $stream], $stream); + } + }; + + return $callback; + } + + /** + * @param float $interval + * @return int + */ + private function convertFloatSecondsToMilliseconds($interval) + { + if ($interval < 0) { + return 0; + } + + $maxValue = (int) (\PHP_INT_MAX / 1000); + $intInterval = (int) $interval; + + if (($intInterval <= 0 && $interval > 1) || $intInterval >= $maxValue) { + throw new \InvalidArgumentException( + "Interval overflow, value must be lower than '{$maxValue}', but '{$interval}' passed." + ); + } + + return (int) \floor($interval * 1000); + } +} diff --git a/vendor/react/event-loop/src/Factory.php b/vendor/react/event-loop/src/Factory.php new file mode 100644 index 000000000..30bbfd7c8 --- /dev/null +++ b/vendor/react/event-loop/src/Factory.php @@ -0,0 +1,75 @@ +futureTick(function () use (&$hasRun) { + $hasRun = true; + }); + + $stopped =& self::$stopped; + register_shutdown_function(function () use ($loop, &$hasRun, &$stopped) { + // Don't run if we're coming from a fatal error (uncaught exception). + $error = error_get_last(); + if ((isset($error['type']) ? $error['type'] : 0) & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR)) { + return; + } + + if (!$hasRun && !$stopped) { + $loop->run(); + } + }); + // @codeCoverageIgnoreEnd + + return self::$instance; + } + + /** + * Internal undocumented method, behavior might change or throw in the + * future. Use with caution and at your own risk. + * + * @internal + * @return void + */ + public static function set(LoopInterface $loop) + { + self::$instance = $loop; + } + + /** + * [Advanced] Register a listener to be notified when a stream is ready to read. + * + * @param resource $stream + * @param callable $listener + * @return void + * @throws \Exception + * @see LoopInterface::addReadStream() + */ + public static function addReadStream($stream, $listener) + { + // create loop instance on demand (legacy PHP < 7 doesn't like ternaries in method calls) + if (self::$instance === null) { + self::get(); + } + self::$instance->addReadStream($stream, $listener); + } + + /** + * [Advanced] Register a listener to be notified when a stream is ready to write. + * + * @param resource $stream + * @param callable $listener + * @return void + * @throws \Exception + * @see LoopInterface::addWriteStream() + */ + public static function addWriteStream($stream, $listener) + { + // create loop instance on demand (legacy PHP < 7 doesn't like ternaries in method calls) + if (self::$instance === null) { + self::get(); + } + self::$instance->addWriteStream($stream, $listener); + } + + /** + * Remove the read event listener for the given stream. + * + * @param resource $stream + * @return void + * @see LoopInterface::removeReadStream() + */ + public static function removeReadStream($stream) + { + if (self::$instance !== null) { + self::$instance->removeReadStream($stream); + } + } + + /** + * Remove the write event listener for the given stream. + * + * @param resource $stream + * @return void + * @see LoopInterface::removeWriteStream() + */ + public static function removeWriteStream($stream) + { + if (self::$instance !== null) { + self::$instance->removeWriteStream($stream); + } + } + + /** + * Enqueue a callback to be invoked once after the given interval. + * + * @param float $interval + * @param callable $callback + * @return TimerInterface + * @see LoopInterface::addTimer() + */ + public static function addTimer($interval, $callback) + { + // create loop instance on demand (legacy PHP < 7 doesn't like ternaries in method calls) + if (self::$instance === null) { + self::get(); + } + return self::$instance->addTimer($interval, $callback); + } + + /** + * Enqueue a callback to be invoked repeatedly after the given interval. + * + * @param float $interval + * @param callable $callback + * @return TimerInterface + * @see LoopInterface::addPeriodicTimer() + */ + public static function addPeriodicTimer($interval, $callback) + { + // create loop instance on demand (legacy PHP < 7 doesn't like ternaries in method calls) + if (self::$instance === null) { + self::get(); + } + return self::$instance->addPeriodicTimer($interval, $callback); + } + + /** + * Cancel a pending timer. + * + * @param TimerInterface $timer + * @return void + * @see LoopInterface::cancelTimer() + */ + public static function cancelTimer(TimerInterface $timer) + { + if (self::$instance !== null) { + self::$instance->cancelTimer($timer); + } + } + + /** + * Schedule a callback to be invoked on a future tick of the event loop. + * + * @param callable $listener + * @return void + * @see LoopInterface::futureTick() + */ + public static function futureTick($listener) + { + // create loop instance on demand (legacy PHP < 7 doesn't like ternaries in method calls) + if (self::$instance === null) { + self::get(); + } + + self::$instance->futureTick($listener); + } + + /** + * Register a listener to be notified when a signal has been caught by this process. + * + * @param int $signal + * @param callable $listener + * @return void + * @see LoopInterface::addSignal() + */ + public static function addSignal($signal, $listener) + { + // create loop instance on demand (legacy PHP < 7 doesn't like ternaries in method calls) + if (self::$instance === null) { + self::get(); + } + + self::$instance->addSignal($signal, $listener); + } + + /** + * Removes a previously added signal listener. + * + * @param int $signal + * @param callable $listener + * @return void + * @see LoopInterface::removeSignal() + */ + public static function removeSignal($signal, $listener) + { + if (self::$instance !== null) { + self::$instance->removeSignal($signal, $listener); + } + } + + /** + * Run the event loop until there are no more tasks to perform. + * + * @return void + * @see LoopInterface::run() + */ + public static function run() + { + // create loop instance on demand (legacy PHP < 7 doesn't like ternaries in method calls) + if (self::$instance === null) { + self::get(); + } + + self::$instance->run(); + } + + /** + * Instruct a running event loop to stop. + * + * @return void + * @see LoopInterface::stop() + */ + public static function stop() + { + self::$stopped = true; + if (self::$instance !== null) { + self::$instance->stop(); + } + } +} diff --git a/vendor/react/event-loop/src/LoopInterface.php b/vendor/react/event-loop/src/LoopInterface.php new file mode 100644 index 000000000..9266f7188 --- /dev/null +++ b/vendor/react/event-loop/src/LoopInterface.php @@ -0,0 +1,472 @@ +addReadStream($stream, function ($stream) use ($name) { + * echo $name . ' said: ' . fread($stream); + * }); + * ``` + * + * See also [example #11](examples). + * + * You can invoke [`removeReadStream()`](#removereadstream) to remove the + * read event listener for this stream. + * + * The execution order of listeners when multiple streams become ready at + * the same time is not guaranteed. + * + * @param resource $stream The PHP stream resource to check. + * @param callable $listener Invoked when the stream is ready. + * @throws \Exception if the given resource type is not supported by this loop implementation + * @see self::removeReadStream() + */ + public function addReadStream($stream, $listener); + + /** + * [Advanced] Register a listener to be notified when a stream is ready to write. + * + * Note that this low-level API is considered advanced usage. + * Most use cases should probably use the higher-level + * [writable Stream API](https://github.com/reactphp/stream#writablestreaminterface) + * instead. + * + * The first parameter MUST be a valid stream resource that supports + * checking whether it is ready to write by this loop implementation. + * A single stream resource MUST NOT be added more than once. + * Instead, either call [`removeWriteStream()`](#removewritestream) first or + * react to this event with a single listener and then dispatch from this + * listener. This method MAY throw an `Exception` if the given resource type + * is not supported by this loop implementation. + * + * The second parameter MUST be a listener callback function that accepts + * the stream resource as its only parameter. + * If you don't use the stream resource inside your listener callback function + * you MAY use a function which has no parameters at all. + * + * The listener callback function MUST NOT throw an `Exception`. + * The return value of the listener callback function will be ignored and has + * no effect, so for performance reasons you're recommended to not return + * any excessive data structures. + * + * If you want to access any variables within your callback function, you + * can bind arbitrary data to a callback closure like this: + * + * ```php + * $loop->addWriteStream($stream, function ($stream) use ($name) { + * fwrite($stream, 'Hello ' . $name); + * }); + * ``` + * + * See also [example #12](examples). + * + * You can invoke [`removeWriteStream()`](#removewritestream) to remove the + * write event listener for this stream. + * + * The execution order of listeners when multiple streams become ready at + * the same time is not guaranteed. + * + * Some event loop implementations are known to only trigger the listener if + * the stream *becomes* readable (edge-triggered) and may not trigger if the + * stream has already been readable from the beginning. + * This also implies that a stream may not be recognized as readable when data + * is still left in PHP's internal stream buffers. + * As such, it's recommended to use `stream_set_read_buffer($stream, 0);` + * to disable PHP's internal read buffer in this case. + * + * @param resource $stream The PHP stream resource to check. + * @param callable $listener Invoked when the stream is ready. + * @throws \Exception if the given resource type is not supported by this loop implementation + * @see self::removeWriteStream() + */ + public function addWriteStream($stream, $listener); + + /** + * Remove the read event listener for the given stream. + * + * Removing a stream from the loop that has already been removed or trying + * to remove a stream that was never added or is invalid has no effect. + * + * @param resource $stream The PHP stream resource. + */ + public function removeReadStream($stream); + + /** + * Remove the write event listener for the given stream. + * + * Removing a stream from the loop that has already been removed or trying + * to remove a stream that was never added or is invalid has no effect. + * + * @param resource $stream The PHP stream resource. + */ + public function removeWriteStream($stream); + + /** + * Enqueue a callback to be invoked once after the given interval. + * + * The second parameter MUST be a timer callback function that accepts + * the timer instance as its only parameter. + * If you don't use the timer instance inside your timer callback function + * you MAY use a function which has no parameters at all. + * + * The timer callback function MUST NOT throw an `Exception`. + * The return value of the timer callback function will be ignored and has + * no effect, so for performance reasons you're recommended to not return + * any excessive data structures. + * + * This method returns a timer instance. The same timer instance will also be + * passed into the timer callback function as described above. + * You can invoke [`cancelTimer`](#canceltimer) to cancel a pending timer. + * Unlike [`addPeriodicTimer()`](#addperiodictimer), this method will ensure + * the callback will be invoked only once after the given interval. + * + * ```php + * $loop->addTimer(0.8, function () { + * echo 'world!' . PHP_EOL; + * }); + * + * $loop->addTimer(0.3, function () { + * echo 'hello '; + * }); + * ``` + * + * See also [example #1](examples). + * + * If you want to access any variables within your callback function, you + * can bind arbitrary data to a callback closure like this: + * + * ```php + * function hello($name, LoopInterface $loop) + * { + * $loop->addTimer(1.0, function () use ($name) { + * echo "hello $name\n"; + * }); + * } + * + * hello('Tester', $loop); + * ``` + * + * This interface does not enforce any particular timer resolution, so + * special care may have to be taken if you rely on very high precision with + * millisecond accuracy or below. Event loop implementations SHOULD work on + * a best effort basis and SHOULD provide at least millisecond accuracy + * unless otherwise noted. Many existing event loop implementations are + * known to provide microsecond accuracy, but it's generally not recommended + * to rely on this high precision. + * + * Similarly, the execution order of timers scheduled to execute at the + * same time (within its possible accuracy) is not guaranteed. + * + * This interface suggests that event loop implementations SHOULD use a + * monotonic time source if available. Given that a monotonic time source is + * only available as of PHP 7.3 by default, event loop implementations MAY + * fall back to using wall-clock time. + * While this does not affect many common use cases, this is an important + * distinction for programs that rely on a high time precision or on systems + * that are subject to discontinuous time adjustments (time jumps). + * This means that if you schedule a timer to trigger in 30s and then adjust + * your system time forward by 20s, the timer SHOULD still trigger in 30s. + * See also [event loop implementations](#loop-implementations) for more details. + * + * @param int|float $interval The number of seconds to wait before execution. + * @param callable $callback The callback to invoke. + * + * @return TimerInterface + */ + public function addTimer($interval, $callback); + + /** + * Enqueue a callback to be invoked repeatedly after the given interval. + * + * The second parameter MUST be a timer callback function that accepts + * the timer instance as its only parameter. + * If you don't use the timer instance inside your timer callback function + * you MAY use a function which has no parameters at all. + * + * The timer callback function MUST NOT throw an `Exception`. + * The return value of the timer callback function will be ignored and has + * no effect, so for performance reasons you're recommended to not return + * any excessive data structures. + * + * This method returns a timer instance. The same timer instance will also be + * passed into the timer callback function as described above. + * Unlike [`addTimer()`](#addtimer), this method will ensure the callback + * will be invoked infinitely after the given interval or until you invoke + * [`cancelTimer`](#canceltimer). + * + * ```php + * $timer = $loop->addPeriodicTimer(0.1, function () { + * echo 'tick!' . PHP_EOL; + * }); + * + * $loop->addTimer(1.0, function () use ($loop, $timer) { + * $loop->cancelTimer($timer); + * echo 'Done' . PHP_EOL; + * }); + * ``` + * + * See also [example #2](examples). + * + * If you want to limit the number of executions, you can bind + * arbitrary data to a callback closure like this: + * + * ```php + * function hello($name, LoopInterface $loop) + * { + * $n = 3; + * $loop->addPeriodicTimer(1.0, function ($timer) use ($name, $loop, &$n) { + * if ($n > 0) { + * --$n; + * echo "hello $name\n"; + * } else { + * $loop->cancelTimer($timer); + * } + * }); + * } + * + * hello('Tester', $loop); + * ``` + * + * This interface does not enforce any particular timer resolution, so + * special care may have to be taken if you rely on very high precision with + * millisecond accuracy or below. Event loop implementations SHOULD work on + * a best effort basis and SHOULD provide at least millisecond accuracy + * unless otherwise noted. Many existing event loop implementations are + * known to provide microsecond accuracy, but it's generally not recommended + * to rely on this high precision. + * + * Similarly, the execution order of timers scheduled to execute at the + * same time (within its possible accuracy) is not guaranteed. + * + * This interface suggests that event loop implementations SHOULD use a + * monotonic time source if available. Given that a monotonic time source is + * only available as of PHP 7.3 by default, event loop implementations MAY + * fall back to using wall-clock time. + * While this does not affect many common use cases, this is an important + * distinction for programs that rely on a high time precision or on systems + * that are subject to discontinuous time adjustments (time jumps). + * This means that if you schedule a timer to trigger in 30s and then adjust + * your system time forward by 20s, the timer SHOULD still trigger in 30s. + * See also [event loop implementations](#loop-implementations) for more details. + * + * Additionally, periodic timers may be subject to timer drift due to + * re-scheduling after each invocation. As such, it's generally not + * recommended to rely on this for high precision intervals with millisecond + * accuracy or below. + * + * @param int|float $interval The number of seconds to wait before execution. + * @param callable $callback The callback to invoke. + * + * @return TimerInterface + */ + public function addPeriodicTimer($interval, $callback); + + /** + * Cancel a pending timer. + * + * See also [`addPeriodicTimer()`](#addperiodictimer) and [example #2](examples). + * + * Calling this method on a timer instance that has not been added to this + * loop instance or on a timer that has already been cancelled has no effect. + * + * @param TimerInterface $timer The timer to cancel. + * + * @return void + */ + public function cancelTimer(TimerInterface $timer); + + /** + * Schedule a callback to be invoked on a future tick of the event loop. + * + * This works very much similar to timers with an interval of zero seconds, + * but does not require the overhead of scheduling a timer queue. + * + * The tick callback function MUST be able to accept zero parameters. + * + * The tick callback function MUST NOT throw an `Exception`. + * The return value of the tick callback function will be ignored and has + * no effect, so for performance reasons you're recommended to not return + * any excessive data structures. + * + * If you want to access any variables within your callback function, you + * can bind arbitrary data to a callback closure like this: + * + * ```php + * function hello($name, LoopInterface $loop) + * { + * $loop->futureTick(function () use ($name) { + * echo "hello $name\n"; + * }); + * } + * + * hello('Tester', $loop); + * ``` + * + * Unlike timers, tick callbacks are guaranteed to be executed in the order + * they are enqueued. + * Also, once a callback is enqueued, there's no way to cancel this operation. + * + * This is often used to break down bigger tasks into smaller steps (a form + * of cooperative multitasking). + * + * ```php + * $loop->futureTick(function () { + * echo 'b'; + * }); + * $loop->futureTick(function () { + * echo 'c'; + * }); + * echo 'a'; + * ``` + * + * See also [example #3](examples). + * + * @param callable $listener The callback to invoke. + * + * @return void + */ + public function futureTick($listener); + + /** + * Register a listener to be notified when a signal has been caught by this process. + * + * This is useful to catch user interrupt signals or shutdown signals from + * tools like `supervisor` or `systemd`. + * + * The second parameter MUST be a listener callback function that accepts + * the signal as its only parameter. + * If you don't use the signal inside your listener callback function + * you MAY use a function which has no parameters at all. + * + * The listener callback function MUST NOT throw an `Exception`. + * The return value of the listener callback function will be ignored and has + * no effect, so for performance reasons you're recommended to not return + * any excessive data structures. + * + * ```php + * $loop->addSignal(SIGINT, function (int $signal) { + * echo 'Caught user interrupt signal' . PHP_EOL; + * }); + * ``` + * + * See also [example #4](examples). + * + * Signaling is only available on Unix-like platforms, Windows isn't + * supported due to operating system limitations. + * This method may throw a `BadMethodCallException` if signals aren't + * supported on this platform, for example when required extensions are + * missing. + * + * **Note: A listener can only be added once to the same signal, any + * attempts to add it more than once will be ignored.** + * + * @param int $signal + * @param callable $listener + * + * @throws \BadMethodCallException when signals aren't supported on this + * platform, for example when required extensions are missing. + * + * @return void + */ + public function addSignal($signal, $listener); + + /** + * Removes a previously added signal listener. + * + * ```php + * $loop->removeSignal(SIGINT, $listener); + * ``` + * + * Any attempts to remove listeners that aren't registered will be ignored. + * + * @param int $signal + * @param callable $listener + * + * @return void + */ + public function removeSignal($signal, $listener); + + /** + * Run the event loop until there are no more tasks to perform. + * + * For many applications, this method is the only directly visible + * invocation on the event loop. + * As a rule of thumb, it is usually recommended to attach everything to the + * same loop instance and then run the loop once at the bottom end of the + * application. + * + * ```php + * $loop->run(); + * ``` + * + * This method will keep the loop running until there are no more tasks + * to perform. In other words: This method will block until the last + * timer, stream and/or signal has been removed. + * + * Likewise, it is imperative to ensure the application actually invokes + * this method once. Adding listeners to the loop and missing to actually + * run it will result in the application exiting without actually waiting + * for any of the attached listeners. + * + * This method MUST NOT be called while the loop is already running. + * This method MAY be called more than once after it has explicitly been + * [`stop()`ped](#stop) or after it automatically stopped because it + * previously did no longer have anything to do. + * + * @return void + */ + public function run(); + + /** + * Instruct a running event loop to stop. + * + * This method is considered advanced usage and should be used with care. + * As a rule of thumb, it is usually recommended to let the loop stop + * only automatically when it no longer has anything to do. + * + * This method can be used to explicitly instruct the event loop to stop: + * + * ```php + * $loop->addTimer(3.0, function () use ($loop) { + * $loop->stop(); + * }); + * ``` + * + * Calling this method on a loop instance that is not currently running or + * on a loop instance that has already been stopped has no effect. + * + * @return void + */ + public function stop(); +} diff --git a/vendor/react/event-loop/src/SignalsHandler.php b/vendor/react/event-loop/src/SignalsHandler.php new file mode 100644 index 000000000..10d125df8 --- /dev/null +++ b/vendor/react/event-loop/src/SignalsHandler.php @@ -0,0 +1,63 @@ +signals[$signal])) { + $this->signals[$signal] = array(); + } + + if (\in_array($listener, $this->signals[$signal])) { + return; + } + + $this->signals[$signal][] = $listener; + } + + public function remove($signal, $listener) + { + if (!isset($this->signals[$signal])) { + return; + } + + $index = \array_search($listener, $this->signals[$signal], true); + unset($this->signals[$signal][$index]); + + if (isset($this->signals[$signal]) && \count($this->signals[$signal]) === 0) { + unset($this->signals[$signal]); + } + } + + public function call($signal) + { + if (!isset($this->signals[$signal])) { + return; + } + + foreach ($this->signals[$signal] as $listener) { + \call_user_func($listener, $signal); + } + } + + public function count($signal) + { + if (!isset($this->signals[$signal])) { + return 0; + } + + return \count($this->signals[$signal]); + } + + public function isEmpty() + { + return !$this->signals; + } +} diff --git a/vendor/react/event-loop/src/StreamSelectLoop.php b/vendor/react/event-loop/src/StreamSelectLoop.php new file mode 100644 index 000000000..1686fd740 --- /dev/null +++ b/vendor/react/event-loop/src/StreamSelectLoop.php @@ -0,0 +1,330 @@ +futureTickQueue = new FutureTickQueue(); + $this->timers = new Timers(); + $this->pcntl = \function_exists('pcntl_signal') && \function_exists('pcntl_signal_dispatch'); + $this->pcntlPoll = $this->pcntl && !\function_exists('pcntl_async_signals'); + $this->signals = new SignalsHandler(); + + // prefer async signals if available (PHP 7.1+) or fall back to dispatching on each tick + if ($this->pcntl && !$this->pcntlPoll) { + \pcntl_async_signals(true); + } + } + + public function addReadStream($stream, $listener) + { + $key = (int) $stream; + + if (!isset($this->readStreams[$key])) { + $this->readStreams[$key] = $stream; + $this->readListeners[$key] = $listener; + } + } + + public function addWriteStream($stream, $listener) + { + $key = (int) $stream; + + if (!isset($this->writeStreams[$key])) { + $this->writeStreams[$key] = $stream; + $this->writeListeners[$key] = $listener; + } + } + + public function removeReadStream($stream) + { + $key = (int) $stream; + + unset( + $this->readStreams[$key], + $this->readListeners[$key] + ); + } + + public function removeWriteStream($stream) + { + $key = (int) $stream; + + unset( + $this->writeStreams[$key], + $this->writeListeners[$key] + ); + } + + public function addTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, false); + + $this->timers->add($timer); + + return $timer; + } + + public function addPeriodicTimer($interval, $callback) + { + $timer = new Timer($interval, $callback, true); + + $this->timers->add($timer); + + return $timer; + } + + public function cancelTimer(TimerInterface $timer) + { + $this->timers->cancel($timer); + } + + public function futureTick($listener) + { + $this->futureTickQueue->add($listener); + } + + public function addSignal($signal, $listener) + { + if ($this->pcntl === false) { + throw new \BadMethodCallException('Event loop feature "signals" isn\'t supported by the "StreamSelectLoop"'); + } + + $first = $this->signals->count($signal) === 0; + $this->signals->add($signal, $listener); + + if ($first) { + \pcntl_signal($signal, array($this->signals, 'call')); + } + } + + public function removeSignal($signal, $listener) + { + if (!$this->signals->count($signal)) { + return; + } + + $this->signals->remove($signal, $listener); + + if ($this->signals->count($signal) === 0) { + \pcntl_signal($signal, \SIG_DFL); + } + } + + public function run() + { + $this->running = true; + + while ($this->running) { + $this->futureTickQueue->tick(); + + $this->timers->tick(); + + // Future-tick queue has pending callbacks ... + if (!$this->running || !$this->futureTickQueue->isEmpty()) { + $timeout = 0; + + // There is a pending timer, only block until it is due ... + } elseif ($scheduledAt = $this->timers->getFirst()) { + $timeout = $scheduledAt - $this->timers->getTime(); + if ($timeout < 0) { + $timeout = 0; + } else { + // Convert float seconds to int microseconds. + // Ensure we do not exceed maximum integer size, which may + // cause the loop to tick once every ~35min on 32bit systems. + $timeout *= self::MICROSECONDS_PER_SECOND; + $timeout = $timeout > \PHP_INT_MAX ? \PHP_INT_MAX : (int)$timeout; + } + + // The only possible event is stream or signal activity, so wait forever ... + } elseif ($this->readStreams || $this->writeStreams || !$this->signals->isEmpty()) { + $timeout = null; + + // There's nothing left to do ... + } else { + break; + } + + $this->waitForStreamActivity($timeout); + } + } + + public function stop() + { + $this->running = false; + } + + /** + * Wait/check for stream activity, or until the next timer is due. + * + * @param integer|null $timeout Activity timeout in microseconds, or null to wait forever. + */ + private function waitForStreamActivity($timeout) + { + $read = $this->readStreams; + $write = $this->writeStreams; + + $available = $this->streamSelect($read, $write, $timeout); + if ($this->pcntlPoll) { + \pcntl_signal_dispatch(); + } + if (false === $available) { + // if a system call has been interrupted, + // we cannot rely on it's outcome + return; + } + + foreach ($read as $stream) { + $key = (int) $stream; + + if (isset($this->readListeners[$key])) { + \call_user_func($this->readListeners[$key], $stream); + } + } + + foreach ($write as $stream) { + $key = (int) $stream; + + if (isset($this->writeListeners[$key])) { + \call_user_func($this->writeListeners[$key], $stream); + } + } + } + + /** + * Emulate a stream_select() implementation that does not break when passed + * empty stream arrays. + * + * @param array $read An array of read streams to select upon. + * @param array $write An array of write streams to select upon. + * @param int|null $timeout Activity timeout in microseconds, or null to wait forever. + * + * @return int|false The total number of streams that are ready for read/write. + * Can return false if stream_select() is interrupted by a signal. + */ + private function streamSelect(array &$read, array &$write, $timeout) + { + if ($read || $write) { + // We do not usually use or expose the `exceptfds` parameter passed to the underlying `select`. + // However, Windows does not report failed connection attempts in `writefds` passed to `select` like most other platforms. + // Instead, it uses `writefds` only for successful connection attempts and `exceptfds` for failed connection attempts. + // We work around this by adding all sockets that look like a pending connection attempt to `exceptfds` automatically on Windows and merge it back later. + // This ensures the public API matches other loop implementations across all platforms (see also test suite or rather test matrix). + // Lacking better APIs, every write-only socket that has not yet read any data is assumed to be in a pending connection attempt state. + // @link https://docs.microsoft.com/de-de/windows/win32/api/winsock2/nf-winsock2-select + $except = null; + if (\DIRECTORY_SEPARATOR === '\\') { + $except = array(); + foreach ($write as $key => $socket) { + if (!isset($read[$key]) && @\ftell($socket) === 0) { + $except[$key] = $socket; + } + } + } + + /** @var ?callable $previous */ + $previous = \set_error_handler(function ($errno, $errstr) use (&$previous) { + // suppress warnings that occur when `stream_select()` is interrupted by a signal + // PHP defines `EINTR` through `ext-sockets` or `ext-pcntl`, otherwise use common default (Linux & Mac) + $eintr = \defined('SOCKET_EINTR') ? \SOCKET_EINTR : (\defined('PCNTL_EINTR') ? \PCNTL_EINTR : 4); + if ($errno === \E_WARNING && \strpos($errstr, '[' . $eintr .']: ') !== false) { + return; + } + + // forward any other error to registered error handler or print warning + return ($previous !== null) ? \call_user_func_array($previous, \func_get_args()) : false; + }); + + try { + $ret = \stream_select($read, $write, $except, $timeout === null ? null : 0, $timeout); + \restore_error_handler(); + } catch (\Throwable $e) { // @codeCoverageIgnoreStart + \restore_error_handler(); + throw $e; + } catch (\Exception $e) { + \restore_error_handler(); + throw $e; + } // @codeCoverageIgnoreEnd + + if ($except) { + $write = \array_merge($write, $except); + } + return $ret; + } + + if ($timeout > 0) { + \usleep($timeout); + } elseif ($timeout === null) { + // wait forever (we only reach this if we're only awaiting signals) + // this may be interrupted and return earlier when a signal is received + \sleep(PHP_INT_MAX); + } + + return 0; + } +} diff --git a/vendor/react/event-loop/src/Tick/FutureTickQueue.php b/vendor/react/event-loop/src/Tick/FutureTickQueue.php new file mode 100644 index 000000000..efabcbc54 --- /dev/null +++ b/vendor/react/event-loop/src/Tick/FutureTickQueue.php @@ -0,0 +1,60 @@ +queue = new SplQueue(); + } + + /** + * Add a callback to be invoked on a future tick of the event loop. + * + * Callbacks are guaranteed to be executed in the order they are enqueued. + * + * @param callable $listener The callback to invoke. + */ + public function add($listener) + { + $this->queue->enqueue($listener); + } + + /** + * Flush the callback queue. + */ + public function tick() + { + // Only invoke as many callbacks as were on the queue when tick() was called. + $count = $this->queue->count(); + + while ($count--) { + \call_user_func( + $this->queue->dequeue() + ); + } + } + + /** + * Check if the next tick queue is empty. + * + * @return boolean + */ + public function isEmpty() + { + return $this->queue->isEmpty(); + } +} diff --git a/vendor/react/event-loop/src/Timer/Timer.php b/vendor/react/event-loop/src/Timer/Timer.php new file mode 100644 index 000000000..da3602a31 --- /dev/null +++ b/vendor/react/event-loop/src/Timer/Timer.php @@ -0,0 +1,55 @@ +interval = (float) $interval; + $this->callback = $callback; + $this->periodic = (bool) $periodic; + } + + public function getInterval() + { + return $this->interval; + } + + public function getCallback() + { + return $this->callback; + } + + public function isPeriodic() + { + return $this->periodic; + } +} diff --git a/vendor/react/event-loop/src/Timer/Timers.php b/vendor/react/event-loop/src/Timer/Timers.php new file mode 100644 index 000000000..53c46d03b --- /dev/null +++ b/vendor/react/event-loop/src/Timer/Timers.php @@ -0,0 +1,113 @@ +useHighResolution = \function_exists('hrtime'); + } + + public function updateTime() + { + return $this->time = $this->useHighResolution ? \hrtime(true) * 1e-9 : \microtime(true); + } + + public function getTime() + { + return $this->time ?: $this->updateTime(); + } + + public function add(TimerInterface $timer) + { + $id = \PHP_VERSION_ID < 70200 ? \spl_object_hash($timer) : \spl_object_id($timer); + $this->timers[$id] = $timer; + $this->schedule[$id] = $timer->getInterval() + $this->updateTime(); + $this->sorted = false; + } + + public function contains(TimerInterface $timer) + { + $id = \PHP_VERSION_ID < 70200 ? \spl_object_hash($timer) : \spl_object_id($timer); + return isset($this->timers[$id]); + } + + public function cancel(TimerInterface $timer) + { + $id = \PHP_VERSION_ID < 70200 ? \spl_object_hash($timer) : \spl_object_id($timer); + unset($this->timers[$id], $this->schedule[$id]); + } + + public function getFirst() + { + // ensure timers are sorted to simply accessing next (first) one + if (!$this->sorted) { + $this->sorted = true; + \asort($this->schedule); + } + + return \reset($this->schedule); + } + + public function isEmpty() + { + return \count($this->timers) === 0; + } + + public function tick() + { + // hot path: skip timers if nothing is scheduled + if (!$this->schedule) { + return; + } + + // ensure timers are sorted so we can execute in order + if (!$this->sorted) { + $this->sorted = true; + \asort($this->schedule); + } + + $time = $this->updateTime(); + + foreach ($this->schedule as $id => $scheduled) { + // schedule is ordered, so loop until first timer that is not scheduled for execution now + if ($scheduled >= $time) { + break; + } + + // skip any timers that are removed while we process the current schedule + if (!isset($this->schedule[$id]) || $this->schedule[$id] !== $scheduled) { + continue; + } + + $timer = $this->timers[$id]; + \call_user_func($timer->getCallback(), $timer); + + // re-schedule if this is a periodic timer and it has not been cancelled explicitly already + if ($timer->isPeriodic() && isset($this->timers[$id])) { + $this->schedule[$id] = $timer->getInterval() + $time; + $this->sorted = false; + } else { + unset($this->timers[$id], $this->schedule[$id]); + } + } + } +} diff --git a/vendor/react/event-loop/src/TimerInterface.php b/vendor/react/event-loop/src/TimerInterface.php new file mode 100644 index 000000000..cdcf7732d --- /dev/null +++ b/vendor/react/event-loop/src/TimerInterface.php @@ -0,0 +1,27 @@ +` and `reject(Throwable $reason): PromiseInterface`. + It is no longer possible to resolve a promise without a value (use `null` instead) or reject a promise without a reason (use `Throwable` instead). + (#93, #141 and #142 by @jsor, #138, #149 and #247 by @WyriHaximus and #213 and #246 by @clue) + + ```php + // old (arguments used to be optional) + $promise = resolve(); + $promise = reject(); + + // new (already supported before) + $promise = resolve(null); + $promise = reject(new RuntimeException()); + ``` + +* Feature / BC break: Report all unhandled rejections by default and remove ~~`done()`~~ method. + Add new `set_rejection_handler()` function to set the global rejection handler for unhandled promise rejections. + (#248, #249 and #224 by @clue) + + ```php + // Unhandled promise rejection with RuntimeException: Unhandled in example.php:2 + reject(new RuntimeException('Unhandled')); + ``` + +* BC break: Remove all deprecated APIs and reduce API surface. + Remove ~~`some()`~~, ~~`map()`~~, ~~`reduce()`~~ functions, use `any()` and `all()` functions instead. + Remove internal ~~`FulfilledPromise`~~ and ~~`RejectedPromise`~~ classes, use `resolve()` and `reject()` functions instead. + Remove legacy promise progress API (deprecated third argument to `then()` method) and deprecated ~~`LazyPromise`~~ class. + (#32 and #98 by @jsor and #164, #219 and #220 by @clue) + +* BC break: Make all classes final to encourage composition over inheritance. + (#80 by @jsor) + +* Feature / BC break: Require `array` (or `iterable`) type for `all()` + `race()` + `any()` functions and bring in line with ES6 specification. + These functions now require a single argument with a variable number of promises or values as input. + (#225 by @clue and #35 by @jsor) + +* Fix / BC break: Fix `race()` to return a forever pending promise when called with an empty `array` (or `iterable`) and bring in line with ES6 specification. + (#83 by @jsor and #225 by @clue) + +* Minor performance improvements by initializing `Deferred` in the constructor and avoiding `call_user_func()` calls. + (#151 by @WyriHaximus and #171 by @Kubo2) + +* Minor documentation improvements. + (#110 by @seregazhuk, #132 by @CharlotteDunois, #145 by @danielecr, #178 by @WyriHaximus, #189 by @srdante, #212 by @clue, #214, #239 and #243 by @SimonFrings and #231 by @nhedger) + +The following changes had to be ported to this release due to our branching +strategy, but also appeared in the [`2.x` branch](https://github.com/reactphp/promise/tree/2.x): + +* Feature: Support union types and address deprecation of `ReflectionType::getClass()` (PHP 8+). + (#197 by @cdosoftei and @SimonFrings) + +* Feature: Support intersection types (PHP 8.1+). + (#209 by @bzikarsky) + +* Feature: Support DNS types (PHP 8.2+). + (#236 by @nhedger) + +* Feature: Port all memory improvements from `2.x` to `3.x`. + (#150 by @clue and @WyriHaximus) + +* Fix: Fix checking whether cancellable promise is an object and avoid possible warning. + (#161 by @smscr) + +* Improve performance by prefixing all global functions calls with \ to skip the look up and resolve process and go straight to the global function. + (#134 by @WyriHaximus) + +* Improve test suite, update PHPUnit and PHP versions and add `.gitattributes` to exclude dev files from exports. + (#107 by @carusogabriel, #148 and #234 by @WyriHaximus, #153 by @reedy, #162, #230 and #240 by @clue, #173, #177, #185 and #199 by @SimonFrings, #193 by @woodongwong and #210 by @bzikarsky) + +The following changes were originally planned for this release but later reverted +and are not part of the final release: + +* Add iterative callback queue handler to avoid recursion (later removed to improve Fiber support). + (#28, #82 and #86 by @jsor, #158 by @WyriHaximus and #229 and #238 by @clue) + +* Trigger an `E_USER_ERROR` instead of throwing an exception from `done()` (later removed entire `done()` method to globally report unhandled rejections). + (#97 by @jsor and #224 and #248 by @clue) + +* Add type declarations for `some()` (later removed entire `some()` function). + (#172 by @WyriHaximus and #219 by @clue) + +## 2.0.0 (2013-12-10) + +See [`2.x` CHANGELOG](https://github.com/reactphp/promise/blob/2.x/CHANGELOG.md) for more details. + +## 1.0.0 (2012-11-07) + +See [`1.x` CHANGELOG](https://github.com/reactphp/promise/blob/1.x/CHANGELOG.md) for more details. diff --git a/vendor/react/promise/LICENSE b/vendor/react/promise/LICENSE new file mode 100644 index 000000000..21c1357b7 --- /dev/null +++ b/vendor/react/promise/LICENSE @@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) 2012 Jan Sorgalla, Christian Lück, Cees-Jan Kiewiet, Chris Boden + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/react/promise/README.md b/vendor/react/promise/README.md new file mode 100644 index 000000000..2108d982e --- /dev/null +++ b/vendor/react/promise/README.md @@ -0,0 +1,722 @@ +Promise +======= + +A lightweight implementation of +[CommonJS Promises/A](http://wiki.commonjs.org/wiki/Promises/A) for PHP. + +[![CI status](https://github.com/reactphp/promise/workflows/CI/badge.svg)](https://github.com/reactphp/promise/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/promise?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/promise) + +Table of Contents +----------------- + +1. [Introduction](#introduction) +2. [Concepts](#concepts) + * [Deferred](#deferred) + * [Promise](#promise-1) +3. [API](#api) + * [Deferred](#deferred-1) + * [Deferred::promise()](#deferredpromise) + * [Deferred::resolve()](#deferredresolve) + * [Deferred::reject()](#deferredreject) + * [PromiseInterface](#promiseinterface) + * [PromiseInterface::then()](#promiseinterfacethen) + * [PromiseInterface::catch()](#promiseinterfacecatch) + * [PromiseInterface::finally()](#promiseinterfacefinally) + * [PromiseInterface::cancel()](#promiseinterfacecancel) + * [~~PromiseInterface::otherwise()~~](#promiseinterfaceotherwise) + * [~~PromiseInterface::always()~~](#promiseinterfacealways) + * [Promise](#promise-2) + * [Functions](#functions) + * [resolve()](#resolve) + * [reject()](#reject) + * [all()](#all) + * [race()](#race) + * [any()](#any) + * [set_rejection_handler()](#set_rejection_handler) +4. [Examples](#examples) + * [How to use Deferred](#how-to-use-deferred) + * [How promise forwarding works](#how-promise-forwarding-works) + * [Resolution forwarding](#resolution-forwarding) + * [Rejection forwarding](#rejection-forwarding) + * [Mixed resolution and rejection forwarding](#mixed-resolution-and-rejection-forwarding) +5. [Install](#install) +6. [Tests](#tests) +7. [Credits](#credits) +8. [License](#license) + +Introduction +------------ + +Promise is a library implementing +[CommonJS Promises/A](http://wiki.commonjs.org/wiki/Promises/A) for PHP. + +It also provides several other useful promise-related concepts, such as joining +multiple promises and mapping and reducing collections of promises. + +If you've never heard about promises before, +[read this first](https://gist.github.com/domenic/3889970). + +Concepts +-------- + +### Deferred + +A **Deferred** represents a computation or unit of work that may not have +completed yet. Typically (but not always), that computation will be something +that executes asynchronously and completes at some point in the future. + +### Promise + +While a deferred represents the computation itself, a **Promise** represents +the result of that computation. Thus, each deferred has a promise that acts as +a placeholder for its actual result. + +API +--- + +### Deferred + +A deferred represents an operation whose resolution is pending. It has separate +promise and resolver parts. + +```php +$deferred = new React\Promise\Deferred(); + +$promise = $deferred->promise(); + +$deferred->resolve(mixed $value); +$deferred->reject(\Throwable $reason); +``` + +The `promise` method returns the promise of the deferred. + +The `resolve` and `reject` methods control the state of the deferred. + +The constructor of the `Deferred` accepts an optional `$canceller` argument. +See [Promise](#promise-2) for more information. + +#### Deferred::promise() + +```php +$promise = $deferred->promise(); +``` + +Returns the promise of the deferred, which you can hand out to others while +keeping the authority to modify its state to yourself. + +#### Deferred::resolve() + +```php +$deferred->resolve(mixed $value); +``` + +Resolves the promise returned by `promise()`. All consumers are notified by +having `$onFulfilled` (which they registered via `$promise->then()`) called with +`$value`. + +If `$value` itself is a promise, the promise will transition to the state of +this promise once it is resolved. + +See also the [`resolve()` function](#resolve). + +#### Deferred::reject() + +```php +$deferred->reject(\Throwable $reason); +``` + +Rejects the promise returned by `promise()`, signalling that the deferred's +computation failed. +All consumers are notified by having `$onRejected` (which they registered via +`$promise->then()`) called with `$reason`. + +See also the [`reject()` function](#reject). + +### PromiseInterface + +The promise interface provides the common interface for all promise +implementations. +See [Promise](#promise-2) for the only public implementation exposed by this +package. + +A promise represents an eventual outcome, which is either fulfillment (success) +and an associated value, or rejection (failure) and an associated reason. + +Once in the fulfilled or rejected state, a promise becomes immutable. +Neither its state nor its result (or error) can be modified. + +#### PromiseInterface::then() + +```php +$transformedPromise = $promise->then(callable $onFulfilled = null, callable $onRejected = null); +``` + +Transforms a promise's value by applying a function to the promise's fulfillment +or rejection value. Returns a new promise for the transformed result. + +The `then()` method registers new fulfilled and rejection handlers with a promise +(all parameters are optional): + + * `$onFulfilled` will be invoked once the promise is fulfilled and passed + the result as the first argument. + * `$onRejected` will be invoked once the promise is rejected and passed the + reason as the first argument. + +It returns a new promise that will fulfill with the return value of either +`$onFulfilled` or `$onRejected`, whichever is called, or will reject with +the thrown exception if either throws. + +A promise makes the following guarantees about handlers registered in +the same call to `then()`: + + 1. Only one of `$onFulfilled` or `$onRejected` will be called, + never both. + 2. `$onFulfilled` and `$onRejected` will never be called more + than once. + +#### See also + +* [resolve()](#resolve) - Creating a resolved promise +* [reject()](#reject) - Creating a rejected promise + +#### PromiseInterface::catch() + +```php +$promise->catch(callable $onRejected); +``` + +Registers a rejection handler for promise. It is a shortcut for: + +```php +$promise->then(null, $onRejected); +``` + +Additionally, you can type hint the `$reason` argument of `$onRejected` to catch +only specific errors. + +```php +$promise + ->catch(function (\RuntimeException $reason) { + // Only catch \RuntimeException instances + // All other types of errors will propagate automatically + }) + ->catch(function (\Throwable $reason) { + // Catch other errors + }); +``` + +#### PromiseInterface::finally() + +```php +$newPromise = $promise->finally(callable $onFulfilledOrRejected); +``` + +Allows you to execute "cleanup" type tasks in a promise chain. + +It arranges for `$onFulfilledOrRejected` to be called, with no arguments, +when the promise is either fulfilled or rejected. + +* If `$promise` fulfills, and `$onFulfilledOrRejected` returns successfully, + `$newPromise` will fulfill with the same value as `$promise`. +* If `$promise` fulfills, and `$onFulfilledOrRejected` throws or returns a + rejected promise, `$newPromise` will reject with the thrown exception or + rejected promise's reason. +* If `$promise` rejects, and `$onFulfilledOrRejected` returns successfully, + `$newPromise` will reject with the same reason as `$promise`. +* If `$promise` rejects, and `$onFulfilledOrRejected` throws or returns a + rejected promise, `$newPromise` will reject with the thrown exception or + rejected promise's reason. + +`finally()` behaves similarly to the synchronous finally statement. When combined +with `catch()`, `finally()` allows you to write code that is similar to the familiar +synchronous catch/finally pair. + +Consider the following synchronous code: + +```php +try { + return doSomething(); +} catch (\Throwable $e) { + return handleError($e); +} finally { + cleanup(); +} +``` + +Similar asynchronous code (with `doSomething()` that returns a promise) can be +written: + +```php +return doSomething() + ->catch('handleError') + ->finally('cleanup'); +``` + +#### PromiseInterface::cancel() + +``` php +$promise->cancel(); +``` + +The `cancel()` method notifies the creator of the promise that there is no +further interest in the results of the operation. + +Once a promise is settled (either fulfilled or rejected), calling `cancel()` on +a promise has no effect. + +#### ~~PromiseInterface::otherwise()~~ + +> Deprecated since v3.0.0, see [`catch()`](#promiseinterfacecatch) instead. + +The `otherwise()` method registers a rejection handler for a promise. + +This method continues to exist only for BC reasons and to ease upgrading +between versions. It is an alias for: + +```php +$promise->catch($onRejected); +``` + +#### ~~PromiseInterface::always()~~ + +> Deprecated since v3.0.0, see [`finally()`](#promiseinterfacefinally) instead. + +The `always()` method allows you to execute "cleanup" type tasks in a promise chain. + +This method continues to exist only for BC reasons and to ease upgrading +between versions. It is an alias for: + +```php +$promise->finally($onFulfilledOrRejected); +``` + +### Promise + +Creates a promise whose state is controlled by the functions passed to +`$resolver`. + +```php +$resolver = function (callable $resolve, callable $reject) { + // Do some work, possibly asynchronously, and then + // resolve or reject. + + $resolve($awesomeResult); + // or throw new Exception('Promise rejected'); + // or $resolve($anotherPromise); + // or $reject($nastyError); +}; + +$canceller = function () { + // Cancel/abort any running operations like network connections, streams etc. + + // Reject promise by throwing an exception + throw new Exception('Promise cancelled'); +}; + +$promise = new React\Promise\Promise($resolver, $canceller); +``` + +The promise constructor receives a resolver function and an optional canceller +function which both will be called with two arguments: + + * `$resolve($value)` - Primary function that seals the fate of the + returned promise. Accepts either a non-promise value, or another promise. + When called with a non-promise value, fulfills promise with that value. + When called with another promise, e.g. `$resolve($otherPromise)`, promise's + fate will be equivalent to that of `$otherPromise`. + * `$reject($reason)` - Function that rejects the promise. It is recommended to + just throw an exception instead of using `$reject()`. + +If the resolver or canceller throw an exception, the promise will be rejected +with that thrown exception as the rejection reason. + +The resolver function will be called immediately, the canceller function only +once all consumers called the `cancel()` method of the promise. + +### Functions + +Useful functions for creating and joining collections of promises. + +All functions working on promise collections (like `all()`, `race()`, +etc.) support cancellation. This means, if you call `cancel()` on the returned +promise, all promises in the collection are cancelled. + +#### resolve() + +```php +$promise = React\Promise\resolve(mixed $promiseOrValue); +``` + +Creates a promise for the supplied `$promiseOrValue`. + +If `$promiseOrValue` is a value, it will be the resolution value of the +returned promise. + +If `$promiseOrValue` is a thenable (any object that provides a `then()` method), +a trusted promise that follows the state of the thenable is returned. + +If `$promiseOrValue` is a promise, it will be returned as is. + +The resulting `$promise` implements the [`PromiseInterface`](#promiseinterface) +and can be consumed like any other promise: + +```php +$promise = React\Promise\resolve(42); + +$promise->then(function (int $result): void { + var_dump($result); +}, function (\Throwable $e): void { + echo 'Error: ' . $e->getMessage() . PHP_EOL; +}); +``` + +#### reject() + +```php +$promise = React\Promise\reject(\Throwable $reason); +``` + +Creates a rejected promise for the supplied `$reason`. + +Note that the [`\Throwable`](https://www.php.net/manual/en/class.throwable.php) interface introduced in PHP 7 covers +both user land [`\Exception`](https://www.php.net/manual/en/class.exception.php)'s and +[`\Error`](https://www.php.net/manual/en/class.error.php) internal PHP errors. By enforcing `\Throwable` as reason to +reject a promise, any language error or user land exception can be used to reject a promise. + +The resulting `$promise` implements the [`PromiseInterface`](#promiseinterface) +and can be consumed like any other promise: + +```php +$promise = React\Promise\reject(new RuntimeException('Request failed')); + +$promise->then(function (int $result): void { + var_dump($result); +}, function (\Throwable $e): void { + echo 'Error: ' . $e->getMessage() . PHP_EOL; +}); +``` + +Note that rejected promises should always be handled similar to how any +exceptions should always be caught in a `try` + `catch` block. If you remove the +last reference to a rejected promise that has not been handled, it will +report an unhandled promise rejection: + +```php +function incorrect(): int +{ + $promise = React\Promise\reject(new RuntimeException('Request failed')); + + // Commented out: No rejection handler registered here. + // $promise->then(null, function (\Throwable $e): void { /* ignore */ }); + + // Returning from a function will remove all local variable references, hence why + // this will report an unhandled promise rejection here. + return 42; +} + +// Calling this function will log an error message plus its stack trace: +// Unhandled promise rejection with RuntimeException: Request failed in example.php:10 +incorrect(); +``` + +A rejected promise will be considered "handled" if you catch the rejection +reason with either the [`then()` method](#promiseinterfacethen), the +[`catch()` method](#promiseinterfacecatch), or the +[`finally()` method](#promiseinterfacefinally). Note that each of these methods +return a new promise that may again be rejected if you re-throw an exception. + +A rejected promise will also be considered "handled" if you abort the operation +with the [`cancel()` method](#promiseinterfacecancel) (which in turn would +usually reject the promise if it is still pending). + +See also the [`set_rejection_handler()` function](#set_rejection_handler). + +#### all() + +```php +$promise = React\Promise\all(iterable $promisesOrValues); +``` + +Returns a promise that will resolve only once all the items in +`$promisesOrValues` have resolved. The resolution value of the returned promise +will be an array containing the resolution values of each of the items in +`$promisesOrValues`. + +#### race() + +```php +$promise = React\Promise\race(iterable $promisesOrValues); +``` + +Initiates a competitive race that allows one winner. Returns a promise which is +resolved in the same way the first settled promise resolves. + +The returned promise will become **infinitely pending** if `$promisesOrValues` +contains 0 items. + +#### any() + +```php +$promise = React\Promise\any(iterable $promisesOrValues); +``` + +Returns a promise that will resolve when any one of the items in +`$promisesOrValues` resolves. The resolution value of the returned promise +will be the resolution value of the triggering item. + +The returned promise will only reject if *all* items in `$promisesOrValues` are +rejected. The rejection value will be a `React\Promise\Exception\CompositeException` +which holds all rejection reasons. The rejection reasons can be obtained with +`CompositeException::getThrowables()`. + +The returned promise will also reject with a `React\Promise\Exception\LengthException` +if `$promisesOrValues` contains 0 items. + +#### set_rejection_handler() + +```php +React\Promise\set_rejection_handler(?callable $callback): ?callable; +``` + +Sets the global rejection handler for unhandled promise rejections. + +Note that rejected promises should always be handled similar to how any +exceptions should always be caught in a `try` + `catch` block. If you remove +the last reference to a rejected promise that has not been handled, it will +report an unhandled promise rejection. See also the [`reject()` function](#reject) +for more details. + +The `?callable $callback` argument MUST be a valid callback function that +accepts a single `Throwable` argument or a `null` value to restore the +default promise rejection handler. The return value of the callback function +will be ignored and has no effect, so you SHOULD return a `void` value. The +callback function MUST NOT throw or the program will be terminated with a +fatal error. + +The function returns the previous rejection handler or `null` if using the +default promise rejection handler. + +The default promise rejection handler will log an error message plus its stack +trace: + +```php +// Unhandled promise rejection with RuntimeException: Unhandled in example.php:2 +React\Promise\reject(new RuntimeException('Unhandled')); +``` + +The promise rejection handler may be used to use customize the log message or +write to custom log targets. As a rule of thumb, this function should only be +used as a last resort and promise rejections are best handled with either the +[`then()` method](#promiseinterfacethen), the +[`catch()` method](#promiseinterfacecatch), or the +[`finally()` method](#promiseinterfacefinally). +See also the [`reject()` function](#reject) for more details. + +Examples +-------- + +### How to use Deferred + +```php +function getAwesomeResultPromise() +{ + $deferred = new React\Promise\Deferred(); + + // Execute a Node.js-style function using the callback pattern + computeAwesomeResultAsynchronously(function (\Throwable $error, $result) use ($deferred) { + if ($error) { + $deferred->reject($error); + } else { + $deferred->resolve($result); + } + }); + + // Return the promise + return $deferred->promise(); +} + +getAwesomeResultPromise() + ->then( + function ($value) { + // Deferred resolved, do something with $value + }, + function (\Throwable $reason) { + // Deferred rejected, do something with $reason + } + ); +``` + +### How promise forwarding works + +A few simple examples to show how the mechanics of Promises/A forwarding works. +These examples are contrived, of course, and in real usage, promise chains will +typically be spread across several function calls, or even several levels of +your application architecture. + +#### Resolution forwarding + +Resolved promises forward resolution values to the next promise. +The first promise, `$deferred->promise()`, will resolve with the value passed +to `$deferred->resolve()` below. + +Each call to `then()` returns a new promise that will resolve with the return +value of the previous handler. This creates a promise "pipeline". + +```php +$deferred = new React\Promise\Deferred(); + +$deferred->promise() + ->then(function ($x) { + // $x will be the value passed to $deferred->resolve() below + // and returns a *new promise* for $x + 1 + return $x + 1; + }) + ->then(function ($x) { + // $x === 2 + // This handler receives the return value of the + // previous handler. + return $x + 1; + }) + ->then(function ($x) { + // $x === 3 + // This handler receives the return value of the + // previous handler. + return $x + 1; + }) + ->then(function ($x) { + // $x === 4 + // This handler receives the return value of the + // previous handler. + echo 'Resolve ' . $x; + }); + +$deferred->resolve(1); // Prints "Resolve 4" +``` + +#### Rejection forwarding + +Rejected promises behave similarly, and also work similarly to try/catch: +When you catch an exception, you must rethrow for it to propagate. + +Similarly, when you handle a rejected promise, to propagate the rejection, +"rethrow" it by either returning a rejected promise, or actually throwing +(since promise translates thrown exceptions into rejections) + +```php +$deferred = new React\Promise\Deferred(); + +$deferred->promise() + ->then(function ($x) { + throw new \Exception($x + 1); + }) + ->catch(function (\Exception $x) { + // Propagate the rejection + throw $x; + }) + ->catch(function (\Exception $x) { + // Can also propagate by returning another rejection + return React\Promise\reject( + new \Exception($x->getMessage() + 1) + ); + }) + ->catch(function ($x) { + echo 'Reject ' . $x->getMessage(); // 3 + }); + +$deferred->resolve(1); // Prints "Reject 3" +``` + +#### Mixed resolution and rejection forwarding + +Just like try/catch, you can choose to propagate or not. Mixing resolutions and +rejections will still forward handler results in a predictable way. + +```php +$deferred = new React\Promise\Deferred(); + +$deferred->promise() + ->then(function ($x) { + return $x + 1; + }) + ->then(function ($x) { + throw new \Exception($x + 1); + }) + ->catch(function (\Exception $x) { + // Handle the rejection, and don't propagate. + // This is like catch without a rethrow + return $x->getMessage() + 1; + }) + ->then(function ($x) { + echo 'Mixed ' . $x; // 4 + }); + +$deferred->resolve(1); // Prints "Mixed 4" +``` + +Install +------- + +The recommended way to install this library is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](https://semver.org/). +This will install the latest supported version from this branch: + +```bash +composer require react/promise:^3.2 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on PHP 7.1 through current PHP 8+. +It's *highly recommended to use the latest supported PHP version* for this project. + +We're committed to providing long-term support (LTS) options and to provide a +smooth upgrade path. If you're using an older PHP version, you may use the +[`2.x` branch](https://github.com/reactphp/promise/tree/2.x) (PHP 5.4+) or +[`1.x` branch](https://github.com/reactphp/promise/tree/1.x) (PHP 5.3+) which both +provide a compatible API but do not take advantage of newer language features. +You may target multiple versions at the same time to support a wider range of +PHP versions like this: + +```bash +composer require "react/promise:^3 || ^2 || ^1" +``` + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org/): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +On top of this, we use PHPStan on max level to ensure type safety across the project: + +```bash +vendor/bin/phpstan +``` + +Credits +------- + +Promise is a port of [when.js](https://github.com/cujojs/when) +by [Brian Cavalier](https://github.com/briancavalier). + +Also, large parts of the documentation have been ported from the when.js +[Wiki](https://github.com/cujojs/when/wiki) and the +[API docs](https://github.com/cujojs/when/blob/master/docs/api.md). + +License +------- + +Released under the [MIT](LICENSE) license. diff --git a/vendor/react/promise/composer.json b/vendor/react/promise/composer.json new file mode 100644 index 000000000..5d1e27710 --- /dev/null +++ b/vendor/react/promise/composer.json @@ -0,0 +1,57 @@ +{ + "name": "react/promise", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "license": "MIT", + "authors": [ + { + "name": "Jan Sorgalla", + "homepage": "https://sorgalla.com/", + "email": "jsorgalla@gmail.com" + }, + { + "name": "Christian Lück", + "homepage": "https://clue.engineering/", + "email": "christian@clue.engineering" + }, + { + "name": "Cees-Jan Kiewiet", + "homepage": "https://wyrihaximus.net/", + "email": "reactphp@ceesjankiewiet.nl" + }, + { + "name": "Chris Boden", + "homepage": "https://cboden.dev/", + "email": "cboden@gmail.com" + } + ], + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "autoload-dev": { + "psr-4": { + "React\\Promise\\": [ + "tests/fixtures/", + "tests/" + ] + }, + "files": [ + "tests/Fiber.php" + ] + }, + "keywords": [ + "promise", + "promises" + ] +} diff --git a/vendor/react/promise/src/Deferred.php b/vendor/react/promise/src/Deferred.php new file mode 100644 index 000000000..80b8fcfbd --- /dev/null +++ b/vendor/react/promise/src/Deferred.php @@ -0,0 +1,52 @@ + + */ + private $promise; + + /** @var callable(T):void */ + private $resolveCallback; + + /** @var callable(\Throwable):void */ + private $rejectCallback; + + /** + * @param (callable(callable(T):void,callable(\Throwable):void):void)|null $canceller + */ + public function __construct(?callable $canceller = null) + { + $this->promise = new Promise(function ($resolve, $reject): void { + $this->resolveCallback = $resolve; + $this->rejectCallback = $reject; + }, $canceller); + } + + /** + * @return PromiseInterface + */ + public function promise(): PromiseInterface + { + return $this->promise; + } + + /** + * @param T $value + */ + public function resolve($value): void + { + ($this->resolveCallback)($value); + } + + public function reject(\Throwable $reason): void + { + ($this->rejectCallback)($reason); + } +} diff --git a/vendor/react/promise/src/Exception/CompositeException.php b/vendor/react/promise/src/Exception/CompositeException.php new file mode 100644 index 000000000..2e672a04a --- /dev/null +++ b/vendor/react/promise/src/Exception/CompositeException.php @@ -0,0 +1,32 @@ +throwables = $throwables; + } + + /** + * @return \Throwable[] + */ + public function getThrowables(): array + { + return $this->throwables; + } +} diff --git a/vendor/react/promise/src/Exception/LengthException.php b/vendor/react/promise/src/Exception/LengthException.php new file mode 100644 index 000000000..775c48db6 --- /dev/null +++ b/vendor/react/promise/src/Exception/LengthException.php @@ -0,0 +1,7 @@ +started) { + return; + } + + $this->started = true; + $this->drain(); + } + + /** + * @param mixed $cancellable + */ + public function enqueue($cancellable): void + { + if (!\is_object($cancellable) || !\method_exists($cancellable, 'then') || !\method_exists($cancellable, 'cancel')) { + return; + } + + $length = \array_push($this->queue, $cancellable); + + if ($this->started && 1 === $length) { + $this->drain(); + } + } + + private function drain(): void + { + for ($i = \key($this->queue); isset($this->queue[$i]); $i++) { + $cancellable = $this->queue[$i]; + assert(\method_exists($cancellable, 'cancel')); + + $exception = null; + + try { + $cancellable->cancel(); + } catch (\Throwable $exception) { + } + + unset($this->queue[$i]); + + if ($exception) { + throw $exception; + } + } + + $this->queue = []; + } +} diff --git a/vendor/react/promise/src/Internal/FulfilledPromise.php b/vendor/react/promise/src/Internal/FulfilledPromise.php new file mode 100644 index 000000000..8664ffdb6 --- /dev/null +++ b/vendor/react/promise/src/Internal/FulfilledPromise.php @@ -0,0 +1,89 @@ + + */ +final class FulfilledPromise implements PromiseInterface +{ + /** @var T */ + private $value; + + /** + * @param T $value + * @throws \InvalidArgumentException + */ + public function __construct($value = null) + { + if ($value instanceof PromiseInterface) { + throw new \InvalidArgumentException('You cannot create React\Promise\FulfilledPromise with a promise. Use React\Promise\resolve($promiseOrValue) instead.'); + } + + $this->value = $value; + } + + /** + * @template TFulfilled + * @param ?(callable((T is void ? null : T)): (PromiseInterface|TFulfilled)) $onFulfilled + * @return PromiseInterface<($onFulfilled is null ? T : TFulfilled)> + */ + public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface + { + if (null === $onFulfilled) { + return $this; + } + + try { + /** + * @var PromiseInterface|T $result + */ + $result = $onFulfilled($this->value); + return resolve($result); + } catch (\Throwable $exception) { + return new RejectedPromise($exception); + } + } + + public function catch(callable $onRejected): PromiseInterface + { + return $this; + } + + public function finally(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->then(function ($value) use ($onFulfilledOrRejected): PromiseInterface { + return resolve($onFulfilledOrRejected())->then(function () use ($value) { + return $value; + }); + }); + } + + public function cancel(): void + { + } + + /** + * @deprecated 3.0.0 Use `catch()` instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface + { + return $this->catch($onRejected); + } + + /** + * @deprecated 3.0.0 Use `finally()` instead + * @see self::finally() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->finally($onFulfilledOrRejected); + } +} diff --git a/vendor/react/promise/src/Internal/RejectedPromise.php b/vendor/react/promise/src/Internal/RejectedPromise.php new file mode 100644 index 000000000..aa1dff308 --- /dev/null +++ b/vendor/react/promise/src/Internal/RejectedPromise.php @@ -0,0 +1,128 @@ + + */ +final class RejectedPromise implements PromiseInterface +{ + /** @var \Throwable */ + private $reason; + + /** @var bool */ + private $handled = false; + + /** + * @param \Throwable $reason + */ + public function __construct(\Throwable $reason) + { + $this->reason = $reason; + } + + /** @throws void */ + public function __destruct() + { + if ($this->handled) { + return; + } + + $handler = set_rejection_handler(null); + if ($handler === null) { + $message = 'Unhandled promise rejection with ' . $this->reason; + + \error_log($message); + return; + } + + try { + $handler($this->reason); + } catch (\Throwable $e) { + \preg_match('/^([^:\s]++)(.*+)$/sm', (string) $e, $match); + \assert(isset($match[1], $match[2])); + $message = 'Fatal error: Uncaught ' . $match[1] . ' from unhandled promise rejection handler' . $match[2]; + + \error_log($message); + exit(255); + } + } + + /** + * @template TRejected + * @param ?callable $onFulfilled + * @param ?(callable(\Throwable): (PromiseInterface|TRejected)) $onRejected + * @return PromiseInterface<($onRejected is null ? never : TRejected)> + */ + public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface + { + if (null === $onRejected) { + return $this; + } + + $this->handled = true; + + try { + return resolve($onRejected($this->reason)); + } catch (\Throwable $exception) { + return new RejectedPromise($exception); + } + } + + /** + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + */ + public function catch(callable $onRejected): PromiseInterface + { + if (!_checkTypehint($onRejected, $this->reason)) { + return $this; + } + + /** + * @var callable(\Throwable):(PromiseInterface|TRejected) $onRejected + */ + return $this->then(null, $onRejected); + } + + public function finally(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->then(null, function (\Throwable $reason) use ($onFulfilledOrRejected): PromiseInterface { + return resolve($onFulfilledOrRejected())->then(function () use ($reason): PromiseInterface { + return new RejectedPromise($reason); + }); + }); + } + + public function cancel(): void + { + $this->handled = true; + } + + /** + * @deprecated 3.0.0 Use `catch()` instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface + { + return $this->catch($onRejected); + } + + /** + * @deprecated 3.0.0 Use `always()` instead + * @see self::always() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->finally($onFulfilledOrRejected); + } +} diff --git a/vendor/react/promise/src/Promise.php b/vendor/react/promise/src/Promise.php new file mode 100644 index 000000000..4ac27007c --- /dev/null +++ b/vendor/react/promise/src/Promise.php @@ -0,0 +1,303 @@ + + */ +final class Promise implements PromiseInterface +{ + /** @var (callable(callable(T):void,callable(\Throwable):void):void)|null */ + private $canceller; + + /** @var ?PromiseInterface */ + private $result; + + /** @var list):void> */ + private $handlers = []; + + /** @var int */ + private $requiredCancelRequests = 0; + + /** @var bool */ + private $cancelled = false; + + /** + * @param callable(callable(T):void,callable(\Throwable):void):void $resolver + * @param (callable(callable(T):void,callable(\Throwable):void):void)|null $canceller + */ + public function __construct(callable $resolver, ?callable $canceller = null) + { + $this->canceller = $canceller; + + // Explicitly overwrite arguments with null values before invoking + // resolver function. This ensure that these arguments do not show up + // in the stack trace in PHP 7+ only. + $cb = $resolver; + $resolver = $canceller = null; + $this->call($cb); + } + + public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface + { + if (null !== $this->result) { + return $this->result->then($onFulfilled, $onRejected); + } + + if (null === $this->canceller) { + return new static($this->resolver($onFulfilled, $onRejected)); + } + + // This promise has a canceller, so we create a new child promise which + // has a canceller that invokes the parent canceller if all other + // followers are also cancelled. We keep a reference to this promise + // instance for the static canceller function and clear this to avoid + // keeping a cyclic reference between parent and follower. + $parent = $this; + ++$parent->requiredCancelRequests; + + return new static( + $this->resolver($onFulfilled, $onRejected), + static function () use (&$parent): void { + assert($parent instanceof self); + --$parent->requiredCancelRequests; + + if ($parent->requiredCancelRequests <= 0) { + $parent->cancel(); + } + + $parent = null; + } + ); + } + + /** + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + */ + public function catch(callable $onRejected): PromiseInterface + { + return $this->then(null, static function (\Throwable $reason) use ($onRejected) { + if (!_checkTypehint($onRejected, $reason)) { + return new RejectedPromise($reason); + } + + /** + * @var callable(\Throwable):(PromiseInterface|TRejected) $onRejected + */ + return $onRejected($reason); + }); + } + + public function finally(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->then(static function ($value) use ($onFulfilledOrRejected): PromiseInterface { + return resolve($onFulfilledOrRejected())->then(function () use ($value) { + return $value; + }); + }, static function (\Throwable $reason) use ($onFulfilledOrRejected): PromiseInterface { + return resolve($onFulfilledOrRejected())->then(function () use ($reason): RejectedPromise { + return new RejectedPromise($reason); + }); + }); + } + + public function cancel(): void + { + $this->cancelled = true; + $canceller = $this->canceller; + $this->canceller = null; + + $parentCanceller = null; + + if (null !== $this->result) { + // Forward cancellation to rejected promise to avoid reporting unhandled rejection + if ($this->result instanceof RejectedPromise) { + $this->result->cancel(); + } + + // Go up the promise chain and reach the top most promise which is + // itself not following another promise + $root = $this->unwrap($this->result); + + // Return if the root promise is already resolved or a + // FulfilledPromise or RejectedPromise + if (!$root instanceof self || null !== $root->result) { + return; + } + + $root->requiredCancelRequests--; + + if ($root->requiredCancelRequests <= 0) { + $parentCanceller = [$root, 'cancel']; + } + } + + if (null !== $canceller) { + $this->call($canceller); + } + + // For BC, we call the parent canceller after our own canceller + if ($parentCanceller) { + $parentCanceller(); + } + } + + /** + * @deprecated 3.0.0 Use `catch()` instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface + { + return $this->catch($onRejected); + } + + /** + * @deprecated 3.0.0 Use `finally()` instead + * @see self::finally() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->finally($onFulfilledOrRejected); + } + + private function resolver(?callable $onFulfilled = null, ?callable $onRejected = null): callable + { + return function (callable $resolve, callable $reject) use ($onFulfilled, $onRejected): void { + $this->handlers[] = static function (PromiseInterface $promise) use ($onFulfilled, $onRejected, $resolve, $reject): void { + $promise = $promise->then($onFulfilled, $onRejected); + + if ($promise instanceof self && $promise->result === null) { + $promise->handlers[] = static function (PromiseInterface $promise) use ($resolve, $reject): void { + $promise->then($resolve, $reject); + }; + } else { + $promise->then($resolve, $reject); + } + }; + }; + } + + private function reject(\Throwable $reason): void + { + if (null !== $this->result) { + return; + } + + $this->settle(reject($reason)); + } + + /** + * @param PromiseInterface $result + */ + private function settle(PromiseInterface $result): void + { + $result = $this->unwrap($result); + + if ($result === $this) { + $result = new RejectedPromise( + new \LogicException('Cannot resolve a promise with itself.') + ); + } + + if ($result instanceof self) { + $result->requiredCancelRequests++; + } else { + // Unset canceller only when not following a pending promise + $this->canceller = null; + } + + $handlers = $this->handlers; + + $this->handlers = []; + $this->result = $result; + + foreach ($handlers as $handler) { + $handler($result); + } + + // Forward cancellation to rejected promise to avoid reporting unhandled rejection + if ($this->cancelled && $result instanceof RejectedPromise) { + $result->cancel(); + } + } + + /** + * @param PromiseInterface $promise + * @return PromiseInterface + */ + private function unwrap(PromiseInterface $promise): PromiseInterface + { + while ($promise instanceof self && null !== $promise->result) { + /** @var PromiseInterface $promise */ + $promise = $promise->result; + } + + return $promise; + } + + /** + * @param callable(callable(mixed):void,callable(\Throwable):void):void $cb + */ + private function call(callable $cb): void + { + // Explicitly overwrite argument with null value. This ensure that this + // argument does not show up in the stack trace in PHP 7+ only. + $callback = $cb; + $cb = null; + + // Use reflection to inspect number of arguments expected by this callback. + // We did some careful benchmarking here: Using reflection to avoid unneeded + // function arguments is actually faster than blindly passing them. + // Also, this helps avoiding unnecessary function arguments in the call stack + // if the callback creates an Exception (creating garbage cycles). + if (\is_array($callback)) { + $ref = new \ReflectionMethod($callback[0], $callback[1]); + } elseif (\is_object($callback) && !$callback instanceof \Closure) { + $ref = new \ReflectionMethod($callback, '__invoke'); + } else { + assert($callback instanceof \Closure || \is_string($callback)); + $ref = new \ReflectionFunction($callback); + } + $args = $ref->getNumberOfParameters(); + + try { + if ($args === 0) { + $callback(); + } else { + // Keep references to this promise instance for the static resolve/reject functions. + // By using static callbacks that are not bound to this instance + // and passing the target promise instance by reference, we can + // still execute its resolving logic and still clear this + // reference when settling the promise. This helps avoiding + // garbage cycles if any callback creates an Exception. + // These assumptions are covered by the test suite, so if you ever feel like + // refactoring this, go ahead, any alternative suggestions are welcome! + $target =& $this; + + $callback( + static function ($value) use (&$target): void { + if ($target !== null) { + $target->settle(resolve($value)); + $target = null; + } + }, + static function (\Throwable $reason) use (&$target): void { + if ($target !== null) { + $target->reject($reason); + $target = null; + } + } + ); + } + } catch (\Throwable $e) { + $target = null; + $this->reject($e); + } + } +} diff --git a/vendor/react/promise/src/PromiseInterface.php b/vendor/react/promise/src/PromiseInterface.php new file mode 100644 index 000000000..5869f76b6 --- /dev/null +++ b/vendor/react/promise/src/PromiseInterface.php @@ -0,0 +1,152 @@ +|TFulfilled)) $onFulfilled + * @param ?(callable(\Throwable): (PromiseInterface|TRejected)) $onRejected + * @return PromiseInterface<($onRejected is null ? ($onFulfilled is null ? T : TFulfilled) : ($onFulfilled is null ? T|TRejected : TFulfilled|TRejected))> + */ + public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface; + + /** + * Registers a rejection handler for promise. It is a shortcut for: + * + * ```php + * $promise->then(null, $onRejected); + * ``` + * + * Additionally, you can type hint the `$reason` argument of `$onRejected` to catch + * only specific errors. + * + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + */ + public function catch(callable $onRejected): PromiseInterface; + + /** + * Allows you to execute "cleanup" type tasks in a promise chain. + * + * It arranges for `$onFulfilledOrRejected` to be called, with no arguments, + * when the promise is either fulfilled or rejected. + * + * * If `$promise` fulfills, and `$onFulfilledOrRejected` returns successfully, + * `$newPromise` will fulfill with the same value as `$promise`. + * * If `$promise` fulfills, and `$onFulfilledOrRejected` throws or returns a + * rejected promise, `$newPromise` will reject with the thrown exception or + * rejected promise's reason. + * * If `$promise` rejects, and `$onFulfilledOrRejected` returns successfully, + * `$newPromise` will reject with the same reason as `$promise`. + * * If `$promise` rejects, and `$onFulfilledOrRejected` throws or returns a + * rejected promise, `$newPromise` will reject with the thrown exception or + * rejected promise's reason. + * + * `finally()` behaves similarly to the synchronous finally statement. When combined + * with `catch()`, `finally()` allows you to write code that is similar to the familiar + * synchronous catch/finally pair. + * + * Consider the following synchronous code: + * + * ```php + * try { + * return doSomething(); + * } catch(\Exception $e) { + * return handleError($e); + * } finally { + * cleanup(); + * } + * ``` + * + * Similar asynchronous code (with `doSomething()` that returns a promise) can be + * written: + * + * ```php + * return doSomething() + * ->catch('handleError') + * ->finally('cleanup'); + * ``` + * + * @param callable(): (void|PromiseInterface) $onFulfilledOrRejected + * @return PromiseInterface + */ + public function finally(callable $onFulfilledOrRejected): PromiseInterface; + + /** + * The `cancel()` method notifies the creator of the promise that there is no + * further interest in the results of the operation. + * + * Once a promise is settled (either fulfilled or rejected), calling `cancel()` on + * a promise has no effect. + * + * @return void + */ + public function cancel(): void; + + /** + * [Deprecated] Registers a rejection handler for a promise. + * + * This method continues to exist only for BC reasons and to ease upgrading + * between versions. It is an alias for: + * + * ```php + * $promise->catch($onRejected); + * ``` + * + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + * @deprecated 3.0.0 Use catch() instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface; + + /** + * [Deprecated] Allows you to execute "cleanup" type tasks in a promise chain. + * + * This method continues to exist only for BC reasons and to ease upgrading + * between versions. It is an alias for: + * + * ```php + * $promise->finally($onFulfilledOrRejected); + * ``` + * + * @param callable(): (void|PromiseInterface) $onFulfilledOrRejected + * @return PromiseInterface + * @deprecated 3.0.0 Use finally() instead + * @see self::finally() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface; +} diff --git a/vendor/react/promise/src/functions.php b/vendor/react/promise/src/functions.php new file mode 100644 index 000000000..2aab877e3 --- /dev/null +++ b/vendor/react/promise/src/functions.php @@ -0,0 +1,345 @@ +|T $promiseOrValue + * @return PromiseInterface + */ +function resolve($promiseOrValue): PromiseInterface +{ + if ($promiseOrValue instanceof PromiseInterface) { + return $promiseOrValue; + } + + if (\is_object($promiseOrValue) && \method_exists($promiseOrValue, 'then')) { + $canceller = null; + + if (\method_exists($promiseOrValue, 'cancel')) { + $canceller = [$promiseOrValue, 'cancel']; + assert(\is_callable($canceller)); + } + + /** @var Promise */ + return new Promise(function (callable $resolve, callable $reject) use ($promiseOrValue): void { + $promiseOrValue->then($resolve, $reject); + }, $canceller); + } + + return new FulfilledPromise($promiseOrValue); +} + +/** + * Creates a rejected promise for the supplied `$reason`. + * + * If `$reason` is a value, it will be the rejection value of the + * returned promise. + * + * If `$reason` is a promise, its completion value will be the rejected + * value of the returned promise. + * + * This can be useful in situations where you need to reject a promise without + * throwing an exception. For example, it allows you to propagate a rejection with + * the value of another promise. + * + * @return PromiseInterface + */ +function reject(\Throwable $reason): PromiseInterface +{ + return new RejectedPromise($reason); +} + +/** + * Returns a promise that will resolve only once all the items in + * `$promisesOrValues` have resolved. The resolution value of the returned promise + * will be an array containing the resolution values of each of the items in + * `$promisesOrValues`. + * + * @template T + * @param iterable|T> $promisesOrValues + * @return PromiseInterface> + */ +function all(iterable $promisesOrValues): PromiseInterface +{ + $cancellationQueue = new Internal\CancellationQueue(); + + /** @var Promise> */ + return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void { + $toResolve = 0; + /** @var bool */ + $continue = true; + $values = []; + + foreach ($promisesOrValues as $i => $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + $values[$i] = null; + ++$toResolve; + + resolve($promiseOrValue)->then( + function ($value) use ($i, &$values, &$toResolve, &$continue, $resolve): void { + $values[$i] = $value; + + if (0 === --$toResolve && !$continue) { + $resolve($values); + } + }, + function (\Throwable $reason) use (&$continue, $reject): void { + $continue = false; + $reject($reason); + } + ); + + if (!$continue && !\is_array($promisesOrValues)) { + break; + } + } + + $continue = false; + if ($toResolve === 0) { + $resolve($values); + } + }, $cancellationQueue); +} + +/** + * Initiates a competitive race that allows one winner. Returns a promise which is + * resolved in the same way the first settled promise resolves. + * + * The returned promise will become **infinitely pending** if `$promisesOrValues` + * contains 0 items. + * + * @template T + * @param iterable|T> $promisesOrValues + * @return PromiseInterface + */ +function race(iterable $promisesOrValues): PromiseInterface +{ + $cancellationQueue = new Internal\CancellationQueue(); + + /** @var Promise */ + return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void { + $continue = true; + + foreach ($promisesOrValues as $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + + resolve($promiseOrValue)->then($resolve, $reject)->finally(function () use (&$continue): void { + $continue = false; + }); + + if (!$continue && !\is_array($promisesOrValues)) { + break; + } + } + }, $cancellationQueue); +} + +/** + * Returns a promise that will resolve when any one of the items in + * `$promisesOrValues` resolves. The resolution value of the returned promise + * will be the resolution value of the triggering item. + * + * The returned promise will only reject if *all* items in `$promisesOrValues` are + * rejected. The rejection value will be an array of all rejection reasons. + * + * The returned promise will also reject with a `React\Promise\Exception\LengthException` + * if `$promisesOrValues` contains 0 items. + * + * @template T + * @param iterable|T> $promisesOrValues + * @return PromiseInterface + */ +function any(iterable $promisesOrValues): PromiseInterface +{ + $cancellationQueue = new Internal\CancellationQueue(); + + /** @var Promise */ + return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void { + $toReject = 0; + $continue = true; + $reasons = []; + + foreach ($promisesOrValues as $i => $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + ++$toReject; + + resolve($promiseOrValue)->then( + function ($value) use ($resolve, &$continue): void { + $continue = false; + $resolve($value); + }, + function (\Throwable $reason) use ($i, &$reasons, &$toReject, $reject, &$continue): void { + $reasons[$i] = $reason; + + if (0 === --$toReject && !$continue) { + $reject(new CompositeException( + $reasons, + 'All promises rejected.' + )); + } + } + ); + + if (!$continue && !\is_array($promisesOrValues)) { + break; + } + } + + $continue = false; + if ($toReject === 0 && !$reasons) { + $reject(new Exception\LengthException( + 'Must contain at least 1 item but contains only 0 items.' + )); + } elseif ($toReject === 0) { + $reject(new CompositeException( + $reasons, + 'All promises rejected.' + )); + } + }, $cancellationQueue); +} + +/** + * Sets the global rejection handler for unhandled promise rejections. + * + * Note that rejected promises should always be handled similar to how any + * exceptions should always be caught in a `try` + `catch` block. If you remove + * the last reference to a rejected promise that has not been handled, it will + * report an unhandled promise rejection. See also the [`reject()` function](#reject) + * for more details. + * + * The `?callable $callback` argument MUST be a valid callback function that + * accepts a single `Throwable` argument or a `null` value to restore the + * default promise rejection handler. The return value of the callback function + * will be ignored and has no effect, so you SHOULD return a `void` value. The + * callback function MUST NOT throw or the program will be terminated with a + * fatal error. + * + * The function returns the previous rejection handler or `null` if using the + * default promise rejection handler. + * + * The default promise rejection handler will log an error message plus its + * stack trace: + * + * ```php + * // Unhandled promise rejection with RuntimeException: Unhandled in example.php:2 + * React\Promise\reject(new RuntimeException('Unhandled')); + * ``` + * + * The promise rejection handler may be used to use customize the log message or + * write to custom log targets. As a rule of thumb, this function should only be + * used as a last resort and promise rejections are best handled with either the + * [`then()` method](#promiseinterfacethen), the + * [`catch()` method](#promiseinterfacecatch), or the + * [`finally()` method](#promiseinterfacefinally). + * See also the [`reject()` function](#reject) for more details. + * + * @param callable(\Throwable):void|null $callback + * @return callable(\Throwable):void|null + */ +function set_rejection_handler(?callable $callback): ?callable +{ + static $current = null; + $previous = $current; + $current = $callback; + + return $previous; +} + +/** + * @internal + */ +function _checkTypehint(callable $callback, \Throwable $reason): bool +{ + if (\is_array($callback)) { + $callbackReflection = new \ReflectionMethod($callback[0], $callback[1]); + } elseif (\is_object($callback) && !$callback instanceof \Closure) { + $callbackReflection = new \ReflectionMethod($callback, '__invoke'); + } else { + assert($callback instanceof \Closure || \is_string($callback)); + $callbackReflection = new \ReflectionFunction($callback); + } + + $parameters = $callbackReflection->getParameters(); + + if (!isset($parameters[0])) { + return true; + } + + $expectedException = $parameters[0]; + + // Extract the type of the argument and handle different possibilities + $type = $expectedException->getType(); + + $isTypeUnion = true; + $types = []; + + switch (true) { + case $type === null: + break; + case $type instanceof \ReflectionNamedType: + $types = [$type]; + break; + case $type instanceof \ReflectionIntersectionType: + $isTypeUnion = false; + case $type instanceof \ReflectionUnionType; + $types = $type->getTypes(); + break; + default: + throw new \LogicException('Unexpected return value of ReflectionParameter::getType'); + } + + // If there is no type restriction, it matches + if (empty($types)) { + return true; + } + + foreach ($types as $type) { + + if ($type instanceof \ReflectionIntersectionType) { + foreach ($type->getTypes() as $typeToMatch) { + assert($typeToMatch instanceof \ReflectionNamedType); + $name = $typeToMatch->getName(); + if (!($matches = (!$typeToMatch->isBuiltin() && $reason instanceof $name))) { + break; + } + } + assert(isset($matches)); + } else { + assert($type instanceof \ReflectionNamedType); + $name = $type->getName(); + $matches = !$type->isBuiltin() && $reason instanceof $name; + } + + // If we look for a single match (union), we can return early on match + // If we look for a full match (intersection), we can return early on mismatch + if ($matches) { + if ($isTypeUnion) { + return true; + } + } else { + if (!$isTypeUnion) { + return false; + } + } + } + + // If we look for a single match (union) and did not return early, we matched no type and are false + // If we look for a full match (intersection) and did not return early, we matched all types and are true + return $isTypeUnion ? false : true; +} diff --git a/vendor/react/promise/src/functions_include.php b/vendor/react/promise/src/functions_include.php new file mode 100644 index 000000000..bd0c54fd5 --- /dev/null +++ b/vendor/react/promise/src/functions_include.php @@ -0,0 +1,5 @@ +connect($uri)->then(function (React\Socket\ConnectionInterface $conn) { + // … + }, function (Exception $e) { + echo 'Error:' . $e->getMessage() . PHP_EOL; + }); + ``` + +* Improve test suite, test against PHP 8.1 release. + (#274 by @SimonFrings) + +## 1.9.0 (2021-08-03) + +* Feature: Add new `SocketServer` and deprecate `Server` to avoid class name collisions. + (#263 by @clue) + + The new `SocketServer` class has been added with an improved constructor signature + as a replacement for the previous `Server` class in order to avoid any ambiguities. + The previous name has been deprecated and should not be used anymore. + In its most basic form, the deprecated `Server` can now be considered an alias for new `SocketServer`. + + ```php + // deprecated + $socket = new React\Socket\Server(0); + $socket = new React\Socket\Server('127.0.0.1:8000'); + $socket = new React\Socket\Server('127.0.0.1:8000', null, $context); + $socket = new React\Socket\Server('127.0.0.1:8000', $loop, $context); + + // new + $socket = new React\Socket\SocketServer('127.0.0.1:0'); + $socket = new React\Socket\SocketServer('127.0.0.1:8000'); + $socket = new React\Socket\SocketServer('127.0.0.1:8000', $context); + $socket = new React\Socket\SocketServer('127.0.0.1:8000', $context, $loop); + ``` + +* Feature: Update `Connector` signature to take optional `$context` as first argument. + (#264 by @clue) + + The new signature has been added to match the new `SocketServer` and + consistently move the now commonly unneeded loop argument to the last argument. + The previous signature has been deprecated and should not be used anymore. + In its most basic form, both signatures are compatible. + + ```php + // deprecated + $connector = new React\Socket\Connector(null, $context); + $connector = new React\Socket\Connector($loop, $context); + + // new + $connector = new React\Socket\Connector($context); + $connector = new React\Socket\Connector($context, $loop); + ``` + +## 1.8.0 (2021-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop). + +* Feature: Simplify usage by supporting new [default loop](https://reactphp.org/event-loop/#loop). + (#260 by @clue) + + ```php + // old (still supported) + $socket = new React\Socket\Server('127.0.0.1:8080', $loop); + $connector = new React\Socket\Connector($loop); + + // new (using default loop) + $socket = new React\Socket\Server('127.0.0.1:8080'); + $connector = new React\Socket\Connector(); + ``` + +## 1.7.0 (2021-06-25) + +* Feature: Support falling back to multiple DNS servers from DNS config. + (#257 by @clue) + + If you're using the default `Connector`, it will now use all DNS servers + configured on your system. If you have multiple DNS servers configured and + connectivity to the primary DNS server is broken, it will now fall back to + your other DNS servers, thus providing improved connectivity and redundancy + for broken DNS configurations. + +* Feature: Use round robin for happy eyeballs DNS responses (load balancing). + (#247 by @clue) + + If you're using the default `Connector`, it will now randomize the order of + the IP addresses resolved via DNS when connecting. This allows the load to + be distributed more evenly across all returned IP addresses. This can be + used as a very basic DNS load balancing mechanism. + +* Internal improvement to avoid unhandled rejection for future Promise API. + (#258 by @clue) + +* Improve test suite, use GitHub actions for continuous integration (CI). + (#254 by @SimonFrings) + +## 1.6.0 (2020-08-28) + +* Feature: Support upcoming PHP 8 release. + (#246 by @clue) + +* Feature: Change default socket backlog size to 511. + (#242 by @clue) + +* Fix: Fix closing connection when cancelling during TLS handshake. + (#241 by @clue) + +* Fix: Fix blocking during possible `accept()` race condition + when multiple socket servers listen on same socket address. + (#244 by @clue) + +* Improve test suite, update PHPUnit config and add full core team to the license. + (#243 by @SimonFrings and #245 by @WyriHaximus) + +## 1.5.0 (2020-07-01) + +* Feature / Fix: Improve error handling and reporting for happy eyeballs and + immediately try next connection when one connection attempt fails. + (#230, #231, #232 and #233 by @clue) + + Error messages for failed connection attempts now include more details to + ease debugging. Additionally, the happy eyeballs algorithm has been improved + to avoid having to wait for some timers to expire which significantly + improves connection setup times (in particular when IPv6 isn't available). + +* Improve test suite, minor code cleanup and improve code coverage to 100%. + Update to PHPUnit 9 and skip legacy TLS 1.0 / TLS 1.1 tests if disabled by + system. Run tests on Windows and simplify Travis CI test matrix for Mac OS X + setup and skip all TLS tests on legacy HHVM. + (#229, #235, #236 and #238 by @clue and #239 by @SimonFrings) + +## 1.4.0 (2020-03-12) + +A major new feature release, see [**release announcement**](https://clue.engineering/2020/introducing-ipv6-for-reactphp). + +* Feature: Add IPv6 support to `Connector` (implement "Happy Eyeballs" algorithm to support IPv6 probing). + IPv6 support is turned on by default, use new `happy_eyeballs` option in `Connector` to toggle behavior. + (#196, #224 and #225 by @WyriHaximus and @clue) + +* Feature: Default to using DNS cache (with max 256 entries) for `Connector`. + (#226 by @clue) + +* Add `.gitattributes` to exclude dev files from exports and some minor code style fixes. + (#219 by @reedy and #218 by @mmoreram) + +* Improve test suite to fix failing test cases when using new DNS component, + significantly improve test performance by awaiting events instead of sleeping, + exclude TLS 1.3 test on PHP 7.3, run tests on PHP 7.4 and simplify test matrix. + (#208, #209, #210, #217 and #223 by @clue) + +## 1.3.0 (2019-07-10) + +* Feature: Forward compatibility with upcoming stable DNS component. + (#206 by @clue) + +## 1.2.1 (2019-06-03) + +* Avoid uneeded fragmented TLS work around for PHP 7.3.3+ and + work around failing test case detecting EOF on TLS 1.3 socket streams. + (#201 and #202 by @clue) + +* Improve TLS certificate/passphrase example. + (#190 by @jsor) + +## 1.2.0 (2019-01-07) + +* Feature / Fix: Improve TLS 1.3 support. + (#186 by @clue) + + TLS 1.3 is now an official standard as of August 2018! :tada: + The protocol has major improvements in the areas of security, performance, and privacy. + TLS 1.3 is supported by default as of [OpenSSL 1.1.1](https://www.openssl.org/blog/blog/2018/09/11/release111/). + For example, this version ships with Ubuntu 18.10 (and newer) by default, meaning that recent installations support TLS 1.3 out of the box :shipit: + +* Fix: Avoid possibility of missing remote address when TLS handshake fails. + (#188 by @clue) + +* Improve performance by prefixing all global functions calls with `\` to skip the look up and resolve process and go straight to the global function. + (#183 by @WyriHaximus) + +* Update documentation to use full class names with namespaces. + (#187 by @clue) + +* Improve test suite to avoid some possible race conditions, + test against PHP 7.3 on Travis and + use dedicated `assertInstanceOf()` assertions. + (#185 by @clue, #178 by @WyriHaximus and #181 by @carusogabriel) + +## 1.1.0 (2018-10-01) + +* Feature: Improve error reporting for failed connection attempts and improve + cancellation forwarding during DNS lookup, TCP/IP connection or TLS handshake. + (#168, #169, #170, #171, #176 and #177 by @clue) + + All error messages now always contain a reference to the remote URI to give + more details which connection actually failed and the reason for this error. + Accordingly, failures during DNS lookup will now mention both the remote URI + as well as the DNS error reason. TCP/IP connection issues and errors during + a secure TLS handshake will both mention the remote URI as well as the + underlying socket error. Similarly, lost/dropped connections during a TLS + handshake will now report a lost connection instead of an empty error reason. + + For most common use cases this means that simply reporting the `Exception` + message should give the most relevant details for any connection issues: + + ```php + $promise = $connector->connect('tls://example.com:443'); + $promise->then(function (ConnectionInterface $conn) use ($loop) { + // … + }, function (Exception $e) { + echo $e->getMessage(); + }); + ``` + +## 1.0.0 (2018-07-11) + +* First stable LTS release, now following [SemVer](https://semver.org/). + We'd like to emphasize that this component is production ready and battle-tested. + We plan to support all long-term support (LTS) releases for at least 24 months, + so you have a rock-solid foundation to build on top of. + +> Contains no other changes, so it's actually fully compatible with the v0.8.12 release. + +## 0.8.12 (2018-06-11) + +* Feature: Improve memory consumption for failed and cancelled connection attempts. + (#161 by @clue) + +* Improve test suite to fix Travis config to test against legacy PHP 5.3 again. + (#162 by @clue) + +## 0.8.11 (2018-04-24) + +* Feature: Improve memory consumption for cancelled connection attempts and + simplify skipping DNS lookup when connecting to IP addresses. + (#159 and #160 by @clue) + +## 0.8.10 (2018-02-28) + +* Feature: Update DNS dependency to support loading system default DNS + nameserver config on all supported platforms + (`/etc/resolv.conf` on Unix/Linux/Mac/Docker/WSL and WMIC on Windows) + (#152 by @clue) + + This means that connecting to hosts that are managed by a local DNS server, + such as a corporate DNS server or when using Docker containers, will now + work as expected across all platforms with no changes required: + + ```php + $connector = new Connector($loop); + $connector->connect('intranet.example:80')->then(function ($connection) { + // … + }); + ``` + +## 0.8.9 (2018-01-18) + +* Feature: Support explicitly choosing TLS version to negotiate with remote side + by respecting `crypto_method` context parameter for all classes. + (#149 by @clue) + + By default, all connector and server classes support TLSv1.0+ and exclude + support for legacy SSLv2/SSLv3. As of PHP 5.6+ you can also explicitly + choose the TLS version you want to negotiate with the remote side: + + ```php + // new: now supports 'crypto_method` context parameter for all classes + $connector = new Connector($loop, array( + 'tls' => array( + 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT + ) + )); + ``` + +* Minor internal clean up to unify class imports + (#148 by @clue) + +## 0.8.8 (2018-01-06) + +* Improve test suite by adding test group to skip integration tests relying on + internet connection and fix minor documentation typo. + (#146 by @clue and #145 by @cn007b) + +## 0.8.7 (2017-12-24) + +* Fix: Fix closing socket resource before removing from loop + (#141 by @clue) + + This fixes the root cause of an uncaught `Exception` that only manifested + itself after the recent Stream v0.7.4 component update and only if you're + using `ext-event` (`ExtEventLoop`). + +* Improve test suite by testing against PHP 7.2 + (#140 by @carusogabriel) + +## 0.8.6 (2017-11-18) + +* Feature: Add Unix domain socket (UDS) support to `Server` with `unix://` URI scheme + and add advanced `UnixServer` class. + (#120 by @andig) + + ```php + // new: Server now supports "unix://" scheme + $server = new Server('unix:///tmp/server.sock', $loop); + + // new: advanced usage + $server = new UnixServer('/tmp/server.sock', $loop); + ``` + +* Restructure examples to ease getting started + (#136 by @clue) + +* Improve test suite by adding forward compatibility with PHPUnit 6 and + ignore Mac OS X test failures for now until Travis tests work again + (#133 by @gabriel-caruso and #134 by @clue) + +## 0.8.5 (2017-10-23) + +* Fix: Work around PHP bug with Unix domain socket (UDS) paths for Mac OS X + (#123 by @andig) + +* Fix: Fix `SecureServer` to return `null` URI if server socket is already closed + (#129 by @clue) + +* Improve test suite by adding forward compatibility with PHPUnit v5 and + forward compatibility with upcoming EventLoop releases in tests and + test Mac OS X on Travis + (#122 by @andig and #125, #127 and #130 by @clue) + +* Readme improvements + (#118 by @jsor) + +## 0.8.4 (2017-09-16) + +* Feature: Add `FixedUriConnector` decorator to use fixed, preconfigured URI instead + (#117 by @clue) + + This can be useful for consumers that do not support certain URIs, such as + when you want to explicitly connect to a Unix domain socket (UDS) path + instead of connecting to a default address assumed by an higher-level API: + + ```php + $connector = new FixedUriConnector( + 'unix:///var/run/docker.sock', + new UnixConnector($loop) + ); + + // destination will be ignored, actually connects to Unix domain socket + $promise = $connector->connect('localhost:80'); + ``` + +## 0.8.3 (2017-09-08) + +* Feature: Reduce memory consumption for failed connections + (#113 by @valga) + +* Fix: Work around write chunk size for TLS streams for PHP < 7.1.14 + (#114 by @clue) + +## 0.8.2 (2017-08-25) + +* Feature: Update DNS dependency to support hosts file on all platforms + (#112 by @clue) + + This means that connecting to hosts such as `localhost` will now work as + expected across all platforms with no changes required: + + ```php + $connector = new Connector($loop); + $connector->connect('localhost:8080')->then(function ($connection) { + // … + }); + ``` + +## 0.8.1 (2017-08-15) + +* Feature: Forward compatibility with upcoming EventLoop v1.0 and v0.5 and + target evenement 3.0 a long side 2.0 and 1.0 + (#104 by @clue and #111 by @WyriHaximus) + +* Improve test suite by locking Travis distro so new defaults will not break the build and + fix HHVM build for now again and ignore future HHVM build errors + (#109 and #110 by @clue) + +* Minor documentation fixes + (#103 by @christiaan and #108 by @hansott) + +## 0.8.0 (2017-05-09) + +* Feature: New `Server` class now acts as a facade for existing server classes + and renamed old `Server` to `TcpServer` for advanced usage. + (#96 and #97 by @clue) + + The `Server` class is now the main class in this package that implements the + `ServerInterface` and allows you to accept incoming streaming connections, + such as plaintext TCP/IP or secure TLS connection streams. + + > This is not a BC break and consumer code does not have to be updated. + +* Feature / BC break: All addresses are now URIs that include the URI scheme + (#98 by @clue) + + ```diff + - $parts = parse_url('tcp://' . $conn->getRemoteAddress()); + + $parts = parse_url($conn->getRemoteAddress()); + ``` + +* Fix: Fix `unix://` addresses for Unix domain socket (UDS) paths + (#100 by @clue) + +* Feature: Forward compatibility with Stream v1.0 and v0.7 + (#99 by @clue) + +## 0.7.2 (2017-04-24) + +* Fix: Work around latest PHP 7.0.18 and 7.1.4 no longer accepting full URIs + (#94 by @clue) + +## 0.7.1 (2017-04-10) + +* Fix: Ignore HHVM errors when closing connection that is already closing + (#91 by @clue) + +## 0.7.0 (2017-04-10) + +* Feature: Merge SocketClient component into this component + (#87 by @clue) + + This means that this package now provides async, streaming plaintext TCP/IP + and secure TLS socket server and client connections for ReactPHP. + + ``` + $connector = new React\Socket\Connector($loop); + $connector->connect('google.com:80')->then(function (ConnectionInterface $conn) { + $connection->write('…'); + }); + ``` + + Accordingly, the `ConnectionInterface` is now used to represent both incoming + server side connections as well as outgoing client side connections. + + If you've previously used the SocketClient component to establish outgoing + client connections, upgrading should take no longer than a few minutes. + All classes have been merged as-is from the latest `v0.7.0` release with no + other changes, so you can simply update your code to use the updated namespace + like this: + + ```php + // old from SocketClient component and namespace + $connector = new React\SocketClient\Connector($loop); + $connector->connect('google.com:80')->then(function (ConnectionInterface $conn) { + $connection->write('…'); + }); + + // new + $connector = new React\Socket\Connector($loop); + $connector->connect('google.com:80')->then(function (ConnectionInterface $conn) { + $connection->write('…'); + }); + ``` + +## 0.6.0 (2017-04-04) + +* Feature: Add `LimitingServer` to limit and keep track of open connections + (#86 by @clue) + + ```php + $server = new Server(0, $loop); + $server = new LimitingServer($server, 100); + + $server->on('connection', function (ConnectionInterface $connection) { + $connection->write('hello there!' . PHP_EOL); + … + }); + ``` + +* Feature / BC break: Add `pause()` and `resume()` methods to limit active + connections + (#84 by @clue) + + ```php + $server = new Server(0, $loop); + $server->pause(); + + $loop->addTimer(1.0, function() use ($server) { + $server->resume(); + }); + ``` + +## 0.5.1 (2017-03-09) + +* Feature: Forward compatibility with Stream v0.5 and upcoming v0.6 + (#79 by @clue) + +## 0.5.0 (2017-02-14) + +* Feature / BC break: Replace `listen()` call with URIs passed to constructor + and reject listening on hostnames with `InvalidArgumentException` + and replace `ConnectionException` with `RuntimeException` for consistency + (#61, #66 and #72 by @clue) + + ```php + // old + $server = new Server($loop); + $server->listen(8080); + + // new + $server = new Server(8080, $loop); + ``` + + Similarly, you can now pass a full listening URI to the constructor to change + the listening host: + + ```php + // old + $server = new Server($loop); + $server->listen(8080, '127.0.0.1'); + + // new + $server = new Server('127.0.0.1:8080', $loop); + ``` + + Trying to start listening on (DNS) host names will now throw an + `InvalidArgumentException`, use IP addresses instead: + + ```php + // old + $server = new Server($loop); + $server->listen(8080, 'localhost'); + + // new + $server = new Server('127.0.0.1:8080', $loop); + ``` + + If trying to listen fails (such as if port is already in use or port below + 1024 may require root access etc.), it will now throw a `RuntimeException`, + the `ConnectionException` class has been removed: + + ```php + // old: throws React\Socket\ConnectionException + $server = new Server($loop); + $server->listen(80); + + // new: throws RuntimeException + $server = new Server(80, $loop); + ``` + +* Feature / BC break: Rename `shutdown()` to `close()` for consistency throughout React + (#62 by @clue) + + ```php + // old + $server->shutdown(); + + // new + $server->close(); + ``` + +* Feature / BC break: Replace `getPort()` with `getAddress()` + (#67 by @clue) + + ```php + // old + echo $server->getPort(); // 8080 + + // new + echo $server->getAddress(); // 127.0.0.1:8080 + ``` + +* Feature / BC break: `getRemoteAddress()` returns full address instead of only IP + (#65 by @clue) + + ```php + // old + echo $connection->getRemoteAddress(); // 192.168.0.1 + + // new + echo $connection->getRemoteAddress(); // 192.168.0.1:51743 + ``` + +* Feature / BC break: Add `getLocalAddress()` method + (#68 by @clue) + + ```php + echo $connection->getLocalAddress(); // 127.0.0.1:8080 + ``` + +* BC break: The `Server` and `SecureServer` class are now marked `final` + and you can no longer `extend` them + (which was never documented or recommended anyway). + Public properties and event handlers are now internal only. + Please use composition instead of extension. + (#71, #70 and #69 by @clue) + +## 0.4.6 (2017-01-26) + +* Feature: Support socket context options passed to `Server` + (#64 by @clue) + +* Fix: Properly return `null` for unknown addresses + (#63 by @clue) + +* Improve documentation for `ServerInterface` and lock test suite requirements + (#60 by @clue, #57 by @shaunbramley) + +## 0.4.5 (2017-01-08) + +* Feature: Add `SecureServer` for secure TLS connections + (#55 by @clue) + +* Add functional integration tests + (#54 by @clue) + +## 0.4.4 (2016-12-19) + +* Feature / Fix: `ConnectionInterface` should extend `DuplexStreamInterface` + documentation + (#50 by @clue) + +* Feature / Fix: Improve test suite and switch to normal stream handler + (#51 by @clue) + +* Feature: Add examples + (#49 by @clue) + +## 0.4.3 (2016-03-01) + +* Bug fix: Suppress errors on stream_socket_accept to prevent PHP from crashing +* Support for PHP7 and HHVM +* Support PHP 5.3 again + +## 0.4.2 (2014-05-25) + +* Verify stream is a valid resource in Connection + +## 0.4.1 (2014-04-13) + +* Bug fix: Check read buffer for data before shutdown signal and end emit (@ArtyDev) +* Bug fix: v0.3.4 changes merged for v0.4.1 + +## 0.3.4 (2014-03-30) + +* Bug fix: Reset socket to non-blocking after shutting down (PHP bug) + +## 0.4.0 (2014-02-02) + +* BC break: Bump minimum PHP version to PHP 5.4, remove 5.3 specific hacks +* BC break: Update to React/Promise 2.0 +* BC break: Update to Evenement 2.0 +* Dependency: Autoloading and filesystem structure now PSR-4 instead of PSR-0 +* Bump React dependencies to v0.4 + +## 0.3.3 (2013-07-08) + +* Version bump + +## 0.3.2 (2013-05-10) + +* Version bump + +## 0.3.1 (2013-04-21) + +* Feature: Support binding to IPv6 addresses (@clue) + +## 0.3.0 (2013-04-14) + +* Bump React dependencies to v0.3 + +## 0.2.6 (2012-12-26) + +* Version bump + +## 0.2.3 (2012-11-14) + +* Version bump + +## 0.2.0 (2012-09-10) + +* Bump React dependencies to v0.2 + +## 0.1.1 (2012-07-12) + +* Version bump + +## 0.1.0 (2012-07-11) + +* First tagged release diff --git a/vendor/react/socket/LICENSE b/vendor/react/socket/LICENSE new file mode 100644 index 000000000..d6f8901f9 --- /dev/null +++ b/vendor/react/socket/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/react/socket/README.md b/vendor/react/socket/README.md new file mode 100644 index 000000000..e77e67645 --- /dev/null +++ b/vendor/react/socket/README.md @@ -0,0 +1,1564 @@ +# Socket + +[![CI status](https://github.com/reactphp/socket/workflows/CI/badge.svg)](https://github.com/reactphp/socket/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/socket?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/socket) + +Async, streaming plaintext TCP/IP and secure TLS socket server and client +connections for [ReactPHP](https://reactphp.org/). + +The socket library provides re-usable interfaces for a socket-layer +server and client based on the [`EventLoop`](https://github.com/reactphp/event-loop) +and [`Stream`](https://github.com/reactphp/stream) components. +Its server component allows you to build networking servers that accept incoming +connections from networking clients (such as an HTTP server). +Its client component allows you to build networking clients that establish +outgoing connections to networking servers (such as an HTTP or database client). +This library provides async, streaming means for all of this, so you can +handle multiple concurrent connections without blocking. + +**Table of Contents** + +* [Quickstart example](#quickstart-example) +* [Connection usage](#connection-usage) + * [ConnectionInterface](#connectioninterface) + * [getRemoteAddress()](#getremoteaddress) + * [getLocalAddress()](#getlocaladdress) +* [Server usage](#server-usage) + * [ServerInterface](#serverinterface) + * [connection event](#connection-event) + * [error event](#error-event) + * [getAddress()](#getaddress) + * [pause()](#pause) + * [resume()](#resume) + * [close()](#close) + * [SocketServer](#socketserver) + * [Advanced server usage](#advanced-server-usage) + * [TcpServer](#tcpserver) + * [SecureServer](#secureserver) + * [UnixServer](#unixserver) + * [LimitingServer](#limitingserver) + * [getConnections()](#getconnections) +* [Client usage](#client-usage) + * [ConnectorInterface](#connectorinterface) + * [connect()](#connect) + * [Connector](#connector) + * [Advanced client usage](#advanced-client-usage) + * [TcpConnector](#tcpconnector) + * [HappyEyeBallsConnector](#happyeyeballsconnector) + * [DnsConnector](#dnsconnector) + * [SecureConnector](#secureconnector) + * [TimeoutConnector](#timeoutconnector) + * [UnixConnector](#unixconnector) + * [FixUriConnector](#fixeduriconnector) +* [Install](#install) +* [Tests](#tests) +* [License](#license) + +## Quickstart example + +Here is a server that closes the connection if you send it anything: + +```php +$socket = new React\Socket\SocketServer('127.0.0.1:8080'); + +$socket->on('connection', function (React\Socket\ConnectionInterface $connection) { + $connection->write("Hello " . $connection->getRemoteAddress() . "!\n"); + $connection->write("Welcome to this amazing server!\n"); + $connection->write("Here's a tip: don't say anything.\n"); + + $connection->on('data', function ($data) use ($connection) { + $connection->close(); + }); +}); +``` + +See also the [examples](examples). + +Here's a client that outputs the output of said server and then attempts to +send it a string: + +```php +$connector = new React\Socket\Connector(); + +$connector->connect('127.0.0.1:8080')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->pipe(new React\Stream\WritableResourceStream(STDOUT)); + $connection->write("Hello World!\n"); +}, function (Exception $e) { + echo 'Error: ' . $e->getMessage() . PHP_EOL; +}); +``` + +## Connection usage + +### ConnectionInterface + +The `ConnectionInterface` is used to represent any incoming and outgoing +connection, such as a normal TCP/IP connection. + +An incoming or outgoing connection is a duplex stream (both readable and +writable) that implements React's +[`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface). +It contains additional properties for the local and remote address (client IP) +where this connection has been established to/from. + +Most commonly, instances implementing this `ConnectionInterface` are emitted +by all classes implementing the [`ServerInterface`](#serverinterface) and +used by all classes implementing the [`ConnectorInterface`](#connectorinterface). + +Because the `ConnectionInterface` implements the underlying +[`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface) +you can use any of its events and methods as usual: + +```php +$connection->on('data', function ($chunk) { + echo $chunk; +}); + +$connection->on('end', function () { + echo 'ended'; +}); + +$connection->on('error', function (Exception $e) { + echo 'error: ' . $e->getMessage(); +}); + +$connection->on('close', function () { + echo 'closed'; +}); + +$connection->write($data); +$connection->end($data = null); +$connection->close(); +// … +``` + +For more details, see the +[`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface). + +#### getRemoteAddress() + +The `getRemoteAddress(): ?string` method returns the full remote address +(URI) where this connection has been established with. + +```php +$address = $connection->getRemoteAddress(); +echo 'Connection with ' . $address . PHP_EOL; +``` + +If the remote address can not be determined or is unknown at this time (such as +after the connection has been closed), it MAY return a `NULL` value instead. + +Otherwise, it will return the full address (URI) as a string value, such +as `tcp://127.0.0.1:8080`, `tcp://[::1]:80`, `tls://127.0.0.1:443`, +`unix://example.sock` or `unix:///path/to/example.sock`. +Note that individual URI components are application specific and depend +on the underlying transport protocol. + +If this is a TCP/IP based connection and you only want the remote IP, you may +use something like this: + +```php +$address = $connection->getRemoteAddress(); +$ip = trim(parse_url($address, PHP_URL_HOST), '[]'); +echo 'Connection with ' . $ip . PHP_EOL; +``` + +#### getLocalAddress() + +The `getLocalAddress(): ?string` method returns the full local address +(URI) where this connection has been established with. + +```php +$address = $connection->getLocalAddress(); +echo 'Connection with ' . $address . PHP_EOL; +``` + +If the local address can not be determined or is unknown at this time (such as +after the connection has been closed), it MAY return a `NULL` value instead. + +Otherwise, it will return the full address (URI) as a string value, such +as `tcp://127.0.0.1:8080`, `tcp://[::1]:80`, `tls://127.0.0.1:443`, +`unix://example.sock` or `unix:///path/to/example.sock`. +Note that individual URI components are application specific and depend +on the underlying transport protocol. + +This method complements the [`getRemoteAddress()`](#getremoteaddress) method, +so they should not be confused. + +If your `TcpServer` instance is listening on multiple interfaces (e.g. using +the address `0.0.0.0`), you can use this method to find out which interface +actually accepted this connection (such as a public or local interface). + +If your system has multiple interfaces (e.g. a WAN and a LAN interface), +you can use this method to find out which interface was actually +used for this connection. + +## Server usage + +### ServerInterface + +The `ServerInterface` is responsible for providing an interface for accepting +incoming streaming connections, such as a normal TCP/IP connection. + +Most higher-level components (such as a HTTP server) accept an instance +implementing this interface to accept incoming streaming connections. +This is usually done via dependency injection, so it's fairly simple to actually +swap this implementation against any other implementation of this interface. +This means that you SHOULD typehint against this interface instead of a concrete +implementation of this interface. + +Besides defining a few methods, this interface also implements the +[`EventEmitterInterface`](https://github.com/igorw/evenement) +which allows you to react to certain events. + +#### connection event + +The `connection` event will be emitted whenever a new connection has been +established, i.e. a new client connects to this server socket: + +```php +$socket->on('connection', function (React\Socket\ConnectionInterface $connection) { + echo 'new connection' . PHP_EOL; +}); +``` + +See also the [`ConnectionInterface`](#connectioninterface) for more details +about handling the incoming connection. + +#### error event + +The `error` event will be emitted whenever there's an error accepting a new +connection from a client. + +```php +$socket->on('error', function (Exception $e) { + echo 'error: ' . $e->getMessage() . PHP_EOL; +}); +``` + +Note that this is not a fatal error event, i.e. the server keeps listening for +new connections even after this event. + +#### getAddress() + +The `getAddress(): ?string` method can be used to +return the full address (URI) this server is currently listening on. + +```php +$address = $socket->getAddress(); +echo 'Server listening on ' . $address . PHP_EOL; +``` + +If the address can not be determined or is unknown at this time (such as +after the socket has been closed), it MAY return a `NULL` value instead. + +Otherwise, it will return the full address (URI) as a string value, such +as `tcp://127.0.0.1:8080`, `tcp://[::1]:80`, `tls://127.0.0.1:443` +`unix://example.sock` or `unix:///path/to/example.sock`. +Note that individual URI components are application specific and depend +on the underlying transport protocol. + +If this is a TCP/IP based server and you only want the local port, you may +use something like this: + +```php +$address = $socket->getAddress(); +$port = parse_url($address, PHP_URL_PORT); +echo 'Server listening on port ' . $port . PHP_EOL; +``` + +#### pause() + +The `pause(): void` method can be used to +pause accepting new incoming connections. + +Removes the socket resource from the EventLoop and thus stop accepting +new connections. Note that the listening socket stays active and is not +closed. + +This means that new incoming connections will stay pending in the +operating system backlog until its configurable backlog is filled. +Once the backlog is filled, the operating system may reject further +incoming connections until the backlog is drained again by resuming +to accept new connections. + +Once the server is paused, no futher `connection` events SHOULD +be emitted. + +```php +$socket->pause(); + +$socket->on('connection', assertShouldNeverCalled()); +``` + +This method is advisory-only, though generally not recommended, the +server MAY continue emitting `connection` events. + +Unless otherwise noted, a successfully opened server SHOULD NOT start +in paused state. + +You can continue processing events by calling `resume()` again. + +Note that both methods can be called any number of times, in particular +calling `pause()` more than once SHOULD NOT have any effect. +Similarly, calling this after `close()` is a NO-OP. + +#### resume() + +The `resume(): void` method can be used to +resume accepting new incoming connections. + +Re-attach the socket resource to the EventLoop after a previous `pause()`. + +```php +$socket->pause(); + +Loop::addTimer(1.0, function () use ($socket) { + $socket->resume(); +}); +``` + +Note that both methods can be called any number of times, in particular +calling `resume()` without a prior `pause()` SHOULD NOT have any effect. +Similarly, calling this after `close()` is a NO-OP. + +#### close() + +The `close(): void` method can be used to +shut down this listening socket. + +This will stop listening for new incoming connections on this socket. + +```php +echo 'Shutting down server socket' . PHP_EOL; +$socket->close(); +``` + +Calling this method more than once on the same instance is a NO-OP. + +### SocketServer + + + +The `SocketServer` class is the main class in this package that implements the +[`ServerInterface`](#serverinterface) and allows you to accept incoming +streaming connections, such as plaintext TCP/IP or secure TLS connection streams. + +In order to accept plaintext TCP/IP connections, you can simply pass a host +and port combination like this: + +```php +$socket = new React\Socket\SocketServer('127.0.0.1:8080'); +``` + +Listening on the localhost address `127.0.0.1` means it will not be reachable from +outside of this system. +In order to change the host the socket is listening on, you can provide an IP +address of an interface or use the special `0.0.0.0` address to listen on all +interfaces: + +```php +$socket = new React\Socket\SocketServer('0.0.0.0:8080'); +``` + +If you want to listen on an IPv6 address, you MUST enclose the host in square +brackets: + +```php +$socket = new React\Socket\SocketServer('[::1]:8080'); +``` + +In order to use a random port assignment, you can use the port `0`: + +```php +$socket = new React\Socket\SocketServer('127.0.0.1:0'); +$address = $socket->getAddress(); +``` + +To listen on a Unix domain socket (UDS) path, you MUST prefix the URI with the +`unix://` scheme: + +```php +$socket = new React\Socket\SocketServer('unix:///tmp/server.sock'); +``` + +In order to listen on an existing file descriptor (FD) number, you MUST prefix +the URI with `php://fd/` like this: + +```php +$socket = new React\Socket\SocketServer('php://fd/3'); +``` + +If the given URI is invalid, does not contain a port, any other scheme or if it +contains a hostname, it will throw an `InvalidArgumentException`: + +```php +// throws InvalidArgumentException due to missing port +$socket = new React\Socket\SocketServer('127.0.0.1'); +``` + +If the given URI appears to be valid, but listening on it fails (such as if port +is already in use or port below 1024 may require root access etc.), it will +throw a `RuntimeException`: + +```php +$first = new React\Socket\SocketServer('127.0.0.1:8080'); + +// throws RuntimeException because port is already in use +$second = new React\Socket\SocketServer('127.0.0.1:8080'); +``` + +> Note that these error conditions may vary depending on your system and/or + configuration. + See the exception message and code for more details about the actual error + condition. + +Optionally, you can specify [TCP socket context options](https://www.php.net/manual/en/context.socket.php) +for the underlying stream socket resource like this: + +```php +$socket = new React\Socket\SocketServer('[::1]:8080', array( + 'tcp' => array( + 'backlog' => 200, + 'so_reuseport' => true, + 'ipv6_v6only' => true + ) +)); +``` + +> Note that available [socket context options](https://www.php.net/manual/en/context.socket.php), + their defaults and effects of changing these may vary depending on your system + and/or PHP version. + Passing unknown context options has no effect. + The `backlog` context option defaults to `511` unless given explicitly. + +You can start a secure TLS (formerly known as SSL) server by simply prepending +the `tls://` URI scheme. +Internally, it will wait for plaintext TCP/IP connections and then performs a +TLS handshake for each connection. +It thus requires valid [TLS context options](https://www.php.net/manual/en/context.ssl.php), +which in its most basic form may look something like this if you're using a +PEM encoded certificate file: + +```php +$socket = new React\Socket\SocketServer('tls://127.0.0.1:8080', array( + 'tls' => array( + 'local_cert' => 'server.pem' + ) +)); +``` + +> Note that the certificate file will not be loaded on instantiation but when an + incoming connection initializes its TLS context. + This implies that any invalid certificate file paths or contents will only cause + an `error` event at a later time. + +If your private key is encrypted with a passphrase, you have to specify it +like this: + +```php +$socket = new React\Socket\SocketServer('tls://127.0.0.1:8000', array( + 'tls' => array( + 'local_cert' => 'server.pem', + 'passphrase' => 'secret' + ) +)); +``` + +By default, this server supports TLSv1.0+ and excludes support for legacy +SSLv2/SSLv3. As of PHP 5.6+ you can also explicitly choose the TLS version you +want to negotiate with the remote side: + +```php +$socket = new React\Socket\SocketServer('tls://127.0.0.1:8000', array( + 'tls' => array( + 'local_cert' => 'server.pem', + 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER + ) +)); +``` + +> Note that available [TLS context options](https://www.php.net/manual/en/context.ssl.php), + their defaults and effects of changing these may vary depending on your system + and/or PHP version. + The outer context array allows you to also use `tcp` (and possibly more) + context options at the same time. + Passing unknown context options has no effect. + If you do not use the `tls://` scheme, then passing `tls` context options + has no effect. + +Whenever a client connects, it will emit a `connection` event with a connection +instance implementing [`ConnectionInterface`](#connectioninterface): + +```php +$socket->on('connection', function (React\Socket\ConnectionInterface $connection) { + echo 'Plaintext connection from ' . $connection->getRemoteAddress() . PHP_EOL; + + $connection->write('hello there!' . PHP_EOL); + … +}); +``` + +See also the [`ServerInterface`](#serverinterface) for more details. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +> Note that the `SocketServer` class is a concrete implementation for TCP/IP sockets. + If you want to typehint in your higher-level protocol implementation, you SHOULD + use the generic [`ServerInterface`](#serverinterface) instead. + +> Changelog v1.9.0: This class has been added with an improved constructor signature + as a replacement for the previous `Server` class in order to avoid any ambiguities. + The previous name has been deprecated and should not be used anymore. + +### Advanced server usage + +#### TcpServer + +The `TcpServer` class implements the [`ServerInterface`](#serverinterface) and +is responsible for accepting plaintext TCP/IP connections. + +```php +$server = new React\Socket\TcpServer(8080); +``` + +As above, the `$uri` parameter can consist of only a port, in which case the +server will default to listening on the localhost address `127.0.0.1`, +which means it will not be reachable from outside of this system. + +In order to use a random port assignment, you can use the port `0`: + +```php +$server = new React\Socket\TcpServer(0); +$address = $server->getAddress(); +``` + +In order to change the host the socket is listening on, you can provide an IP +address through the first parameter provided to the constructor, optionally +preceded by the `tcp://` scheme: + +```php +$server = new React\Socket\TcpServer('192.168.0.1:8080'); +``` + +If you want to listen on an IPv6 address, you MUST enclose the host in square +brackets: + +```php +$server = new React\Socket\TcpServer('[::1]:8080'); +``` + +If the given URI is invalid, does not contain a port, any other scheme or if it +contains a hostname, it will throw an `InvalidArgumentException`: + +```php +// throws InvalidArgumentException due to missing port +$server = new React\Socket\TcpServer('127.0.0.1'); +``` + +If the given URI appears to be valid, but listening on it fails (such as if port +is already in use or port below 1024 may require root access etc.), it will +throw a `RuntimeException`: + +```php +$first = new React\Socket\TcpServer(8080); + +// throws RuntimeException because port is already in use +$second = new React\Socket\TcpServer(8080); +``` + +> Note that these error conditions may vary depending on your system and/or +configuration. +See the exception message and code for more details about the actual error +condition. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +Optionally, you can specify [socket context options](https://www.php.net/manual/en/context.socket.php) +for the underlying stream socket resource like this: + +```php +$server = new React\Socket\TcpServer('[::1]:8080', null, array( + 'backlog' => 200, + 'so_reuseport' => true, + 'ipv6_v6only' => true +)); +``` + +> Note that available [socket context options](https://www.php.net/manual/en/context.socket.php), +their defaults and effects of changing these may vary depending on your system +and/or PHP version. +Passing unknown context options has no effect. +The `backlog` context option defaults to `511` unless given explicitly. + +Whenever a client connects, it will emit a `connection` event with a connection +instance implementing [`ConnectionInterface`](#connectioninterface): + +```php +$server->on('connection', function (React\Socket\ConnectionInterface $connection) { + echo 'Plaintext connection from ' . $connection->getRemoteAddress() . PHP_EOL; + + $connection->write('hello there!' . PHP_EOL); + … +}); +``` + +See also the [`ServerInterface`](#serverinterface) for more details. + +#### SecureServer + +The `SecureServer` class implements the [`ServerInterface`](#serverinterface) +and is responsible for providing a secure TLS (formerly known as SSL) server. + +It does so by wrapping a [`TcpServer`](#tcpserver) instance which waits for plaintext +TCP/IP connections and then performs a TLS handshake for each connection. +It thus requires valid [TLS context options](https://www.php.net/manual/en/context.ssl.php), +which in its most basic form may look something like this if you're using a +PEM encoded certificate file: + +```php +$server = new React\Socket\TcpServer(8000); +$server = new React\Socket\SecureServer($server, null, array( + 'local_cert' => 'server.pem' +)); +``` + +> Note that the certificate file will not be loaded on instantiation but when an +incoming connection initializes its TLS context. +This implies that any invalid certificate file paths or contents will only cause +an `error` event at a later time. + +If your private key is encrypted with a passphrase, you have to specify it +like this: + +```php +$server = new React\Socket\TcpServer(8000); +$server = new React\Socket\SecureServer($server, null, array( + 'local_cert' => 'server.pem', + 'passphrase' => 'secret' +)); +``` + +By default, this server supports TLSv1.0+ and excludes support for legacy +SSLv2/SSLv3. As of PHP 5.6+ you can also explicitly choose the TLS version you +want to negotiate with the remote side: + +```php +$server = new React\Socket\TcpServer(8000); +$server = new React\Socket\SecureServer($server, null, array( + 'local_cert' => 'server.pem', + 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER +)); +``` + +> Note that available [TLS context options](https://www.php.net/manual/en/context.ssl.php), +their defaults and effects of changing these may vary depending on your system +and/or PHP version. +Passing unknown context options has no effect. + +Whenever a client completes the TLS handshake, it will emit a `connection` event +with a connection instance implementing [`ConnectionInterface`](#connectioninterface): + +```php +$server->on('connection', function (React\Socket\ConnectionInterface $connection) { + echo 'Secure connection from' . $connection->getRemoteAddress() . PHP_EOL; + + $connection->write('hello there!' . PHP_EOL); + … +}); +``` + +Whenever a client fails to perform a successful TLS handshake, it will emit an +`error` event and then close the underlying TCP/IP connection: + +```php +$server->on('error', function (Exception $e) { + echo 'Error' . $e->getMessage() . PHP_EOL; +}); +``` + +See also the [`ServerInterface`](#serverinterface) for more details. + +Note that the `SecureServer` class is a concrete implementation for TLS sockets. +If you want to typehint in your higher-level protocol implementation, you SHOULD +use the generic [`ServerInterface`](#serverinterface) instead. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +> Advanced usage: Despite allowing any `ServerInterface` as first parameter, +you SHOULD pass a `TcpServer` instance as first parameter, unless you +know what you're doing. +Internally, the `SecureServer` has to set the required TLS context options on +the underlying stream resources. +These resources are not exposed through any of the interfaces defined in this +package, but only through the internal `Connection` class. +The `TcpServer` class is guaranteed to emit connections that implement +the `ConnectionInterface` and uses the internal `Connection` class in order to +expose these underlying resources. +If you use a custom `ServerInterface` and its `connection` event does not +meet this requirement, the `SecureServer` will emit an `error` event and +then close the underlying connection. + +#### UnixServer + +The `UnixServer` class implements the [`ServerInterface`](#serverinterface) and +is responsible for accepting connections on Unix domain sockets (UDS). + +```php +$server = new React\Socket\UnixServer('/tmp/server.sock'); +``` + +As above, the `$uri` parameter can consist of only a socket path or socket path +prefixed by the `unix://` scheme. + +If the given URI appears to be valid, but listening on it fails (such as if the +socket is already in use or the file not accessible etc.), it will throw a +`RuntimeException`: + +```php +$first = new React\Socket\UnixServer('/tmp/same.sock'); + +// throws RuntimeException because socket is already in use +$second = new React\Socket\UnixServer('/tmp/same.sock'); +``` + +> Note that these error conditions may vary depending on your system and/or + configuration. + In particular, Zend PHP does only report "Unknown error" when the UDS path + already exists and can not be bound. You may want to check `is_file()` on the + given UDS path to report a more user-friendly error message in this case. + See the exception message and code for more details about the actual error + condition. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +Whenever a client connects, it will emit a `connection` event with a connection +instance implementing [`ConnectionInterface`](#connectioninterface): + +```php +$server->on('connection', function (React\Socket\ConnectionInterface $connection) { + echo 'New connection' . PHP_EOL; + + $connection->write('hello there!' . PHP_EOL); + … +}); +``` + +See also the [`ServerInterface`](#serverinterface) for more details. + +#### LimitingServer + +The `LimitingServer` decorator wraps a given `ServerInterface` and is responsible +for limiting and keeping track of open connections to this server instance. + +Whenever the underlying server emits a `connection` event, it will check its +limits and then either + - keep track of this connection by adding it to the list of + open connections and then forward the `connection` event + - or reject (close) the connection when its limits are exceeded and will + forward an `error` event instead. + +Whenever a connection closes, it will remove this connection from the list of +open connections. + +```php +$server = new React\Socket\LimitingServer($server, 100); +$server->on('connection', function (React\Socket\ConnectionInterface $connection) { + $connection->write('hello there!' . PHP_EOL); + … +}); +``` + +See also the [second example](examples) for more details. + +You have to pass a maximum number of open connections to ensure +the server will automatically reject (close) connections once this limit +is exceeded. In this case, it will emit an `error` event to inform about +this and no `connection` event will be emitted. + +```php +$server = new React\Socket\LimitingServer($server, 100); +$server->on('connection', function (React\Socket\ConnectionInterface $connection) { + $connection->write('hello there!' . PHP_EOL); + … +}); +``` + +You MAY pass a `null` limit in order to put no limit on the number of +open connections and keep accepting new connection until you run out of +operating system resources (such as open file handles). This may be +useful if you do not want to take care of applying a limit but still want +to use the `getConnections()` method. + +You can optionally configure the server to pause accepting new +connections once the connection limit is reached. In this case, it will +pause the underlying server and no longer process any new connections at +all, thus also no longer closing any excessive connections. +The underlying operating system is responsible for keeping a backlog of +pending connections until its limit is reached, at which point it will +start rejecting further connections. +Once the server is below the connection limit, it will continue consuming +connections from the backlog and will process any outstanding data on +each connection. +This mode may be useful for some protocols that are designed to wait for +a response message (such as HTTP), but may be less useful for other +protocols that demand immediate responses (such as a "welcome" message in +an interactive chat). + +```php +$server = new React\Socket\LimitingServer($server, 100, true); +$server->on('connection', function (React\Socket\ConnectionInterface $connection) { + $connection->write('hello there!' . PHP_EOL); + … +}); +``` + +##### getConnections() + +The `getConnections(): ConnectionInterface[]` method can be used to +return an array with all currently active connections. + +```php +foreach ($server->getConnection() as $connection) { + $connection->write('Hi!'); +} +``` + +## Client usage + +### ConnectorInterface + +The `ConnectorInterface` is responsible for providing an interface for +establishing streaming connections, such as a normal TCP/IP connection. + +This is the main interface defined in this package and it is used throughout +React's vast ecosystem. + +Most higher-level components (such as HTTP, database or other networking +service clients) accept an instance implementing this interface to create their +TCP/IP connection to the underlying networking service. +This is usually done via dependency injection, so it's fairly simple to actually +swap this implementation against any other implementation of this interface. + +The interface only offers a single method: + +#### connect() + +The `connect(string $uri): PromiseInterface` method can be used to +create a streaming connection to the given remote address. + +It returns a [Promise](https://github.com/reactphp/promise) which either +fulfills with a stream implementing [`ConnectionInterface`](#connectioninterface) +on success or rejects with an `Exception` if the connection is not successful: + +```php +$connector->connect('google.com:443')->then( + function (React\Socket\ConnectionInterface $connection) { + // connection successfully established + }, + function (Exception $error) { + // failed to connect due to $error + } +); +``` + +See also [`ConnectionInterface`](#connectioninterface) for more details. + +The returned Promise MUST be implemented in such a way that it can be +cancelled when it is still pending. Cancelling a pending promise MUST +reject its value with an `Exception`. It SHOULD clean up any underlying +resources and references as applicable: + +```php +$promise = $connector->connect($uri); + +$promise->cancel(); +``` + +### Connector + +The `Connector` class is the main class in this package that implements the +[`ConnectorInterface`](#connectorinterface) and allows you to create streaming connections. + +You can use this connector to create any kind of streaming connections, such +as plaintext TCP/IP, secure TLS or local Unix connection streams. + +It binds to the main event loop and can be used like this: + +```php +$connector = new React\Socket\Connector(); + +$connector->connect($uri)->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}, function (Exception $e) { + echo 'Error: ' . $e->getMessage() . PHP_EOL; +}); +``` + +In order to create a plaintext TCP/IP connection, you can simply pass a host +and port combination like this: + +```php +$connector->connect('www.google.com:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +> If you do no specify a URI scheme in the destination URI, it will assume + `tcp://` as a default and establish a plaintext TCP/IP connection. + Note that TCP/IP connections require a host and port part in the destination + URI like above, all other URI components are optional. + +In order to create a secure TLS connection, you can use the `tls://` URI scheme +like this: + +```php +$connector->connect('tls://www.google.com:443')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +In order to create a local Unix domain socket connection, you can use the +`unix://` URI scheme like this: + +```php +$connector->connect('unix:///tmp/demo.sock')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +> The [`getRemoteAddress()`](#getremoteaddress) method will return the target + Unix domain socket (UDS) path as given to the `connect()` method, including + the `unix://` scheme, for example `unix:///tmp/demo.sock`. + The [`getLocalAddress()`](#getlocaladdress) method will most likely return a + `null` value as this value is not applicable to UDS connections here. + +Under the hood, the `Connector` is implemented as a *higher-level facade* +for the lower-level connectors implemented in this package. This means it +also shares all of their features and implementation details. +If you want to typehint in your higher-level protocol implementation, you SHOULD +use the generic [`ConnectorInterface`](#connectorinterface) instead. + +As of `v1.4.0`, the `Connector` class defaults to using the +[happy eyeballs algorithm](https://en.wikipedia.org/wiki/Happy_Eyeballs) to +automatically connect over IPv4 or IPv6 when a hostname is given. +This automatically attempts to connect using both IPv4 and IPv6 at the same time +(preferring IPv6), thus avoiding the usual problems faced by users with imperfect +IPv6 connections or setups. +If you want to revert to the old behavior of only doing an IPv4 lookup and +only attempt a single IPv4 connection, you can set up the `Connector` like this: + +```php +$connector = new React\Socket\Connector(array( + 'happy_eyeballs' => false +)); +``` + +Similarly, you can also affect the default DNS behavior as follows. +The `Connector` class will try to detect your system DNS settings (and uses +Google's public DNS server `8.8.8.8` as a fallback if unable to determine your +system settings) to resolve all public hostnames into underlying IP addresses by +default. +If you explicitly want to use a custom DNS server (such as a local DNS relay or +a company wide DNS server), you can set up the `Connector` like this: + +```php +$connector = new React\Socket\Connector(array( + 'dns' => '127.0.1.1' +)); + +$connector->connect('localhost:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +If you do not want to use a DNS resolver at all and want to connect to IP +addresses only, you can also set up your `Connector` like this: + +```php +$connector = new React\Socket\Connector(array( + 'dns' => false +)); + +$connector->connect('127.0.0.1:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +Advanced: If you need a custom DNS `React\Dns\Resolver\ResolverInterface` instance, you +can also set up your `Connector` like this: + +```php +$dnsResolverFactory = new React\Dns\Resolver\Factory(); +$resolver = $dnsResolverFactory->createCached('127.0.1.1'); + +$connector = new React\Socket\Connector(array( + 'dns' => $resolver +)); + +$connector->connect('localhost:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +By default, the `tcp://` and `tls://` URI schemes will use timeout value that +respects your `default_socket_timeout` ini setting (which defaults to 60s). +If you want a custom timeout value, you can simply pass this like this: + +```php +$connector = new React\Socket\Connector(array( + 'timeout' => 10.0 +)); +``` + +Similarly, if you do not want to apply a timeout at all and let the operating +system handle this, you can pass a boolean flag like this: + +```php +$connector = new React\Socket\Connector(array( + 'timeout' => false +)); +``` + +By default, the `Connector` supports the `tcp://`, `tls://` and `unix://` +URI schemes. If you want to explicitly prohibit any of these, you can simply +pass boolean flags like this: + +```php +// only allow secure TLS connections +$connector = new React\Socket\Connector(array( + 'tcp' => false, + 'tls' => true, + 'unix' => false, +)); + +$connector->connect('tls://google.com:443')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +The `tcp://` and `tls://` also accept additional context options passed to +the underlying connectors. +If you want to explicitly pass additional context options, you can simply +pass arrays of context options like this: + +```php +// allow insecure TLS connections +$connector = new React\Socket\Connector(array( + 'tcp' => array( + 'bindto' => '192.168.0.1:0' + ), + 'tls' => array( + 'verify_peer' => false, + 'verify_peer_name' => false + ), +)); + +$connector->connect('tls://localhost:443')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +By default, this connector supports TLSv1.0+ and excludes support for legacy +SSLv2/SSLv3. As of PHP 5.6+ you can also explicitly choose the TLS version you +want to negotiate with the remote side: + +```php +$connector = new React\Socket\Connector(array( + 'tls' => array( + 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT + ) +)); +``` + +> For more details about context options, please refer to the PHP documentation + about [socket context options](https://www.php.net/manual/en/context.socket.php) + and [SSL context options](https://www.php.net/manual/en/context.ssl.php). + +Advanced: By default, the `Connector` supports the `tcp://`, `tls://` and +`unix://` URI schemes. +For this, it sets up the required connector classes automatically. +If you want to explicitly pass custom connectors for any of these, you can simply +pass an instance implementing the `ConnectorInterface` like this: + +```php +$dnsResolverFactory = new React\Dns\Resolver\Factory(); +$resolver = $dnsResolverFactory->createCached('127.0.1.1'); +$tcp = new React\Socket\HappyEyeBallsConnector(null, new React\Socket\TcpConnector(), $resolver); + +$tls = new React\Socket\SecureConnector($tcp); + +$unix = new React\Socket\UnixConnector(); + +$connector = new React\Socket\Connector(array( + 'tcp' => $tcp, + 'tls' => $tls, + 'unix' => $unix, + + 'dns' => false, + 'timeout' => false, +)); + +$connector->connect('google.com:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +> Internally, the `tcp://` connector will always be wrapped by the DNS resolver, + unless you disable DNS like in the above example. In this case, the `tcp://` + connector receives the actual hostname instead of only the resolved IP address + and is thus responsible for performing the lookup. + Internally, the automatically created `tls://` connector will always wrap the + underlying `tcp://` connector for establishing the underlying plaintext + TCP/IP connection before enabling secure TLS mode. If you want to use a custom + underlying `tcp://` connector for secure TLS connections only, you may + explicitly pass a `tls://` connector like above instead. + Internally, the `tcp://` and `tls://` connectors will always be wrapped by + `TimeoutConnector`, unless you disable timeouts like in the above example. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +> Changelog v1.9.0: The constructur signature has been updated to take the +> optional `$context` as the first parameter and the optional `$loop` as a second +> argument. The previous signature has been deprecated and should not be used anymore. +> +> ```php +> // constructor signature as of v1.9.0 +> $connector = new React\Socket\Connector(array $context = [], ?LoopInterface $loop = null); +> +> // legacy constructor signature before v1.9.0 +> $connector = new React\Socket\Connector(?LoopInterface $loop = null, array $context = []); +> ``` + +### Advanced client usage + +#### TcpConnector + +The `TcpConnector` class implements the +[`ConnectorInterface`](#connectorinterface) and allows you to create plaintext +TCP/IP connections to any IP-port-combination: + +```php +$tcpConnector = new React\Socket\TcpConnector(); + +$tcpConnector->connect('127.0.0.1:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +See also the [examples](examples). + +Pending connection attempts can be cancelled by cancelling its pending promise like so: + +```php +$promise = $tcpConnector->connect('127.0.0.1:80'); + +$promise->cancel(); +``` + +Calling `cancel()` on a pending promise will close the underlying socket +resource, thus cancelling the pending TCP/IP connection, and reject the +resulting promise. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +You can optionally pass additional +[socket context options](https://www.php.net/manual/en/context.socket.php) +to the constructor like this: + +```php +$tcpConnector = new React\Socket\TcpConnector(null, array( + 'bindto' => '192.168.0.1:0' +)); +``` + +Note that this class only allows you to connect to IP-port-combinations. +If the given URI is invalid, does not contain a valid IP address and port +or contains any other scheme, it will reject with an +`InvalidArgumentException`: + +If the given URI appears to be valid, but connecting to it fails (such as if +the remote host rejects the connection etc.), it will reject with a +`RuntimeException`. + +If you want to connect to hostname-port-combinations, see also the following chapter. + +> Advanced usage: Internally, the `TcpConnector` allocates an empty *context* +resource for each stream resource. +If the destination URI contains a `hostname` query parameter, its value will +be used to set up the TLS peer name. +This is used by the `SecureConnector` and `DnsConnector` to verify the peer +name and can also be used if you want a custom TLS peer name. + +#### HappyEyeBallsConnector + +The `HappyEyeBallsConnector` class implements the +[`ConnectorInterface`](#connectorinterface) and allows you to create plaintext +TCP/IP connections to any hostname-port-combination. Internally it implements the +happy eyeballs algorithm from [`RFC6555`](https://tools.ietf.org/html/rfc6555) and +[`RFC8305`](https://tools.ietf.org/html/rfc8305) to support IPv6 and IPv4 hostnames. + +It does so by decorating a given `TcpConnector` instance so that it first +looks up the given domain name via DNS (if applicable) and then establishes the +underlying TCP/IP connection to the resolved target IP address. + +Make sure to set up your DNS resolver and underlying TCP connector like this: + +```php +$dnsResolverFactory = new React\Dns\Resolver\Factory(); +$dns = $dnsResolverFactory->createCached('8.8.8.8'); + +$dnsConnector = new React\Socket\HappyEyeBallsConnector(null, $tcpConnector, $dns); + +$dnsConnector->connect('www.google.com:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +See also the [examples](examples). + +Pending connection attempts can be cancelled by cancelling its pending promise like so: + +```php +$promise = $dnsConnector->connect('www.google.com:80'); + +$promise->cancel(); +``` + +Calling `cancel()` on a pending promise will cancel the underlying DNS lookups +and/or the underlying TCP/IP connection(s) and reject the resulting promise. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +> Advanced usage: Internally, the `HappyEyeBallsConnector` relies on a `Resolver` to +look up the IP addresses for the given hostname. +It will then replace the hostname in the destination URI with this IP's and +append a `hostname` query parameter and pass this updated URI to the underlying +connector. +The Happy Eye Balls algorithm describes looking the IPv6 and IPv4 address for +the given hostname so this connector sends out two DNS lookups for the A and +AAAA records. It then uses all IP addresses (both v6 and v4) and tries to +connect to all of them with a 50ms interval in between. Alterating between IPv6 +and IPv4 addresses. When a connection is established all the other DNS lookups +and connection attempts are cancelled. + +#### DnsConnector + +The `DnsConnector` class implements the +[`ConnectorInterface`](#connectorinterface) and allows you to create plaintext +TCP/IP connections to any hostname-port-combination. + +It does so by decorating a given `TcpConnector` instance so that it first +looks up the given domain name via DNS (if applicable) and then establishes the +underlying TCP/IP connection to the resolved target IP address. + +Make sure to set up your DNS resolver and underlying TCP connector like this: + +```php +$dnsResolverFactory = new React\Dns\Resolver\Factory(); +$dns = $dnsResolverFactory->createCached('8.8.8.8'); + +$dnsConnector = new React\Socket\DnsConnector($tcpConnector, $dns); + +$dnsConnector->connect('www.google.com:80')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write('...'); + $connection->end(); +}); +``` + +See also the [examples](examples). + +Pending connection attempts can be cancelled by cancelling its pending promise like so: + +```php +$promise = $dnsConnector->connect('www.google.com:80'); + +$promise->cancel(); +``` + +Calling `cancel()` on a pending promise will cancel the underlying DNS lookup +and/or the underlying TCP/IP connection and reject the resulting promise. + +> Advanced usage: Internally, the `DnsConnector` relies on a `React\Dns\Resolver\ResolverInterface` +to look up the IP address for the given hostname. +It will then replace the hostname in the destination URI with this IP and +append a `hostname` query parameter and pass this updated URI to the underlying +connector. +The underlying connector is thus responsible for creating a connection to the +target IP address, while this query parameter can be used to check the original +hostname and is used by the `TcpConnector` to set up the TLS peer name. +If a `hostname` is given explicitly, this query parameter will not be modified, +which can be useful if you want a custom TLS peer name. + +#### SecureConnector + +The `SecureConnector` class implements the +[`ConnectorInterface`](#connectorinterface) and allows you to create secure +TLS (formerly known as SSL) connections to any hostname-port-combination. + +It does so by decorating a given `DnsConnector` instance so that it first +creates a plaintext TCP/IP connection and then enables TLS encryption on this +stream. + +```php +$secureConnector = new React\Socket\SecureConnector($dnsConnector); + +$secureConnector->connect('www.google.com:443')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write("GET / HTTP/1.0\r\nHost: www.google.com\r\n\r\n"); + ... +}); +``` + +See also the [examples](examples). + +Pending connection attempts can be cancelled by cancelling its pending promise like so: + +```php +$promise = $secureConnector->connect('www.google.com:443'); + +$promise->cancel(); +``` + +Calling `cancel()` on a pending promise will cancel the underlying TCP/IP +connection and/or the SSL/TLS negotiation and reject the resulting promise. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +You can optionally pass additional +[SSL context options](https://www.php.net/manual/en/context.ssl.php) +to the constructor like this: + +```php +$secureConnector = new React\Socket\SecureConnector($dnsConnector, null, array( + 'verify_peer' => false, + 'verify_peer_name' => false +)); +``` + +By default, this connector supports TLSv1.0+ and excludes support for legacy +SSLv2/SSLv3. As of PHP 5.6+ you can also explicitly choose the TLS version you +want to negotiate with the remote side: + +```php +$secureConnector = new React\Socket\SecureConnector($dnsConnector, null, array( + 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT +)); +``` + +> Advanced usage: Internally, the `SecureConnector` relies on setting up the +required *context options* on the underlying stream resource. +It should therefor be used with a `TcpConnector` somewhere in the connector +stack so that it can allocate an empty *context* resource for each stream +resource and verify the peer name. +Failing to do so may result in a TLS peer name mismatch error or some hard to +trace race conditions, because all stream resources will use a single, shared +*default context* resource otherwise. + +#### TimeoutConnector + +The `TimeoutConnector` class implements the +[`ConnectorInterface`](#connectorinterface) and allows you to add timeout +handling to any existing connector instance. + +It does so by decorating any given [`ConnectorInterface`](#connectorinterface) +instance and starting a timer that will automatically reject and abort any +underlying connection attempt if it takes too long. + +```php +$timeoutConnector = new React\Socket\TimeoutConnector($connector, 3.0); + +$timeoutConnector->connect('google.com:80')->then(function (React\Socket\ConnectionInterface $connection) { + // connection succeeded within 3.0 seconds +}); +``` + +See also any of the [examples](examples). + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +Pending connection attempts can be cancelled by cancelling its pending promise like so: + +```php +$promise = $timeoutConnector->connect('google.com:80'); + +$promise->cancel(); +``` + +Calling `cancel()` on a pending promise will cancel the underlying connection +attempt, abort the timer and reject the resulting promise. + +#### UnixConnector + +The `UnixConnector` class implements the +[`ConnectorInterface`](#connectorinterface) and allows you to connect to +Unix domain socket (UDS) paths like this: + +```php +$connector = new React\Socket\UnixConnector(); + +$connector->connect('/tmp/demo.sock')->then(function (React\Socket\ConnectionInterface $connection) { + $connection->write("HELLO\n"); +}); +``` + +Connecting to Unix domain sockets is an atomic operation, i.e. its promise will +settle (either resolve or reject) immediately. +As such, calling `cancel()` on the resulting promise has no effect. + +> The [`getRemoteAddress()`](#getremoteaddress) method will return the target + Unix domain socket (UDS) path as given to the `connect()` method, prepended + with the `unix://` scheme, for example `unix:///tmp/demo.sock`. + The [`getLocalAddress()`](#getlocaladdress) method will most likely return a + `null` value as this value is not applicable to UDS connections here. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +#### FixedUriConnector + +The `FixedUriConnector` class implements the +[`ConnectorInterface`](#connectorinterface) and decorates an existing Connector +to always use a fixed, preconfigured URI. + +This can be useful for consumers that do not support certain URIs, such as +when you want to explicitly connect to a Unix domain socket (UDS) path +instead of connecting to a default address assumed by an higher-level API: + +```php +$connector = new React\Socket\FixedUriConnector( + 'unix:///var/run/docker.sock', + new React\Socket\UnixConnector() +); + +// destination will be ignored, actually connects to Unix domain socket +$promise = $connector->connect('localhost:80'); +``` + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](https://semver.org/). +This will install the latest supported version: + +```bash +composer require react/socket:^1.16 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 8+ and HHVM. +It's *highly recommended to use the latest supported PHP version* for this project, +partly due to its vast performance improvements and partly because legacy PHP +versions require several workarounds as described below. + +Secure TLS connections received some major upgrades starting with PHP 5.6, with +the defaults now being more secure, while older versions required explicit +context options. +This library does not take responsibility over these context options, so it's +up to consumers of this library to take care of setting appropriate context +options as described above. + +PHP < 7.3.3 (and PHP < 7.2.15) suffers from a bug where feof() might +block with 100% CPU usage on fragmented TLS records. +We try to work around this by always consuming the complete receive +buffer at once to avoid stale data in TLS buffers. This is known to +work around high CPU usage for well-behaving peers, but this may +cause very large data chunks for high throughput scenarios. The buggy +behavior can still be triggered due to network I/O buffers or +malicious peers on affected versions, upgrading is highly recommended. + +PHP < 7.1.4 (and PHP < 7.0.18) suffers from a bug when writing big +chunks of data over TLS streams at once. +We try to work around this by limiting the write chunk size to 8192 +bytes for older PHP versions only. +This is only a work-around and has a noticable performance penalty on +affected versions. + +This project also supports running on HHVM. +Note that really old HHVM < 3.8 does not support secure TLS connections, as it +lacks the required `stream_socket_enable_crypto()` function. +As such, trying to create a secure TLS connections on affected versions will +return a rejected promise instead. +This issue is also covered by our test suite, which will skip related tests +on affected versions. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org/): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +The test suite also contains a number of functional integration tests that rely +on a stable internet connection. +If you do not want to run these, they can simply be skipped like this: + +```bash +vendor/bin/phpunit --exclude-group internet +``` + +## License + +MIT, see [LICENSE file](LICENSE). diff --git a/vendor/react/socket/composer.json b/vendor/react/socket/composer.json new file mode 100644 index 000000000..b1e1d2535 --- /dev/null +++ b/vendor/react/socket/composer.json @@ -0,0 +1,52 @@ +{ + "name": "react/socket", + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": ["async", "socket", "stream", "connection", "ReactPHP"], + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "homepage": "https://clue.engineering/", + "email": "christian@clue.engineering" + }, + { + "name": "Cees-Jan Kiewiet", + "homepage": "https://wyrihaximus.net/", + "email": "reactphp@ceesjankiewiet.nl" + }, + { + "name": "Jan Sorgalla", + "homepage": "https://sorgalla.com/", + "email": "jsorgalla@gmail.com" + }, + { + "name": "Chris Boden", + "homepage": "https://cboden.dev/", + "email": "cboden@gmail.com" + } + ], + "require": { + "php": ">=5.3.0", + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "React\\Tests\\Socket\\": "tests/" + } + } +} diff --git a/vendor/react/socket/src/Connection.php b/vendor/react/socket/src/Connection.php new file mode 100644 index 000000000..65ae26b48 --- /dev/null +++ b/vendor/react/socket/src/Connection.php @@ -0,0 +1,183 @@ += 70300 && \PHP_VERSION_ID < 70303); + + // PHP < 7.1.4 (and PHP < 7.0.18) suffers from a bug when writing big + // chunks of data over TLS streams at once. + // We try to work around this by limiting the write chunk size to 8192 + // bytes for older PHP versions only. + // This is only a work-around and has a noticable performance penalty on + // affected versions. Please update your PHP version. + // This applies to all streams because TLS may be enabled later on. + // See https://github.com/reactphp/socket/issues/105 + $limitWriteChunks = (\PHP_VERSION_ID < 70018 || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70104)); + + $this->input = new DuplexResourceStream( + $resource, + $loop, + $clearCompleteBuffer ? -1 : null, + new WritableResourceStream($resource, $loop, null, $limitWriteChunks ? 8192 : null) + ); + + $this->stream = $resource; + + Util::forwardEvents($this->input, $this, array('data', 'end', 'error', 'close', 'pipe', 'drain')); + + $this->input->on('close', array($this, 'close')); + } + + public function isReadable() + { + return $this->input->isReadable(); + } + + public function isWritable() + { + return $this->input->isWritable(); + } + + public function pause() + { + $this->input->pause(); + } + + public function resume() + { + $this->input->resume(); + } + + public function pipe(WritableStreamInterface $dest, array $options = array()) + { + return $this->input->pipe($dest, $options); + } + + public function write($data) + { + return $this->input->write($data); + } + + public function end($data = null) + { + $this->input->end($data); + } + + public function close() + { + $this->input->close(); + $this->handleClose(); + $this->removeAllListeners(); + } + + public function handleClose() + { + if (!\is_resource($this->stream)) { + return; + } + + // Try to cleanly shut down socket and ignore any errors in case other + // side already closed. Underlying Stream implementation will take care + // of closing stream resource, so we otherwise keep this open here. + @\stream_socket_shutdown($this->stream, \STREAM_SHUT_RDWR); + } + + public function getRemoteAddress() + { + if (!\is_resource($this->stream)) { + return null; + } + + return $this->parseAddress(\stream_socket_get_name($this->stream, true)); + } + + public function getLocalAddress() + { + if (!\is_resource($this->stream)) { + return null; + } + + return $this->parseAddress(\stream_socket_get_name($this->stream, false)); + } + + private function parseAddress($address) + { + if ($address === false) { + return null; + } + + if ($this->unix) { + // remove trailing colon from address for HHVM < 3.19: https://3v4l.org/5C1lo + // note that technically ":" is a valid address, so keep this in place otherwise + if (\substr($address, -1) === ':' && \defined('HHVM_VERSION_ID') && \HHVM_VERSION_ID < 31900) { + $address = (string)\substr($address, 0, -1); // @codeCoverageIgnore + } + + // work around unknown addresses should return null value: https://3v4l.org/5C1lo and https://bugs.php.net/bug.php?id=74556 + // PHP uses "\0" string and HHVM uses empty string (colon removed above) + if ($address === '' || $address[0] === "\x00" ) { + return null; // @codeCoverageIgnore + } + + return 'unix://' . $address; + } + + // check if this is an IPv6 address which includes multiple colons but no square brackets + $pos = \strrpos($address, ':'); + if ($pos !== false && \strpos($address, ':') < $pos && \substr($address, 0, 1) !== '[') { + $address = '[' . \substr($address, 0, $pos) . ']:' . \substr($address, $pos + 1); // @codeCoverageIgnore + } + + return ($this->encryptionEnabled ? 'tls' : 'tcp') . '://' . $address; + } +} diff --git a/vendor/react/socket/src/ConnectionInterface.php b/vendor/react/socket/src/ConnectionInterface.php new file mode 100644 index 000000000..64613b58a --- /dev/null +++ b/vendor/react/socket/src/ConnectionInterface.php @@ -0,0 +1,119 @@ +on('data', function ($chunk) { + * echo $chunk; + * }); + * + * $connection->on('end', function () { + * echo 'ended'; + * }); + * + * $connection->on('error', function (Exception $e) { + * echo 'error: ' . $e->getMessage(); + * }); + * + * $connection->on('close', function () { + * echo 'closed'; + * }); + * + * $connection->write($data); + * $connection->end($data = null); + * $connection->close(); + * // … + * ``` + * + * For more details, see the + * [`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface). + * + * @see DuplexStreamInterface + * @see ServerInterface + * @see ConnectorInterface + */ +interface ConnectionInterface extends DuplexStreamInterface +{ + /** + * Returns the full remote address (URI) where this connection has been established with + * + * ```php + * $address = $connection->getRemoteAddress(); + * echo 'Connection with ' . $address . PHP_EOL; + * ``` + * + * If the remote address can not be determined or is unknown at this time (such as + * after the connection has been closed), it MAY return a `NULL` value instead. + * + * Otherwise, it will return the full address (URI) as a string value, such + * as `tcp://127.0.0.1:8080`, `tcp://[::1]:80`, `tls://127.0.0.1:443`, + * `unix://example.sock` or `unix:///path/to/example.sock`. + * Note that individual URI components are application specific and depend + * on the underlying transport protocol. + * + * If this is a TCP/IP based connection and you only want the remote IP, you may + * use something like this: + * + * ```php + * $address = $connection->getRemoteAddress(); + * $ip = trim(parse_url($address, PHP_URL_HOST), '[]'); + * echo 'Connection with ' . $ip . PHP_EOL; + * ``` + * + * @return ?string remote address (URI) or null if unknown + */ + public function getRemoteAddress(); + + /** + * Returns the full local address (full URI with scheme, IP and port) where this connection has been established with + * + * ```php + * $address = $connection->getLocalAddress(); + * echo 'Connection with ' . $address . PHP_EOL; + * ``` + * + * If the local address can not be determined or is unknown at this time (such as + * after the connection has been closed), it MAY return a `NULL` value instead. + * + * Otherwise, it will return the full address (URI) as a string value, such + * as `tcp://127.0.0.1:8080`, `tcp://[::1]:80`, `tls://127.0.0.1:443`, + * `unix://example.sock` or `unix:///path/to/example.sock`. + * Note that individual URI components are application specific and depend + * on the underlying transport protocol. + * + * This method complements the [`getRemoteAddress()`](#getremoteaddress) method, + * so they should not be confused. + * + * If your `TcpServer` instance is listening on multiple interfaces (e.g. using + * the address `0.0.0.0`), you can use this method to find out which interface + * actually accepted this connection (such as a public or local interface). + * + * If your system has multiple interfaces (e.g. a WAN and a LAN interface), + * you can use this method to find out which interface was actually + * used for this connection. + * + * @return ?string local address (URI) or null if unknown + * @see self::getRemoteAddress() + */ + public function getLocalAddress(); +} diff --git a/vendor/react/socket/src/Connector.php b/vendor/react/socket/src/Connector.php new file mode 100644 index 000000000..15faa4699 --- /dev/null +++ b/vendor/react/socket/src/Connector.php @@ -0,0 +1,236 @@ + true, + 'tls' => true, + 'unix' => true, + + 'dns' => true, + 'timeout' => true, + 'happy_eyeballs' => true, + ); + + if ($context['timeout'] === true) { + $context['timeout'] = (float)\ini_get("default_socket_timeout"); + } + + if ($context['tcp'] instanceof ConnectorInterface) { + $tcp = $context['tcp']; + } else { + $tcp = new TcpConnector( + $loop, + \is_array($context['tcp']) ? $context['tcp'] : array() + ); + } + + if ($context['dns'] !== false) { + if ($context['dns'] instanceof ResolverInterface) { + $resolver = $context['dns']; + } else { + if ($context['dns'] !== true) { + $config = $context['dns']; + } else { + // try to load nameservers from system config or default to Google's public DNS + $config = DnsConfig::loadSystemConfigBlocking(); + if (!$config->nameservers) { + $config->nameservers[] = '8.8.8.8'; // @codeCoverageIgnore + } + } + + $factory = new DnsFactory(); + $resolver = $factory->createCached( + $config, + $loop + ); + } + + if ($context['happy_eyeballs'] === true) { + $tcp = new HappyEyeBallsConnector($loop, $tcp, $resolver); + } else { + $tcp = new DnsConnector($tcp, $resolver); + } + } + + if ($context['tcp'] !== false) { + $context['tcp'] = $tcp; + + if ($context['timeout'] !== false) { + $context['tcp'] = new TimeoutConnector( + $context['tcp'], + $context['timeout'], + $loop + ); + } + + $this->connectors['tcp'] = $context['tcp']; + } + + if ($context['tls'] !== false) { + if (!$context['tls'] instanceof ConnectorInterface) { + $context['tls'] = new SecureConnector( + $tcp, + $loop, + \is_array($context['tls']) ? $context['tls'] : array() + ); + } + + if ($context['timeout'] !== false) { + $context['tls'] = new TimeoutConnector( + $context['tls'], + $context['timeout'], + $loop + ); + } + + $this->connectors['tls'] = $context['tls']; + } + + if ($context['unix'] !== false) { + if (!$context['unix'] instanceof ConnectorInterface) { + $context['unix'] = new UnixConnector($loop); + } + $this->connectors['unix'] = $context['unix']; + } + } + + public function connect($uri) + { + $scheme = 'tcp'; + if (\strpos($uri, '://') !== false) { + $scheme = (string)\substr($uri, 0, \strpos($uri, '://')); + } + + if (!isset($this->connectors[$scheme])) { + return \React\Promise\reject(new \RuntimeException( + 'No connector available for URI scheme "' . $scheme . '" (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + )); + } + + return $this->connectors[$scheme]->connect($uri); + } + + + /** + * [internal] Builds on URI from the given URI parts and ip address with original hostname as query + * + * @param array $parts + * @param string $host + * @param string $ip + * @return string + * @internal + */ + public static function uri(array $parts, $host, $ip) + { + $uri = ''; + + // prepend original scheme if known + if (isset($parts['scheme'])) { + $uri .= $parts['scheme'] . '://'; + } + + if (\strpos($ip, ':') !== false) { + // enclose IPv6 addresses in square brackets before appending port + $uri .= '[' . $ip . ']'; + } else { + $uri .= $ip; + } + + // append original port if known + if (isset($parts['port'])) { + $uri .= ':' . $parts['port']; + } + + // append orignal path if known + if (isset($parts['path'])) { + $uri .= $parts['path']; + } + + // append original query if known + if (isset($parts['query'])) { + $uri .= '?' . $parts['query']; + } + + // append original hostname as query if resolved via DNS and if + // destination URI does not contain "hostname" query param already + $args = array(); + \parse_str(isset($parts['query']) ? $parts['query'] : '', $args); + if ($host !== $ip && !isset($args['hostname'])) { + $uri .= (isset($parts['query']) ? '&' : '?') . 'hostname=' . \rawurlencode($host); + } + + // append original fragment if known + if (isset($parts['fragment'])) { + $uri .= '#' . $parts['fragment']; + } + + return $uri; + } +} diff --git a/vendor/react/socket/src/ConnectorInterface.php b/vendor/react/socket/src/ConnectorInterface.php new file mode 100644 index 000000000..1f07b753e --- /dev/null +++ b/vendor/react/socket/src/ConnectorInterface.php @@ -0,0 +1,59 @@ +connect('google.com:443')->then( + * function (React\Socket\ConnectionInterface $connection) { + * // connection successfully established + * }, + * function (Exception $error) { + * // failed to connect due to $error + * } + * ); + * ``` + * + * The returned Promise MUST be implemented in such a way that it can be + * cancelled when it is still pending. Cancelling a pending promise MUST + * reject its value with an Exception. It SHOULD clean up any underlying + * resources and references as applicable. + * + * ```php + * $promise = $connector->connect($uri); + * + * $promise->cancel(); + * ``` + * + * @param string $uri + * @return \React\Promise\PromiseInterface + * Resolves with a `ConnectionInterface` on success or rejects with an `Exception` on error. + * @see ConnectionInterface + */ + public function connect($uri); +} diff --git a/vendor/react/socket/src/DnsConnector.php b/vendor/react/socket/src/DnsConnector.php new file mode 100644 index 000000000..d2fb2c7dd --- /dev/null +++ b/vendor/react/socket/src/DnsConnector.php @@ -0,0 +1,117 @@ +connector = $connector; + $this->resolver = $resolver; + } + + public function connect($uri) + { + $original = $uri; + if (\strpos($uri, '://') === false) { + $uri = 'tcp://' . $uri; + $parts = \parse_url($uri); + if (isset($parts['scheme'])) { + unset($parts['scheme']); + } + } else { + $parts = \parse_url($uri); + } + + if (!$parts || !isset($parts['host'])) { + return Promise\reject(new \InvalidArgumentException( + 'Given URI "' . $original . '" is invalid (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + )); + } + + $host = \trim($parts['host'], '[]'); + $connector = $this->connector; + + // skip DNS lookup / URI manipulation if this URI already contains an IP + if (@\inet_pton($host) !== false) { + return $connector->connect($original); + } + + $promise = $this->resolver->resolve($host); + $resolved = null; + + return new Promise\Promise( + function ($resolve, $reject) use (&$promise, &$resolved, $uri, $connector, $host, $parts) { + // resolve/reject with result of DNS lookup + $promise->then(function ($ip) use (&$promise, &$resolved, $uri, $connector, $host, $parts) { + $resolved = $ip; + + return $promise = $connector->connect( + Connector::uri($parts, $host, $ip) + )->then(null, function (\Exception $e) use ($uri) { + if ($e instanceof \RuntimeException) { + $message = \preg_replace('/^(Connection to [^ ]+)[&?]hostname=[^ &]+/', '$1', $e->getMessage()); + $e = new \RuntimeException( + 'Connection to ' . $uri . ' failed: ' . $message, + $e->getCode(), + $e + ); + + // avoid garbage references by replacing all closures in call stack. + // what a lovely piece of code! + $r = new \ReflectionProperty('Exception', 'trace'); + $r->setAccessible(true); + $trace = $r->getValue($e); + + // Exception trace arguments are not available on some PHP 7.4 installs + // @codeCoverageIgnoreStart + foreach ($trace as $ti => $one) { + if (isset($one['args'])) { + foreach ($one['args'] as $ai => $arg) { + if ($arg instanceof \Closure) { + $trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')'; + } + } + } + } + // @codeCoverageIgnoreEnd + $r->setValue($e, $trace); + } + + throw $e; + }); + }, function ($e) use ($uri, $reject) { + $reject(new \RuntimeException('Connection to ' . $uri .' failed during DNS lookup: ' . $e->getMessage(), 0, $e)); + })->then($resolve, $reject); + }, + function ($_, $reject) use (&$promise, &$resolved, $uri) { + // cancellation should reject connection attempt + // reject DNS resolution with custom reason, otherwise rely on connection cancellation below + if ($resolved === null) { + $reject(new \RuntimeException( + 'Connection to ' . $uri . ' cancelled during DNS lookup (ECONNABORTED)', + \defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103 + )); + } + + // (try to) cancel pending DNS lookup / connection attempt + if ($promise instanceof PromiseInterface && \method_exists($promise, 'cancel')) { + // overwrite callback arguments for PHP7+ only, so they do not show + // up in the Exception trace and do not cause a possible cyclic reference. + $_ = $reject = null; + + $promise->cancel(); + $promise = null; + } + } + ); + } +} diff --git a/vendor/react/socket/src/FdServer.php b/vendor/react/socket/src/FdServer.php new file mode 100644 index 000000000..8e46719aa --- /dev/null +++ b/vendor/react/socket/src/FdServer.php @@ -0,0 +1,222 @@ +on('connection', function (ConnectionInterface $connection) { + * echo 'Plaintext connection from ' . $connection->getRemoteAddress() . PHP_EOL; + * $connection->write('hello there!' . PHP_EOL); + * … + * }); + * ``` + * + * See also the `ServerInterface` for more details. + * + * @see ServerInterface + * @see ConnectionInterface + * @internal + */ +final class FdServer extends EventEmitter implements ServerInterface +{ + private $master; + private $loop; + private $unix = false; + private $listening = false; + + /** + * Creates a socket server and starts listening on the given file descriptor + * + * This starts accepting new incoming connections on the given file descriptor. + * See also the `connection event` documented in the `ServerInterface` + * for more details. + * + * ```php + * $socket = new React\Socket\FdServer(3); + * ``` + * + * If the given FD is invalid or out of range, it will throw an `InvalidArgumentException`: + * + * ```php + * // throws InvalidArgumentException + * $socket = new React\Socket\FdServer(-1); + * ``` + * + * If the given FD appears to be valid, but listening on it fails (such as + * if the FD does not exist or does not refer to a socket server), it will + * throw a `RuntimeException`: + * + * ```php + * // throws RuntimeException because FD does not reference a socket server + * $socket = new React\Socket\FdServer(0, $loop); + * ``` + * + * Note that these error conditions may vary depending on your system and/or + * configuration. + * See the exception message and code for more details about the actual error + * condition. + * + * @param int|string $fd FD number such as `3` or as URL in the form of `php://fd/3` + * @param ?LoopInterface $loop + * @throws \InvalidArgumentException if the listening address is invalid + * @throws \RuntimeException if listening on this address fails (already in use etc.) + */ + public function __construct($fd, $loop = null) + { + if (\preg_match('#^php://fd/(\d+)$#', $fd, $m)) { + $fd = (int) $m[1]; + } + if (!\is_int($fd) || $fd < 0 || $fd >= \PHP_INT_MAX) { + throw new \InvalidArgumentException( + 'Invalid FD number given (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + ); + } + + if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); + } + + $this->loop = $loop ?: Loop::get(); + + $errno = 0; + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { + // Match errstr from PHP's warning message. + // fopen(php://fd/3): Failed to open stream: Error duping file descriptor 3; possibly it doesn't exist: [9]: Bad file descriptor + \preg_match('/\[(\d+)\]: (.*)/', $error, $m); + $errno = isset($m[1]) ? (int) $m[1] : 0; + $errstr = isset($m[2]) ? $m[2] : $error; + }); + + $this->master = \fopen('php://fd/' . $fd, 'r+'); + + \restore_error_handler(); + + if (false === $this->master) { + throw new \RuntimeException( + 'Failed to listen on FD ' . $fd . ': ' . $errstr . SocketServer::errconst($errno), + $errno + ); + } + + $meta = \stream_get_meta_data($this->master); + if (!isset($meta['stream_type']) || $meta['stream_type'] !== 'tcp_socket') { + \fclose($this->master); + + $errno = \defined('SOCKET_ENOTSOCK') ? \SOCKET_ENOTSOCK : 88; + $errstr = \function_exists('socket_strerror') ? \socket_strerror($errno) : 'Not a socket'; + + throw new \RuntimeException( + 'Failed to listen on FD ' . $fd . ': ' . $errstr . ' (ENOTSOCK)', + $errno + ); + } + + // Socket should not have a peer address if this is a listening socket. + // Looks like this work-around is the closest we can get because PHP doesn't expose SO_ACCEPTCONN even with ext-sockets. + if (\stream_socket_get_name($this->master, true) !== false) { + \fclose($this->master); + + $errno = \defined('SOCKET_EISCONN') ? \SOCKET_EISCONN : 106; + $errstr = \function_exists('socket_strerror') ? \socket_strerror($errno) : 'Socket is connected'; + + throw new \RuntimeException( + 'Failed to listen on FD ' . $fd . ': ' . $errstr . ' (EISCONN)', + $errno + ); + } + + // Assume this is a Unix domain socket (UDS) when its listening address doesn't parse as a valid URL with a port. + // Looks like this work-around is the closest we can get because PHP doesn't expose SO_DOMAIN even with ext-sockets. + $this->unix = \parse_url($this->getAddress(), \PHP_URL_PORT) === false; + + \stream_set_blocking($this->master, false); + + $this->resume(); + } + + public function getAddress() + { + if (!\is_resource($this->master)) { + return null; + } + + $address = \stream_socket_get_name($this->master, false); + + if ($this->unix === true) { + return 'unix://' . $address; + } + + // check if this is an IPv6 address which includes multiple colons but no square brackets + $pos = \strrpos($address, ':'); + if ($pos !== false && \strpos($address, ':') < $pos && \substr($address, 0, 1) !== '[') { + $address = '[' . \substr($address, 0, $pos) . ']:' . \substr($address, $pos + 1); // @codeCoverageIgnore + } + + return 'tcp://' . $address; + } + + public function pause() + { + if (!$this->listening) { + return; + } + + $this->loop->removeReadStream($this->master); + $this->listening = false; + } + + public function resume() + { + if ($this->listening || !\is_resource($this->master)) { + return; + } + + $that = $this; + $this->loop->addReadStream($this->master, function ($master) use ($that) { + try { + $newSocket = SocketServer::accept($master); + } catch (\RuntimeException $e) { + $that->emit('error', array($e)); + return; + } + $that->handleConnection($newSocket); + }); + $this->listening = true; + } + + public function close() + { + if (!\is_resource($this->master)) { + return; + } + + $this->pause(); + \fclose($this->master); + $this->removeAllListeners(); + } + + /** @internal */ + public function handleConnection($socket) + { + $connection = new Connection($socket, $this->loop); + $connection->unix = $this->unix; + + $this->emit('connection', array($connection)); + } +} diff --git a/vendor/react/socket/src/FixedUriConnector.php b/vendor/react/socket/src/FixedUriConnector.php new file mode 100644 index 000000000..f83241d6c --- /dev/null +++ b/vendor/react/socket/src/FixedUriConnector.php @@ -0,0 +1,41 @@ +connect('localhost:80'); + * ``` + */ +class FixedUriConnector implements ConnectorInterface +{ + private $uri; + private $connector; + + /** + * @param string $uri + * @param ConnectorInterface $connector + */ + public function __construct($uri, ConnectorInterface $connector) + { + $this->uri = $uri; + $this->connector = $connector; + } + + public function connect($_) + { + return $this->connector->connect($this->uri); + } +} diff --git a/vendor/react/socket/src/HappyEyeBallsConnectionBuilder.php b/vendor/react/socket/src/HappyEyeBallsConnectionBuilder.php new file mode 100644 index 000000000..d4f05e857 --- /dev/null +++ b/vendor/react/socket/src/HappyEyeBallsConnectionBuilder.php @@ -0,0 +1,334 @@ + false, + Message::TYPE_AAAA => false, + ); + public $resolverPromises = array(); + public $connectionPromises = array(); + public $connectQueue = array(); + public $nextAttemptTimer; + public $parts; + public $ipsCount = 0; + public $failureCount = 0; + public $resolve; + public $reject; + + public $lastErrorFamily; + public $lastError6; + public $lastError4; + + public function __construct(LoopInterface $loop, ConnectorInterface $connector, ResolverInterface $resolver, $uri, $host, $parts) + { + $this->loop = $loop; + $this->connector = $connector; + $this->resolver = $resolver; + $this->uri = $uri; + $this->host = $host; + $this->parts = $parts; + } + + public function connect() + { + $that = $this; + return new Promise\Promise(function ($resolve, $reject) use ($that) { + $lookupResolve = function ($type) use ($that, $resolve, $reject) { + return function (array $ips) use ($that, $type, $resolve, $reject) { + unset($that->resolverPromises[$type]); + $that->resolved[$type] = true; + + $that->mixIpsIntoConnectQueue($ips); + + // start next connection attempt if not already awaiting next + if ($that->nextAttemptTimer === null && $that->connectQueue) { + $that->check($resolve, $reject); + } + }; + }; + + $that->resolverPromises[Message::TYPE_AAAA] = $that->resolve(Message::TYPE_AAAA, $reject)->then($lookupResolve(Message::TYPE_AAAA)); + $that->resolverPromises[Message::TYPE_A] = $that->resolve(Message::TYPE_A, $reject)->then(function (array $ips) use ($that) { + // happy path: IPv6 has resolved already (or could not resolve), continue with IPv4 addresses + if ($that->resolved[Message::TYPE_AAAA] === true || !$ips) { + return $ips; + } + + // Otherwise delay processing IPv4 lookup until short timer passes or IPv6 resolves in the meantime + $deferred = new Promise\Deferred(function () use (&$ips) { + // discard all IPv4 addresses if cancelled + $ips = array(); + }); + $timer = $that->loop->addTimer($that::RESOLUTION_DELAY, function () use ($deferred, $ips) { + $deferred->resolve($ips); + }); + + $that->resolverPromises[Message::TYPE_AAAA]->then(function () use ($that, $timer, $deferred, &$ips) { + $that->loop->cancelTimer($timer); + $deferred->resolve($ips); + }); + + return $deferred->promise(); + })->then($lookupResolve(Message::TYPE_A)); + }, function ($_, $reject) use ($that) { + $reject(new \RuntimeException( + 'Connection to ' . $that->uri . ' cancelled' . (!$that->connectionPromises ? ' during DNS lookup' : '') . ' (ECONNABORTED)', + \defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103 + )); + $_ = $reject = null; + + $that->cleanUp(); + }); + } + + /** + * @internal + * @param int $type DNS query type + * @param callable $reject + * @return \React\Promise\PromiseInterface Returns a promise that + * always resolves with a list of IP addresses on success or an empty + * list on error. + */ + public function resolve($type, $reject) + { + $that = $this; + return $that->resolver->resolveAll($that->host, $type)->then(null, function (\Exception $e) use ($type, $reject, $that) { + unset($that->resolverPromises[$type]); + $that->resolved[$type] = true; + + if ($type === Message::TYPE_A) { + $that->lastError4 = $e->getMessage(); + $that->lastErrorFamily = 4; + } else { + $that->lastError6 = $e->getMessage(); + $that->lastErrorFamily = 6; + } + + // cancel next attempt timer when there are no more IPs to connect to anymore + if ($that->nextAttemptTimer !== null && !$that->connectQueue) { + $that->loop->cancelTimer($that->nextAttemptTimer); + $that->nextAttemptTimer = null; + } + + if ($that->hasBeenResolved() && $that->ipsCount === 0) { + $reject(new \RuntimeException( + $that->error(), + 0, + $e + )); + } + + // Exception already handled above, so don't throw an unhandled rejection here + return array(); + }); + } + + /** + * @internal + */ + public function check($resolve, $reject) + { + $ip = \array_shift($this->connectQueue); + + // start connection attempt and remember array position to later unset again + $this->connectionPromises[] = $this->attemptConnection($ip); + \end($this->connectionPromises); + $index = \key($this->connectionPromises); + + $that = $this; + $that->connectionPromises[$index]->then(function ($connection) use ($that, $index, $resolve) { + unset($that->connectionPromises[$index]); + + $that->cleanUp(); + + $resolve($connection); + }, function (\Exception $e) use ($that, $index, $ip, $resolve, $reject) { + unset($that->connectionPromises[$index]); + + $that->failureCount++; + + $message = \preg_replace('/^(Connection to [^ ]+)[&?]hostname=[^ &]+/', '$1', $e->getMessage()); + if (\strpos($ip, ':') === false) { + $that->lastError4 = $message; + $that->lastErrorFamily = 4; + } else { + $that->lastError6 = $message; + $that->lastErrorFamily = 6; + } + + // start next connection attempt immediately on error + if ($that->connectQueue) { + if ($that->nextAttemptTimer !== null) { + $that->loop->cancelTimer($that->nextAttemptTimer); + $that->nextAttemptTimer = null; + } + + $that->check($resolve, $reject); + } + + if ($that->hasBeenResolved() === false) { + return; + } + + if ($that->ipsCount === $that->failureCount) { + $that->cleanUp(); + + $reject(new \RuntimeException( + $that->error(), + $e->getCode(), + $e + )); + } + }); + + // Allow next connection attempt in 100ms: https://tools.ietf.org/html/rfc8305#section-5 + // Only start timer when more IPs are queued or when DNS query is still pending (might add more IPs) + if ($this->nextAttemptTimer === null && (\count($this->connectQueue) > 0 || $this->resolved[Message::TYPE_A] === false || $this->resolved[Message::TYPE_AAAA] === false)) { + $this->nextAttemptTimer = $this->loop->addTimer(self::CONNECTION_ATTEMPT_DELAY, function () use ($that, $resolve, $reject) { + $that->nextAttemptTimer = null; + + if ($that->connectQueue) { + $that->check($resolve, $reject); + } + }); + } + } + + /** + * @internal + */ + public function attemptConnection($ip) + { + $uri = Connector::uri($this->parts, $this->host, $ip); + + return $this->connector->connect($uri); + } + + /** + * @internal + */ + public function cleanUp() + { + // clear list of outstanding IPs to avoid creating new connections + $this->connectQueue = array(); + + // cancel pending connection attempts + foreach ($this->connectionPromises as $connectionPromise) { + if ($connectionPromise instanceof PromiseInterface && \method_exists($connectionPromise, 'cancel')) { + $connectionPromise->cancel(); + } + } + + // cancel pending DNS resolution (cancel IPv4 first in case it is awaiting IPv6 resolution delay) + foreach (\array_reverse($this->resolverPromises) as $resolverPromise) { + if ($resolverPromise instanceof PromiseInterface && \method_exists($resolverPromise, 'cancel')) { + $resolverPromise->cancel(); + } + } + + if ($this->nextAttemptTimer instanceof TimerInterface) { + $this->loop->cancelTimer($this->nextAttemptTimer); + $this->nextAttemptTimer = null; + } + } + + /** + * @internal + */ + public function hasBeenResolved() + { + foreach ($this->resolved as $typeHasBeenResolved) { + if ($typeHasBeenResolved === false) { + return false; + } + } + + return true; + } + + /** + * Mixes an array of IP addresses into the connect queue in such a way they alternate when attempting to connect. + * The goal behind it is first attempt to connect to IPv6, then to IPv4, then to IPv6 again until one of those + * attempts succeeds. + * + * @link https://tools.ietf.org/html/rfc8305#section-4 + * + * @internal + */ + public function mixIpsIntoConnectQueue(array $ips) + { + \shuffle($ips); + $this->ipsCount += \count($ips); + $connectQueueStash = $this->connectQueue; + $this->connectQueue = array(); + while (\count($connectQueueStash) > 0 || \count($ips) > 0) { + if (\count($ips) > 0) { + $this->connectQueue[] = \array_shift($ips); + } + if (\count($connectQueueStash) > 0) { + $this->connectQueue[] = \array_shift($connectQueueStash); + } + } + } + + /** + * @internal + * @return string + */ + public function error() + { + if ($this->lastError4 === $this->lastError6) { + $message = $this->lastError6; + } elseif ($this->lastErrorFamily === 6) { + $message = 'Last error for IPv6: ' . $this->lastError6 . '. Previous error for IPv4: ' . $this->lastError4; + } else { + $message = 'Last error for IPv4: ' . $this->lastError4 . '. Previous error for IPv6: ' . $this->lastError6; + } + + if ($this->hasBeenResolved() && $this->ipsCount === 0) { + if ($this->lastError6 === $this->lastError4) { + $message = ' during DNS lookup: ' . $this->lastError6; + } else { + $message = ' during DNS lookup. ' . $message; + } + } else { + $message = ': ' . $message; + } + + return 'Connection to ' . $this->uri . ' failed' . $message; + } +} diff --git a/vendor/react/socket/src/HappyEyeBallsConnector.php b/vendor/react/socket/src/HappyEyeBallsConnector.php new file mode 100644 index 000000000..a5511ac9e --- /dev/null +++ b/vendor/react/socket/src/HappyEyeBallsConnector.php @@ -0,0 +1,80 @@ +loop = $loop ?: Loop::get(); + $this->connector = $connector; + $this->resolver = $resolver; + } + + public function connect($uri) + { + $original = $uri; + if (\strpos($uri, '://') === false) { + $uri = 'tcp://' . $uri; + $parts = \parse_url($uri); + if (isset($parts['scheme'])) { + unset($parts['scheme']); + } + } else { + $parts = \parse_url($uri); + } + + if (!$parts || !isset($parts['host'])) { + return Promise\reject(new \InvalidArgumentException( + 'Given URI "' . $original . '" is invalid (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + )); + } + + $host = \trim($parts['host'], '[]'); + + // skip DNS lookup / URI manipulation if this URI already contains an IP + if (@\inet_pton($host) !== false) { + return $this->connector->connect($original); + } + + $builder = new HappyEyeBallsConnectionBuilder( + $this->loop, + $this->connector, + $this->resolver, + $uri, + $host, + $parts + ); + return $builder->connect(); + } +} diff --git a/vendor/react/socket/src/LimitingServer.php b/vendor/react/socket/src/LimitingServer.php new file mode 100644 index 000000000..d19000b36 --- /dev/null +++ b/vendor/react/socket/src/LimitingServer.php @@ -0,0 +1,203 @@ +on('connection', function (React\Socket\ConnectionInterface $connection) { + * $connection->write('hello there!' . PHP_EOL); + * … + * }); + * ``` + * + * See also the `ServerInterface` for more details. + * + * @see ServerInterface + * @see ConnectionInterface + */ +class LimitingServer extends EventEmitter implements ServerInterface +{ + private $connections = array(); + private $server; + private $limit; + + private $pauseOnLimit = false; + private $autoPaused = false; + private $manuPaused = false; + + /** + * Instantiates a new LimitingServer. + * + * You have to pass a maximum number of open connections to ensure + * the server will automatically reject (close) connections once this limit + * is exceeded. In this case, it will emit an `error` event to inform about + * this and no `connection` event will be emitted. + * + * ```php + * $server = new React\Socket\LimitingServer($server, 100); + * $server->on('connection', function (React\Socket\ConnectionInterface $connection) { + * $connection->write('hello there!' . PHP_EOL); + * … + * }); + * ``` + * + * You MAY pass a `null` limit in order to put no limit on the number of + * open connections and keep accepting new connection until you run out of + * operating system resources (such as open file handles). This may be + * useful if you do not want to take care of applying a limit but still want + * to use the `getConnections()` method. + * + * You can optionally configure the server to pause accepting new + * connections once the connection limit is reached. In this case, it will + * pause the underlying server and no longer process any new connections at + * all, thus also no longer closing any excessive connections. + * The underlying operating system is responsible for keeping a backlog of + * pending connections until its limit is reached, at which point it will + * start rejecting further connections. + * Once the server is below the connection limit, it will continue consuming + * connections from the backlog and will process any outstanding data on + * each connection. + * This mode may be useful for some protocols that are designed to wait for + * a response message (such as HTTP), but may be less useful for other + * protocols that demand immediate responses (such as a "welcome" message in + * an interactive chat). + * + * ```php + * $server = new React\Socket\LimitingServer($server, 100, true); + * $server->on('connection', function (React\Socket\ConnectionInterface $connection) { + * $connection->write('hello there!' . PHP_EOL); + * … + * }); + * ``` + * + * @param ServerInterface $server + * @param int|null $connectionLimit + * @param bool $pauseOnLimit + */ + public function __construct(ServerInterface $server, $connectionLimit, $pauseOnLimit = false) + { + $this->server = $server; + $this->limit = $connectionLimit; + if ($connectionLimit !== null) { + $this->pauseOnLimit = $pauseOnLimit; + } + + $this->server->on('connection', array($this, 'handleConnection')); + $this->server->on('error', array($this, 'handleError')); + } + + /** + * Returns an array with all currently active connections + * + * ```php + * foreach ($server->getConnection() as $connection) { + * $connection->write('Hi!'); + * } + * ``` + * + * @return ConnectionInterface[] + */ + public function getConnections() + { + return $this->connections; + } + + public function getAddress() + { + return $this->server->getAddress(); + } + + public function pause() + { + if (!$this->manuPaused) { + $this->manuPaused = true; + + if (!$this->autoPaused) { + $this->server->pause(); + } + } + } + + public function resume() + { + if ($this->manuPaused) { + $this->manuPaused = false; + + if (!$this->autoPaused) { + $this->server->resume(); + } + } + } + + public function close() + { + $this->server->close(); + } + + /** @internal */ + public function handleConnection(ConnectionInterface $connection) + { + // close connection if limit exceeded + if ($this->limit !== null && \count($this->connections) >= $this->limit) { + $this->handleError(new \OverflowException('Connection closed because server reached connection limit')); + $connection->close(); + return; + } + + $this->connections[] = $connection; + $that = $this; + $connection->on('close', function () use ($that, $connection) { + $that->handleDisconnection($connection); + }); + + // pause accepting new connections if limit exceeded + if ($this->pauseOnLimit && !$this->autoPaused && \count($this->connections) >= $this->limit) { + $this->autoPaused = true; + + if (!$this->manuPaused) { + $this->server->pause(); + } + } + + $this->emit('connection', array($connection)); + } + + /** @internal */ + public function handleDisconnection(ConnectionInterface $connection) + { + unset($this->connections[\array_search($connection, $this->connections)]); + + // continue accepting new connection if below limit + if ($this->autoPaused && \count($this->connections) < $this->limit) { + $this->autoPaused = false; + + if (!$this->manuPaused) { + $this->server->resume(); + } + } + } + + /** @internal */ + public function handleError(\Exception $error) + { + $this->emit('error', array($error)); + } +} diff --git a/vendor/react/socket/src/SecureConnector.php b/vendor/react/socket/src/SecureConnector.php new file mode 100644 index 000000000..08255ac92 --- /dev/null +++ b/vendor/react/socket/src/SecureConnector.php @@ -0,0 +1,132 @@ +connector = $connector; + $this->streamEncryption = new StreamEncryption($loop ?: Loop::get(), false); + $this->context = $context; + } + + public function connect($uri) + { + if (!\function_exists('stream_socket_enable_crypto')) { + return Promise\reject(new \BadMethodCallException('Encryption not supported on your platform (HHVM < 3.8?)')); // @codeCoverageIgnore + } + + if (\strpos($uri, '://') === false) { + $uri = 'tls://' . $uri; + } + + $parts = \parse_url($uri); + if (!$parts || !isset($parts['scheme']) || $parts['scheme'] !== 'tls') { + return Promise\reject(new \InvalidArgumentException( + 'Given URI "' . $uri . '" is invalid (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + )); + } + + $context = $this->context; + $encryption = $this->streamEncryption; + $connected = false; + /** @var \React\Promise\PromiseInterface $promise */ + $promise = $this->connector->connect( + \str_replace('tls://', '', $uri) + )->then(function (ConnectionInterface $connection) use ($context, $encryption, $uri, &$promise, &$connected) { + // (unencrypted) TCP/IP connection succeeded + $connected = true; + + if (!$connection instanceof Connection) { + $connection->close(); + throw new \UnexpectedValueException('Base connector does not use internal Connection class exposing stream resource'); + } + + // set required SSL/TLS context options + foreach ($context as $name => $value) { + \stream_context_set_option($connection->stream, 'ssl', $name, $value); + } + + // try to enable encryption + return $promise = $encryption->enable($connection)->then(null, function ($error) use ($connection, $uri) { + // establishing encryption failed => close invalid connection and return error + $connection->close(); + + throw new \RuntimeException( + 'Connection to ' . $uri . ' failed during TLS handshake: ' . $error->getMessage(), + $error->getCode() + ); + }); + }, function (\Exception $e) use ($uri) { + if ($e instanceof \RuntimeException) { + $message = \preg_replace('/^Connection to [^ ]+/', '', $e->getMessage()); + $e = new \RuntimeException( + 'Connection to ' . $uri . $message, + $e->getCode(), + $e + ); + + // avoid garbage references by replacing all closures in call stack. + // what a lovely piece of code! + $r = new \ReflectionProperty('Exception', 'trace'); + $r->setAccessible(true); + $trace = $r->getValue($e); + + // Exception trace arguments are not available on some PHP 7.4 installs + // @codeCoverageIgnoreStart + foreach ($trace as $ti => $one) { + if (isset($one['args'])) { + foreach ($one['args'] as $ai => $arg) { + if ($arg instanceof \Closure) { + $trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')'; + } + } + } + } + // @codeCoverageIgnoreEnd + $r->setValue($e, $trace); + } + + throw $e; + }); + + return new \React\Promise\Promise( + function ($resolve, $reject) use ($promise) { + $promise->then($resolve, $reject); + }, + function ($_, $reject) use (&$promise, $uri, &$connected) { + if ($connected) { + $reject(new \RuntimeException( + 'Connection to ' . $uri . ' cancelled during TLS handshake (ECONNABORTED)', + \defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103 + )); + } + + $promise->cancel(); + $promise = null; + } + ); + } +} diff --git a/vendor/react/socket/src/SecureServer.php b/vendor/react/socket/src/SecureServer.php new file mode 100644 index 000000000..5a202d27b --- /dev/null +++ b/vendor/react/socket/src/SecureServer.php @@ -0,0 +1,210 @@ +on('connection', function (React\Socket\ConnectionInterface $connection) { + * echo 'Secure connection from' . $connection->getRemoteAddress() . PHP_EOL; + * + * $connection->write('hello there!' . PHP_EOL); + * … + * }); + * ``` + * + * Whenever a client fails to perform a successful TLS handshake, it will emit an + * `error` event and then close the underlying TCP/IP connection: + * + * ```php + * $server->on('error', function (Exception $e) { + * echo 'Error' . $e->getMessage() . PHP_EOL; + * }); + * ``` + * + * See also the `ServerInterface` for more details. + * + * Note that the `SecureServer` class is a concrete implementation for TLS sockets. + * If you want to typehint in your higher-level protocol implementation, you SHOULD + * use the generic `ServerInterface` instead. + * + * @see ServerInterface + * @see ConnectionInterface + */ +final class SecureServer extends EventEmitter implements ServerInterface +{ + private $tcp; + private $encryption; + private $context; + + /** + * Creates a secure TLS server and starts waiting for incoming connections + * + * It does so by wrapping a `TcpServer` instance which waits for plaintext + * TCP/IP connections and then performs a TLS handshake for each connection. + * It thus requires valid [TLS context options], + * which in its most basic form may look something like this if you're using a + * PEM encoded certificate file: + * + * ```php + * $server = new React\Socket\TcpServer(8000); + * $server = new React\Socket\SecureServer($server, null, array( + * 'local_cert' => 'server.pem' + * )); + * ``` + * + * Note that the certificate file will not be loaded on instantiation but when an + * incoming connection initializes its TLS context. + * This implies that any invalid certificate file paths or contents will only cause + * an `error` event at a later time. + * + * If your private key is encrypted with a passphrase, you have to specify it + * like this: + * + * ```php + * $server = new React\Socket\TcpServer(8000); + * $server = new React\Socket\SecureServer($server, null, array( + * 'local_cert' => 'server.pem', + * 'passphrase' => 'secret' + * )); + * ``` + * + * Note that available [TLS context options], + * their defaults and effects of changing these may vary depending on your system + * and/or PHP version. + * Passing unknown context options has no effect. + * + * This class takes an optional `LoopInterface|null $loop` parameter that can be used to + * pass the event loop instance to use for this object. You can use a `null` value + * here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). + * This value SHOULD NOT be given unless you're sure you want to explicitly use a + * given event loop instance. + * + * Advanced usage: Despite allowing any `ServerInterface` as first parameter, + * you SHOULD pass a `TcpServer` instance as first parameter, unless you + * know what you're doing. + * Internally, the `SecureServer` has to set the required TLS context options on + * the underlying stream resources. + * These resources are not exposed through any of the interfaces defined in this + * package, but only through the internal `Connection` class. + * The `TcpServer` class is guaranteed to emit connections that implement + * the `ConnectionInterface` and uses the internal `Connection` class in order to + * expose these underlying resources. + * If you use a custom `ServerInterface` and its `connection` event does not + * meet this requirement, the `SecureServer` will emit an `error` event and + * then close the underlying connection. + * + * @param ServerInterface|TcpServer $tcp + * @param ?LoopInterface $loop + * @param array $context + * @throws BadMethodCallException for legacy HHVM < 3.8 due to lack of support + * @see TcpServer + * @link https://www.php.net/manual/en/context.ssl.php for TLS context options + */ + public function __construct(ServerInterface $tcp, $loop = null, array $context = array()) + { + if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); + } + + if (!\function_exists('stream_socket_enable_crypto')) { + throw new \BadMethodCallException('Encryption not supported on your platform (HHVM < 3.8?)'); // @codeCoverageIgnore + } + + // default to empty passphrase to suppress blocking passphrase prompt + $context += array( + 'passphrase' => '' + ); + + $this->tcp = $tcp; + $this->encryption = new StreamEncryption($loop ?: Loop::get()); + $this->context = $context; + + $that = $this; + $this->tcp->on('connection', function ($connection) use ($that) { + $that->handleConnection($connection); + }); + $this->tcp->on('error', function ($error) use ($that) { + $that->emit('error', array($error)); + }); + } + + public function getAddress() + { + $address = $this->tcp->getAddress(); + if ($address === null) { + return null; + } + + return \str_replace('tcp://' , 'tls://', $address); + } + + public function pause() + { + $this->tcp->pause(); + } + + public function resume() + { + $this->tcp->resume(); + } + + public function close() + { + return $this->tcp->close(); + } + + /** @internal */ + public function handleConnection(ConnectionInterface $connection) + { + if (!$connection instanceof Connection) { + $this->emit('error', array(new \UnexpectedValueException('Base server does not use internal Connection class exposing stream resource'))); + $connection->close(); + return; + } + + foreach ($this->context as $name => $value) { + \stream_context_set_option($connection->stream, 'ssl', $name, $value); + } + + // get remote address before starting TLS handshake in case connection closes during handshake + $remote = $connection->getRemoteAddress(); + $that = $this; + + $this->encryption->enable($connection)->then( + function ($conn) use ($that) { + $that->emit('connection', array($conn)); + }, + function ($error) use ($that, $connection, $remote) { + $error = new \RuntimeException( + 'Connection from ' . $remote . ' failed during TLS handshake: ' . $error->getMessage(), + $error->getCode() + ); + + $that->emit('error', array($error)); + $connection->close(); + } + ); + } +} diff --git a/vendor/react/socket/src/Server.php b/vendor/react/socket/src/Server.php new file mode 100644 index 000000000..b24c55648 --- /dev/null +++ b/vendor/react/socket/src/Server.php @@ -0,0 +1,118 @@ + $context); + } + + // apply default options if not explicitly given + $context += array( + 'tcp' => array(), + 'tls' => array(), + 'unix' => array() + ); + + $scheme = 'tcp'; + $pos = \strpos($uri, '://'); + if ($pos !== false) { + $scheme = \substr($uri, 0, $pos); + } + + if ($scheme === 'unix') { + $server = new UnixServer($uri, $loop, $context['unix']); + } else { + $server = new TcpServer(str_replace('tls://', '', $uri), $loop, $context['tcp']); + + if ($scheme === 'tls') { + $server = new SecureServer($server, $loop, $context['tls']); + } + } + + $this->server = $server; + + $that = $this; + $server->on('connection', function (ConnectionInterface $conn) use ($that) { + $that->emit('connection', array($conn)); + }); + $server->on('error', function (Exception $error) use ($that) { + $that->emit('error', array($error)); + }); + } + + public function getAddress() + { + return $this->server->getAddress(); + } + + public function pause() + { + $this->server->pause(); + } + + public function resume() + { + $this->server->resume(); + } + + public function close() + { + $this->server->close(); + } +} diff --git a/vendor/react/socket/src/ServerInterface.php b/vendor/react/socket/src/ServerInterface.php new file mode 100644 index 000000000..aa79fa17e --- /dev/null +++ b/vendor/react/socket/src/ServerInterface.php @@ -0,0 +1,151 @@ +on('connection', function (React\Socket\ConnectionInterface $connection) { + * echo 'new connection' . PHP_EOL; + * }); + * ``` + * + * See also the `ConnectionInterface` for more details about handling the + * incoming connection. + * + * error event: + * The `error` event will be emitted whenever there's an error accepting a new + * connection from a client. + * + * ```php + * $socket->on('error', function (Exception $e) { + * echo 'error: ' . $e->getMessage() . PHP_EOL; + * }); + * ``` + * + * Note that this is not a fatal error event, i.e. the server keeps listening for + * new connections even after this event. + * + * @see ConnectionInterface + */ +interface ServerInterface extends EventEmitterInterface +{ + /** + * Returns the full address (URI) this server is currently listening on + * + * ```php + * $address = $socket->getAddress(); + * echo 'Server listening on ' . $address . PHP_EOL; + * ``` + * + * If the address can not be determined or is unknown at this time (such as + * after the socket has been closed), it MAY return a `NULL` value instead. + * + * Otherwise, it will return the full address (URI) as a string value, such + * as `tcp://127.0.0.1:8080`, `tcp://[::1]:80` or `tls://127.0.0.1:443`. + * Note that individual URI components are application specific and depend + * on the underlying transport protocol. + * + * If this is a TCP/IP based server and you only want the local port, you may + * use something like this: + * + * ```php + * $address = $socket->getAddress(); + * $port = parse_url($address, PHP_URL_PORT); + * echo 'Server listening on port ' . $port . PHP_EOL; + * ``` + * + * @return ?string the full listening address (URI) or NULL if it is unknown (not applicable to this server socket or already closed) + */ + public function getAddress(); + + /** + * Pauses accepting new incoming connections. + * + * Removes the socket resource from the EventLoop and thus stop accepting + * new connections. Note that the listening socket stays active and is not + * closed. + * + * This means that new incoming connections will stay pending in the + * operating system backlog until its configurable backlog is filled. + * Once the backlog is filled, the operating system may reject further + * incoming connections until the backlog is drained again by resuming + * to accept new connections. + * + * Once the server is paused, no futher `connection` events SHOULD + * be emitted. + * + * ```php + * $socket->pause(); + * + * $socket->on('connection', assertShouldNeverCalled()); + * ``` + * + * This method is advisory-only, though generally not recommended, the + * server MAY continue emitting `connection` events. + * + * Unless otherwise noted, a successfully opened server SHOULD NOT start + * in paused state. + * + * You can continue processing events by calling `resume()` again. + * + * Note that both methods can be called any number of times, in particular + * calling `pause()` more than once SHOULD NOT have any effect. + * Similarly, calling this after `close()` is a NO-OP. + * + * @see self::resume() + * @return void + */ + public function pause(); + + /** + * Resumes accepting new incoming connections. + * + * Re-attach the socket resource to the EventLoop after a previous `pause()`. + * + * ```php + * $socket->pause(); + * + * Loop::addTimer(1.0, function () use ($socket) { + * $socket->resume(); + * }); + * ``` + * + * Note that both methods can be called any number of times, in particular + * calling `resume()` without a prior `pause()` SHOULD NOT have any effect. + * Similarly, calling this after `close()` is a NO-OP. + * + * @see self::pause() + * @return void + */ + public function resume(); + + /** + * Shuts down this listening socket + * + * This will stop listening for new incoming connections on this socket. + * + * Calling this method more than once on the same instance is a NO-OP. + * + * @return void + */ + public function close(); +} diff --git a/vendor/react/socket/src/SocketServer.php b/vendor/react/socket/src/SocketServer.php new file mode 100644 index 000000000..e987f5f6a --- /dev/null +++ b/vendor/react/socket/src/SocketServer.php @@ -0,0 +1,215 @@ + array(), + 'tls' => array(), + 'unix' => array() + ); + + $scheme = 'tcp'; + $pos = \strpos($uri, '://'); + if ($pos !== false) { + $scheme = \substr($uri, 0, $pos); + } + + if ($scheme === 'unix') { + $server = new UnixServer($uri, $loop, $context['unix']); + } elseif ($scheme === 'php') { + $server = new FdServer($uri, $loop); + } else { + if (preg_match('#^(?:\w+://)?\d+$#', $uri)) { + throw new \InvalidArgumentException( + 'Invalid URI given (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + ); + } + + $server = new TcpServer(str_replace('tls://', '', $uri), $loop, $context['tcp']); + + if ($scheme === 'tls') { + $server = new SecureServer($server, $loop, $context['tls']); + } + } + + $this->server = $server; + + $that = $this; + $server->on('connection', function (ConnectionInterface $conn) use ($that) { + $that->emit('connection', array($conn)); + }); + $server->on('error', function (\Exception $error) use ($that) { + $that->emit('error', array($error)); + }); + } + + public function getAddress() + { + return $this->server->getAddress(); + } + + public function pause() + { + $this->server->pause(); + } + + public function resume() + { + $this->server->resume(); + } + + public function close() + { + $this->server->close(); + } + + /** + * [internal] Internal helper method to accept new connection from given server socket + * + * @param resource $socket server socket to accept connection from + * @return resource new client socket if any + * @throws \RuntimeException if accepting fails + * @internal + */ + public static function accept($socket) + { + $errno = 0; + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { + // Match errstr from PHP's warning message. + // stream_socket_accept(): accept failed: Connection timed out + $errstr = \preg_replace('#.*: #', '', $error); + $errno = SocketServer::errno($errstr); + }); + + $newSocket = \stream_socket_accept($socket, 0); + + \restore_error_handler(); + + if (false === $newSocket) { + throw new \RuntimeException( + 'Unable to accept new connection: ' . $errstr . self::errconst($errno), + $errno + ); + } + + return $newSocket; + } + + /** + * [Internal] Returns errno value for given errstr + * + * The errno and errstr values describes the type of error that has been + * encountered. This method tries to look up the given errstr and find a + * matching errno value which can be useful to provide more context to error + * messages. It goes through the list of known errno constants when either + * `ext-sockets`, `ext-posix` or `ext-pcntl` is available to find an errno + * matching the given errstr. + * + * @param string $errstr + * @return int errno value (e.g. value of `SOCKET_ECONNREFUSED`) or 0 if not found + * @internal + * @copyright Copyright (c) 2023 Christian Lück, taken from https://github.com/clue/errno with permission + * @codeCoverageIgnore + */ + public static function errno($errstr) + { + // PHP defines the required `strerror()` function through either `ext-sockets`, `ext-posix` or `ext-pcntl` + $strerror = \function_exists('socket_strerror') ? 'socket_strerror' : (\function_exists('posix_strerror') ? 'posix_strerror' : (\function_exists('pcntl_strerror') ? 'pcntl_strerror' : null)); + if ($strerror !== null) { + assert(\is_string($strerror) && \is_callable($strerror)); + + // PHP defines most useful errno constants like `ECONNREFUSED` through constants in `ext-sockets` like `SOCKET_ECONNREFUSED` + // PHP also defines a hand full of errno constants like `EMFILE` through constants in `ext-pcntl` like `PCNTL_EMFILE` + // go through list of all defined constants like `SOCKET_E*` and `PCNTL_E*` and see if they match the given `$errstr` + foreach (\get_defined_constants(false) as $name => $value) { + if (\is_int($value) && (\strpos($name, 'SOCKET_E') === 0 || \strpos($name, 'PCNTL_E') === 0) && $strerror($value) === $errstr) { + return $value; + } + } + + // if we reach this, no matching errno constant could be found (unlikely when `ext-sockets` is available) + // go through list of all possible errno values from 1 to `MAX_ERRNO` and see if they match the given `$errstr` + for ($errno = 1, $max = \defined('MAX_ERRNO') ? \MAX_ERRNO : 4095; $errno <= $max; ++$errno) { + if ($strerror($errno) === $errstr) { + return $errno; + } + } + } + + // if we reach this, no matching errno value could be found (unlikely when either `ext-sockets`, `ext-posix` or `ext-pcntl` is available) + return 0; + } + + /** + * [Internal] Returns errno constant name for given errno value + * + * The errno value describes the type of error that has been encountered. + * This method tries to look up the given errno value and find a matching + * errno constant name which can be useful to provide more context and more + * descriptive error messages. It goes through the list of known errno + * constants when either `ext-sockets` or `ext-pcntl` is available to find + * the matching errno constant name. + * + * Because this method is used to append more context to error messages, the + * constant name will be prefixed with a space and put between parenthesis + * when found. + * + * @param int $errno + * @return string e.g. ` (ECONNREFUSED)` or empty string if no matching const for the given errno could be found + * @internal + * @copyright Copyright (c) 2023 Christian Lück, taken from https://github.com/clue/errno with permission + * @codeCoverageIgnore + */ + public static function errconst($errno) + { + // PHP defines most useful errno constants like `ECONNREFUSED` through constants in `ext-sockets` like `SOCKET_ECONNREFUSED` + // PHP also defines a hand full of errno constants like `EMFILE` through constants in `ext-pcntl` like `PCNTL_EMFILE` + // go through list of all defined constants like `SOCKET_E*` and `PCNTL_E*` and see if they match the given `$errno` + foreach (\get_defined_constants(false) as $name => $value) { + if ($value === $errno && (\strpos($name, 'SOCKET_E') === 0 || \strpos($name, 'PCNTL_E') === 0)) { + return ' (' . \substr($name, \strpos($name, '_') + 1) . ')'; + } + } + + // if we reach this, no matching errno constant could be found (unlikely when `ext-sockets` is available) + return ''; + } +} diff --git a/vendor/react/socket/src/StreamEncryption.php b/vendor/react/socket/src/StreamEncryption.php new file mode 100644 index 000000000..f91a3597e --- /dev/null +++ b/vendor/react/socket/src/StreamEncryption.php @@ -0,0 +1,158 @@ +loop = $loop; + $this->server = $server; + + // support TLSv1.0+ by default and exclude legacy SSLv2/SSLv3. + // As of PHP 7.2+ the main crypto method constant includes all TLS versions. + // As of PHP 5.6+ the crypto method is a bitmask, so we explicitly include all TLS versions. + // For legacy PHP < 5.6 the crypto method is a single value only and this constant includes all TLS versions. + // @link https://3v4l.org/9PSST + if ($server) { + $this->method = \STREAM_CRYPTO_METHOD_TLS_SERVER; + + if (\PHP_VERSION_ID < 70200 && \PHP_VERSION_ID >= 50600) { + $this->method |= \STREAM_CRYPTO_METHOD_TLSv1_0_SERVER | \STREAM_CRYPTO_METHOD_TLSv1_1_SERVER | \STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; // @codeCoverageIgnore + } + } else { + $this->method = \STREAM_CRYPTO_METHOD_TLS_CLIENT; + + if (\PHP_VERSION_ID < 70200 && \PHP_VERSION_ID >= 50600) { + $this->method |= \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; // @codeCoverageIgnore + } + } + } + + /** + * @param Connection $stream + * @return \React\Promise\PromiseInterface + */ + public function enable(Connection $stream) + { + return $this->toggle($stream, true); + } + + /** + * @param Connection $stream + * @param bool $toggle + * @return \React\Promise\PromiseInterface + */ + public function toggle(Connection $stream, $toggle) + { + // pause actual stream instance to continue operation on raw stream socket + $stream->pause(); + + // TODO: add write() event to make sure we're not sending any excessive data + + // cancelling this leaves this stream in an inconsistent state… + $deferred = new Deferred(function () { + throw new \RuntimeException(); + }); + + // get actual stream socket from stream instance + $socket = $stream->stream; + + // get crypto method from context options or use global setting from constructor + $method = $this->method; + $context = \stream_context_get_options($socket); + if (isset($context['ssl']['crypto_method'])) { + $method = $context['ssl']['crypto_method']; + } + + $that = $this; + $toggleCrypto = function () use ($socket, $deferred, $toggle, $method, $that) { + $that->toggleCrypto($socket, $deferred, $toggle, $method); + }; + + $this->loop->addReadStream($socket, $toggleCrypto); + + if (!$this->server) { + $toggleCrypto(); + } + + $loop = $this->loop; + + return $deferred->promise()->then(function () use ($stream, $socket, $loop, $toggle) { + $loop->removeReadStream($socket); + + $stream->encryptionEnabled = $toggle; + $stream->resume(); + + return $stream; + }, function($error) use ($stream, $socket, $loop) { + $loop->removeReadStream($socket); + $stream->resume(); + throw $error; + }); + } + + /** + * @internal + * @param resource $socket + * @param Deferred $deferred + * @param bool $toggle + * @param int $method + * @return void + */ + public function toggleCrypto($socket, Deferred $deferred, $toggle, $method) + { + $error = null; + \set_error_handler(function ($_, $errstr) use (&$error) { + $error = \str_replace(array("\r", "\n"), ' ', $errstr); + + // remove useless function name from error message + if (($pos = \strpos($error, "): ")) !== false) { + $error = \substr($error, $pos + 3); + } + }); + + $result = \stream_socket_enable_crypto($socket, $toggle, $method); + + \restore_error_handler(); + + if (true === $result) { + $deferred->resolve(null); + } else if (false === $result) { + // overwrite callback arguments for PHP7+ only, so they do not show + // up in the Exception trace and do not cause a possible cyclic reference. + $d = $deferred; + $deferred = null; + + if (\feof($socket) || $error === null) { + // EOF or failed without error => connection closed during handshake + $d->reject(new \UnexpectedValueException( + 'Connection lost during TLS handshake (ECONNRESET)', + \defined('SOCKET_ECONNRESET') ? \SOCKET_ECONNRESET : 104 + )); + } else { + // handshake failed with error message + $d->reject(new \UnexpectedValueException( + $error + )); + } + } else { + // need more data, will retry + } + } +} diff --git a/vendor/react/socket/src/TcpConnector.php b/vendor/react/socket/src/TcpConnector.php new file mode 100644 index 000000000..9d2599e81 --- /dev/null +++ b/vendor/react/socket/src/TcpConnector.php @@ -0,0 +1,173 @@ +loop = $loop ?: Loop::get(); + $this->context = $context; + } + + public function connect($uri) + { + if (\strpos($uri, '://') === false) { + $uri = 'tcp://' . $uri; + } + + $parts = \parse_url($uri); + if (!$parts || !isset($parts['scheme'], $parts['host'], $parts['port']) || $parts['scheme'] !== 'tcp') { + return Promise\reject(new \InvalidArgumentException( + 'Given URI "' . $uri . '" is invalid (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + )); + } + + $ip = \trim($parts['host'], '[]'); + if (@\inet_pton($ip) === false) { + return Promise\reject(new \InvalidArgumentException( + 'Given URI "' . $uri . '" does not contain a valid host IP (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + )); + } + + // use context given in constructor + $context = array( + 'socket' => $this->context + ); + + // parse arguments from query component of URI + $args = array(); + if (isset($parts['query'])) { + \parse_str($parts['query'], $args); + } + + // If an original hostname has been given, use this for TLS setup. + // This can happen due to layers of nested connectors, such as a + // DnsConnector reporting its original hostname. + // These context options are here in case TLS is enabled later on this stream. + // If TLS is not enabled later, this doesn't hurt either. + if (isset($args['hostname'])) { + $context['ssl'] = array( + 'SNI_enabled' => true, + 'peer_name' => $args['hostname'] + ); + + // Legacy PHP < 5.6 ignores peer_name and requires legacy context options instead. + // The SNI_server_name context option has to be set here during construction, + // as legacy PHP ignores any values set later. + // @codeCoverageIgnoreStart + if (\PHP_VERSION_ID < 50600) { + $context['ssl'] += array( + 'SNI_server_name' => $args['hostname'], + 'CN_match' => $args['hostname'] + ); + } + // @codeCoverageIgnoreEnd + } + + // latest versions of PHP no longer accept any other URI components and + // HHVM fails to parse URIs with a query but no path, so let's simplify our URI here + $remote = 'tcp://' . $parts['host'] . ':' . $parts['port']; + + $stream = @\stream_socket_client( + $remote, + $errno, + $errstr, + 0, + \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT, + \stream_context_create($context) + ); + + if (false === $stream) { + return Promise\reject(new \RuntimeException( + 'Connection to ' . $uri . ' failed: ' . $errstr . SocketServer::errconst($errno), + $errno + )); + } + + // wait for connection + $loop = $this->loop; + return new Promise\Promise(function ($resolve, $reject) use ($loop, $stream, $uri) { + $loop->addWriteStream($stream, function ($stream) use ($loop, $resolve, $reject, $uri) { + $loop->removeWriteStream($stream); + + // The following hack looks like the only way to + // detect connection refused errors with PHP's stream sockets. + if (false === \stream_socket_get_name($stream, true)) { + // If we reach this point, we know the connection is dead, but we don't know the underlying error condition. + // @codeCoverageIgnoreStart + if (\function_exists('socket_import_stream')) { + // actual socket errno and errstr can be retrieved with ext-sockets on PHP 5.4+ + $socket = \socket_import_stream($stream); + $errno = \socket_get_option($socket, \SOL_SOCKET, \SO_ERROR); + $errstr = \socket_strerror($errno); + } elseif (\PHP_OS === 'Linux') { + // Linux reports socket errno and errstr again when trying to write to the dead socket. + // Suppress error reporting to get error message below and close dead socket before rejecting. + // This is only known to work on Linux, Mac and Windows are known to not support this. + $errno = 0; + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { + // Match errstr from PHP's warning message. + // fwrite(): send of 1 bytes failed with errno=111 Connection refused + \preg_match('/errno=(\d+) (.+)/', $error, $m); + $errno = isset($m[1]) ? (int) $m[1] : 0; + $errstr = isset($m[2]) ? $m[2] : $error; + }); + + \fwrite($stream, \PHP_EOL); + + \restore_error_handler(); + } else { + // Not on Linux and ext-sockets not available? Too bad. + $errno = \defined('SOCKET_ECONNREFUSED') ? \SOCKET_ECONNREFUSED : 111; + $errstr = 'Connection refused?'; + } + // @codeCoverageIgnoreEnd + + \fclose($stream); + $reject(new \RuntimeException( + 'Connection to ' . $uri . ' failed: ' . $errstr . SocketServer::errconst($errno), + $errno + )); + } else { + $resolve(new Connection($stream, $loop)); + } + }); + }, function () use ($loop, $stream, $uri) { + $loop->removeWriteStream($stream); + \fclose($stream); + + // @codeCoverageIgnoreStart + // legacy PHP 5.3 sometimes requires a second close call (see tests) + if (\PHP_VERSION_ID < 50400 && \is_resource($stream)) { + \fclose($stream); + } + // @codeCoverageIgnoreEnd + + throw new \RuntimeException( + 'Connection to ' . $uri . ' cancelled during TCP/IP handshake (ECONNABORTED)', + \defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103 + ); + }); + } +} diff --git a/vendor/react/socket/src/TcpServer.php b/vendor/react/socket/src/TcpServer.php new file mode 100644 index 000000000..01b2b46dc --- /dev/null +++ b/vendor/react/socket/src/TcpServer.php @@ -0,0 +1,262 @@ +on('connection', function (React\Socket\ConnectionInterface $connection) { + * echo 'Plaintext connection from ' . $connection->getRemoteAddress() . PHP_EOL; + * $connection->write('hello there!' . PHP_EOL); + * … + * }); + * ``` + * + * See also the `ServerInterface` for more details. + * + * @see ServerInterface + * @see ConnectionInterface + */ +final class TcpServer extends EventEmitter implements ServerInterface +{ + private $master; + private $loop; + private $listening = false; + + /** + * Creates a plaintext TCP/IP socket server and starts listening on the given address + * + * This starts accepting new incoming connections on the given address. + * See also the `connection event` documented in the `ServerInterface` + * for more details. + * + * ```php + * $server = new React\Socket\TcpServer(8080); + * ``` + * + * As above, the `$uri` parameter can consist of only a port, in which case the + * server will default to listening on the localhost address `127.0.0.1`, + * which means it will not be reachable from outside of this system. + * + * In order to use a random port assignment, you can use the port `0`: + * + * ```php + * $server = new React\Socket\TcpServer(0); + * $address = $server->getAddress(); + * ``` + * + * In order to change the host the socket is listening on, you can provide an IP + * address through the first parameter provided to the constructor, optionally + * preceded by the `tcp://` scheme: + * + * ```php + * $server = new React\Socket\TcpServer('192.168.0.1:8080'); + * ``` + * + * If you want to listen on an IPv6 address, you MUST enclose the host in square + * brackets: + * + * ```php + * $server = new React\Socket\TcpServer('[::1]:8080'); + * ``` + * + * If the given URI is invalid, does not contain a port, any other scheme or if it + * contains a hostname, it will throw an `InvalidArgumentException`: + * + * ```php + * // throws InvalidArgumentException due to missing port + * $server = new React\Socket\TcpServer('127.0.0.1'); + * ``` + * + * If the given URI appears to be valid, but listening on it fails (such as if port + * is already in use or port below 1024 may require root access etc.), it will + * throw a `RuntimeException`: + * + * ```php + * $first = new React\Socket\TcpServer(8080); + * + * // throws RuntimeException because port is already in use + * $second = new React\Socket\TcpServer(8080); + * ``` + * + * Note that these error conditions may vary depending on your system and/or + * configuration. + * See the exception message and code for more details about the actual error + * condition. + * + * This class takes an optional `LoopInterface|null $loop` parameter that can be used to + * pass the event loop instance to use for this object. You can use a `null` value + * here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). + * This value SHOULD NOT be given unless you're sure you want to explicitly use a + * given event loop instance. + * + * Optionally, you can specify [socket context options](https://www.php.net/manual/en/context.socket.php) + * for the underlying stream socket resource like this: + * + * ```php + * $server = new React\Socket\TcpServer('[::1]:8080', null, array( + * 'backlog' => 200, + * 'so_reuseport' => true, + * 'ipv6_v6only' => true + * )); + * ``` + * + * Note that available [socket context options](https://www.php.net/manual/en/context.socket.php), + * their defaults and effects of changing these may vary depending on your system + * and/or PHP version. + * Passing unknown context options has no effect. + * The `backlog` context option defaults to `511` unless given explicitly. + * + * @param string|int $uri + * @param ?LoopInterface $loop + * @param array $context + * @throws InvalidArgumentException if the listening address is invalid + * @throws RuntimeException if listening on this address fails (already in use etc.) + */ + public function __construct($uri, $loop = null, array $context = array()) + { + if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 + throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); + } + + $this->loop = $loop ?: Loop::get(); + + // a single port has been given => assume localhost + if ((string)(int)$uri === (string)$uri) { + $uri = '127.0.0.1:' . $uri; + } + + // assume default scheme if none has been given + if (\strpos($uri, '://') === false) { + $uri = 'tcp://' . $uri; + } + + // parse_url() does not accept null ports (random port assignment) => manually remove + if (\substr($uri, -2) === ':0') { + $parts = \parse_url(\substr($uri, 0, -2)); + if ($parts) { + $parts['port'] = 0; + } + } else { + $parts = \parse_url($uri); + } + + // ensure URI contains TCP scheme, host and port + if (!$parts || !isset($parts['scheme'], $parts['host'], $parts['port']) || $parts['scheme'] !== 'tcp') { + throw new \InvalidArgumentException( + 'Invalid URI "' . $uri . '" given (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + ); + } + + if (@\inet_pton(\trim($parts['host'], '[]')) === false) { + throw new \InvalidArgumentException( + 'Given URI "' . $uri . '" does not contain a valid host IP (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + ); + } + + $this->master = @\stream_socket_server( + $uri, + $errno, + $errstr, + \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN, + \stream_context_create(array('socket' => $context + array('backlog' => 511))) + ); + if (false === $this->master) { + if ($errno === 0) { + // PHP does not seem to report errno, so match errno from errstr + // @link https://3v4l.org/3qOBl + $errno = SocketServer::errno($errstr); + } + + throw new \RuntimeException( + 'Failed to listen on "' . $uri . '": ' . $errstr . SocketServer::errconst($errno), + $errno + ); + } + \stream_set_blocking($this->master, false); + + $this->resume(); + } + + public function getAddress() + { + if (!\is_resource($this->master)) { + return null; + } + + $address = \stream_socket_get_name($this->master, false); + + // check if this is an IPv6 address which includes multiple colons but no square brackets + $pos = \strrpos($address, ':'); + if ($pos !== false && \strpos($address, ':') < $pos && \substr($address, 0, 1) !== '[') { + $address = '[' . \substr($address, 0, $pos) . ']:' . \substr($address, $pos + 1); // @codeCoverageIgnore + } + + return 'tcp://' . $address; + } + + public function pause() + { + if (!$this->listening) { + return; + } + + $this->loop->removeReadStream($this->master); + $this->listening = false; + } + + public function resume() + { + if ($this->listening || !\is_resource($this->master)) { + return; + } + + $that = $this; + $this->loop->addReadStream($this->master, function ($master) use ($that) { + try { + $newSocket = SocketServer::accept($master); + } catch (\RuntimeException $e) { + $that->emit('error', array($e)); + return; + } + $that->handleConnection($newSocket); + }); + $this->listening = true; + } + + public function close() + { + if (!\is_resource($this->master)) { + return; + } + + $this->pause(); + \fclose($this->master); + $this->removeAllListeners(); + } + + /** @internal */ + public function handleConnection($socket) + { + $this->emit('connection', array( + new Connection($socket, $this->loop) + )); + } +} diff --git a/vendor/react/socket/src/TimeoutConnector.php b/vendor/react/socket/src/TimeoutConnector.php new file mode 100644 index 000000000..9ef252f7d --- /dev/null +++ b/vendor/react/socket/src/TimeoutConnector.php @@ -0,0 +1,79 @@ +connector = $connector; + $this->timeout = $timeout; + $this->loop = $loop ?: Loop::get(); + } + + public function connect($uri) + { + $promise = $this->connector->connect($uri); + + $loop = $this->loop; + $time = $this->timeout; + return new Promise(function ($resolve, $reject) use ($loop, $time, $promise, $uri) { + $timer = null; + $promise = $promise->then(function ($v) use (&$timer, $loop, $resolve) { + if ($timer) { + $loop->cancelTimer($timer); + } + $timer = false; + $resolve($v); + }, function ($v) use (&$timer, $loop, $reject) { + if ($timer) { + $loop->cancelTimer($timer); + } + $timer = false; + $reject($v); + }); + + // promise already resolved => no need to start timer + if ($timer === false) { + return; + } + + // start timeout timer which will cancel the pending promise + $timer = $loop->addTimer($time, function () use ($time, &$promise, $reject, $uri) { + $reject(new \RuntimeException( + 'Connection to ' . $uri . ' timed out after ' . $time . ' seconds (ETIMEDOUT)', + \defined('SOCKET_ETIMEDOUT') ? \SOCKET_ETIMEDOUT : 110 + )); + + // Cancel pending connection to clean up any underlying resources and references. + // Avoid garbage references in call stack by passing pending promise by reference. + assert(\method_exists($promise, 'cancel')); + $promise->cancel(); + $promise = null; + }); + }, function () use (&$promise) { + // Cancelling this promise will cancel the pending connection, thus triggering the rejection logic above. + // Avoid garbage references in call stack by passing pending promise by reference. + assert(\method_exists($promise, 'cancel')); + $promise->cancel(); + $promise = null; + }); + } +} diff --git a/vendor/react/socket/src/UnixConnector.php b/vendor/react/socket/src/UnixConnector.php new file mode 100644 index 000000000..95f932cb0 --- /dev/null +++ b/vendor/react/socket/src/UnixConnector.php @@ -0,0 +1,58 @@ +loop = $loop ?: Loop::get(); + } + + public function connect($path) + { + if (\strpos($path, '://') === false) { + $path = 'unix://' . $path; + } elseif (\substr($path, 0, 7) !== 'unix://') { + return Promise\reject(new \InvalidArgumentException( + 'Given URI "' . $path . '" is invalid (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + )); + } + + $resource = @\stream_socket_client($path, $errno, $errstr, 1.0); + + if (!$resource) { + return Promise\reject(new \RuntimeException( + 'Unable to connect to unix domain socket "' . $path . '": ' . $errstr . SocketServer::errconst($errno), + $errno + )); + } + + $connection = new Connection($resource, $this->loop); + $connection->unix = true; + + return Promise\resolve($connection); + } +} diff --git a/vendor/react/socket/src/UnixServer.php b/vendor/react/socket/src/UnixServer.php new file mode 100644 index 000000000..27b014d15 --- /dev/null +++ b/vendor/react/socket/src/UnixServer.php @@ -0,0 +1,162 @@ +loop = $loop ?: Loop::get(); + + if (\strpos($path, '://') === false) { + $path = 'unix://' . $path; + } elseif (\substr($path, 0, 7) !== 'unix://') { + throw new \InvalidArgumentException( + 'Given URI "' . $path . '" is invalid (EINVAL)', + \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22) + ); + } + + $errno = 0; + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { + // PHP does not seem to report errno/errstr for Unix domain sockets (UDS) right now. + // This only applies to UDS server sockets, see also https://3v4l.org/NAhpr. + // Parse PHP warning message containing unknown error, HHVM reports proper info at least. + if (\preg_match('/\(([^\)]+)\)|\[(\d+)\]: (.*)/', $error, $match)) { + $errstr = isset($match[3]) ? $match['3'] : $match[1]; + $errno = isset($match[2]) ? (int)$match[2] : 0; + } + }); + + $this->master = \stream_socket_server( + $path, + $errno, + $errstr, + \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN, + \stream_context_create(array('socket' => $context)) + ); + + \restore_error_handler(); + + if (false === $this->master) { + throw new \RuntimeException( + 'Failed to listen on Unix domain socket "' . $path . '": ' . $errstr . SocketServer::errconst($errno), + $errno + ); + } + \stream_set_blocking($this->master, 0); + + $this->resume(); + } + + public function getAddress() + { + if (!\is_resource($this->master)) { + return null; + } + + return 'unix://' . \stream_socket_get_name($this->master, false); + } + + public function pause() + { + if (!$this->listening) { + return; + } + + $this->loop->removeReadStream($this->master); + $this->listening = false; + } + + public function resume() + { + if ($this->listening || !is_resource($this->master)) { + return; + } + + $that = $this; + $this->loop->addReadStream($this->master, function ($master) use ($that) { + try { + $newSocket = SocketServer::accept($master); + } catch (\RuntimeException $e) { + $that->emit('error', array($e)); + return; + } + $that->handleConnection($newSocket); + }); + $this->listening = true; + } + + public function close() + { + if (!\is_resource($this->master)) { + return; + } + + $this->pause(); + \fclose($this->master); + $this->removeAllListeners(); + } + + /** @internal */ + public function handleConnection($socket) + { + $connection = new Connection($socket, $this->loop); + $connection->unix = true; + + $this->emit('connection', array( + $connection + )); + } +} diff --git a/vendor/react/stream/CHANGELOG.md b/vendor/react/stream/CHANGELOG.md new file mode 100644 index 000000000..639db6585 --- /dev/null +++ b/vendor/react/stream/CHANGELOG.md @@ -0,0 +1,460 @@ +# Changelog + +## 1.4.0 (2024-06-11) + +* Feature: Improve PHP 8.4+ support by avoiding implicitly nullable type declarations. + (#179 by @clue) + +* Feature: Full PHP 8.3 compatibility. + (#172 by @clue) + +* Fix: Fix `drain` event of `ThroughStream` to handle potential race condition. + (#171 by @clue) + +## 1.3.0 (2023-06-16) + +* Feature: Full PHP 8.1 and PHP 8.2 compatibility. + (#160 by @SimonFrings, #165 by @clue and #169 by @WyriHaximus) + +* Feature: Avoid unneeded syscall when creating non-blocking `DuplexResourceStream`. + (#164 by @clue) + +* Minor documentation improvements. + (#161 by @mrsimonbennett, #162 by @SimonFrings and #166 by @nhedger) + +* Improve test suite and project setup and report failed assertions. + (#168 and #170 by @clue and #163 by @SimonFrings) + +## 1.2.0 (2021-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2021/announcing-reactphp-default-loop). + +* Feature: Simplify usage by supporting new [default loop](https://reactphp.org/event-loop/#loop). + (#159 by @clue) + + ```php + // old (still supported) + $stream = new ReadableResourceStream($resource, $loop); + $stream = new WritabeResourceStream($resource, $loop); + $stream = new DuplexResourceStream($resource, $loop); + + // new (using default loop) + $stream = new ReadableResourceStream($resource); + $stream = new WritabeResourceStream($resource); + $stream = new DuplexResourceStream($resource); + ``` + +* Improve test suite, use GitHub actions for continuous integration (CI), + update PHPUnit config, run tests on PHP 8 and add full core team to the license. + (#153, #156 and #157 by @SimonFrings and #154 by @WyriHaximus) + +## 1.1.1 (2020-05-04) + +* Fix: Fix faulty write buffer behavior when sending large data chunks over TLS (Mac OS X only). + (#150 by @clue) + +* Minor code style improvements to fix phpstan analysis warnings and + add `.gitattributes` to exclude dev files from exports. + (#140 by @flow-control and #144 by @reedy) + +* Improve test suite to run tests on PHP 7.4 and simplify test matrix. + (#147 by @clue) + +## 1.1.0 (2019-01-01) + +* Improvement: Increase performance by optimizing global function and constant look ups. + (#137 by @WyriHaximus) + +* Travis: Test against PHP 7.3. + (#138 by @WyriHaximus) + +* Fix: Ignore empty reads. + (#139 by @WyriHaximus) + +## 1.0.0 (2018-07-11) + +* First stable LTS release, now following [SemVer](https://semver.org/). + We'd like to emphasize that this component is production ready and battle-tested. + We plan to support all long-term support (LTS) releases for at least 24 months, + so you have a rock-solid foundation to build on top of. + +> Contains no other changes, so it's actually fully compatible with the v0.7.7 release. + +## 0.7.7 (2018-01-19) + +* Improve test suite by fixing forward compatibility with upcoming EventLoop + releases, avoid risky tests and add test group to skip integration tests + relying on internet connection and apply appropriate test timeouts. + (#128, #131 and #132 by @clue) + +## 0.7.6 (2017-12-21) + +* Fix: Work around reading from unbuffered pipe stream in legacy PHP < 5.4.28 and PHP < 5.5.12 + (#126 by @clue) + +* Improve test suite by simplifying test bootstrapping logic via Composer and + test against PHP 7.2 + (#127 by @clue and #124 by @carusogabriel) + +## 0.7.5 (2017-11-20) + +* Fix: Igore excessive `fopen()` mode flags for `WritableResourceStream` + (#119 by @clue) + +* Fix: Fix forward compatibility with upcoming EventLoop releases + (#121 by @clue) + +* Restructure examples to ease getting started + (#123 by @clue) + +* Improve test suite by adding forward compatibility with PHPUnit 6 and + ignore Mac OS X test failures for now until Travis tests work again + (#122 by @gabriel-caruso and #120 by @clue) + +## 0.7.4 (2017-10-11) + +* Fix: Remove event listeners from `CompositeStream` once closed and + remove undocumented left-over `close` event argument + (#116 by @clue) + +* Minor documentation improvements: Fix wrong class name in example, + fix typos in README and + fix forward compatibility with upcoming EventLoop releases in example + (#113 by @docteurklein and #114 and #115 by @clue) + +* Improve test suite by running against Mac OS X on Travis + (#112 by @clue) + +## 0.7.3 (2017-08-05) + +* Improvement: Support Événement 3.0 a long side 2.0 and 1.0 + (#108 by @WyriHaximus) + +* Readme: Corrected loop initialization in usage example + (#109 by @pulyavin) + +* Travis: Lock linux distribution preventing future builds from breaking + (#110 by @clue) + +## 0.7.2 (2017-06-15) + +* Bug fix: WritableResourceStream: Close the underlying stream when closing the stream. + (#107 by @WyriHaximus) + +## 0.7.1 (2017-05-20) + +* Feature: Add optional `$writeChunkSize` parameter to limit maximum number of + bytes to write at once. + (#105 by @clue) + + ```php + $stream = new WritableResourceStream(STDOUT, $loop, null, 8192); + ``` + +* Ignore HHVM test failures for now until Travis tests work again + (#106 by @clue) + +## 0.7.0 (2017-05-04) + +* Removed / BC break: Remove deprecated and unneeded functionality + (#45, #87, #90, #91 and #93 by @clue) + + * Remove deprecated `Stream` class, use `DuplexResourceStream` instead + (#87 by @clue) + + * Remove public `$buffer` property, use new constructor parameters instead + (#91 by @clue) + + * Remove public `$stream` property from all resource streams + (#90 by @clue) + + * Remove undocumented and now unused `ReadableStream` and `WritableStream` + (#93 by @clue) + + * Remove `BufferedSink` + (#45 by @clue) + +* Feature / BC break: Simplify `ThroughStream` by using data callback instead of + inheritance. It is now a direct implementation of `DuplexStreamInterface`. + (#88 and #89 by @clue) + + ```php + $through = new ThroughStream(function ($data) { + return json_encode($data) . PHP_EOL; + }); + $through->on('data', $this->expectCallableOnceWith("[2, true]\n")); + + $through->write(array(2, true)); + ``` + +* Feature / BC break: The `CompositeStream` starts closed if either side is + already closed and forwards pause to pipe source on first write attempt. + (#96 and #103 by @clue) + + If either side of the composite stream closes, it will also close the other + side. We now also ensure that if either side is already closed during + instantiation, it will also close the other side. + +* BC break: Mark all classes as `final` and + mark internal API as `private` to discourage inheritance + (#95 and #99 by @clue) + +* Feature / BC break: Only emit `error` event for fatal errors + (#92 by @clue) + + > The `error` event was previously also allowed to be emitted for non-fatal + errors, but our implementations actually only ever emitted this as a fatal + error and then closed the stream. + +* Feature: Explicitly allow custom events and exclude any semantics + (#97 by @clue) + +* Strict definition for event callback functions + (#101 by @clue) + +* Support legacy PHP 5.3 through PHP 7.1 and HHVM and improve usage documentation + (#100 and #102 by @clue) + +* Actually require all dependencies so this is self-contained and improve + forward compatibility with EventLoop v1.0 and v0.5 + (#94 and #98 by @clue) + +## 0.6.0 (2017-03-26) + +* Feature / Fix / BC break: Add `DuplexResourceStream` and deprecate `Stream` + (#85 by @clue) + + ```php + // old (does still work for BC reasons) + $stream = new Stream($connection, $loop); + + // new + $stream = new DuplexResourceStream($connection, $loop); + ``` + + Note that the `DuplexResourceStream` now rejects read-only or write-only + streams, so this may affect BC. If you want a read-only or write-only + resource, use `ReadableResourceStream` or `WritableResourceStream` instead of + `DuplexResourceStream`. + + > BC note: This class was previously called `Stream`. The `Stream` class still + exists for BC reasons and will be removed in future versions of this package. + +* Feature / BC break: Add `WritableResourceStream` (previously called `Buffer`) + (#84 by @clue) + + ```php + // old + $stream = new Buffer(STDOUT, $loop); + + // new + $stream = new WritableResourceStream(STDOUT, $loop); + ``` + +* Feature: Add `ReadableResourceStream` + (#83 by @clue) + + ```php + $stream = new ReadableResourceStream(STDIN, $loop); + ``` + +* Fix / BC Break: Enforce using non-blocking I/O + (#46 by @clue) + + > BC note: This is known to affect process pipes on Windows which do not + support non-blocking I/O and could thus block the whole EventLoop previously. + +* Feature / Fix / BC break: Consistent semantics for + `DuplexStreamInterface::end()` to ensure it SHOULD also end readable side + (#86 by @clue) + +* Fix: Do not use unbuffered reads on pipe streams for legacy PHP < 5.4 + (#80 by @clue) + +## 0.5.0 (2017-03-08) + +* Feature / BC break: Consistent `end` event semantics (EOF) + (#70 by @clue) + + The `end` event will now only be emitted for a *successful* end, not if the + stream closes due to an unrecoverable `error` event or if you call `close()` + explicitly. + If you want to detect when the stream closes (terminates), use the `close` + event instead. + +* BC break: Remove custom (undocumented) `full-drain` event from `Buffer` + (#63 and #68 by @clue) + + > The `full-drain` event was undocumented and mostly used internally. + Relying on this event has attracted some low-quality code in the past, so + we've removed this from the public API in order to work out a better + solution instead. + If you want to detect when the buffer finishes flushing data to the stream, + you may want to look into its `end()` method or the `close` event instead. + +* Feature / BC break: Consistent event semantics and documentation, + explicitly state *when* events will be emitted and *which* arguments they + receive. + (#73 and #69 by @clue) + + The documentation now explicitly defines each event and its arguments. + Custom events and event arguments are still supported. + Most notably, all defined events only receive inherently required event + arguments and no longer transmit the instance they are emitted on for + consistency and performance reasons. + + ```php + // old (inconsistent and not supported by all implementations) + $stream->on('data', function ($data, $stream) { + // process $data + }); + + // new (consistent throughout the whole ecosystem) + $stream->on('data', function ($data) use ($stream) { + // process $data + }); + ``` + + > This mostly adds documentation (and thus some stricter, consistent + definitions) for the existing behavior, it does NOT define any major + changes otherwise. + Most existing code should be compatible with these changes, unless + it relied on some undocumented/unintended semantics. + +* Feature / BC break: Consistent method semantics and documentation + (#72 by @clue) + + > This mostly adds documentation (and thus some stricter, consistent + definitions) for the existing behavior, it does NOT define any major + changes otherwise. + Most existing code should be compatible with these changes, unless + it relied on some undocumented/unintended semantics. + +* Feature: Consistent `pipe()` semantics for closed and closing streams + (#71 from @clue) + + The source stream will now always be paused via `pause()` when the + destination stream closes. Also, properly stop piping if the source + stream closes and remove all event forwarding. + +* Improve test suite by adding PHPUnit to `require-dev` and improving coverage. + (#74 and #75 by @clue, #66 by @nawarian) + +## 0.4.6 (2017-01-25) + +* Feature: The `Buffer` can now be injected into the `Stream` (or be used standalone) + (#62 by @clue) + +* Fix: Forward `close` event only once for `CompositeStream` and `ThroughStream` + (#60 by @clue) + +* Fix: Consistent `close` event behavior for `Buffer` + (#61 by @clue) + +## 0.4.5 (2016-11-13) + +* Feature: Support setting read buffer size to `null` (infinite) + (#42 by @clue) + +* Fix: Do not emit `full-drain` event if `Buffer` is closed during `drain` event + (#55 by @clue) + +* Vastly improved performance by factor of 10x to 20x. + Raise default buffer sizes to 64 KiB and simplify and improve error handling + and unneeded function calls. + (#53, #55, #56 by @clue) + +## 0.4.4 (2016-08-22) + +* Bug fix: Emit `error` event and close `Stream` when accessing the underlying + stream resource fails with a permanent error. + (#52 and #40 by @clue, #25 by @lysenkobv) + +* Bug fix: Do not emit empty `data` event if nothing has been read (stream reached EOF) + (#39 by @clue) + +* Bug fix: Ignore empty writes to `Buffer` + (#51 by @clue) + +* Add benchmarking script to measure throughput in CI + (#41 by @clue) + +## 0.4.3 (2015-10-07) + +* Bug fix: Read buffer to 0 fixes error with libevent and large quantity of I/O (@mbonneau) +* Bug fix: No double-write during drain call (@arnaud-lb) +* Bug fix: Support HHVM (@clue) +* Adjust compatibility to 5.3 (@clue) + +## 0.4.2 (2014-09-09) + +* Added DuplexStreamInterface +* Stream sets stream resources to non-blocking +* Fixed potential race condition in pipe + +## 0.4.1 (2014-04-13) + +* Bug fix: v0.3.4 changes merged for v0.4.1 + +## 0.3.4 (2014-03-30) + +* Bug fix: [Stream] Fixed 100% CPU spike from non-empty write buffer on closed stream + +## 0.4.0 (2014-02-02) + +* BC break: Bump minimum PHP version to PHP 5.4, remove 5.3 specific hacks +* BC break: Update to Evenement 2.0 +* Dependency: Autoloading and filesystem structure now PSR-4 instead of PSR-0 + +## 0.3.3 (2013-07-08) + +* Bug fix: [Stream] Correctly detect closed connections + +## 0.3.2 (2013-05-10) + +* Bug fix: [Stream] Make sure CompositeStream is closed properly + +## 0.3.1 (2013-04-21) + +* Bug fix: [Stream] Allow any `ReadableStreamInterface` on `BufferedSink::createPromise()` + +## 0.3.0 (2013-04-14) + +* Feature: [Stream] Factory method for BufferedSink + +## 0.2.6 (2012-12-26) + +* Version bump + +## 0.2.5 (2012-11-26) + +* Feature: Make BufferedSink trigger progress events on the promise (@jsor) + +## 0.2.4 (2012-11-18) + +* Feature: Added ThroughStream, CompositeStream, ReadableStream and WritableStream +* Feature: Added BufferedSink + +## 0.2.3 (2012-11-14) + +* Version bump + +## 0.2.2 (2012-10-28) + +* Version bump + +## 0.2.1 (2012-10-14) + +* Bug fix: Check for EOF in `Buffer::write()` + +## 0.2.0 (2012-09-10) + +* Version bump + +## 0.1.1 (2012-07-12) + +* Bug fix: Testing and functional against PHP >= 5.3.3 and <= 5.3.8 + +## 0.1.0 (2012-07-11) + +* First tagged release diff --git a/vendor/react/stream/LICENSE b/vendor/react/stream/LICENSE new file mode 100644 index 000000000..d6f8901f9 --- /dev/null +++ b/vendor/react/stream/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/react/stream/README.md b/vendor/react/stream/README.md new file mode 100644 index 000000000..9c0468a65 --- /dev/null +++ b/vendor/react/stream/README.md @@ -0,0 +1,1249 @@ +# Stream + +[![CI status](https://github.com/reactphp/stream/actions/workflows/ci.yml/badge.svg)](https://github.com/reactphp/stream/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/stream?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/stream) + +Event-driven readable and writable streams for non-blocking I/O in [ReactPHP](https://reactphp.org/). + +In order to make the [EventLoop](https://github.com/reactphp/event-loop) +easier to use, this component introduces the powerful concept of "streams". +Streams allow you to efficiently process huge amounts of data (such as a multi +Gigabyte file download) in small chunks without having to store everything in +memory at once. +They are very similar to the streams found in PHP itself, +but have an interface more suited for async, non-blocking I/O. + +**Table of contents** + +* [Stream usage](#stream-usage) + * [ReadableStreamInterface](#readablestreaminterface) + * [data event](#data-event) + * [end event](#end-event) + * [error event](#error-event) + * [close event](#close-event) + * [isReadable()](#isreadable) + * [pause()](#pause) + * [resume()](#resume) + * [pipe()](#pipe) + * [close()](#close) + * [WritableStreamInterface](#writablestreaminterface) + * [drain event](#drain-event) + * [pipe event](#pipe-event) + * [error event](#error-event-1) + * [close event](#close-event-1) + * [isWritable()](#iswritable) + * [write()](#write) + * [end()](#end) + * [close()](#close-1) + * [DuplexStreamInterface](#duplexstreaminterface) +* [Creating streams](#creating-streams) + * [ReadableResourceStream](#readableresourcestream) + * [WritableResourceStream](#writableresourcestream) + * [DuplexResourceStream](#duplexresourcestream) + * [ThroughStream](#throughstream) + * [CompositeStream](#compositestream) +* [Usage](#usage) +* [Install](#install) +* [Tests](#tests) +* [License](#license) +* [More](#more) + +## Stream usage + +ReactPHP uses the concept of "streams" throughout its ecosystem to provide a +consistent higher-level abstraction for processing streams of arbitrary data +contents and size. +While a stream itself is a quite low-level concept, it can be used as a powerful +abstraction to build higher-level components and protocols on top. + +If you're new to this concept, it helps to think of them as a water pipe: +You can consume water from a source or you can produce water and forward (pipe) +it to any destination (sink). + +Similarly, streams can either be + +* readable (such as `STDIN` terminal input) or +* writable (such as `STDOUT` terminal output) or +* duplex (both readable *and* writable, such as a TCP/IP connection) + +Accordingly, this package defines the following three interfaces + +* [`ReadableStreamInterface`](#readablestreaminterface) +* [`WritableStreamInterface`](#writablestreaminterface) +* [`DuplexStreamInterface`](#duplexstreaminterface) + +### ReadableStreamInterface + +The `ReadableStreamInterface` is responsible for providing an interface for +read-only streams and the readable side of duplex streams. + +Besides defining a few methods, this interface also implements the +`EventEmitterInterface` which allows you to react to certain events. + +The event callback functions MUST be a valid `callable` that obeys strict +parameter definitions and MUST accept event parameters exactly as documented. +The event callback functions MUST NOT throw an `Exception`. +The return value of the event callback functions will be ignored and has no +effect, so for performance reasons you're recommended to not return any +excessive data structures. + +Every implementation of this interface MUST follow these event semantics in +order to be considered a well-behaving stream. + +> Note that higher-level implementations of this interface may choose to + define additional events with dedicated semantics not defined as part of + this low-level stream specification. Conformance with these event semantics + is out of scope for this interface, so you may also have to refer to the + documentation of such a higher-level implementation. + +#### data event + +The `data` event will be emitted whenever some data was read/received +from this source stream. +The event receives a single mixed argument for incoming data. + +```php +$stream->on('data', function ($data) { + echo $data; +}); +``` + +This event MAY be emitted any number of times, which may be zero times if +this stream does not send any data at all. +It SHOULD not be emitted after an `end` or `close` event. + +The given `$data` argument may be of mixed type, but it's usually +recommended it SHOULD be a `string` value or MAY use a type that allows +representation as a `string` for maximum compatibility. + +Many common streams (such as a TCP/IP connection or a file-based stream) +will emit the raw (binary) payload data that is received over the wire as +chunks of `string` values. + +Due to the stream-based nature of this, the sender may send any number +of chunks with varying sizes. There are no guarantees that these chunks +will be received with the exact same framing the sender intended to send. +In other words, many lower-level protocols (such as TCP/IP) transfer the +data in chunks that may be anywhere between single-byte values to several +dozens of kilobytes. You may want to apply a higher-level protocol to +these low-level data chunks in order to achieve proper message framing. + +#### end event + +The `end` event will be emitted once the source stream has successfully +reached the end of the stream (EOF). + +```php +$stream->on('end', function () { + echo 'END'; +}); +``` + +This event SHOULD be emitted once or never at all, depending on whether +a successful end was detected. +It SHOULD NOT be emitted after a previous `end` or `close` event. +It MUST NOT be emitted if the stream closes due to a non-successful +end, such as after a previous `error` event. + +After the stream is ended, it MUST switch to non-readable mode, +see also `isReadable()`. + +This event will only be emitted if the *end* was reached successfully, +not if the stream was interrupted by an unrecoverable error or explicitly +closed. Not all streams know this concept of a "successful end". +Many use-cases involve detecting when the stream closes (terminates) +instead, in this case you should use the `close` event. +After the stream emits an `end` event, it SHOULD usually be followed by a +`close` event. + +Many common streams (such as a TCP/IP connection or a file-based stream) +will emit this event if either the remote side closes the connection or +a file handle was successfully read until reaching its end (EOF). + +Note that this event should not be confused with the `end()` method. +This event defines a successful end *reading* from a source stream, while +the `end()` method defines *writing* a successful end to a destination +stream. + +#### error event + +The `error` event will be emitted once a fatal error occurs, usually while +trying to read from this stream. +The event receives a single `Exception` argument for the error instance. + +```php +$server->on('error', function (Exception $e) { + echo 'Error: ' . $e->getMessage() . PHP_EOL; +}); +``` + +This event SHOULD be emitted once the stream detects a fatal error, such +as a fatal transmission error or after an unexpected `data` or premature +`end` event. +It SHOULD NOT be emitted after a previous `error`, `end` or `close` event. +It MUST NOT be emitted if this is not a fatal error condition, such as +a temporary network issue that did not cause any data to be lost. + +After the stream errors, it MUST close the stream and SHOULD thus be +followed by a `close` event and then switch to non-readable mode, see +also `close()` and `isReadable()`. + +Many common streams (such as a TCP/IP connection or a file-based stream) +only deal with data transmission and do not make assumption about data +boundaries (such as unexpected `data` or premature `end` events). +In other words, many lower-level protocols (such as TCP/IP) may choose +to only emit this for a fatal transmission error once and will then +close (terminate) the stream in response. + +If this stream is a `DuplexStreamInterface`, you should also notice +how the writable side of the stream also implements an `error` event. +In other words, an error may occur while either reading or writing the +stream which should result in the same error processing. + +#### close event + +The `close` event will be emitted once the stream closes (terminates). + +```php +$stream->on('close', function () { + echo 'CLOSED'; +}); +``` + +This event SHOULD be emitted once or never at all, depending on whether +the stream ever terminates. +It SHOULD NOT be emitted after a previous `close` event. + +After the stream is closed, it MUST switch to non-readable mode, +see also `isReadable()`. + +Unlike the `end` event, this event SHOULD be emitted whenever the stream +closes, irrespective of whether this happens implicitly due to an +unrecoverable error or explicitly when either side closes the stream. +If you only want to detect a *successful* end, you should use the `end` +event instead. + +Many common streams (such as a TCP/IP connection or a file-based stream) +will likely choose to emit this event after reading a *successful* `end` +event or after a fatal transmission `error` event. + +If this stream is a `DuplexStreamInterface`, you should also notice +how the writable side of the stream also implements a `close` event. +In other words, after receiving this event, the stream MUST switch into +non-writable AND non-readable mode, see also `isWritable()`. +Note that this event should not be confused with the `end` event. + +#### isReadable() + +The `isReadable(): bool` method can be used to +check whether this stream is in a readable state (not closed already). + +This method can be used to check if the stream still accepts incoming +data events or if it is ended or closed already. +Once the stream is non-readable, no further `data` or `end` events SHOULD +be emitted. + +```php +assert($stream->isReadable() === false); + +$stream->on('data', assertNeverCalled()); +$stream->on('end', assertNeverCalled()); +``` + +A successfully opened stream always MUST start in readable mode. + +Once the stream ends or closes, it MUST switch to non-readable mode. +This can happen any time, explicitly through `close()` or +implicitly due to a remote close or an unrecoverable transmission error. +Once a stream has switched to non-readable mode, it MUST NOT transition +back to readable mode. + +If this stream is a `DuplexStreamInterface`, you should also notice +how the writable side of the stream also implements an `isWritable()` +method. Unless this is a half-open duplex stream, they SHOULD usually +have the same return value. + +#### pause() + +The `pause(): void` method can be used to +pause reading incoming data events. + +Removes the data source file descriptor from the event loop. This +allows you to throttle incoming data. + +Unless otherwise noted, a successfully opened stream SHOULD NOT start +in paused state. + +Once the stream is paused, no futher `data` or `end` events SHOULD +be emitted. + +```php +$stream->pause(); + +$stream->on('data', assertShouldNeverCalled()); +$stream->on('end', assertShouldNeverCalled()); +``` + +This method is advisory-only, though generally not recommended, the +stream MAY continue emitting `data` events. + +You can continue processing events by calling `resume()` again. + +Note that both methods can be called any number of times, in particular +calling `pause()` more than once SHOULD NOT have any effect. + +See also `resume()`. + +#### resume() + +The `resume(): void` method can be used to +resume reading incoming data events. + +Re-attach the data source after a previous `pause()`. + +```php +$stream->pause(); + +Loop::addTimer(1.0, function () use ($stream) { + $stream->resume(); +}); +``` + +Note that both methods can be called any number of times, in particular +calling `resume()` without a prior `pause()` SHOULD NOT have any effect. + +See also `pause()`. + +#### pipe() + +The `pipe(WritableStreamInterface $dest, array $options = [])` method can be used to +pipe all the data from this readable source into the given writable destination. + +Automatically sends all incoming data to the destination. +Automatically throttles the source based on what the destination can handle. + +```php +$source->pipe($dest); +``` + +Similarly, you can also pipe an instance implementing `DuplexStreamInterface` +into itself in order to write back all the data that is received. +This may be a useful feature for a TCP/IP echo service: + +```php +$connection->pipe($connection); +``` + +This method returns the destination stream as-is, which can be used to +set up chains of piped streams: + +```php +$source->pipe($decodeGzip)->pipe($filterBadWords)->pipe($dest); +``` + +By default, this will call `end()` on the destination stream once the +source stream emits an `end` event. This can be disabled like this: + +```php +$source->pipe($dest, array('end' => false)); +``` + +Note that this only applies to the `end` event. +If an `error` or explicit `close` event happens on the source stream, +you'll have to manually close the destination stream: + +```php +$source->pipe($dest); +$source->on('close', function () use ($dest) { + $dest->end('BYE!'); +}); +``` + +If the source stream is not readable (closed state), then this is a NO-OP. + +```php +$source->close(); +$source->pipe($dest); // NO-OP +``` + +If the destinantion stream is not writable (closed state), then this will simply +throttle (pause) the source stream: + +```php +$dest->close(); +$source->pipe($dest); // calls $source->pause() +``` + +Similarly, if the destination stream is closed while the pipe is still +active, it will also throttle (pause) the source stream: + +```php +$source->pipe($dest); +$dest->close(); // calls $source->pause() +``` + +Once the pipe is set up successfully, the destination stream MUST emit +a `pipe` event with this source stream an event argument. + +#### close() + +The `close(): void` method can be used to +close the stream (forcefully). + +This method can be used to (forcefully) close the stream. + +```php +$stream->close(); +``` + +Once the stream is closed, it SHOULD emit a `close` event. +Note that this event SHOULD NOT be emitted more than once, in particular +if this method is called multiple times. + +After calling this method, the stream MUST switch into a non-readable +mode, see also `isReadable()`. +This means that no further `data` or `end` events SHOULD be emitted. + +```php +$stream->close(); +assert($stream->isReadable() === false); + +$stream->on('data', assertNeverCalled()); +$stream->on('end', assertNeverCalled()); +``` + +If this stream is a `DuplexStreamInterface`, you should also notice +how the writable side of the stream also implements a `close()` method. +In other words, after calling this method, the stream MUST switch into +non-writable AND non-readable mode, see also `isWritable()`. +Note that this method should not be confused with the `end()` method. + +### WritableStreamInterface + +The `WritableStreamInterface` is responsible for providing an interface for +write-only streams and the writable side of duplex streams. + +Besides defining a few methods, this interface also implements the +`EventEmitterInterface` which allows you to react to certain events. + +The event callback functions MUST be a valid `callable` that obeys strict +parameter definitions and MUST accept event parameters exactly as documented. +The event callback functions MUST NOT throw an `Exception`. +The return value of the event callback functions will be ignored and has no +effect, so for performance reasons you're recommended to not return any +excessive data structures. + +Every implementation of this interface MUST follow these event semantics in +order to be considered a well-behaving stream. + +> Note that higher-level implementations of this interface may choose to + define additional events with dedicated semantics not defined as part of + this low-level stream specification. Conformance with these event semantics + is out of scope for this interface, so you may also have to refer to the + documentation of such a higher-level implementation. + +#### drain event + +The `drain` event will be emitted whenever the write buffer became full +previously and is now ready to accept more data. + +```php +$stream->on('drain', function () use ($stream) { + echo 'Stream is now ready to accept more data'; +}); +``` + +This event SHOULD be emitted once every time the buffer became full +previously and is now ready to accept more data. +In other words, this event MAY be emitted any number of times, which may +be zero times if the buffer never became full in the first place. +This event SHOULD NOT be emitted if the buffer has not become full +previously. + +This event is mostly used internally, see also `write()` for more details. + +#### pipe event + +The `pipe` event will be emitted whenever a readable stream is `pipe()`d +into this stream. +The event receives a single `ReadableStreamInterface` argument for the +source stream. + +```php +$stream->on('pipe', function (ReadableStreamInterface $source) use ($stream) { + echo 'Now receiving piped data'; + + // explicitly close target if source emits an error + $source->on('error', function () use ($stream) { + $stream->close(); + }); +}); + +$source->pipe($stream); +``` + +This event MUST be emitted once for each readable stream that is +successfully piped into this destination stream. +In other words, this event MAY be emitted any number of times, which may +be zero times if no stream is ever piped into this stream. +This event MUST NOT be emitted if either the source is not readable +(closed already) or this destination is not writable (closed already). + +This event is mostly used internally, see also `pipe()` for more details. + +#### error event + +The `error` event will be emitted once a fatal error occurs, usually while +trying to write to this stream. +The event receives a single `Exception` argument for the error instance. + +```php +$stream->on('error', function (Exception $e) { + echo 'Error: ' . $e->getMessage() . PHP_EOL; +}); +``` + +This event SHOULD be emitted once the stream detects a fatal error, such +as a fatal transmission error. +It SHOULD NOT be emitted after a previous `error` or `close` event. +It MUST NOT be emitted if this is not a fatal error condition, such as +a temporary network issue that did not cause any data to be lost. + +After the stream errors, it MUST close the stream and SHOULD thus be +followed by a `close` event and then switch to non-writable mode, see +also `close()` and `isWritable()`. + +Many common streams (such as a TCP/IP connection or a file-based stream) +only deal with data transmission and may choose +to only emit this for a fatal transmission error once and will then +close (terminate) the stream in response. + +If this stream is a `DuplexStreamInterface`, you should also notice +how the readable side of the stream also implements an `error` event. +In other words, an error may occur while either reading or writing the +stream which should result in the same error processing. + +#### close event + +The `close` event will be emitted once the stream closes (terminates). + +```php +$stream->on('close', function () { + echo 'CLOSED'; +}); +``` + +This event SHOULD be emitted once or never at all, depending on whether +the stream ever terminates. +It SHOULD NOT be emitted after a previous `close` event. + +After the stream is closed, it MUST switch to non-writable mode, +see also `isWritable()`. + +This event SHOULD be emitted whenever the stream closes, irrespective of +whether this happens implicitly due to an unrecoverable error or +explicitly when either side closes the stream. + +Many common streams (such as a TCP/IP connection or a file-based stream) +will likely choose to emit this event after flushing the buffer from +the `end()` method, after receiving a *successful* `end` event or after +a fatal transmission `error` event. + +If this stream is a `DuplexStreamInterface`, you should also notice +how the readable side of the stream also implements a `close` event. +In other words, after receiving this event, the stream MUST switch into +non-writable AND non-readable mode, see also `isReadable()`. +Note that this event should not be confused with the `end` event. + +#### isWritable() + +The `isWritable(): bool` method can be used to +check whether this stream is in a writable state (not closed already). + +This method can be used to check if the stream still accepts writing +any data or if it is ended or closed already. +Writing any data to a non-writable stream is a NO-OP: + +```php +assert($stream->isWritable() === false); + +$stream->write('end'); // NO-OP +$stream->end('end'); // NO-OP +``` + +A successfully opened stream always MUST start in writable mode. + +Once the stream ends or closes, it MUST switch to non-writable mode. +This can happen any time, explicitly through `end()` or `close()` or +implicitly due to a remote close or an unrecoverable transmission error. +Once a stream has switched to non-writable mode, it MUST NOT transition +back to writable mode. + +If this stream is a `DuplexStreamInterface`, you should also notice +how the readable side of the stream also implements an `isReadable()` +method. Unless this is a half-open duplex stream, they SHOULD usually +have the same return value. + +#### write() + +The `write(mixed $data): bool` method can be used to +write some data into the stream. + +A successful write MUST be confirmed with a boolean `true`, which means +that either the data was written (flushed) immediately or is buffered and +scheduled for a future write. Note that this interface gives you no +control over explicitly flushing the buffered data, as finding the +appropriate time for this is beyond the scope of this interface and left +up to the implementation of this interface. + +Many common streams (such as a TCP/IP connection or file-based stream) +may choose to buffer all given data and schedule a future flush by using +an underlying EventLoop to check when the resource is actually writable. + +If a stream cannot handle writing (or flushing) the data, it SHOULD emit +an `error` event and MAY `close()` the stream if it can not recover from +this error. + +If the internal buffer is full after adding `$data`, then `write()` +SHOULD return `false`, indicating that the caller should stop sending +data until the buffer drains. +The stream SHOULD send a `drain` event once the buffer is ready to accept +more data. + +Similarly, if the stream is not writable (already in a closed state) +it MUST NOT process the given `$data` and SHOULD return `false`, +indicating that the caller should stop sending data. + +The given `$data` argument MAY be of mixed type, but it's usually +recommended it SHOULD be a `string` value or MAY use a type that allows +representation as a `string` for maximum compatibility. + +Many common streams (such as a TCP/IP connection or a file-based stream) +will only accept the raw (binary) payload data that is transferred over +the wire as chunks of `string` values. + +Due to the stream-based nature of this, the sender may send any number +of chunks with varying sizes. There are no guarantees that these chunks +will be received with the exact same framing the sender intended to send. +In other words, many lower-level protocols (such as TCP/IP) transfer the +data in chunks that may be anywhere between single-byte values to several +dozens of kilobytes. You may want to apply a higher-level protocol to +these low-level data chunks in order to achieve proper message framing. + +#### end() + +The `end(mixed $data = null): void` method can be used to +successfully end the stream (after optionally sending some final data). + +This method can be used to successfully end the stream, i.e. close +the stream after sending out all data that is currently buffered. + +```php +$stream->write('hello'); +$stream->write('world'); +$stream->end(); +``` + +If there's no data currently buffered and nothing to be flushed, then +this method MAY `close()` the stream immediately. + +If there's still data in the buffer that needs to be flushed first, then +this method SHOULD try to write out this data and only then `close()` +the stream. +Once the stream is closed, it SHOULD emit a `close` event. + +Note that this interface gives you no control over explicitly flushing +the buffered data, as finding the appropriate time for this is beyond the +scope of this interface and left up to the implementation of this +interface. + +Many common streams (such as a TCP/IP connection or file-based stream) +may choose to buffer all given data and schedule a future flush by using +an underlying EventLoop to check when the resource is actually writable. + +You can optionally pass some final data that is written to the stream +before ending the stream. If a non-`null` value is given as `$data`, then +this method will behave just like calling `write($data)` before ending +with no data. + +```php +// shorter version +$stream->end('bye'); + +// same as longer version +$stream->write('bye'); +$stream->end(); +``` + +After calling this method, the stream MUST switch into a non-writable +mode, see also `isWritable()`. +This means that no further writes are possible, so any additional +`write()` or `end()` calls have no effect. + +```php +$stream->end(); +assert($stream->isWritable() === false); + +$stream->write('nope'); // NO-OP +$stream->end(); // NO-OP +``` + +If this stream is a `DuplexStreamInterface`, calling this method SHOULD +also end its readable side, unless the stream supports half-open mode. +In other words, after calling this method, these streams SHOULD switch +into non-writable AND non-readable mode, see also `isReadable()`. +This implies that in this case, the stream SHOULD NOT emit any `data` +or `end` events anymore. +Streams MAY choose to use the `pause()` method logic for this, but +special care may have to be taken to ensure a following call to the +`resume()` method SHOULD NOT continue emitting readable events. + +Note that this method should not be confused with the `close()` method. + +#### close() + +The `close(): void` method can be used to +close the stream (forcefully). + +This method can be used to forcefully close the stream, i.e. close +the stream without waiting for any buffered data to be flushed. +If there's still data in the buffer, this data SHOULD be discarded. + +```php +$stream->close(); +``` + +Once the stream is closed, it SHOULD emit a `close` event. +Note that this event SHOULD NOT be emitted more than once, in particular +if this method is called multiple times. + +After calling this method, the stream MUST switch into a non-writable +mode, see also `isWritable()`. +This means that no further writes are possible, so any additional +`write()` or `end()` calls have no effect. + +```php +$stream->close(); +assert($stream->isWritable() === false); + +$stream->write('nope'); // NO-OP +$stream->end(); // NO-OP +``` + +Note that this method should not be confused with the `end()` method. +Unlike the `end()` method, this method does not take care of any existing +buffers and simply discards any buffer contents. +Likewise, this method may also be called after calling `end()` on a +stream in order to stop waiting for the stream to flush its final data. + +```php +$stream->end(); +Loop::addTimer(1.0, function () use ($stream) { + $stream->close(); +}); +``` + +If this stream is a `DuplexStreamInterface`, you should also notice +how the readable side of the stream also implements a `close()` method. +In other words, after calling this method, the stream MUST switch into +non-writable AND non-readable mode, see also `isReadable()`. + +### DuplexStreamInterface + +The `DuplexStreamInterface` is responsible for providing an interface for +duplex streams (both readable and writable). + +It builds on top of the existing interfaces for readable and writable streams +and follows the exact same method and event semantics. +If you're new to this concept, you should look into the +`ReadableStreamInterface` and `WritableStreamInterface` first. + +Besides defining a few methods, this interface also implements the +`EventEmitterInterface` which allows you to react to the same events defined +on the `ReadbleStreamInterface` and `WritableStreamInterface`. + +The event callback functions MUST be a valid `callable` that obeys strict +parameter definitions and MUST accept event parameters exactly as documented. +The event callback functions MUST NOT throw an `Exception`. +The return value of the event callback functions will be ignored and has no +effect, so for performance reasons you're recommended to not return any +excessive data structures. + +Every implementation of this interface MUST follow these event semantics in +order to be considered a well-behaving stream. + +> Note that higher-level implementations of this interface may choose to + define additional events with dedicated semantics not defined as part of + this low-level stream specification. Conformance with these event semantics + is out of scope for this interface, so you may also have to refer to the + documentation of such a higher-level implementation. + +See also [`ReadableStreamInterface`](#readablestreaminterface) and +[`WritableStreamInterface`](#writablestreaminterface) for more details. + +## Creating streams + +ReactPHP uses the concept of "streams" throughout its ecosystem, so that +many higher-level consumers of this package only deal with +[stream usage](#stream-usage). +This implies that stream instances are most often created within some +higher-level components and many consumers never actually have to deal with +creating a stream instance. + +* Use [react/socket](https://github.com/reactphp/socket) + if you want to accept incoming or establish outgoing plaintext TCP/IP or + secure TLS socket connection streams. +* Use [react/http](https://github.com/reactphp/http) + if you want to receive an incoming HTTP request body streams. +* Use [react/child-process](https://github.com/reactphp/child-process) + if you want to communicate with child processes via process pipes such as + STDIN, STDOUT, STDERR etc. +* Use experimental [react/filesystem](https://github.com/reactphp/filesystem) + if you want to read from / write to the filesystem. +* See also the last chapter for [more real-world applications](#more). + +However, if you are writing a lower-level component or want to create a stream +instance from a stream resource, then the following chapter is for you. + +> Note that the following examples use `fopen()` and `stream_socket_client()` + for illustration purposes only. + These functions SHOULD NOT be used in a truly async program because each call + may take several seconds to complete and would block the EventLoop otherwise. + Additionally, the `fopen()` call will return a file handle on some platforms + which may or may not be supported by all EventLoop implementations. + As an alternative, you may want to use higher-level libraries listed above. + +### ReadableResourceStream + +The `ReadableResourceStream` is a concrete implementation of the +[`ReadableStreamInterface`](#readablestreaminterface) for PHP's stream resources. + +This can be used to represent a read-only resource like a file stream opened in +readable mode or a stream such as `STDIN`: + +```php +$stream = new ReadableResourceStream(STDIN); +$stream->on('data', function ($chunk) { + echo $chunk; +}); +$stream->on('end', function () { + echo 'END'; +}); +``` + +See also [`ReadableStreamInterface`](#readablestreaminterface) for more details. + +The first parameter given to the constructor MUST be a valid stream resource +that is opened in reading mode (e.g. `fopen()` mode `r`). +Otherwise, it will throw an `InvalidArgumentException`: + +```php +// throws InvalidArgumentException +$stream = new ReadableResourceStream(false); +``` + +See also the [`DuplexResourceStream`](#readableresourcestream) for read-and-write +stream resources otherwise. + +Internally, this class tries to enable non-blocking mode on the stream resource +which may not be supported for all stream resources. +Most notably, this is not supported by pipes on Windows (STDIN etc.). +If this fails, it will throw a `RuntimeException`: + +```php +// throws RuntimeException on Windows +$stream = new ReadableResourceStream(STDIN); +``` + +Once the constructor is called with a valid stream resource, this class will +take care of the underlying stream resource. +You SHOULD only use its public API and SHOULD NOT interfere with the underlying +stream resource manually. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +This class takes an optional `int|null $readChunkSize` parameter that controls +the maximum buffer size in bytes to read at once from the stream. +You can use a `null` value here in order to apply its default value. +This value SHOULD NOT be changed unless you know what you're doing. +This can be a positive number which means that up to X bytes will be read +at once from the underlying stream resource. Note that the actual number +of bytes read may be lower if the stream resource has less than X bytes +currently available. +This can be `-1` which means "read everything available" from the +underlying stream resource. +This should read until the stream resource is not readable anymore +(i.e. underlying buffer drained), note that this does not neccessarily +mean it reached EOF. + +```php +$stream = new ReadableResourceStream(STDIN, null, 8192); +``` + +> PHP bug warning: If the PHP process has explicitly been started without a + `STDIN` stream, then trying to read from `STDIN` may return data from + another stream resource. This does not happen if you start this with an empty + stream like `php test.php < /dev/null` instead of `php test.php <&-`. + See [#81](https://github.com/reactphp/stream/issues/81) for more details. + +> Changelog: As of v1.2.0 the `$loop` parameter can be omitted (or skipped with a + `null` value) to use the [default loop](https://github.com/reactphp/event-loop#loop). + +### WritableResourceStream + +The `WritableResourceStream` is a concrete implementation of the +[`WritableStreamInterface`](#writablestreaminterface) for PHP's stream resources. + +This can be used to represent a write-only resource like a file stream opened in +writable mode or a stream such as `STDOUT` or `STDERR`: + +```php +$stream = new WritableResourceStream(STDOUT); +$stream->write('hello!'); +$stream->end(); +``` + +See also [`WritableStreamInterface`](#writablestreaminterface) for more details. + +The first parameter given to the constructor MUST be a valid stream resource +that is opened for writing. +Otherwise, it will throw an `InvalidArgumentException`: + +```php +// throws InvalidArgumentException +$stream = new WritableResourceStream(false); +``` + +See also the [`DuplexResourceStream`](#readableresourcestream) for read-and-write +stream resources otherwise. + +Internally, this class tries to enable non-blocking mode on the stream resource +which may not be supported for all stream resources. +Most notably, this is not supported by pipes on Windows (STDOUT, STDERR etc.). +If this fails, it will throw a `RuntimeException`: + +```php +// throws RuntimeException on Windows +$stream = new WritableResourceStream(STDOUT); +``` + +Once the constructor is called with a valid stream resource, this class will +take care of the underlying stream resource. +You SHOULD only use its public API and SHOULD NOT interfere with the underlying +stream resource manually. + +Any `write()` calls to this class will not be performed instantly, but will +be performed asynchronously, once the EventLoop reports the stream resource is +ready to accept data. +For this, it uses an in-memory buffer string to collect all outstanding writes. +This buffer has a soft-limit applied which defines how much data it is willing +to accept before the caller SHOULD stop sending further data. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +This class takes an optional `int|null $writeBufferSoftLimit` parameter that controls +this maximum buffer size in bytes. +You can use a `null` value here in order to apply its default value. +This value SHOULD NOT be changed unless you know what you're doing. + +```php +$stream = new WritableResourceStream(STDOUT, null, 8192); +``` + +This class takes an optional `int|null $writeChunkSize` parameter that controls +this maximum buffer size in bytes to write at once to the stream. +You can use a `null` value here in order to apply its default value. +This value SHOULD NOT be changed unless you know what you're doing. +This can be a positive number which means that up to X bytes will be written +at once to the underlying stream resource. Note that the actual number +of bytes written may be lower if the stream resource has less than X bytes +currently available. +This can be `-1` which means "write everything available" to the +underlying stream resource. + +```php +$stream = new WritableResourceStream(STDOUT, null, null, 8192); +``` + +See also [`write()`](#write) for more details. + +> Changelog: As of v1.2.0 the `$loop` parameter can be omitted (or skipped with a + `null` value) to use the [default loop](https://github.com/reactphp/event-loop#loop). + +### DuplexResourceStream + +The `DuplexResourceStream` is a concrete implementation of the +[`DuplexStreamInterface`](#duplexstreaminterface) for PHP's stream resources. + +This can be used to represent a read-and-write resource like a file stream opened +in read and write mode mode or a stream such as a TCP/IP connection: + +```php +$conn = stream_socket_client('tcp://google.com:80'); +$stream = new DuplexResourceStream($conn); +$stream->write('hello!'); +$stream->end(); +``` + +See also [`DuplexStreamInterface`](#duplexstreaminterface) for more details. + +The first parameter given to the constructor MUST be a valid stream resource +that is opened for reading *and* writing. +Otherwise, it will throw an `InvalidArgumentException`: + +```php +// throws InvalidArgumentException +$stream = new DuplexResourceStream(false); +``` + +See also the [`ReadableResourceStream`](#readableresourcestream) for read-only +and the [`WritableResourceStream`](#writableresourcestream) for write-only +stream resources otherwise. + +Internally, this class tries to enable non-blocking mode on the stream resource +which may not be supported for all stream resources. +Most notably, this is not supported by pipes on Windows (STDOUT, STDERR etc.). +If this fails, it will throw a `RuntimeException`: + +```php +// throws RuntimeException on Windows +$stream = new DuplexResourceStream(STDOUT); +``` + +Once the constructor is called with a valid stream resource, this class will +take care of the underlying stream resource. +You SHOULD only use its public API and SHOULD NOT interfere with the underlying +stream resource manually. + +This class takes an optional `LoopInterface|null $loop` parameter that can be used to +pass the event loop instance to use for this object. You can use a `null` value +here in order to use the [default loop](https://github.com/reactphp/event-loop#loop). +This value SHOULD NOT be given unless you're sure you want to explicitly use a +given event loop instance. + +This class takes an optional `int|null $readChunkSize` parameter that controls +the maximum buffer size in bytes to read at once from the stream. +You can use a `null` value here in order to apply its default value. +This value SHOULD NOT be changed unless you know what you're doing. +This can be a positive number which means that up to X bytes will be read +at once from the underlying stream resource. Note that the actual number +of bytes read may be lower if the stream resource has less than X bytes +currently available. +This can be `-1` which means "read everything available" from the +underlying stream resource. +This should read until the stream resource is not readable anymore +(i.e. underlying buffer drained), note that this does not neccessarily +mean it reached EOF. + +```php +$conn = stream_socket_client('tcp://google.com:80'); +$stream = new DuplexResourceStream($conn, null, 8192); +``` + +Any `write()` calls to this class will not be performed instantly, but will +be performed asynchronously, once the EventLoop reports the stream resource is +ready to accept data. +For this, it uses an in-memory buffer string to collect all outstanding writes. +This buffer has a soft-limit applied which defines how much data it is willing +to accept before the caller SHOULD stop sending further data. + +This class takes another optional `WritableStreamInterface|null $buffer` parameter +that controls this write behavior of this stream. +You can use a `null` value here in order to apply its default value. +This value SHOULD NOT be changed unless you know what you're doing. + +If you want to change the write buffer soft limit, you can pass an instance of +[`WritableResourceStream`](#writableresourcestream) like this: + +```php +$conn = stream_socket_client('tcp://google.com:80'); +$buffer = new WritableResourceStream($conn, null, 8192); +$stream = new DuplexResourceStream($conn, null, null, $buffer); +``` + +See also [`WritableResourceStream`](#writableresourcestream) for more details. + +> Changelog: As of v1.2.0 the `$loop` parameter can be omitted (or skipped with a + `null` value) to use the [default loop](https://github.com/reactphp/event-loop#loop). + +### ThroughStream + +The `ThroughStream` implements the +[`DuplexStreamInterface`](#duplexstreaminterface) and will simply pass any data +you write to it through to its readable end. + +```php +$through = new ThroughStream(); +$through->on('data', $this->expectCallableOnceWith('hello')); + +$through->write('hello'); +``` + +Similarly, the [`end()` method](#end) will end the stream and emit an +[`end` event](#end-event) and then [`close()`](#close-1) the stream. +The [`close()` method](#close-1) will close the stream and emit a +[`close` event](#close-event). +Accordingly, this is can also be used in a [`pipe()`](#pipe) context like this: + +```php +$through = new ThroughStream(); +$source->pipe($through)->pipe($dest); +``` + +Optionally, its constructor accepts any callable function which will then be +used to *filter* any data written to it. This function receives a single data +argument as passed to the writable side and must return the data as it will be +passed to its readable end: + +```php +$through = new ThroughStream('strtoupper'); +$source->pipe($through)->pipe($dest); +``` + +Note that this class makes no assumptions about any data types. This can be +used to convert data, for example for transforming any structured data into +a newline-delimited JSON (NDJSON) stream like this: + +```php +$through = new ThroughStream(function ($data) { + return json_encode($data) . PHP_EOL; +}); +$through->on('data', $this->expectCallableOnceWith("[2, true]\n")); + +$through->write(array(2, true)); +``` + +The callback function is allowed to throw an `Exception`. In this case, +the stream will emit an `error` event and then [`close()`](#close-1) the stream. + +```php +$through = new ThroughStream(function ($data) { + if (!is_string($data)) { + throw new \UnexpectedValueException('Only strings allowed'); + } + return $data; +}); +$through->on('error', $this->expectCallableOnce())); +$through->on('close', $this->expectCallableOnce())); +$through->on('data', $this->expectCallableNever())); + +$through->write(2); +``` + +### CompositeStream + +The `CompositeStream` implements the +[`DuplexStreamInterface`](#duplexstreaminterface) and can be used to create a +single duplex stream from two individual streams implementing +[`ReadableStreamInterface`](#readablestreaminterface) and +[`WritableStreamInterface`](#writablestreaminterface) respectively. + +This is useful for some APIs which may require a single +[`DuplexStreamInterface`](#duplexstreaminterface) or simply because it's often +more convenient to work with a single stream instance like this: + +```php +$stdin = new ReadableResourceStream(STDIN); +$stdout = new WritableResourceStream(STDOUT); + +$stdio = new CompositeStream($stdin, $stdout); + +$stdio->on('data', function ($chunk) use ($stdio) { + $stdio->write('You said: ' . $chunk); +}); +``` + +This is a well-behaving stream which forwards all stream events from the +underlying streams and forwards all streams calls to the underlying streams. + +If you `write()` to the duplex stream, it will simply `write()` to the +writable side and return its status. + +If you `end()` the duplex stream, it will `end()` the writable side and will +`pause()` the readable side. + +If you `close()` the duplex stream, both input streams will be closed. +If either of the two input streams emits a `close` event, the duplex stream +will also close. +If either of the two input streams is already closed while constructing the +duplex stream, it will `close()` the other side and return a closed stream. + +## Usage + +The following example can be used to pipe the contents of a source file into +a destination file without having to ever read the whole file into memory: + +```php +$source = new React\Stream\ReadableResourceStream(fopen('source.txt', 'r')); +$dest = new React\Stream\WritableResourceStream(fopen('destination.txt', 'w')); + +$source->pipe($dest); +``` + +> Note that this example uses `fopen()` for illustration purposes only. + This should not be used in a truly async program because the filesystem is + inherently blocking and each call could potentially take several seconds. + See also [creating streams](#creating-streams) for more sophisticated + examples. + +## Install + +The recommended way to install this library is [through Composer](https://getcomposer.org). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) + +This project follows [SemVer](https://semver.org/). +This will install the latest supported version: + +```bash +composer require react/stream:^1.4 +``` + +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. + +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on legacy PHP 5.3 through current PHP 8+ and HHVM. +It's *highly recommended to use PHP 7+* for this project due to its vast +performance improvements. + +## Tests + +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org): + +```bash +composer install +``` + +To run the test suite, go to the project root and run: + +```bash +vendor/bin/phpunit +``` + +The test suite also contains a number of functional integration tests that rely +on a stable internet connection. +If you do not want to run these, they can simply be skipped like this: + +```bash +vendor/bin/phpunit --exclude-group internet +``` + +## License + +MIT, see [LICENSE file](LICENSE). + +## More + +* See [creating streams](#creating-streams) for more information on how streams + are created in real-world applications. +* See our [users wiki](https://github.com/reactphp/react/wiki/Users) and the + [dependents on Packagist](https://packagist.org/packages/react/stream/dependents) + for a list of packages that use streams in real-world applications. diff --git a/vendor/react/stream/composer.json b/vendor/react/stream/composer.json new file mode 100644 index 000000000..09d8b71e0 --- /dev/null +++ b/vendor/react/stream/composer.json @@ -0,0 +1,47 @@ +{ + "name": "react/stream", + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": ["event-driven", "readable", "writable", "stream", "non-blocking", "io", "pipe", "ReactPHP"], + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "homepage": "https://clue.engineering/", + "email": "christian@clue.engineering" + }, + { + "name": "Cees-Jan Kiewiet", + "homepage": "https://wyrihaximus.net/", + "email": "reactphp@ceesjankiewiet.nl" + }, + { + "name": "Jan Sorgalla", + "homepage": "https://sorgalla.com/", + "email": "jsorgalla@gmail.com" + }, + { + "name": "Chris Boden", + "homepage": "https://cboden.dev/", + "email": "cboden@gmail.com" + } + ], + "require": { + "php": ">=5.3.8", + "react/event-loop": "^1.2", + "evenement/evenement": "^3.0 || ^2.0 || ^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "clue/stream-filter": "~1.2" + }, + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "React\\Tests\\Stream\\": "tests/" + } + } +} diff --git a/vendor/react/stream/src/CompositeStream.php b/vendor/react/stream/src/CompositeStream.php new file mode 100644 index 000000000..dde091de0 --- /dev/null +++ b/vendor/react/stream/src/CompositeStream.php @@ -0,0 +1,83 @@ +readable = $readable; + $this->writable = $writable; + + if (!$readable->isReadable() || !$writable->isWritable()) { + $this->close(); + return; + } + + Util::forwardEvents($this->readable, $this, array('data', 'end', 'error')); + Util::forwardEvents($this->writable, $this, array('drain', 'error', 'pipe')); + + $this->readable->on('close', array($this, 'close')); + $this->writable->on('close', array($this, 'close')); + } + + public function isReadable() + { + return $this->readable->isReadable(); + } + + public function pause() + { + $this->readable->pause(); + } + + public function resume() + { + if (!$this->writable->isWritable()) { + return; + } + + $this->readable->resume(); + } + + public function pipe(WritableStreamInterface $dest, array $options = array()) + { + return Util::pipe($this, $dest, $options); + } + + public function isWritable() + { + return $this->writable->isWritable(); + } + + public function write($data) + { + return $this->writable->write($data); + } + + public function end($data = null) + { + $this->readable->pause(); + $this->writable->end($data); + } + + public function close() + { + if ($this->closed) { + return; + } + + $this->closed = true; + $this->readable->close(); + $this->writable->close(); + + $this->emit('close'); + $this->removeAllListeners(); + } +} diff --git a/vendor/react/stream/src/DuplexResourceStream.php b/vendor/react/stream/src/DuplexResourceStream.php new file mode 100644 index 000000000..d6de55c07 --- /dev/null +++ b/vendor/react/stream/src/DuplexResourceStream.php @@ -0,0 +1,240 @@ +isLegacyPipe($stream)) { + \stream_set_read_buffer($stream, 0); + } + + if ($buffer === null) { + $buffer = new WritableResourceStream($stream, $loop); + } + + $this->stream = $stream; + $this->loop = $loop ?: Loop::get(); + $this->bufferSize = ($readChunkSize === null) ? 65536 : (int)$readChunkSize; + $this->buffer = $buffer; + + $that = $this; + + $this->buffer->on('error', function ($error) use ($that) { + $that->emit('error', array($error)); + }); + + $this->buffer->on('close', array($this, 'close')); + + $this->buffer->on('drain', function () use ($that) { + $that->emit('drain'); + }); + + $this->resume(); + } + + public function isReadable() + { + return $this->readable; + } + + public function isWritable() + { + return $this->writable; + } + + public function pause() + { + if ($this->listening) { + $this->loop->removeReadStream($this->stream); + $this->listening = false; + } + } + + public function resume() + { + if (!$this->listening && $this->readable) { + $this->loop->addReadStream($this->stream, array($this, 'handleData')); + $this->listening = true; + } + } + + public function write($data) + { + if (!$this->writable) { + return false; + } + + return $this->buffer->write($data); + } + + public function close() + { + if (!$this->writable && !$this->closing) { + return; + } + + $this->closing = false; + + $this->readable = false; + $this->writable = false; + + $this->emit('close'); + $this->pause(); + $this->buffer->close(); + $this->removeAllListeners(); + + if (\is_resource($this->stream)) { + \fclose($this->stream); + } + } + + public function end($data = null) + { + if (!$this->writable) { + return; + } + + $this->closing = true; + + $this->readable = false; + $this->writable = false; + $this->pause(); + + $this->buffer->end($data); + } + + public function pipe(WritableStreamInterface $dest, array $options = array()) + { + return Util::pipe($this, $dest, $options); + } + + /** @internal */ + public function handleData($stream) + { + $error = null; + \set_error_handler(function ($errno, $errstr, $errfile, $errline) use (&$error) { + $error = new \ErrorException( + $errstr, + 0, + $errno, + $errfile, + $errline + ); + }); + + $data = \stream_get_contents($stream, $this->bufferSize); + + \restore_error_handler(); + + if ($error !== null) { + $this->emit('error', array(new \RuntimeException('Unable to read from stream: ' . $error->getMessage(), 0, $error))); + $this->close(); + return; + } + + if ($data !== '') { + $this->emit('data', array($data)); + } elseif (\feof($this->stream)) { + // no data read => we reached the end and close the stream + $this->emit('end'); + $this->close(); + } + } + + /** + * Returns whether this is a pipe resource in a legacy environment + * + * This works around a legacy PHP bug (#61019) that was fixed in PHP 5.4.28+ + * and PHP 5.5.12+ and newer. + * + * @param resource $resource + * @return bool + * @link https://github.com/reactphp/child-process/issues/40 + * + * @codeCoverageIgnore + */ + private function isLegacyPipe($resource) + { + if (\PHP_VERSION_ID < 50428 || (\PHP_VERSION_ID >= 50500 && \PHP_VERSION_ID < 50512)) { + $meta = \stream_get_meta_data($resource); + + if (isset($meta['stream_type']) && $meta['stream_type'] === 'STDIO') { + return true; + } + } + return false; + } +} diff --git a/vendor/react/stream/src/DuplexStreamInterface.php b/vendor/react/stream/src/DuplexStreamInterface.php new file mode 100644 index 000000000..631ce31e8 --- /dev/null +++ b/vendor/react/stream/src/DuplexStreamInterface.php @@ -0,0 +1,39 @@ + Note that higher-level implementations of this interface may choose to + * define additional events with dedicated semantics not defined as part of + * this low-level stream specification. Conformance with these event semantics + * is out of scope for this interface, so you may also have to refer to the + * documentation of such a higher-level implementation. + * + * @see ReadableStreamInterface + * @see WritableStreamInterface + */ +interface DuplexStreamInterface extends ReadableStreamInterface, WritableStreamInterface +{ +} diff --git a/vendor/react/stream/src/ReadableResourceStream.php b/vendor/react/stream/src/ReadableResourceStream.php new file mode 100644 index 000000000..823360a63 --- /dev/null +++ b/vendor/react/stream/src/ReadableResourceStream.php @@ -0,0 +1,188 @@ +isLegacyPipe($stream)) { + \stream_set_read_buffer($stream, 0); + } + + $this->stream = $stream; + $this->loop = $loop ?: Loop::get(); + $this->bufferSize = ($readChunkSize === null) ? 65536 : (int)$readChunkSize; + + $this->resume(); + } + + public function isReadable() + { + return !$this->closed; + } + + public function pause() + { + if ($this->listening) { + $this->loop->removeReadStream($this->stream); + $this->listening = false; + } + } + + public function resume() + { + if (!$this->listening && !$this->closed) { + $this->loop->addReadStream($this->stream, array($this, 'handleData')); + $this->listening = true; + } + } + + public function pipe(WritableStreamInterface $dest, array $options = array()) + { + return Util::pipe($this, $dest, $options); + } + + public function close() + { + if ($this->closed) { + return; + } + + $this->closed = true; + + $this->emit('close'); + $this->pause(); + $this->removeAllListeners(); + + if (\is_resource($this->stream)) { + \fclose($this->stream); + } + } + + /** @internal */ + public function handleData() + { + $error = null; + \set_error_handler(function ($errno, $errstr, $errfile, $errline) use (&$error) { + $error = new \ErrorException( + $errstr, + 0, + $errno, + $errfile, + $errline + ); + }); + + $data = \stream_get_contents($this->stream, $this->bufferSize); + + \restore_error_handler(); + + if ($error !== null) { + $this->emit('error', array(new \RuntimeException('Unable to read from stream: ' . $error->getMessage(), 0, $error))); + $this->close(); + return; + } + + if ($data !== '') { + $this->emit('data', array($data)); + } elseif (\feof($this->stream)) { + // no data read => we reached the end and close the stream + $this->emit('end'); + $this->close(); + } + } + + /** + * Returns whether this is a pipe resource in a legacy environment + * + * This works around a legacy PHP bug (#61019) that was fixed in PHP 5.4.28+ + * and PHP 5.5.12+ and newer. + * + * @param resource $resource + * @return bool + * @link https://github.com/reactphp/child-process/issues/40 + * + * @codeCoverageIgnore + */ + private function isLegacyPipe($resource) + { + if (\PHP_VERSION_ID < 50428 || (\PHP_VERSION_ID >= 50500 && \PHP_VERSION_ID < 50512)) { + $meta = \stream_get_meta_data($resource); + + if (isset($meta['stream_type']) && $meta['stream_type'] === 'STDIO') { + return true; + } + } + return false; + } +} diff --git a/vendor/react/stream/src/ReadableStreamInterface.php b/vendor/react/stream/src/ReadableStreamInterface.php new file mode 100644 index 000000000..fa3d59cdb --- /dev/null +++ b/vendor/react/stream/src/ReadableStreamInterface.php @@ -0,0 +1,362 @@ +on('data', function ($data) { + * echo $data; + * }); + * ``` + * + * This event MAY be emitted any number of times, which may be zero times if + * this stream does not send any data at all. + * It SHOULD not be emitted after an `end` or `close` event. + * + * The given `$data` argument may be of mixed type, but it's usually + * recommended it SHOULD be a `string` value or MAY use a type that allows + * representation as a `string` for maximum compatibility. + * + * Many common streams (such as a TCP/IP connection or a file-based stream) + * will emit the raw (binary) payload data that is received over the wire as + * chunks of `string` values. + * + * Due to the stream-based nature of this, the sender may send any number + * of chunks with varying sizes. There are no guarantees that these chunks + * will be received with the exact same framing the sender intended to send. + * In other words, many lower-level protocols (such as TCP/IP) transfer the + * data in chunks that may be anywhere between single-byte values to several + * dozens of kilobytes. You may want to apply a higher-level protocol to + * these low-level data chunks in order to achieve proper message framing. + * + * end event: + * The `end` event will be emitted once the source stream has successfully + * reached the end of the stream (EOF). + * + * ```php + * $stream->on('end', function () { + * echo 'END'; + * }); + * ``` + * + * This event SHOULD be emitted once or never at all, depending on whether + * a successful end was detected. + * It SHOULD NOT be emitted after a previous `end` or `close` event. + * It MUST NOT be emitted if the stream closes due to a non-successful + * end, such as after a previous `error` event. + * + * After the stream is ended, it MUST switch to non-readable mode, + * see also `isReadable()`. + * + * This event will only be emitted if the *end* was reached successfully, + * not if the stream was interrupted by an unrecoverable error or explicitly + * closed. Not all streams know this concept of a "successful end". + * Many use-cases involve detecting when the stream closes (terminates) + * instead, in this case you should use the `close` event. + * After the stream emits an `end` event, it SHOULD usually be followed by a + * `close` event. + * + * Many common streams (such as a TCP/IP connection or a file-based stream) + * will emit this event if either the remote side closes the connection or + * a file handle was successfully read until reaching its end (EOF). + * + * Note that this event should not be confused with the `end()` method. + * This event defines a successful end *reading* from a source stream, while + * the `end()` method defines *writing* a successful end to a destination + * stream. + * + * error event: + * The `error` event will be emitted once a fatal error occurs, usually while + * trying to read from this stream. + * The event receives a single `Exception` argument for the error instance. + * + * ```php + * $stream->on('error', function (Exception $e) { + * echo 'Error: ' . $e->getMessage() . PHP_EOL; + * }); + * ``` + * + * This event SHOULD be emitted once the stream detects a fatal error, such + * as a fatal transmission error or after an unexpected `data` or premature + * `end` event. + * It SHOULD NOT be emitted after a previous `error`, `end` or `close` event. + * It MUST NOT be emitted if this is not a fatal error condition, such as + * a temporary network issue that did not cause any data to be lost. + * + * After the stream errors, it MUST close the stream and SHOULD thus be + * followed by a `close` event and then switch to non-readable mode, see + * also `close()` and `isReadable()`. + * + * Many common streams (such as a TCP/IP connection or a file-based stream) + * only deal with data transmission and do not make assumption about data + * boundaries (such as unexpected `data` or premature `end` events). + * In other words, many lower-level protocols (such as TCP/IP) may choose + * to only emit this for a fatal transmission error once and will then + * close (terminate) the stream in response. + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the writable side of the stream also implements an `error` event. + * In other words, an error may occur while either reading or writing the + * stream which should result in the same error processing. + * + * close event: + * The `close` event will be emitted once the stream closes (terminates). + * + * ```php + * $stream->on('close', function () { + * echo 'CLOSED'; + * }); + * ``` + * + * This event SHOULD be emitted once or never at all, depending on whether + * the stream ever terminates. + * It SHOULD NOT be emitted after a previous `close` event. + * + * After the stream is closed, it MUST switch to non-readable mode, + * see also `isReadable()`. + * + * Unlike the `end` event, this event SHOULD be emitted whenever the stream + * closes, irrespective of whether this happens implicitly due to an + * unrecoverable error or explicitly when either side closes the stream. + * If you only want to detect a *successful* end, you should use the `end` + * event instead. + * + * Many common streams (such as a TCP/IP connection or a file-based stream) + * will likely choose to emit this event after reading a *successful* `end` + * event or after a fatal transmission `error` event. + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the writable side of the stream also implements a `close` event. + * In other words, after receiving this event, the stream MUST switch into + * non-writable AND non-readable mode, see also `isWritable()`. + * Note that this event should not be confused with the `end` event. + * + * The event callback functions MUST be a valid `callable` that obeys strict + * parameter definitions and MUST accept event parameters exactly as documented. + * The event callback functions MUST NOT throw an `Exception`. + * The return value of the event callback functions will be ignored and has no + * effect, so for performance reasons you're recommended to not return any + * excessive data structures. + * + * Every implementation of this interface MUST follow these event semantics in + * order to be considered a well-behaving stream. + * + * > Note that higher-level implementations of this interface may choose to + * define additional events with dedicated semantics not defined as part of + * this low-level stream specification. Conformance with these event semantics + * is out of scope for this interface, so you may also have to refer to the + * documentation of such a higher-level implementation. + * + * @see EventEmitterInterface + */ +interface ReadableStreamInterface extends EventEmitterInterface +{ + /** + * Checks whether this stream is in a readable state (not closed already). + * + * This method can be used to check if the stream still accepts incoming + * data events or if it is ended or closed already. + * Once the stream is non-readable, no further `data` or `end` events SHOULD + * be emitted. + * + * ```php + * assert($stream->isReadable() === false); + * + * $stream->on('data', assertNeverCalled()); + * $stream->on('end', assertNeverCalled()); + * ``` + * + * A successfully opened stream always MUST start in readable mode. + * + * Once the stream ends or closes, it MUST switch to non-readable mode. + * This can happen any time, explicitly through `close()` or + * implicitly due to a remote close or an unrecoverable transmission error. + * Once a stream has switched to non-readable mode, it MUST NOT transition + * back to readable mode. + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the writable side of the stream also implements an `isWritable()` + * method. Unless this is a half-open duplex stream, they SHOULD usually + * have the same return value. + * + * @return bool + */ + public function isReadable(); + + /** + * Pauses reading incoming data events. + * + * Removes the data source file descriptor from the event loop. This + * allows you to throttle incoming data. + * + * Unless otherwise noted, a successfully opened stream SHOULD NOT start + * in paused state. + * + * Once the stream is paused, no futher `data` or `end` events SHOULD + * be emitted. + * + * ```php + * $stream->pause(); + * + * $stream->on('data', assertShouldNeverCalled()); + * $stream->on('end', assertShouldNeverCalled()); + * ``` + * + * This method is advisory-only, though generally not recommended, the + * stream MAY continue emitting `data` events. + * + * You can continue processing events by calling `resume()` again. + * + * Note that both methods can be called any number of times, in particular + * calling `pause()` more than once SHOULD NOT have any effect. + * + * @see self::resume() + * @return void + */ + public function pause(); + + /** + * Resumes reading incoming data events. + * + * Re-attach the data source after a previous `pause()`. + * + * ```php + * $stream->pause(); + * + * Loop::addTimer(1.0, function () use ($stream) { + * $stream->resume(); + * }); + * ``` + * + * Note that both methods can be called any number of times, in particular + * calling `resume()` without a prior `pause()` SHOULD NOT have any effect. + * + * @see self::pause() + * @return void + */ + public function resume(); + + /** + * Pipes all the data from this readable source into the given writable destination. + * + * Automatically sends all incoming data to the destination. + * Automatically throttles the source based on what the destination can handle. + * + * ```php + * $source->pipe($dest); + * ``` + * + * Similarly, you can also pipe an instance implementing `DuplexStreamInterface` + * into itself in order to write back all the data that is received. + * This may be a useful feature for a TCP/IP echo service: + * + * ```php + * $connection->pipe($connection); + * ``` + * + * This method returns the destination stream as-is, which can be used to + * set up chains of piped streams: + * + * ```php + * $source->pipe($decodeGzip)->pipe($filterBadWords)->pipe($dest); + * ``` + * + * By default, this will call `end()` on the destination stream once the + * source stream emits an `end` event. This can be disabled like this: + * + * ```php + * $source->pipe($dest, array('end' => false)); + * ``` + * + * Note that this only applies to the `end` event. + * If an `error` or explicit `close` event happens on the source stream, + * you'll have to manually close the destination stream: + * + * ```php + * $source->pipe($dest); + * $source->on('close', function () use ($dest) { + * $dest->end('BYE!'); + * }); + * ``` + * + * If the source stream is not readable (closed state), then this is a NO-OP. + * + * ```php + * $source->close(); + * $source->pipe($dest); // NO-OP + * ``` + * + * If the destinantion stream is not writable (closed state), then this will simply + * throttle (pause) the source stream: + * + * ```php + * $dest->close(); + * $source->pipe($dest); // calls $source->pause() + * ``` + * + * Similarly, if the destination stream is closed while the pipe is still + * active, it will also throttle (pause) the source stream: + * + * ```php + * $source->pipe($dest); + * $dest->close(); // calls $source->pause() + * ``` + * + * Once the pipe is set up successfully, the destination stream MUST emit + * a `pipe` event with this source stream an event argument. + * + * @param WritableStreamInterface $dest + * @param array $options + * @return WritableStreamInterface $dest stream as-is + */ + public function pipe(WritableStreamInterface $dest, array $options = array()); + + /** + * Closes the stream (forcefully). + * + * This method can be used to (forcefully) close the stream. + * + * ```php + * $stream->close(); + * ``` + * + * Once the stream is closed, it SHOULD emit a `close` event. + * Note that this event SHOULD NOT be emitted more than once, in particular + * if this method is called multiple times. + * + * After calling this method, the stream MUST switch into a non-readable + * mode, see also `isReadable()`. + * This means that no further `data` or `end` events SHOULD be emitted. + * + * ```php + * $stream->close(); + * assert($stream->isReadable() === false); + * + * $stream->on('data', assertNeverCalled()); + * $stream->on('end', assertNeverCalled()); + * ``` + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the writable side of the stream also implements a `close()` method. + * In other words, after calling this method, the stream MUST switch into + * non-writable AND non-readable mode, see also `isWritable()`. + * Note that this method should not be confused with the `end()` method. + * + * @return void + * @see WritableStreamInterface::close() + */ + public function close(); +} diff --git a/vendor/react/stream/src/ThroughStream.php b/vendor/react/stream/src/ThroughStream.php new file mode 100644 index 000000000..3b4fbb780 --- /dev/null +++ b/vendor/react/stream/src/ThroughStream.php @@ -0,0 +1,195 @@ +on('data', $this->expectCallableOnceWith('hello')); + * + * $through->write('hello'); + * ``` + * + * Similarly, the [`end()` method](#end) will end the stream and emit an + * [`end` event](#end-event) and then [`close()`](#close-1) the stream. + * The [`close()` method](#close-1) will close the stream and emit a + * [`close` event](#close-event). + * Accordingly, this is can also be used in a [`pipe()`](#pipe) context like this: + * + * ```php + * $through = new ThroughStream(); + * $source->pipe($through)->pipe($dest); + * ``` + * + * Optionally, its constructor accepts any callable function which will then be + * used to *filter* any data written to it. This function receives a single data + * argument as passed to the writable side and must return the data as it will be + * passed to its readable end: + * + * ```php + * $through = new ThroughStream('strtoupper'); + * $source->pipe($through)->pipe($dest); + * ``` + * + * Note that this class makes no assumptions about any data types. This can be + * used to convert data, for example for transforming any structured data into + * a newline-delimited JSON (NDJSON) stream like this: + * + * ```php + * $through = new ThroughStream(function ($data) { + * return json_encode($data) . PHP_EOL; + * }); + * $through->on('data', $this->expectCallableOnceWith("[2, true]\n")); + * + * $through->write(array(2, true)); + * ``` + * + * The callback function is allowed to throw an `Exception`. In this case, + * the stream will emit an `error` event and then [`close()`](#close-1) the stream. + * + * ```php + * $through = new ThroughStream(function ($data) { + * if (!is_string($data)) { + * throw new \UnexpectedValueException('Only strings allowed'); + * } + * return $data; + * }); + * $through->on('error', $this->expectCallableOnce())); + * $through->on('close', $this->expectCallableOnce())); + * $through->on('data', $this->expectCallableNever())); + * + * $through->write(2); + * ``` + * + * @see WritableStreamInterface::write() + * @see WritableStreamInterface::end() + * @see DuplexStreamInterface::close() + * @see WritableStreamInterface::pipe() + */ +final class ThroughStream extends EventEmitter implements DuplexStreamInterface +{ + private $readable = true; + private $writable = true; + private $closed = false; + private $paused = false; + private $drain = false; + private $callback; + + public function __construct($callback = null) + { + if ($callback !== null && !\is_callable($callback)) { + throw new InvalidArgumentException('Invalid transformation callback given'); + } + + $this->callback = $callback; + } + + public function pause() + { + // only allow pause if still readable, false otherwise + $this->paused = $this->readable; + } + + public function resume() + { + $this->paused = false; + + // emit drain event if previous write was paused (throttled) + if ($this->drain) { + $this->drain = false; + $this->emit('drain'); + } + } + + public function pipe(WritableStreamInterface $dest, array $options = array()) + { + return Util::pipe($this, $dest, $options); + } + + public function isReadable() + { + return $this->readable; + } + + public function isWritable() + { + return $this->writable; + } + + public function write($data) + { + if (!$this->writable) { + return false; + } + + if ($this->callback !== null) { + try { + $data = \call_user_func($this->callback, $data); + } catch (\Exception $e) { + $this->emit('error', array($e)); + $this->close(); + + return false; + } + } + + $this->emit('data', array($data)); + + // emit drain event on next resume if currently paused (throttled) + if ($this->paused) { + $this->drain = true; + } + + // continue writing if still writable and not paused (throttled), false otherwise + return $this->writable && !$this->paused; + } + + public function end($data = null) + { + if (!$this->writable) { + return; + } + + if (null !== $data) { + $this->write($data); + + // return if write() already caused the stream to close + if (!$this->writable) { + return; + } + } + + $this->readable = false; + $this->writable = false; + $this->paused = false; + $this->drain = false; + + $this->emit('end'); + $this->close(); + } + + public function close() + { + if ($this->closed) { + return; + } + + $this->readable = false; + $this->writable = false; + $this->paused = false; + $this->drain = false; + + $this->closed = true; + $this->callback = null; + + $this->emit('close'); + $this->removeAllListeners(); + } +} diff --git a/vendor/react/stream/src/Util.php b/vendor/react/stream/src/Util.php new file mode 100644 index 000000000..056b03774 --- /dev/null +++ b/vendor/react/stream/src/Util.php @@ -0,0 +1,75 @@ + NO-OP + if (!$source->isReadable()) { + return $dest; + } + + // destination not writable => just pause() source + if (!$dest->isWritable()) { + $source->pause(); + + return $dest; + } + + $dest->emit('pipe', array($source)); + + // forward all source data events as $dest->write() + $source->on('data', $dataer = function ($data) use ($source, $dest) { + $feedMore = $dest->write($data); + + if (false === $feedMore) { + $source->pause(); + } + }); + $dest->on('close', function () use ($source, $dataer) { + $source->removeListener('data', $dataer); + $source->pause(); + }); + + // forward destination drain as $source->resume() + $dest->on('drain', $drainer = function () use ($source) { + $source->resume(); + }); + $source->on('close', function () use ($dest, $drainer) { + $dest->removeListener('drain', $drainer); + }); + + // forward end event from source as $dest->end() + $end = isset($options['end']) ? $options['end'] : true; + if ($end) { + $source->on('end', $ender = function () use ($dest) { + $dest->end(); + }); + $dest->on('close', function () use ($source, $ender) { + $source->removeListener('end', $ender); + }); + } + + return $dest; + } + + public static function forwardEvents($source, $target, array $events) + { + foreach ($events as $event) { + $source->on($event, function () use ($event, $target) { + $target->emit($event, \func_get_args()); + }); + } + } +} diff --git a/vendor/react/stream/src/WritableResourceStream.php b/vendor/react/stream/src/WritableResourceStream.php new file mode 100644 index 000000000..e3a7e74da --- /dev/null +++ b/vendor/react/stream/src/WritableResourceStream.php @@ -0,0 +1,178 @@ +stream = $stream; + $this->loop = $loop ?: Loop::get(); + $this->softLimit = ($writeBufferSoftLimit === null) ? 65536 : (int)$writeBufferSoftLimit; + $this->writeChunkSize = ($writeChunkSize === null) ? -1 : (int)$writeChunkSize; + } + + public function isWritable() + { + return $this->writable; + } + + public function write($data) + { + if (!$this->writable) { + return false; + } + + $this->data .= $data; + + if (!$this->listening && $this->data !== '') { + $this->listening = true; + + $this->loop->addWriteStream($this->stream, array($this, 'handleWrite')); + } + + return !isset($this->data[$this->softLimit - 1]); + } + + public function end($data = null) + { + if (null !== $data) { + $this->write($data); + } + + $this->writable = false; + + // close immediately if buffer is already empty + // otherwise wait for buffer to flush first + if ($this->data === '') { + $this->close(); + } + } + + public function close() + { + if ($this->closed) { + return; + } + + if ($this->listening) { + $this->listening = false; + $this->loop->removeWriteStream($this->stream); + } + + $this->closed = true; + $this->writable = false; + $this->data = ''; + + $this->emit('close'); + $this->removeAllListeners(); + + if (\is_resource($this->stream)) { + \fclose($this->stream); + } + } + + /** @internal */ + public function handleWrite() + { + $error = null; + \set_error_handler(function ($_, $errstr) use (&$error) { + $error = $errstr; + }); + + if ($this->writeChunkSize === -1) { + $sent = \fwrite($this->stream, $this->data); + } else { + $sent = \fwrite($this->stream, $this->data, $this->writeChunkSize); + } + + \restore_error_handler(); + + // Only report errors if *nothing* could be sent and an error has been raised. + // Ignore non-fatal warnings if *some* data could be sent. + // Any hard (permanent) error will fail to send any data at all. + // Sending excessive amounts of data will only flush *some* data and then + // report a temporary error (EAGAIN) which we do not raise here in order + // to keep the stream open for further tries to write. + // Should this turn out to be a permanent error later, it will eventually + // send *nothing* and we can detect this. + if (($sent === 0 || $sent === false) && $error !== null) { + $this->emit('error', array(new \RuntimeException('Unable to write to stream: ' . $error))); + $this->close(); + + return; + } + + $exceeded = isset($this->data[$this->softLimit - 1]); + $this->data = (string) \substr($this->data, $sent); + + // buffer has been above limit and is now below limit + if ($exceeded && !isset($this->data[$this->softLimit - 1])) { + $this->emit('drain'); + } + + // buffer is now completely empty => stop trying to write + if ($this->data === '') { + // stop waiting for resource to be writable + if ($this->listening) { + $this->loop->removeWriteStream($this->stream); + $this->listening = false; + } + + // buffer is end()ing and now completely empty => close buffer + if (!$this->writable) { + $this->close(); + } + } + } +} diff --git a/vendor/react/stream/src/WritableStreamInterface.php b/vendor/react/stream/src/WritableStreamInterface.php new file mode 100644 index 000000000..e2625928c --- /dev/null +++ b/vendor/react/stream/src/WritableStreamInterface.php @@ -0,0 +1,347 @@ +on('drain', function () use ($stream) { + * echo 'Stream is now ready to accept more data'; + * }); + * ``` + * + * This event SHOULD be emitted once every time the buffer became full + * previously and is now ready to accept more data. + * In other words, this event MAY be emitted any number of times, which may + * be zero times if the buffer never became full in the first place. + * This event SHOULD NOT be emitted if the buffer has not become full + * previously. + * + * This event is mostly used internally, see also `write()` for more details. + * + * pipe event: + * The `pipe` event will be emitted whenever a readable stream is `pipe()`d + * into this stream. + * The event receives a single `ReadableStreamInterface` argument for the + * source stream. + * + * ```php + * $stream->on('pipe', function (ReadableStreamInterface $source) use ($stream) { + * echo 'Now receiving piped data'; + * + * // explicitly close target if source emits an error + * $source->on('error', function () use ($stream) { + * $stream->close(); + * }); + * }); + * + * $source->pipe($stream); + * ``` + * + * This event MUST be emitted once for each readable stream that is + * successfully piped into this destination stream. + * In other words, this event MAY be emitted any number of times, which may + * be zero times if no stream is ever piped into this stream. + * This event MUST NOT be emitted if either the source is not readable + * (closed already) or this destination is not writable (closed already). + * + * This event is mostly used internally, see also `pipe()` for more details. + * + * error event: + * The `error` event will be emitted once a fatal error occurs, usually while + * trying to write to this stream. + * The event receives a single `Exception` argument for the error instance. + * + * ```php + * $stream->on('error', function (Exception $e) { + * echo 'Error: ' . $e->getMessage() . PHP_EOL; + * }); + * ``` + * + * This event SHOULD be emitted once the stream detects a fatal error, such + * as a fatal transmission error. + * It SHOULD NOT be emitted after a previous `error` or `close` event. + * It MUST NOT be emitted if this is not a fatal error condition, such as + * a temporary network issue that did not cause any data to be lost. + * + * After the stream errors, it MUST close the stream and SHOULD thus be + * followed by a `close` event and then switch to non-writable mode, see + * also `close()` and `isWritable()`. + * + * Many common streams (such as a TCP/IP connection or a file-based stream) + * only deal with data transmission and may choose + * to only emit this for a fatal transmission error once and will then + * close (terminate) the stream in response. + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the readable side of the stream also implements an `error` event. + * In other words, an error may occur while either reading or writing the + * stream which should result in the same error processing. + * + * close event: + * The `close` event will be emitted once the stream closes (terminates). + * + * ```php + * $stream->on('close', function () { + * echo 'CLOSED'; + * }); + * ``` + * + * This event SHOULD be emitted once or never at all, depending on whether + * the stream ever terminates. + * It SHOULD NOT be emitted after a previous `close` event. + * + * After the stream is closed, it MUST switch to non-writable mode, + * see also `isWritable()`. + * + * This event SHOULD be emitted whenever the stream closes, irrespective of + * whether this happens implicitly due to an unrecoverable error or + * explicitly when either side closes the stream. + * + * Many common streams (such as a TCP/IP connection or a file-based stream) + * will likely choose to emit this event after flushing the buffer from + * the `end()` method, after receiving a *successful* `end` event or after + * a fatal transmission `error` event. + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the readable side of the stream also implements a `close` event. + * In other words, after receiving this event, the stream MUST switch into + * non-writable AND non-readable mode, see also `isReadable()`. + * Note that this event should not be confused with the `end` event. + * + * The event callback functions MUST be a valid `callable` that obeys strict + * parameter definitions and MUST accept event parameters exactly as documented. + * The event callback functions MUST NOT throw an `Exception`. + * The return value of the event callback functions will be ignored and has no + * effect, so for performance reasons you're recommended to not return any + * excessive data structures. + * + * Every implementation of this interface MUST follow these event semantics in + * order to be considered a well-behaving stream. + * + * > Note that higher-level implementations of this interface may choose to + * define additional events with dedicated semantics not defined as part of + * this low-level stream specification. Conformance with these event semantics + * is out of scope for this interface, so you may also have to refer to the + * documentation of such a higher-level implementation. + * + * @see EventEmitterInterface + * @see DuplexStreamInterface + */ +interface WritableStreamInterface extends EventEmitterInterface +{ + /** + * Checks whether this stream is in a writable state (not closed already). + * + * This method can be used to check if the stream still accepts writing + * any data or if it is ended or closed already. + * Writing any data to a non-writable stream is a NO-OP: + * + * ```php + * assert($stream->isWritable() === false); + * + * $stream->write('end'); // NO-OP + * $stream->end('end'); // NO-OP + * ``` + * + * A successfully opened stream always MUST start in writable mode. + * + * Once the stream ends or closes, it MUST switch to non-writable mode. + * This can happen any time, explicitly through `end()` or `close()` or + * implicitly due to a remote close or an unrecoverable transmission error. + * Once a stream has switched to non-writable mode, it MUST NOT transition + * back to writable mode. + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the readable side of the stream also implements an `isReadable()` + * method. Unless this is a half-open duplex stream, they SHOULD usually + * have the same return value. + * + * @return bool + */ + public function isWritable(); + + /** + * Write some data into the stream. + * + * A successful write MUST be confirmed with a boolean `true`, which means + * that either the data was written (flushed) immediately or is buffered and + * scheduled for a future write. Note that this interface gives you no + * control over explicitly flushing the buffered data, as finding the + * appropriate time for this is beyond the scope of this interface and left + * up to the implementation of this interface. + * + * Many common streams (such as a TCP/IP connection or file-based stream) + * may choose to buffer all given data and schedule a future flush by using + * an underlying EventLoop to check when the resource is actually writable. + * + * If a stream cannot handle writing (or flushing) the data, it SHOULD emit + * an `error` event and MAY `close()` the stream if it can not recover from + * this error. + * + * If the internal buffer is full after adding `$data`, then `write()` + * SHOULD return `false`, indicating that the caller should stop sending + * data until the buffer drains. + * The stream SHOULD send a `drain` event once the buffer is ready to accept + * more data. + * + * Similarly, if the stream is not writable (already in a closed state) + * it MUST NOT process the given `$data` and SHOULD return `false`, + * indicating that the caller should stop sending data. + * + * The given `$data` argument MAY be of mixed type, but it's usually + * recommended it SHOULD be a `string` value or MAY use a type that allows + * representation as a `string` for maximum compatibility. + * + * Many common streams (such as a TCP/IP connection or a file-based stream) + * will only accept the raw (binary) payload data that is transferred over + * the wire as chunks of `string` values. + * + * Due to the stream-based nature of this, the sender may send any number + * of chunks with varying sizes. There are no guarantees that these chunks + * will be received with the exact same framing the sender intended to send. + * In other words, many lower-level protocols (such as TCP/IP) transfer the + * data in chunks that may be anywhere between single-byte values to several + * dozens of kilobytes. You may want to apply a higher-level protocol to + * these low-level data chunks in order to achieve proper message framing. + * + * @param mixed|string $data + * @return bool + */ + public function write($data); + + /** + * Successfully ends the stream (after optionally sending some final data). + * + * This method can be used to successfully end the stream, i.e. close + * the stream after sending out all data that is currently buffered. + * + * ```php + * $stream->write('hello'); + * $stream->write('world'); + * $stream->end(); + * ``` + * + * If there's no data currently buffered and nothing to be flushed, then + * this method MAY `close()` the stream immediately. + * + * If there's still data in the buffer that needs to be flushed first, then + * this method SHOULD try to write out this data and only then `close()` + * the stream. + * Once the stream is closed, it SHOULD emit a `close` event. + * + * Note that this interface gives you no control over explicitly flushing + * the buffered data, as finding the appropriate time for this is beyond the + * scope of this interface and left up to the implementation of this + * interface. + * + * Many common streams (such as a TCP/IP connection or file-based stream) + * may choose to buffer all given data and schedule a future flush by using + * an underlying EventLoop to check when the resource is actually writable. + * + * You can optionally pass some final data that is written to the stream + * before ending the stream. If a non-`null` value is given as `$data`, then + * this method will behave just like calling `write($data)` before ending + * with no data. + * + * ```php + * // shorter version + * $stream->end('bye'); + * + * // same as longer version + * $stream->write('bye'); + * $stream->end(); + * ``` + * + * After calling this method, the stream MUST switch into a non-writable + * mode, see also `isWritable()`. + * This means that no further writes are possible, so any additional + * `write()` or `end()` calls have no effect. + * + * ```php + * $stream->end(); + * assert($stream->isWritable() === false); + * + * $stream->write('nope'); // NO-OP + * $stream->end(); // NO-OP + * ``` + * + * If this stream is a `DuplexStreamInterface`, calling this method SHOULD + * also end its readable side, unless the stream supports half-open mode. + * In other words, after calling this method, these streams SHOULD switch + * into non-writable AND non-readable mode, see also `isReadable()`. + * This implies that in this case, the stream SHOULD NOT emit any `data` + * or `end` events anymore. + * Streams MAY choose to use the `pause()` method logic for this, but + * special care may have to be taken to ensure a following call to the + * `resume()` method SHOULD NOT continue emitting readable events. + * + * Note that this method should not be confused with the `close()` method. + * + * @param mixed|string|null $data + * @return void + */ + public function end($data = null); + + /** + * Closes the stream (forcefully). + * + * This method can be used to forcefully close the stream, i.e. close + * the stream without waiting for any buffered data to be flushed. + * If there's still data in the buffer, this data SHOULD be discarded. + * + * ```php + * $stream->close(); + * ``` + * + * Once the stream is closed, it SHOULD emit a `close` event. + * Note that this event SHOULD NOT be emitted more than once, in particular + * if this method is called multiple times. + * + * After calling this method, the stream MUST switch into a non-writable + * mode, see also `isWritable()`. + * This means that no further writes are possible, so any additional + * `write()` or `end()` calls have no effect. + * + * ```php + * $stream->close(); + * assert($stream->isWritable() === false); + * + * $stream->write('nope'); // NO-OP + * $stream->end(); // NO-OP + * ``` + * + * Note that this method should not be confused with the `end()` method. + * Unlike the `end()` method, this method does not take care of any existing + * buffers and simply discards any buffer contents. + * Likewise, this method may also be called after calling `end()` on a + * stream in order to stop waiting for the stream to flush its final data. + * + * ```php + * $stream->end(); + * Loop::addTimer(1.0, function () use ($stream) { + * $stream->close(); + * }); + * ``` + * + * If this stream is a `DuplexStreamInterface`, you should also notice + * how the readable side of the stream also implements a `close()` method. + * In other words, after calling this method, the stream MUST switch into + * non-writable AND non-readable mode, see also `isReadable()`. + * + * @return void + * @see ReadableStreamInterface::close() + */ + public function close(); +} diff --git a/vendor/rector/rector/bin/rector b/vendor/rector/rector/bin/rector index c3ed5aa3a..dd6feebe1 100755 --- a/vendor/rector/rector/bin/rector +++ b/vendor/rector/rector/bin/rector @@ -1,5 +1,5 @@ #!/usr/bin/env php 'mb_ereg_search_getregs', 'mbereg_search_getpos' => 'mb_ereg_search_getpos', ]); - $rectorConfig->rules([StringifyStrNeedlesRector::class, RegexDashEscapeRector::class, ContinueToBreakInSwitchRector::class, SetCookieRector::class, IsCountableRector::class, ArrayKeyFirstLastRector::class, SensitiveDefineRector::class, SensitiveConstantNameRector::class, SensitiveHereNowDocRector::class]); + $rectorConfig->rules([StringifyStrNeedlesRector::class, RegexDashEscapeRector::class, SetCookieRector::class, IsCountableRector::class, ArrayKeyFirstLastRector::class, SensitiveDefineRector::class, SensitiveConstantNameRector::class, SensitiveHereNowDocRector::class]); }; diff --git a/vendor/rector/rector/config/set/php74.php b/vendor/rector/rector/config/set/php74.php index 13ba31745..8e961f492 100644 --- a/vendor/rector/rector/config/set/php74.php +++ b/vendor/rector/rector/config/set/php74.php @@ -1,7 +1,7 @@ rules([AddOverrideAttributeToOverriddenMethodsRector::class, AddTypeToConstRector::class, CombineHostPortLdapUriRector::class]); + $rectorConfig->rules([AddOverrideAttributeToOverriddenMethodsRector::class, AddTypeToConstRector::class, CombineHostPortLdapUriRector::class, RemoveGetClassGetParentClassNoArgsRector::class]); }; diff --git a/vendor/rector/rector/config/set/php84.php b/vendor/rector/rector/config/set/php84.php index 2b67732ea..91ef55118 100644 --- a/vendor/rector/rector/config/set/php84.php +++ b/vendor/rector/rector/config/set/php84.php @@ -1,7 +1,7 @@ staticTypeMapper = $staticTypeMapper; + } + public function createFromPropertyTagValueNode(PropertyTagValueNode $propertyTagValueNode, Class_ $class, string $propertyName) : Property + { + $propertyProperty = new PropertyProperty($propertyName); + $propertyTypeNode = $this->createPropertyTypeNode($propertyTagValueNode, $class); + return new Property(Class_::MODIFIER_PRIVATE, [$propertyProperty], [], $propertyTypeNode); + } + /** + * @return \PhpParser\Node\Name|\PhpParser\Node\ComplexType|\PhpParser\Node\Identifier|null + */ + public function createPropertyTypeNode(PropertyTagValueNode $propertyTagValueNode, Class_ $class, bool $isNullable = \true) + { + $propertyType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($propertyTagValueNode->type, $class); + $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); + if ($isNullable && !$typeNode instanceof NullableType && !$typeNode instanceof ComplexType && $typeNode instanceof Node) { + return new NullableType($typeNode); + } + return $typeNode; + } +} diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php new file mode 100644 index 000000000..8829edb50 --- /dev/null +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php @@ -0,0 +1,223 @@ +phpAttributeAnalyzer = $phpAttributeAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->phpDocTagRemover = $phpDocTagRemover; + $this->docBlockUpdater = $docBlockUpdater; + $this->typedPropertyFactory = $typedPropertyFactory; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->valueResolver = $valueResolver; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Turn dynamic docblock properties on class with no parents to explicit ones', [new CodeSample(<<<'CODE_SAMPLE' +/** + * @property SomeDependency $someDependency + */ +#[\AllowDynamicProperties] +final class SomeClass +{ + public function __construct() + { + $this->someDependency = new SomeDependency(); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +final class SomeClass +{ + private SomeDependency $someDependency; + + public function __construct() + { + $this->someDependency = new SomeDependency(); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->phpAttributeAnalyzer->hasPhpAttribute($node, 'AllowDynamicProperties')) { + return null; + } + if ($this->shouldSkipClass($node)) { + return null; + } + // 2. add defined @property explicitly + $classPhpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + if (!$classPhpDocInfo instanceof PhpDocInfo) { + return null; + } + $propertyPhpDocTagNodes = $classPhpDocInfo->getTagsByName('property'); + if ($propertyPhpDocTagNodes === []) { + return null; + } + // 1. remove dynamic attribute, most likely any + foreach ($node->attrGroups as $key => $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + if ($attr->name->toString() === 'AllowDynamicProperties') { + unset($node->attrGroups[$key]); + continue 2; + } + } + } + $node->attrGroups = \array_values($node->attrGroups); + $newProperties = $this->createNewPropertyFromPropertyTagValueNodes($propertyPhpDocTagNodes, $node); + // remove property tags + foreach ($propertyPhpDocTagNodes as $propertyPhpDocTagNode) { + // remove from docblock + $this->phpDocTagRemover->removeTagValueFromNode($classPhpDocInfo, $propertyPhpDocTagNode); + } + // merge new properties to start of the file + $node->stmts = \array_merge($newProperties, $node->stmts); + // update doc info + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::DEPRECATE_DYNAMIC_PROPERTIES; + } + /** + * @param PhpDocTagNode[] $propertyPhpDocTagNodes + * @return Property[] + */ + private function createNewPropertyFromPropertyTagValueNodes(array $propertyPhpDocTagNodes, Class_ $class) : array + { + $newProperties = []; + foreach ($propertyPhpDocTagNodes as $propertyPhpDocTagNode) { + // add explicit native property + $propertyTagValueNode = $propertyPhpDocTagNode->value; + if (!$propertyTagValueNode instanceof PropertyTagValueNode) { + continue; + } + $propertyName = \ltrim($propertyTagValueNode->propertyName, '$'); + if ($this->isPromotedProperty($class, $propertyName)) { + continue; + } + // is property already defined? + if ($class->getProperty($propertyName)) { + // improve exising one type if needed + $existingProperty = $class->getProperty($propertyName); + if ($existingProperty->type !== null) { + continue; + } + $defaultValue = $existingProperty->props[0]->default; + $isNullable = $defaultValue instanceof Expr && $this->valueResolver->isNull($defaultValue); + $existingProperty->type = $this->typedPropertyFactory->createPropertyTypeNode($propertyTagValueNode, $class, $isNullable); + continue; + } + $newProperties[] = $this->typedPropertyFactory->createFromPropertyTagValueNode($propertyTagValueNode, $class, $propertyName); + } + return $newProperties; + } + private function shouldSkipClass(Class_ $class) : bool + { + // skip magic + $getClassMethod = $class->getMethod('__get'); + if ($getClassMethod instanceof ClassMethod) { + return \true; + } + $setClassMethod = $class->getMethod('__set'); + if ($setClassMethod instanceof ClassMethod) { + return \true; + } + if (!$class->extends instanceof Node) { + return \false; + } + return !$this->testsNodeAnalyzer->isInTestClass($class); + } + private function isPromotedProperty(Class_ $class, string $propertyName) : bool + { + $constructClassMethod = $class->getMethod(MethodName::CONSTRUCT); + if ($constructClassMethod instanceof ClassMethod) { + foreach ($constructClassMethod->params as $param) { + if (!$param->flags) { + continue; + } + $paramName = $this->getName($param->var); + if ($paramName === $propertyName) { + return \true; + } + } + } + return \false; + } +} diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php index f415e0bc5..6a411353d 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\Concat; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Scalar\String_; @@ -66,6 +66,11 @@ public function refactor(Node $node) : ?Node if (!$node->right instanceof String_) { return null; } + $leftStartLine = $node->left->getStartLine(); + $rightStartLine = $node->right->getStartLine(); + if ($leftStartLine > 0 && $rightStartLine > 0 && $rightStartLine > $leftStartLine) { + return null; + } return $this->joinConcatIfStrings($node->left, $node->right); } private function joinConcatIfStrings(String_ $leftString, String_ $rightString) : ?String_ diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php index edc6cf952..e8d8eac7d 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php @@ -119,6 +119,10 @@ private function isAppend(Stmt $stmt, array $emptyArrayVariables) : bool return NodeTraverser::STOP_TRAVERSAL; } } + if ($subNode instanceof Assign && $subNode->var instanceof Variable && $this->isNames($subNode->var, $emptyArrayVariables) && !$this->valueResolver->isValue($subNode->expr, [])) { + $isAppend = \true; + return NodeTraverser::STOP_TRAVERSAL; + } return null; }); return $isAppend; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php index a91f3ce45..877da71b9 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\FuncCall; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Scalar\String_; use Rector\NodeNameResolver\Regex\RegexPatternDetector; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php index a9be33eb0..f0c997963 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\FuncCall; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php index 24000bcba..800f1c9ab 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; @@ -20,7 +21,9 @@ use PhpParser\Node\Scalar\DNumber; use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; +use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\ElseIf_; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; @@ -91,8 +94,9 @@ public function getNodeTypes() : array } /** * @param If_|ElseIf_|Ternary $node + * @return null|Stmt[]|Node */ - public function refactor(Node $node) : ?Node + public function refactor(Node $node) { // skip short ternary if ($node instanceof Ternary && !$node->if instanceof Expr) { @@ -116,6 +120,13 @@ public function refactor(Node $node) : ?Node if (!$binaryOp instanceof BinaryOp) { return null; } + if ($node instanceof If_ && $node->cond instanceof Assign && $binaryOp->left instanceof NotIdentical && $binaryOp->right instanceof NotIdentical) { + $expression = new Expression($node->cond); + $binaryOp->left->left = $node->cond->var; + $binaryOp->right->left = $node->cond->var; + $node->cond = $binaryOp; + return [$expression, $node]; + } $node->cond = $binaryOp; return $node; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php index 51c7ec540..d74f476cb 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; @@ -65,6 +66,12 @@ public function refactor(Node $node) : ?StmtsAwareInterface if (!$stmt instanceof If_) { continue; } + if ($stmt->else instanceof Else_) { + continue; + } + if ($stmt->elseifs !== []) { + continue; + } if (!isset($node->stmts[$key + 1])) { return null; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php index d73692c17..63fcdb3d6 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php @@ -118,9 +118,6 @@ private function shouldSkipIfAndReturn(If_ $if, Return_ $return) : bool if ($if->elseifs !== []) { return \true; } - if ($this->isElseSeparatedThenIf($if)) { - return \true; - } if (!$this->isIfWithSingleReturnExpr($if)) { return \true; } @@ -172,26 +169,12 @@ private function processReturnFalse(If_ $if, Return_ $nextReturn) : ?Return_ } return new Return_($this->exprBoolCaster->boolCastOrNullCompareIfNeeded(new BooleanNot($if->cond))); } - /** - * Matches: "else if" - */ - private function isElseSeparatedThenIf(If_ $if) : bool - { - if (!$if->else instanceof Else_) { - return \false; - } - if (\count($if->else->stmts) !== 1) { - return \false; - } - $onlyStmt = $if->else->stmts[0]; - return $onlyStmt instanceof If_; - } private function isIfWithSingleReturnExpr(If_ $if) : bool { if (\count($if->stmts) !== 1) { return \false; } - if ($if->elseifs !== []) { + if ($if->else instanceof Else_ || $if->elseifs !== []) { return \false; } $ifInnerNode = $if->stmts[0]; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php index 094796f66..74a93b3b5 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\Include_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\Include_; diff --git a/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php b/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php index 8d0142c10..406ad6aa7 100644 --- a/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php +++ b/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Application; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Declare_; diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index 08a5b80c4..9166d9f30 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; diff --git a/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php b/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php index 30e1cff5e..6ce8dab39 100644 --- a/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php +++ b/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Naming; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassLike; diff --git a/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php b/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php index 58c887936..aedfd4c44 100644 --- a/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php +++ b/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\NodeAnalyzer; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\GroupUse; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php index a81e7022f..48a7df6ba 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\Catch_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Closure; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php index 28b8c779c..07117271f 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php @@ -114,7 +114,7 @@ public function refactor(Node $node) : ?Node /** @var ReflectionMethod $parentReflectionMethod */ $parentReflectionMethod = $nativeClassReflection->getMethod($methodName); if ($this->isClassMethodCompatibleWithParentReflectionMethod($classMethod, $parentReflectionMethod)) { - continue; + continue 2; } $this->changeClassMethodVisibilityBasedOnReflectionMethod($classMethod, $parentReflectionMethod); $hasChanged = \true; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php index 374869ac5..1f2a97244 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\Encapsed; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php index f1d93e4e4..e4935e32a 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\Stmt; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Namespace_; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php index 990ebb79a..dcfb2ee6b 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\String_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Name\FullyQualified; diff --git a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php index c7551fda8..e950f7e00 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php @@ -7,12 +7,15 @@ use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; +use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Variable; use PHPStan\Reflection\ClassReflection; +use PHPStan\Type\MixedType; use Rector\NodeAnalyzer\ExprAnalyzer; +use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Reflection\ReflectionResolver; final class SafeLeftTypeBooleanAndOrAnalyzer @@ -32,11 +35,17 @@ final class SafeLeftTypeBooleanAndOrAnalyzer * @var \Rector\Reflection\ReflectionResolver */ private $reflectionResolver; - public function __construct(BetterNodeFinder $betterNodeFinder, ExprAnalyzer $exprAnalyzer, ReflectionResolver $reflectionResolver) + /** + * @readonly + * @var \Rector\NodeTypeResolver\NodeTypeResolver + */ + private $nodeTypeResolver; + public function __construct(BetterNodeFinder $betterNodeFinder, ExprAnalyzer $exprAnalyzer, ReflectionResolver $reflectionResolver, NodeTypeResolver $nodeTypeResolver) { $this->betterNodeFinder = $betterNodeFinder; $this->exprAnalyzer = $exprAnalyzer; $this->reflectionResolver = $reflectionResolver; + $this->nodeTypeResolver = $nodeTypeResolver; } /** * @param \PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BinaryOp\BooleanOr $booleanAnd @@ -61,6 +70,12 @@ public function isSafe($booleanAnd) : bool if ($classReflection instanceof ClassReflection && $classReflection->isTrait()) { return !$booleanAnd->left instanceof Instanceof_; } - return \true; + return !(bool) $this->betterNodeFinder->findFirst($booleanAnd->left, function (Node $node) : bool { + if (!$node instanceof CallLike) { + return \false; + } + $nativeType = $this->nodeTypeResolver->getNativeType($node); + return $nativeType instanceof MixedType && !$nativeType->isExplicitMixed(); + }); } } diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php index ef4831f6d..1f9351ce5 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php @@ -11,10 +11,12 @@ use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareUnionTypeNode; use Rector\DeadCode\PhpDoc\Guard\StandaloneTypeRemovalGuard; +use Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard; use Rector\DeadCode\TypeNodeAnalyzer\GenericTypeNodeAnalyzer; use Rector\DeadCode\TypeNodeAnalyzer\MixedArrayTypeNodeAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; +use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\NodeAnalyzer\ParamAnalyzer; final class DeadParamTagValueNodeAnalyzer { @@ -53,7 +55,17 @@ final class DeadParamTagValueNodeAnalyzer * @var \Rector\DeadCode\PhpDoc\Guard\StandaloneTypeRemovalGuard */ private $standaloneTypeRemovalGuard; - public function __construct(NodeNameResolver $nodeNameResolver, TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer, ParamAnalyzer $paramAnalyzer, PhpDocTypeChanger $phpDocTypeChanger, StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard) + /** + * @readonly + * @var \Rector\StaticTypeMapper\StaticTypeMapper + */ + private $staticTypeMapper; + /** + * @readonly + * @var \Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard + */ + private $templateTypeRemovalGuard; + public function __construct(NodeNameResolver $nodeNameResolver, TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer, ParamAnalyzer $paramAnalyzer, PhpDocTypeChanger $phpDocTypeChanger, StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard, StaticTypeMapper $staticTypeMapper, TemplateTypeRemovalGuard $templateTypeRemovalGuard) { $this->nodeNameResolver = $nodeNameResolver; $this->typeComparator = $typeComparator; @@ -62,6 +74,8 @@ public function __construct(NodeNameResolver $nodeNameResolver, TypeComparator $ $this->paramAnalyzer = $paramAnalyzer; $this->phpDocTypeChanger = $phpDocTypeChanger; $this->standaloneTypeRemovalGuard = $standaloneTypeRemovalGuard; + $this->staticTypeMapper = $staticTypeMapper; + $this->templateTypeRemovalGuard = $templateTypeRemovalGuard; } public function isDead(ParamTagValueNode $paramTagValueNode, FunctionLike $functionLike) : bool { @@ -75,6 +89,10 @@ public function isDead(ParamTagValueNode $paramTagValueNode, FunctionLike $funct if ($paramTagValueNode->description !== '') { return \false; } + $docType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($paramTagValueNode->type, $functionLike); + if (!$this->templateTypeRemovalGuard->isLegal($docType)) { + return \false; + } if ($param->type instanceof Name && $this->nodeNameResolver->isName($param->type, 'object')) { return $paramTagValueNode->type instanceof IdentifierTypeNode && (string) $paramTagValueNode->type === 'object'; } diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php index b3044e6c6..020e61023 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php @@ -16,6 +16,7 @@ use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareUnionTypeNode; use Rector\DeadCode\PhpDoc\Guard\StandaloneTypeRemovalGuard; +use Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard; use Rector\DeadCode\TypeNodeAnalyzer\GenericTypeNodeAnalyzer; use Rector\DeadCode\TypeNodeAnalyzer\MixedArrayTypeNodeAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -53,7 +54,12 @@ final class DeadReturnTagValueNodeAnalyzer * @var \Rector\StaticTypeMapper\StaticTypeMapper */ private $staticTypeMapper; - public function __construct(TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer, StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard, PhpDocTypeChanger $phpDocTypeChanger, StaticTypeMapper $staticTypeMapper) + /** + * @readonly + * @var \Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard + */ + private $templateTypeRemovalGuard; + public function __construct(TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer, StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard, PhpDocTypeChanger $phpDocTypeChanger, StaticTypeMapper $staticTypeMapper, TemplateTypeRemovalGuard $templateTypeRemovalGuard) { $this->typeComparator = $typeComparator; $this->genericTypeNodeAnalyzer = $genericTypeNodeAnalyzer; @@ -61,6 +67,7 @@ public function __construct(TypeComparator $typeComparator, GenericTypeNodeAnaly $this->standaloneTypeRemovalGuard = $standaloneTypeRemovalGuard; $this->phpDocTypeChanger = $phpDocTypeChanger; $this->staticTypeMapper = $staticTypeMapper; + $this->templateTypeRemovalGuard = $templateTypeRemovalGuard; } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_ $functionLike @@ -74,6 +81,10 @@ public function isDead(ReturnTagValueNode $returnTagValueNode, $functionLike) : if ($returnTagValueNode->description !== '') { return \false; } + $docType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($returnTagValueNode->type, $functionLike); + if (!$this->templateTypeRemovalGuard->isLegal($docType)) { + return \false; + } $scope = $functionLike->getAttribute(AttributeKey::SCOPE); if ($scope instanceof Scope && $scope->isInTrait() && $returnTagValueNode->type instanceof ThisTypeNode) { return \false; diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php index 905617a85..e2f953d6b 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php @@ -9,6 +9,7 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; +use Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; use Rector\StaticTypeMapper\StaticTypeMapper; final class DeadVarTagValueNodeAnalyzer @@ -23,10 +24,16 @@ final class DeadVarTagValueNodeAnalyzer * @var \Rector\StaticTypeMapper\StaticTypeMapper */ private $staticTypeMapper; - public function __construct(TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper) + /** + * @readonly + * @var \Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard + */ + private $templateTypeRemovalGuard; + public function __construct(TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper, TemplateTypeRemovalGuard $templateTypeRemovalGuard) { $this->typeComparator = $typeComparator; $this->staticTypeMapper = $staticTypeMapper; + $this->templateTypeRemovalGuard = $templateTypeRemovalGuard; } public function isDead(VarTagValueNode $varTagValueNode, Property $property) : bool { @@ -39,6 +46,9 @@ public function isDead(VarTagValueNode $varTagValueNode, Property $property) : b // is strict type superior to doc type? keep strict type only $propertyType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($property->type); $docType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($varTagValueNode->type, $property); + if (!$this->templateTypeRemovalGuard->isLegal($docType)) { + return \false; + } if ($propertyType instanceof UnionType && !$docType instanceof UnionType) { return !$docType instanceof IntersectionType; } diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php new file mode 100644 index 000000000..c93146d2c --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php @@ -0,0 +1,26 @@ +getTypes() : [$docType]; + foreach ($types as $type) { + if ($type instanceof TemplateType) { + return \false; + } + } + return \true; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php index 9c0b8084c..d3e97eac0 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\DeadCode\PhpDoc\TagRemover; +use PhpParser\Node; use PhpParser\Node\Param; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Property; @@ -74,6 +75,20 @@ public function removeVarTagIfUseless(PhpDocInfo $phpDocInfo, Property $property $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($property); return \true; } + /** + * @api generic + */ + public function removeVarTag(Node $node) : bool + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $varTagValueNode = $phpDocInfo->getVarTagValueNode(); + if (!$varTagValueNode instanceof VarTagValueNode) { + return \false; + } + $phpDocInfo->removeByType(VarTagValueNode::class); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return \true; + } /** * @param \PhpParser\Node\Stmt\Expression|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $node */ diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php index 568759f07..4d4800186 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php @@ -17,7 +17,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\DeadCode\Rector\ClassLike\RemoveAnnotationRector\RemoveAnnotationRectorTest */ diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php new file mode 100644 index 000000000..5984622d4 --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php @@ -0,0 +1,144 @@ +varTagRemover = $varTagRemover; + $this->staticTypeMapper = $staticTypeMapper; + $this->phpDocInfoFactory = $phpDocInfoFactory; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove @var annotation for PHPUnit\\Framework\\MockObject\\MockObject combined with native object type', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\MockObject\MockObject; + +final class SomeTest extends TestCase +{ + /** + * @var SomeClass|MockObject + */ + private SomeClass $someProperty; +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\MockObject\MockObject; + +final class SomeTest extends TestCase +{ + private SomeClass $someProperty; +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->isObjectType($node, new ObjectType(ClassName::TEST_CASE_CLASS))) { + return null; + } + $hasChanged = \false; + foreach ($node->getProperties() as $property) { + // not yet typed + if (!$property->type instanceof Node) { + continue; + } + if (\count($property->props) !== 1) { + continue; + } + if (!$property->type instanceof FullyQualified) { + continue; + } + if ($this->isObjectType($property->type, new ObjectType(self::MOCK_OBJECT_CLASS))) { + continue; + } + $propertyDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); + if (!$this->isVarTagUnionTypeMockObject($propertyDocInfo, $property)) { + continue; + } + // clear var docblock + if ($this->varTagRemover->removeVarTag($property)) { + $hasChanged = \true; + } + } + if (!$hasChanged) { + return null; + } + return $node; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::TYPED_PROPERTIES; + } + private function isVarTagUnionTypeMockObject(PhpDocInfo $phpDocInfo, Property $property) : bool + { + $varTagValueNode = $phpDocInfo->getVarTagValueNode(); + if (!$varTagValueNode instanceof VarTagValueNode) { + return \false; + } + if (!$varTagValueNode->type instanceof UnionTypeNode) { + return \false; + } + $varTagType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($varTagValueNode->type, $property); + if (!$varTagType instanceof UnionType) { + return \false; + } + foreach ($varTagType->getTypes() as $unionedType) { + if ($unionedType->isSuperTypeOf(new ObjectType(self::MOCK_OBJECT_CLASS))->yes()) { + return \true; + } + } + return \false; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php index fef110f15..7fbd8a465 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php @@ -11,6 +11,7 @@ use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Rector\AbstractScopeAwareRector; use Rector\Reflection\ReflectionResolver; @@ -89,7 +90,8 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node $filter = static function (ClassMethod $classMethod) : bool { return $classMethod->isPrivate(); }; - if (\array_filter($classMethods, $filter) === []) { + $privateMethods = \array_filter($classMethods, $filter); + if ($privateMethods === []) { return null; } if ($this->hasDynamicMethodCallOnFetchThis($classMethods)) { @@ -97,17 +99,14 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } $hasChanged = \false; $classReflection = $this->reflectionResolver->resolveClassReflection($node); - foreach ($node->stmts as $key => $stmt) { - if (!$stmt instanceof ClassMethod) { + foreach ($privateMethods as $privateMethod) { + if ($this->shouldSkip($privateMethod, $classReflection)) { continue; } - if ($this->shouldSkip($stmt, $classReflection)) { + if ($this->isClassMethodUsedAnalyzer->isClassMethodUsed($node, $privateMethod, $scope)) { continue; } - if ($this->isClassMethodUsedAnalyzer->isClassMethodUsed($node, $stmt, $scope)) { - continue; - } - unset($node->stmts[$key]); + unset($node->stmts[$privateMethod->getAttribute(AttributeKey::STMT_KEY)]); $hasChanged = \true; } if ($hasChanged) { @@ -130,9 +129,6 @@ private function shouldSkip(ClassMethod $classMethod, ?ClassReflection $classRef if ($classReflection->isAnonymous()) { return \true; } - if (!$classMethod->isPrivate()) { - return \true; - } // skip magic methods - @see https://www.php.net/manual/en/language.oop5.magic.php if ($classMethod->isMagic()) { return \true; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php index b3dbed998..fc9d864a7 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php @@ -84,6 +84,7 @@ public function refactor(Node $node) : ?Node private function removeDuplicatedCases(Switch_ $switch) : void { $totalKeys = \count($switch->cases); + $conds = []; foreach (\array_keys($switch->cases) as $key) { if (isset($switch->cases[$key - 1]) && $switch->cases[$key - 1]->stmts === []) { continue; @@ -97,6 +98,10 @@ private function removeDuplicatedCases(Switch_ $switch) : void continue; } $nextCase = $switch->cases[$jumpToKey]; + if (isset($switch->cases[$jumpToKey - 1]) && $switch->cases[$jumpToKey - 1]->stmts === []) { + $nextCases[] = $switch->cases[$jumpToKey - 1]; + $conds[] = $switch->cases[$jumpToKey - 1]->cond; + } unset($switch->cases[$jumpToKey]); $nextCases[] = $nextCase; $this->hasChanged = \true; @@ -110,6 +115,15 @@ private function removeDuplicatedCases(Switch_ $switch) : void } $key += \count($nextCases); } + foreach ($conds as $keyCond => $cond) { + foreach (\array_reverse($switch->cases, \true) as $keyCase => $case) { + if ($this->nodeComparator->areNodesEqual($cond, $case->cond)) { + unset($switch->cases[$keyCase]); + unset($conds[$keyCond]); + continue 2; + } + } + } } private function areSwitchStmtsEqualsAndWithBreak(Case_ $currentCase, Case_ $nextCase) : bool { diff --git a/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php b/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php index 92cbcb4d7..0a57d0b4e 100644 --- a/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php +++ b/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\DeadCode\SideEffect; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrayDimFetch; diff --git a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php index f04faf93f..7850e36b3 100644 --- a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php +++ b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Naming\ExpectedNameResolver; -use RectorPrefix202410\Doctrine\Inflector\Inflector; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Doctrine\Inflector\Inflector; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\Util\StringUtils; /** * @see \Rector\Tests\Naming\ExpectedNameResolver\InflectorSingularResolverTest diff --git a/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php b/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php index 4f0942336..f1f88f280 100644 --- a/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php +++ b/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Naming\Naming; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PHPStan\Type\Generic\GenericObjectType; use PHPStan\Type\ObjectType; use PHPStan\Type\StaticType; diff --git a/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php index 9352dd679..53d21c323 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Naming\Rector\Assign; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Closure; diff --git a/vendor/rector/rector/rules/Naming/RectorNamingInflector.php b/vendor/rector/rector/rules/Naming/RectorNamingInflector.php index 01eca2fb1..f2f481588 100644 --- a/vendor/rector/rector/rules/Naming/RectorNamingInflector.php +++ b/vendor/rector/rector/rules/Naming/RectorNamingInflector.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Naming; -use RectorPrefix202410\Doctrine\Inflector\Inflector; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Doctrine\Inflector\Inflector; +use RectorPrefix202411\Nette\Utils\Strings; final class RectorNamingInflector { /** diff --git a/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php b/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php index 64c19ebf6..eb196e616 100644 --- a/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php +++ b/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php @@ -7,7 +7,7 @@ use PhpParser\Node\Stmt\Property; use Rector\Naming\ValueObject\PropertyRename; use Rector\NodeNameResolver\NodeNameResolver; -use RectorPrefix202410\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; final class PropertyRenameFactory { /** diff --git a/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php b/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php index 5512a7e0c..c8b379d12 100644 --- a/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php +++ b/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php @@ -18,7 +18,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php55\Rector\String_\StringClassNameToClassConstantRector\StringClassNameToClassConstantRectorTest */ diff --git a/vendor/rector/rector/rules/Php55/RegexMatcher.php b/vendor/rector/rector/rules/Php55/RegexMatcher.php index 9fb99c84a..cafecbc36 100644 --- a/vendor/rector/rector/rules/Php55/RegexMatcher.php +++ b/vendor/rector/rector/rules/Php55/RegexMatcher.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php55; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Scalar\String_; diff --git a/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php b/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php index 928ccdad8..d95a2c9d1 100644 --- a/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php +++ b/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php70; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\Php70\Exception\InvalidEregException; /** * @changelog https://gist.github.com/lifthrasiir/704754/7e486f43e62fd1c9d3669330c251f8ca4a59a3f8 @@ -67,17 +67,8 @@ public function __construct(string $pcreDelimiter = '#') { $this->pcreDelimiter = $pcreDelimiter; } - public function transform(string $ereg, bool $isCaseInsensitive) : string - { - if (\strpos($ereg, $this->pcreDelimiter) === \false) { - return $this->ere2pcre($ereg, $isCaseInsensitive); - } - // fallback - $quotedEreg = \preg_quote($ereg, '#'); - return $this->ere2pcre($quotedEreg, $isCaseInsensitive); - } // converts the ERE $s into the PCRE $r. triggers error on any invalid input. - private function ere2pcre(string $content, bool $ignorecase) : string + public function transform(string $content, bool $ignorecase) : string { if ($ignorecase) { if (isset($this->icache[$content])) { @@ -91,9 +82,9 @@ private function ere2pcre(string $content, bool $ignorecase) : string throw new InvalidEregException('unescaped metacharacter ")"'); } if ($ignorecase) { - return $this->icache[$content] = '#' . $r . '#mi'; + return $this->icache[$content] = $this->pcreDelimiter . $r . $this->pcreDelimiter . 'mi'; } - return $this->cache[$content] = '#' . $r . '#m'; + return $this->cache[$content] = $this->pcreDelimiter . $r . $this->pcreDelimiter . 'm'; } /** * Recursively converts ERE into PCRE, starting at the position $i. @@ -105,6 +96,7 @@ private function _ere2pcre(string $content, int $i) : array $r = ['']; $rr = 0; $l = \strlen($content); + $normalizeUnprintableChar = \false; while ($i < $l) { // atom $char = $content[$i]; @@ -146,7 +138,7 @@ private function _ere2pcre(string $content, int $i) : array continue; } elseif ($char === '|') { if ($r[$rr] === '') { - throw new InvalidEregException('empty branch'); + $normalizeUnprintableChar = \true; } $r[] = ''; ++$rr; @@ -178,7 +170,14 @@ private function _ere2pcre(string $content, int $i) : array if ($r[$rr] === '') { throw new InvalidEregException('empty regular expression or branch'); } - return [\implode('|', $r), $i]; + return [$this->normalize(\implode('|', $r), $normalizeUnprintableChar), $i]; + } + private function normalize(string $content, bool $normalizeUnprintableChar) : string + { + if ($normalizeUnprintableChar) { + $content = \str_replace("\f", '\\\\f', $content); + } + return \str_replace($this->pcreDelimiter, '\\' . $this->pcreDelimiter, $content); } /** * @param mixed[] $r diff --git a/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php b/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php index eaf2effa1..ae226dbf7 100644 --- a/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php @@ -21,7 +21,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php70\Rector\FuncCall\EregToPregMatchRector\EregToPregMatchRectorTest */ diff --git a/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php b/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php index c47312010..954854317 100644 --- a/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php +++ b/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php72\NodeFactory; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\ComplexType; use PhpParser\Node\Expr; diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php index 375b4547e..136f827cb 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php73\Rector\FuncCall; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Scalar\String_; use Rector\NodeTypeResolver\Node\AttributeKey; diff --git a/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php b/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php index eafa6b99c..fc205241f 100644 --- a/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php @@ -14,7 +14,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php74\Rector\LNumber\AddLiteralSeparatorToNumberRector\AddLiteralSeparatorToNumberRectorTest * diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php b/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php index ef8cbf8cb..2406a14e2 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php @@ -37,7 +37,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\AnnotationToAttributeRectorTest * @see \Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Php81NestedAttributesRectorTest diff --git a/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php b/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php index 2a33e173c..fc2dae064 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php @@ -30,7 +30,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php80\Rector\Property\NestedAnnotationToAttributeRector\NestedAnnotationToAttributeRectorTest */ diff --git a/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php b/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php index 3869993a3..5b3a489c0 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php @@ -6,6 +6,10 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\Cast; +use PhpParser\Node\Expr\Cast\Int_; +use PhpParser\Node\Expr\Cast\String_; +use PhpParser\Node\Expr\Match_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; @@ -108,10 +112,22 @@ public function refactor(Node $node) : ?Node } $match = $matchResult->getMatch(); if ($matchResult->shouldRemoveNextStmt() && $isReturn) { + /** @var Return_ $returnStatement */ + $returnStatement = $node->stmts[$key + 1]; + $returnComment = $returnStatement->getComments(); + if ($returnComment !== []) { + foreach ($match->arms as $arm) { + if ($arm->conds === null) { + $this->mirrorComments($arm, $returnStatement); + break; + } + } + } unset($node->stmts[$key + 1]); } $assignVar = $this->resolveAssignVar($condAndExprs); $hasDefaultValue = $this->matchSwitchAnalyzer->hasDefaultValue($match); + $this->castMatchCond($match); if ($assignVar instanceof Expr) { if (!$hasDefaultValue) { continue; @@ -138,6 +154,36 @@ public function provideMinPhpVersion() : int { return PhpVersionFeature::MATCH_EXPRESSION; } + private function castMatchCond(Match_ $match) : void + { + $type = $this->nodeTypeResolver->getNativeType($match->cond); + $isNativeCondString = $type->isString()->yes(); + $isNativeCondInt = $type->isInteger()->yes(); + if (!$isNativeCondString && !$isNativeCondInt) { + return; + } + $armCondType = []; + $newMatchCond = null; + foreach ($match->arms as $arm) { + if ($arm->conds === null) { + continue; + } + foreach ($arm->conds as $armCond) { + $armCondType = $this->nodeTypeResolver->getNativeType($armCond); + if ($armCondType->isInteger()->yes() && $isNativeCondString) { + $newMatchCond = new Int_($match->cond); + } elseif ($armCondType->isString()->yes() && $isNativeCondInt) { + $newMatchCond = new String_($match->cond); + } else { + $newMatchCond = null; + break; + } + } + } + if ($newMatchCond instanceof Cast) { + $match->cond = $newMatchCond; + } + } /** * @param CondAndExpr[] $condAndExprs */ diff --git a/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php b/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php index 08b634008..c53430308 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php @@ -5,7 +5,7 @@ use Rector\Php80\Contract\ValueObject\AnnotationToAttributeInterface; use Rector\Validation\RectorAssert; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class AnnotationToAttribute implements AnnotationToAttributeInterface { /** diff --git a/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php b/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php index 884dce1b5..ad71d2996 100644 --- a/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php +++ b/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php81\NodeFactory; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\BuilderFactory; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayItem; diff --git a/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php b/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php index e347351dd..ad98331bf 100644 --- a/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php +++ b/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php @@ -15,16 +15,17 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php82\Rector\Param\AddSensitiveParameterAttributeRector\AddSensitiveParameterAttributeRectorTest */ final class AddSensitiveParameterAttributeRector extends AbstractRector implements ConfigurableRectorInterface, MinPhpVersionInterface { /** + * @readonly * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - protected $phpAttributeAnalyzer; + private $phpAttributeAnalyzer; public const SENSITIVE_PARAMETERS = 'sensitive_parameters'; /** * @var string[] diff --git a/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php b/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php index 2195d9484..92a0b9ec6 100644 --- a/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php +++ b/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php @@ -104,7 +104,7 @@ public function refactor(Node $node) : ?Node return null; } $classReflection = $this->reflectionProvider->getClass($className); - $parentClassReflections = \array_merge($classReflection->getParents(), $classReflection->getInterfaces()); + $parentClassReflections = \array_merge($classReflection->getParents(), $classReflection->getInterfaces(), $classReflection->getTraits()); $this->processAddOverrideAttribute($node, $parentClassReflections); if (!$this->hasChanged) { return null; @@ -144,6 +144,9 @@ private function processAddOverrideAttribute(Class_ $class, array $parentClassRe if ($parentMethod->isPrivate()) { continue; } + if ($parentClassReflection->isTrait() && !$parentMethod->isAbstract()) { + continue; + } $classMethod->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified('Override'))]); $this->hasChanged = \true; continue 2; diff --git a/vendor/rector/rector/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php b/vendor/rector/rector/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php new file mode 100644 index 000000000..7125d1968 --- /dev/null +++ b/vendor/rector/rector/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php @@ -0,0 +1,73 @@ +> + */ + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?Node + { + if ($node->isFirstClassCallable()) { + return null; + } + if (\count($node->getArgs()) !== 0) { + return null; + } + $target = null; + if ($this->isName($node, 'get_class')) { + $target = 'self'; + } + if ($this->isName($node, 'get_parent_class')) { + $target = 'parent'; + } + if ($target !== null) { + return new ClassConstFetch(new Name([$target]), new VarLikeIdentifier('class')); + } + return null; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::DEPRECATE_GET_CLASS_WITHOUT_ARGS; + } +} diff --git a/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php b/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php index 8de19ebd8..dacfb2f9d 100644 --- a/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php +++ b/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php @@ -58,7 +58,10 @@ public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $this->propertyManipulator = $propertyManipulator; $this->classReflectionAnalyzer = $classReflectionAnalyzer; } - public function isLegal(Property $property, ?ClassReflection $classReflection) : bool + /** + * @param \PhpParser\Node\Stmt\Property|string $property + */ + public function isLegal($property, ?ClassReflection $classReflection) : bool { if (!$classReflection instanceof ClassReflection) { return \false; @@ -66,7 +69,7 @@ public function isLegal(Property $property, ?ClassReflection $classReflection) : if ($classReflection->isAnonymous()) { return \false; } - $propertyName = $this->nodeNameResolver->getName($property); + $propertyName = $property instanceof Property ? $this->nodeNameResolver->getName($property) : $property; if ($this->propertyManipulator->isUsedByTrait($classReflection, $propertyName)) { return \false; } diff --git a/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php b/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php index f0fbd1d44..6ef5b4cfb 100644 --- a/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php +++ b/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php @@ -9,7 +9,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use Rector\ValueObject\Visibility; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Privatization\NodeManipulator\VisibilityManipulatorTest */ @@ -24,7 +24,7 @@ public function hasVisibility($node, int $visibility) : bool } /** * @api - * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $node + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Param $node */ public function makeStatic($node) : void { @@ -95,7 +95,7 @@ public function makeProtected($node) : void $this->replaceVisibilityFlag($node, Visibility::PROTECTED); } /** - * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $node + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Param $node */ public function makePrivate($node) : void { @@ -150,7 +150,7 @@ public function publicize($node) } /** * This way "abstract", "static", "final" are kept - * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $node + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Param $node */ private function removeVisibility($node) : void { @@ -158,6 +158,10 @@ private function removeVisibility($node) : void if ($node->flags === 0) { return; } + if ($node instanceof Param) { + $node->flags = 0; + return; + } if ($node->isPublic()) { $node->flags |= Class_::MODIFIER_PUBLIC; $node->flags -= Class_::MODIFIER_PUBLIC; @@ -185,7 +189,7 @@ private function removeVisibilityFlag($node, int $visibility) : void $node->flags &= ~$visibility; } /** - * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $node + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Param $node */ private function replaceVisibilityFlag($node, int $visibility) : void { diff --git a/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php b/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php index fb763cd2f..4ba350b5d 100644 --- a/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php +++ b/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php @@ -107,6 +107,9 @@ public function refactor(Node $node) : ?Node } private function matchLocalPropertyFetchInGetterMethod(ClassMethod $classMethod) : ?PropertyFetch { + if ($classMethod->params !== []) { + return null; + } $stmts = (array) $classMethod->stmts; if (\count($stmts) !== 1) { return null; diff --git a/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php b/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php index ee10a0183..7773af165 100644 --- a/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php +++ b/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php @@ -5,12 +5,15 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PHPStan\Reflection\ClassReflection; use Rector\Privatization\Guard\ParentPropertyLookupGuard; use Rector\Privatization\NodeManipulator\VisibilityManipulator; use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; +use Rector\ValueObject\MethodName; +use Rector\ValueObject\Visibility; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -71,20 +74,36 @@ public function refactor(Node $node) : ?Node return null; } $hasChanged = \false; - $classReflection = null; + $classReflection = $this->reflectionResolver->resolveClassReflection($node); + if (!$classReflection instanceof ClassReflection) { + return null; + } foreach ($node->getProperties() as $property) { if ($this->shouldSkipProperty($property)) { continue; } - if (!$classReflection instanceof ClassReflection) { - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - } if (!$this->parentPropertyLookupGuard->isLegal($property, $classReflection)) { continue; } $this->visibilityManipulator->makePrivate($property); $hasChanged = \true; } + $construct = $node->getMethod(MethodName::CONSTRUCT); + if ($construct instanceof ClassMethod) { + foreach ($construct->params as $param) { + if ($param->flags === 0) { + continue; + } + if (!$this->visibilityManipulator->hasVisibility($param, Visibility::PROTECTED)) { + continue; + } + if (!$this->parentPropertyLookupGuard->isLegal((string) $this->getName($param), $classReflection)) { + continue; + } + $this->visibilityManipulator->makePrivate($param); + $hasChanged = \true; + } + } if ($hasChanged) { return $node; } diff --git a/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php b/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php index 6f9b4ab28..076c75965 100644 --- a/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php @@ -15,7 +15,7 @@ use Rector\Removing\ValueObject\ArgumentRemover; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\ClassMethod\ArgumentRemoverRector\ArgumentRemoverRectorTest */ diff --git a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php index 03a7e0300..55c4e8f6d 100644 --- a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php @@ -9,7 +9,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\Class_\RemoveInterfacesRector\RemoveInterfacesRectorTest */ diff --git a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php index 3d74897b0..b19c00a08 100644 --- a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\Class_\RemoveTraitUseRector\RemoveTraitUseRectorTest */ diff --git a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php index 6b4d6bb8b..a756702fe 100644 --- a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php @@ -11,7 +11,7 @@ use Rector\Removing\ValueObject\RemoveFuncCallArg; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\FuncCall\RemoveFuncCallArgRector\RemoveFuncCallArgRectorTest */ diff --git a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php index 730d02607..d63475e9c 100644 --- a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\FuncCall\RemoveFuncCallRector\RemoveFuncCallRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php b/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php index 2c8d0062d..84335ab62 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php @@ -14,7 +14,7 @@ use Rector\Renaming\ValueObject\RenameClassConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\ClassConstFetch\RenameClassConstFetchRector\RenameClassConstFetchRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php b/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php index 771040e15..357ca9614 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php @@ -18,7 +18,7 @@ use Rector\Renaming\ValueObject\RenameAnnotationByType; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\ClassMethod\RenameAnnotationRector\RenameAnnotationRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php b/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php index 881f1f704..8a524171d 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php @@ -16,7 +16,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\Class_\RenameAttributeRector\RenameAttributeRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php b/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php index 2c3eed971..d04db27b2 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php @@ -11,7 +11,7 @@ use Rector\Validation\RectorAssert; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\ConstFetch\RenameConstantRector\RenameConstantRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php b/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php index b93fdd9fc..10f23a5e4 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\FuncCall\RenameFunctionRector\RenameFunctionRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php b/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php index ce70cad33..ab734a101 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php @@ -23,7 +23,7 @@ use Rector\Renaming\ValueObject\RenameFunctionLikeParamWithinCallLikeArg; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\FunctionLike\RenameFunctionLikeParamWithinCallLikeArgRector\RenameFunctionLikeParamWithinCallLikeArgRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php b/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php index 973c76712..752f5b3b5 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php @@ -25,7 +25,7 @@ use Rector\Renaming\ValueObject\MethodCallRenameWithArrayKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\MethodCall\RenameMethodRector\RenameMethodRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php b/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php index 739dece65..728c9865b 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php @@ -18,7 +18,7 @@ use Rector\Renaming\NodeManipulator\ClassRenamer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\Name\RenameClassRector\RenameClassRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php b/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php index 9f156ed78..981bac4de 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php @@ -15,7 +15,7 @@ use Rector\Renaming\ValueObject\RenameProperty; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\PropertyFetch\RenamePropertyRector\RenamePropertyRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php b/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php index 83d17a243..74c6d1e95 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php @@ -12,7 +12,7 @@ use Rector\Renaming\ValueObject\RenameStaticMethod; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\StaticCall\RenameStaticMethodRector\RenameStaticMethodRectorTest */ diff --git a/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php b/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php index 42fc08c31..728b3c03c 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php @@ -10,7 +10,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\String_\RenameStringRector\RenameStringRectorTest */ diff --git a/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php b/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php index 428f980ce..d386ad691 100644 --- a/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php +++ b/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php @@ -3,14 +3,20 @@ declare (strict_types=1); namespace Rector\Strict\NodeFactory; +use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\BooleanNot; +use PhpParser\Node\Expr\CallLike; +use PhpParser\Node\Expr\ConstFetch; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Instanceof_; +use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; @@ -32,57 +38,61 @@ public function __construct(NodeFactory $nodeFactory) $this->nodeFactory = $nodeFactory; } /** - * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BooleanNot|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|null + * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BooleanNot|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|null|\PhpParser\Node\Expr\FuncCall */ public function createIdenticalFalsyCompare(Type $exprType, Expr $expr, bool $treatAsNonEmpty, bool $isOnlyString = \true) { + $result = null; if ($exprType->isString()->yes()) { if ($treatAsNonEmpty || !$isOnlyString) { return new Identical($expr, new String_('')); } - return new BooleanOr(new Identical($expr, new String_('')), new Identical($expr, new String_('0'))); - } - if ($exprType->isInteger()->yes()) { + $result = new BooleanOr(new Identical($expr, new String_('')), new Identical($expr, new String_('0'))); + } elseif ($exprType->isInteger()->yes()) { return new Identical($expr, new LNumber(0)); - } - if ($exprType->isBoolean()->yes()) { + } elseif ($exprType->isBoolean()->yes()) { return new Identical($expr, $this->nodeFactory->createFalse()); - } - if ($exprType->isArray()->yes()) { + } elseif ($exprType->isArray()->yes()) { return new Identical($expr, new Array_([])); - } - if ($exprType instanceof NullType) { + } elseif ($exprType instanceof NullType) { return new Identical($expr, $this->nodeFactory->createNull()); - } - if (!$exprType instanceof UnionType) { + } elseif (!$exprType instanceof UnionType) { return null; + } else { + $result = $this->createTruthyFromUnionType($exprType, $expr, $treatAsNonEmpty, \false); + } + if ($result instanceof BooleanOr && $expr instanceof CallLike && $result->left instanceof Identical && $result->right instanceof Identical) { + return new FuncCall(new Name('in_array'), [new Arg($expr), new Arg(new Array_([new ArrayItem($result->left->right), new ArrayItem($result->right->right)])), new Arg(new ConstFetch(new Name('true')))]); } - return $this->createTruthyFromUnionType($exprType, $expr, $treatAsNonEmpty, \false); + return $result; } /** * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BooleanNot|null */ public function createNotIdenticalFalsyCompare(Type $exprType, Expr $expr, bool $treatAsNotEmpty, bool $isOnlyString = \true) { + $result = null; if ($exprType->isString()->yes()) { if ($treatAsNotEmpty || !$isOnlyString) { return new NotIdentical($expr, new String_('')); } - return new BooleanAnd(new NotIdentical($expr, new String_('')), new NotIdentical($expr, new String_('0'))); - } - if ($exprType->isInteger()->yes()) { + $result = new BooleanAnd(new NotIdentical($expr, new String_('')), new NotIdentical($expr, new String_('0'))); + } elseif ($exprType->isInteger()->yes()) { return new NotIdentical($expr, new LNumber(0)); - } - if ($exprType->isArray()->yes()) { + } elseif ($exprType->isArray()->yes()) { return new NotIdentical($expr, new Array_([])); - } - if (!$exprType instanceof UnionType) { + } elseif (!$exprType instanceof UnionType) { return null; + } else { + $result = $this->createFromUnionType($exprType, $expr, $treatAsNotEmpty, \false); + } + if ($result instanceof BooleanAnd && $expr instanceof CallLike && $result->left instanceof NotIdentical && $result->right instanceof NotIdentical) { + return new BooleanNot(new FuncCall(new Name('in_array'), [new Arg($expr), new Arg(new Array_([new ArrayItem($result->left->right), new ArrayItem($result->right->right)])), new Arg(new ConstFetch(new Name('true')))])); } - return $this->createFromUnionType($exprType, $expr, $treatAsNotEmpty, \false); + return $result; } /** - * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BooleanNot|null + * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|null */ private function createFromUnionType(UnionType $unionType, Expr $expr, bool $treatAsNotEmpty, bool $isOnlyString) { @@ -111,16 +121,13 @@ private function createFromUnionType(UnionType $unionType, Expr $expr, bool $tre } return new BooleanAnd($toNullNotIdentical, $compareExpr); } - /** - * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BooleanNot|null - */ - private function resolveFromCleanedNullUnionType(UnionType $unionType, Expr $expr, bool $treatAsNotEmpty) + private function resolveFromCleanedNullUnionType(UnionType $unionType, Expr $expr, bool $treatAsNotEmpty) : ?BooleanAnd { $compareExprs = $this->collectCompareExprs($unionType, $expr, $treatAsNotEmpty, \false); return $this->createBooleanAnd($compareExprs); } /** - * @return array + * @return array */ private function collectCompareExprs(UnionType $unionType, Expr $expr, bool $treatAsNonEmpty, bool $identical = \true) : array { @@ -135,10 +142,9 @@ private function cleanUpPossibleNullableUnionType(UnionType $unionType) : Type return \count($unionType->getTypes()) === 2 ? TypeCombinator::removeNull($unionType) : $unionType; } /** - * @param array $compareExprs - * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BooleanNot|null + * @param array $compareExprs */ - private function createBooleanOr(array $compareExprs) + private function createBooleanOr(array $compareExprs) : ?BooleanOr { $truthyExpr = \array_shift($compareExprs); foreach ($compareExprs as $compareExpr) { @@ -150,13 +156,13 @@ private function createBooleanOr(array $compareExprs) } $truthyExpr = new BooleanOr($truthyExpr, $compareExpr); } + /** @var BooleanOr $truthyExpr */ return $truthyExpr; } /** - * @param array $compareExprs - * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BooleanNot|null + * @param array $compareExprs */ - private function createBooleanAnd(array $compareExprs) + private function createBooleanAnd(array $compareExprs) : ?BooleanAnd { $truthyExpr = \array_shift($compareExprs); foreach ($compareExprs as $compareExpr) { @@ -168,10 +174,11 @@ private function createBooleanAnd(array $compareExprs) } $truthyExpr = new BooleanAnd($truthyExpr, $compareExpr); } + /** @var BooleanAnd $truthyExpr */ return $truthyExpr; } /** - * @return \PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BooleanNot|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|null + * @return \PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BooleanNot|null */ private function createTruthyFromUnionType(UnionType $unionType, Expr $expr, bool $treatAsNonEmpty, bool $isOnlyString) { diff --git a/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php index 281ae4174..886e0c319 100644 --- a/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php @@ -5,7 +5,7 @@ use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Rector\AbstractScopeAwareRector; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Strict\Rector\BooleanNot\BooleanInBooleanNotRuleFixerRector\BooleanInBooleanNotRuleFixerRectorTest * diff --git a/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php index 6f90f2c9a..d38d0c975 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php @@ -13,7 +13,7 @@ use Rector\Transform\ValueObject\ArrayDimFetchToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\ArrayDimFetch\ArrayDimFetchToMethodCallRector\ArrayDimFetchToMethodCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php index c6a5ed1ea..fa14360fc 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\PropertyAssignToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\Assign\PropertyAssignToMethodCallRector\PropertyAssignToMethodCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php index 6d84f3848..e0b5fb787 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php @@ -13,7 +13,7 @@ use Rector\Transform\ValueObject\PropertyFetchToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\Assign\PropertyFetchToMethodCallRector\PropertyFetchToMethodCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php index baccd830f..c2e23ab77 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php @@ -22,7 +22,7 @@ use Rector\Transform\ValueObject\AttributeKeyToClassConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api used in rector-doctrine * @see \Rector\Tests\Transform\Rector\Attribute\AttributeKeyToClassConstFetchRector\AttributeKeyToClassConstFetchRectorTest diff --git a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php index 317200098..8b096a17a 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php @@ -17,7 +17,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\ClassMethod\ReturnTypeWillChangeRector\ReturnTypeWillChangeRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php index 0b328fd4c..965b7a219 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php @@ -15,7 +15,7 @@ use Rector\Transform\ValueObject\WrapReturn; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\ClassMethod\WrapReturnRector\WrapReturnRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php index 0f8794356..40e47d9ae 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php @@ -18,7 +18,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\Class_\AddAllowDynamicPropertiesAttributeRector\AddAllowDynamicPropertiesAttributeRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php index e861df615..ec5679d33 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php @@ -12,7 +12,7 @@ use Rector\Rector\AbstractScopeAwareRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api used in rector-doctrine * @see \Rector\Tests\Transform\Rector\Class_\AddInterfaceByTraitRector\AddInterfaceByTraitRectorTest diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php index 8d9d73f99..f74e91a6f 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * Covers cases like * - https://github.com/FriendsOfPHP/PHP-CS-Fixer/commit/a1cdb4d2dd8f45d731244eed406e1d537218cc66 diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php index 0708007b7..0361e115f 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php @@ -14,7 +14,7 @@ use Rector\Transform\ValueObject\ParentClassToTraits; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * Can handle cases like: * - https://doc.nette.org/en/2.4/migration-2-4#toc-nette-smartobject diff --git a/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php index 1678ad315..33d5bc447 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php @@ -11,7 +11,7 @@ use Rector\Transform\ValueObject\ConstFetchToClassConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see Rector\Tests\Transform\Rector\ConstFetch\ConstFetchToClassConstFetchRector\ConstFetchToClassConstFetchTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php b/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php index adfcfd3a0..017107dd6 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php @@ -18,7 +18,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FileWithoutNamespace\RectorConfigBuilderRector\RectorConfigBuilderRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php index 456ed7b2c..cea9ec905 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToConstFetchRector\FunctionCallToConstantRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php index 0d174770f..3d7aa9878 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\FuncCallToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToMethodCallRector\FuncCallToMethodCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php index 5e1f921e8..1a21066b5 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToNewRector\FuncCallToNewRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php index 0933f9558..6cb07932a 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\FuncCallToStaticCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToStaticCallRector\FuncCallToStaticCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php index 893f2c7f3..495a77681 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php @@ -13,7 +13,7 @@ use Rector\Transform\ValueObject\MethodCallToFuncCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\MethodCallToFuncCallRector\MethodCallToFuncCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php new file mode 100644 index 000000000..72cac86ab --- /dev/null +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php @@ -0,0 +1,67 @@ +methodCallToNew = $configuration; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change method call to new class', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' +$object->createResponse(['a' => 1]); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +new Response(['a' => 1]); +CODE_SAMPLE +, [new MethodCallToNew(new ObjectType('ResponseFactory'), 'createResponse', 'Response')])]); + } + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?New_ + { + if ($node->isFirstClassCallable()) { + return null; + } + foreach ($this->methodCallToNew as $methodCallToNew) { + if (!$this->isName($node->name, $methodCallToNew->getMethodName())) { + continue; + } + if (!$this->isObjectType($node->var, $methodCallToNew->getObject())) { + continue; + } + return new New_(new FullyQualified($methodCallToNew->getNewClassString()), $node->args); + } + return null; + } +} diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php index e409eb2e3..83bfba916 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\MethodCallToPropertyFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\MethodCallToPropertyFetchRector\MethodCallToPropertyFetchRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php index ab937c428..0f9d1f82d 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\MethodCallToStaticCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\MethodCallToStaticCallRector\MethodCallToStaticCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php index 3a1ddb0b0..1edd7dd0c 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\ReplaceParentCallByPropertyCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\ReplaceParentCallByPropertyCallRector\ReplaceParentCallByPropertyCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php b/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php index 1007bf241..bce70c9fe 100644 --- a/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\NewToStaticCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\New_\NewToStaticCallRector\NewToStaticCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php index 9ee1f4d73..b16f0ea57 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php @@ -16,7 +16,7 @@ use Rector\Transform\ValueObject\ScalarValueToConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see Rector\Tests\Transform\Rector\Scalar\ScalarValueToConstFetchRector\ScalarValueToConstFetchRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php index f1ad80898..e95923044 100644 --- a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\StaticCallToFuncCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\StaticCall\StaticCallToFuncCallRector\StaticCallToFuncCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php index e8ca282aa..06e68a5cd 100644 --- a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php @@ -17,7 +17,7 @@ use Rector\Transform\ValueObject\StaticCallToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\StaticCall\StaticCallToMethodCallRector\StaticCallToMethodCallRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php index 1d53dbe54..987098c0c 100644 --- a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\StaticCallToNew; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\StaticCall\StaticCallToNewRector\StaticCallToNewRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php b/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php index a7fa72869..52a2105ef 100644 --- a/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php @@ -11,7 +11,7 @@ use Rector\Transform\ValueObject\StringToClassConstant; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\String_\StringToClassConstantRector\StringToClassConstantRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php new file mode 100644 index 000000000..16081016e --- /dev/null +++ b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php @@ -0,0 +1,45 @@ +objectType = $objectType; + $this->methodName = $methodName; + $this->newClassString = $newClassString; + } + public function getObject() : ObjectType + { + return $this->objectType; + } + public function getMethodName() : string + { + return $this->methodName; + } + public function getNewClassString() : string + { + return $this->newClassString; + } +} diff --git a/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php b/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php index 55745ed16..05aa6aafa 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php @@ -4,7 +4,7 @@ namespace Rector\Transform\ValueObject; use Rector\Validation\RectorAssert; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class ParentClassToTraits { /** diff --git a/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php b/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php index 5a76114fc..cb69562c4 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php +++ b/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php @@ -3,20 +3,25 @@ declare (strict_types=1); namespace Rector\TypeDeclaration\PHPStan; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; use PhpParser\Node\Stmt\UseUse; use PHPStan\Analyser\Scope; +use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\Generic\GenericObjectType; +use PHPStan\Type\Generic\TemplateType; +use PHPStan\Type\Generic\TemplateTypeFactory; +use PHPStan\Type\Generic\TemplateTypeScope; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\TypeWithClassName; use PHPStan\Type\UnionType; use Rector\Naming\Naming\UseImportsResolver; +use Rector\StaticTypeMapper\Naming\NameScopeFactory; use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\NonExistingObjectType; @@ -34,13 +39,19 @@ final class ObjectTypeSpecifier * @var \Rector\Naming\Naming\UseImportsResolver */ private $useImportsResolver; - public function __construct(ReflectionProvider $reflectionProvider, UseImportsResolver $useImportsResolver) + /** + * @readonly + * @var \Rector\StaticTypeMapper\Naming\NameScopeFactory + */ + private $nameScopeFactory; + public function __construct(ReflectionProvider $reflectionProvider, UseImportsResolver $useImportsResolver, NameScopeFactory $nameScopeFactory) { $this->reflectionProvider = $reflectionProvider; $this->useImportsResolver = $useImportsResolver; + $this->nameScopeFactory = $nameScopeFactory; } /** - * @return \PHPStan\Type\TypeWithClassName|\Rector\StaticTypeMapper\ValueObject\Type\NonExistingObjectType|\PHPStan\Type\UnionType|\PHPStan\Type\MixedType + * @return \PHPStan\Type\TypeWithClassName|\Rector\StaticTypeMapper\ValueObject\Type\NonExistingObjectType|\PHPStan\Type\UnionType|\PHPStan\Type\MixedType|\PHPStan\Type\Generic\TemplateType */ public function narrowToFullyQualifiedOrAliasedObjectType(Node $node, ObjectType $objectType, ?\PHPStan\Analyser\Scope $scope) { @@ -67,6 +78,24 @@ public function narrowToFullyQualifiedOrAliasedObjectType(Node $node, ObjectType } } } + if ($scope instanceof Scope) { + $classReflection = $scope->getClassReflection(); + if ($classReflection instanceof ClassReflection) { + $templateTags = $classReflection->getTemplateTags(); + $nameScope = $this->nameScopeFactory->createNameScopeFromNodeWithoutTemplateTypes($node); + $templateTypeScope = $nameScope->getTemplateTypeScope(); + if (!$templateTypeScope instanceof TemplateTypeScope) { + // invalid type + return new NonExistingObjectType($className); + } + $currentTemplateTag = $templateTags[$className] ?? null; + if ($currentTemplateTag === null) { + // invalid type + return new NonExistingObjectType($className); + } + return TemplateTypeFactory::create($templateTypeScope, $currentTemplateTag->getName(), $currentTemplateTag->getBound(), $currentTemplateTag->getVariance()); + } + } // invalid type return new NonExistingObjectType($className); } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php index 0aa7fd49e..c5be54715 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\TypeDeclaration\Rector\ClassMethod; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php index c44201271..5d5081916 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php @@ -21,7 +21,7 @@ use Rector\ValueObject\PhpVersionFeature; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamTypeDeclarationRector\AddParamTypeDeclarationRectorTest */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php index d8005ba71..f5eb3833f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php @@ -20,7 +20,7 @@ use Rector\VendorLocker\ParentClassMethodTypeOverrideGuard; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddReturnTypeDeclarationRector\AddReturnTypeDeclarationRectorTest */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php index c13d811d7..3678461ad 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php @@ -24,7 +24,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddTypeFromResourceDocblockRector\AddTypeFromResourceDocblockRectorTest */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php index d0fb0e49c..bc30c5a06 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php @@ -12,6 +12,7 @@ use PHPStan\Type\IntersectionType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; +use Rector\Enum\ClassName; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Rector\AbstractScopeAwareRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; @@ -40,10 +41,6 @@ final class ReturnTypeFromMockObjectRector extends AbstractScopeAwareRector impl * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ private $returnAnalyzer; - /** - * @var string - */ - private const TESTCASE_CLASS = 'PHPUnit\\Framework\\TestCase'; /** * @var string */ @@ -142,6 +139,6 @@ private function isInsideTestCaseClass(Scope $scope) : bool return \false; } // is phpunit test case? - return $classReflection->isSubclassOf(self::TESTCASE_CLASS); + return $classReflection->isSubclassOf(ClassName::TEST_CASE_CLASS); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php index a9e504374..1332e25f0 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php @@ -17,6 +17,7 @@ use PHPStan\Type\ArrayType; use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\IntegerType; +use PHPStan\Type\IntersectionType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; @@ -192,7 +193,12 @@ private function changeReturnType($node, ArrayType $arrayType) : void if ($arrayType instanceof ConstantArrayType && \count($arrayType->getValueTypes()) !== 1) { return; } - $narrowArrayType = new ArrayType(new MixedType(), $arrayType->getItemType()); + $itemType = $arrayType->getItemType(); + if ($itemType instanceof IntersectionType) { + $narrowArrayType = $arrayType; + } else { + $narrowArrayType = new ArrayType(new MixedType(), $itemType); + } $this->phpDocTypeChanger->changeReturnType($node, $phpDocInfo, $narrowArrayType); } /** diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php index efb08ef76..3e0f9f6e2 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\Class_; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; +use Rector\Enum\ClassName; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -37,10 +38,6 @@ final class TypedPropertyFromCreateMockAssignRector extends AbstractRector imple * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ private $constructorAssignDetector; - /** - * @var string - */ - private const TEST_CASE_CLASS = 'PHPUnit\\Framework\\TestCase'; /** * @var string */ @@ -90,7 +87,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if (!$this->isObjectType($node, new ObjectType(self::TEST_CASE_CLASS))) { + if (!$this->isObjectType($node, new ObjectType(ClassName::TEST_CASE_CLASS))) { return null; } $hasChanged = \false; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php index 28fb1c80e..675df860e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\TypeDeclaration\Rector\Class_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Identifier; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php index 620be9ba5..a27e1808a 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php @@ -27,7 +27,7 @@ use Rector\TypeDeclaration\ValueObject\AddClosureParamTypeFromArg; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddClosureParamTypeFromArgRector\AddClosureParamTypeFromArgRectorTest */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php new file mode 100644 index 000000000..751ed4352 --- /dev/null +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php @@ -0,0 +1,221 @@ +typeComparator = $typeComparator; + $this->staticTypeMapper = $staticTypeMapper; + $this->methodReflectionResolver = $methodReflectionResolver; + $this->typeUnwrapper = $typeUnwrapper; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Applies type hints to closures on Iterable method calls where key/value types are documented', [new CodeSample(<<<'CODE_SAMPLE' +class SomeClass +{ + /** + * @param Collection $collection + */ + public function run(Collection $collection) + { + return $collection->map(function ($item, $key) { + return $item . $key; + }); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeClass +{ + /** + * @param Collection $collection + */ + public function run(Collection $collection) + { + return $collection->map(function (string $item, int $key) { + return $item . $key; + }); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?Node + { + if ($node->isFirstClassCallable()) { + return null; + } + $varType = $this->getType($node->var); + if (!$varType instanceof IntersectionType || !$varType->isIterable()->yes()) { + return null; + } + $className = $varType->getObjectClassNames()[0] ?? null; + if ($className === null) { + return null; + } + if (!$node->name instanceof Identifier) { + return null; + } + $methodReflection = $this->methodReflectionResolver->resolveMethodReflection($className, $node->name->name, $node->getAttribute(AttributeKey::SCOPE)); + if (!$methodReflection instanceof MethodReflection) { + return null; + } + $parameters = $methodReflection->getVariants()[0]->getParameters(); + if (!$this->methodSignatureUsesCallableWithIteratorTypes($className, $parameters)) { + return null; + } + if (!$this->callUsesClosures($node->getArgs())) { + return null; + } + $nameIndex = []; + foreach ($parameters as $index => $parameter) { + $nameIndex[$parameter->getName()] = $index; + } + $valueType = $varType->getIterableValueType(); + $keyType = $varType->getIterableKeyType(); + $changesMade = \false; + foreach ($node->getArgs() as $index => $arg) { + if (!$arg instanceof Arg) { + continue; + } + if (!$arg->value instanceof Closure) { + continue; + } + $parameter = \is_string($index) ? $parameters[$nameIndex[$index]] : $parameters[$index]; + if ($this->updateClosureWithTypes($className, $parameter, $arg->value, $keyType, $valueType)) { + $changesMade = \true; + } + } + if ($changesMade) { + return $node; + } + return null; + } + private function updateClosureWithTypes(string $className, ParameterReflection $parameter, Closure $closure, Type $keyType, Type $valueType) : bool + { + // get the ClosureType from the ParameterReflection + $callableType = $this->typeUnwrapper->unwrapFirstCallableTypeFromUnionType($parameter->getType()); + if (!$callableType instanceof CallableType) { + return \false; + } + $changesMade = \false; + foreach ($callableType->getParameters() as $index => $parameterReflection) { + $closureParameter = $closure->getParams()[$index] ?? null; + if (!$closureParameter instanceof Param) { + continue; + } + if ($this->typeUnwrapper->isIterableTypeValue($className, $parameterReflection->getType())) { + if ($this->refactorParameter($closureParameter, $valueType)) { + $changesMade = \true; + } + } elseif ($this->typeUnwrapper->isIterableTypeKey($className, $parameterReflection->getType())) { + if ($this->refactorParameter($closureParameter, $keyType)) { + $changesMade = \true; + } + } + } + return $changesMade; + } + private function refactorParameter(Param $param, Type $type) : bool + { + // already set → no change + if ($param->type instanceof Node) { + $currentParamType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); + if ($this->typeComparator->areTypesEqual($currentParamType, $type)) { + return \false; + } + } + $paramTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::PARAM); + if (!$paramTypeNode instanceof Node) { + return \false; + } + $param->type = $paramTypeNode; + return \true; + } + /** + * @param class-string $className + * @param ParameterReflection[] $parameters + */ + private function methodSignatureUsesCallableWithIteratorTypes(string $className, array $parameters) : bool + { + foreach ($parameters as $parameter) { + $callableType = $this->typeUnwrapper->unwrapFirstCallableTypeFromUnionType($parameter->getType()); + if (!$callableType instanceof CallableType) { + continue; + } + foreach ($callableType->getParameters() as $parameterReflection) { + if ($this->typeUnwrapper->isIterableTypeValue($className, $parameterReflection->getType()) || $this->typeUnwrapper->isIterableTypeKey($className, $parameterReflection->getType())) { + return \true; + } + } + } + return \false; + } + /** + * @param array $args + */ + private function callUsesClosures(array $args) : bool + { + foreach ($args as $arg) { + if ($arg instanceof Arg && $arg->value instanceof Closure) { + return \true; + } + } + return \false; + } +} diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php index 4ee8934b6..f1d2aaa6f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php @@ -22,7 +22,7 @@ use Rector\TypeDeclaration\ValueObject\AddClosureParamTypeFromObject; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddClosureParamTypeFromObjectRector\AddClosureParamTypeFromObjectRectorTest */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php index e8d9d369e..84b721fd4 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php @@ -23,7 +23,7 @@ use Rector\ValueObject\PhpVersionFeature; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector\AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRectorTest */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php index 1c8e40ca5..a556d165a 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php @@ -16,7 +16,7 @@ use Rector\TypeDeclaration\ValueObject\AddPropertyTypeDeclaration; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\Property\AddPropertyTypeDeclarationRector\AddPropertyTypeDeclarationRectorTest */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php index 0e88e3634..02b5ef8b6 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php @@ -18,7 +18,7 @@ use Rector\TypeDeclaration\NodeAnalyzer\DeclareStrictTypeFinder; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\StmtsAwareInterface\IncreaseDeclareStrictTypesRector\IncreaseDeclareStrictTypesRectorTest */ diff --git a/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php b/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php index 674dc07d1..93eaf29a4 100644 --- a/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php +++ b/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php @@ -13,7 +13,7 @@ use Rector\Visibility\ValueObject\ChangeConstantVisibility; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Visibility\Rector\ClassConst\ChangeConstantVisibilityRector\ChangeConstantVisibilityRectorTest */ diff --git a/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php b/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php index 0275b2572..783bf83e3 100644 --- a/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php +++ b/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php @@ -14,7 +14,7 @@ use Rector\Visibility\ValueObject\ChangeMethodVisibility; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector\ChangeMethodVisibilityRectorTest */ diff --git a/vendor/rector/rector/src/Application/ApplicationFileProcessor.php b/vendor/rector/rector/src/Application/ApplicationFileProcessor.php index ce95b3bdd..325c41b1e 100644 --- a/vendor/rector/rector/src/Application/ApplicationFileProcessor.php +++ b/vendor/rector/rector/src/Application/ApplicationFileProcessor.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Application; -use RectorPrefix202410\Nette\Utils\FileSystem as UtilsFileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem as UtilsFileSystem; use PHPStan\Parser\ParserErrorsException; use Rector\Application\Provider\CurrentFileProvider; use Rector\Caching\Detector\ChangedFilesDetector; @@ -21,11 +21,11 @@ use Rector\ValueObject\FileProcessResult; use Rector\ValueObject\ProcessResult; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202410\Symplify\EasyParallel\CpuCoreCountProvider; -use RectorPrefix202410\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; -use RectorPrefix202410\Symplify\EasyParallel\ScheduleFactory; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symplify\EasyParallel\CpuCoreCountProvider; +use RectorPrefix202411\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; +use RectorPrefix202411\Symplify\EasyParallel\ScheduleFactory; use Throwable; final class ApplicationFileProcessor { diff --git a/vendor/rector/rector/src/Application/FileProcessor.php b/vendor/rector/rector/src/Application/FileProcessor.php index ec6028a42..fc228d413 100644 --- a/vendor/rector/rector/src/Application/FileProcessor.php +++ b/vendor/rector/rector/src/Application/FileProcessor.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Application; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Strings; use PHPStan\AnalysedCodeException; use PHPStan\Parser\ParserErrorsException; use Rector\Caching\Detector\ChangedFilesDetector; @@ -24,7 +24,7 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\FileProcessResult; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; use Throwable; final class FileProcessor { diff --git a/vendor/rector/rector/src/Application/VersionResolver.php b/vendor/rector/rector/src/Application/VersionResolver.php index 93ad6aee8..09b3d2333 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 = '1.2.6'; + public const PACKAGE_VERSION = '1.2.10'; /** * @api * @var string */ - public const RELEASE_DATE = '2024-10-03 10:18:39'; + public const RELEASE_DATE = '2024-11-08 14:55:18'; /** * @var int */ diff --git a/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php b/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php index 95eb543e3..61477bc78 100644 --- a/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php +++ b/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php @@ -6,8 +6,8 @@ use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\StaticReflection\DynamicSourceLocatorDecorator; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * Should it pass autoload files/directories to PHPStan analyzer? */ diff --git a/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php b/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php index fa5d2ceba..3599bc676 100644 --- a/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php +++ b/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php @@ -9,7 +9,7 @@ use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SplFileInfo; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Autoloading\BootstrapFilesIncluderTest */ diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/ArrayItemNode.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/ArrayItemNode.php index 4c5a87d95..1fb8b6ad5 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/ArrayItemNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/ArrayItemNode.php @@ -37,7 +37,7 @@ public function __toString() : string $value .= $singleValue; } } elseif ($this->value instanceof \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode) { - $value .= $this->value->identifierTypeNode . $this->value; + $value .= '@' . \ltrim((string) $this->value->identifierTypeNode, '@') . $this->value; } else { $value .= $this->value; } diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php index 124514756..5af221efe 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocManipulator; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php index a595fde67..cf71aff19 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php @@ -10,7 +10,7 @@ use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CloningPhpDocNodeVisitor; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\ParentConnectingPhpDocNodeVisitor; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\BetterPhpDocParser\PhpDocNodeMapperTest */ diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php index 4b5e15e9f..949ec9766 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocParser; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php index 836086f7c..c6c080a49 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocParser; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; @@ -21,7 +21,7 @@ use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\BetterPhpDocParser\ValueObject\StartAndEnd; use Rector\Util\StringUtils; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class DoctrineAnnotationDecorator implements PhpDocNodeDecoratorInterface { /** diff --git a/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php b/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php index 6e02d9be2..540b22e8a 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\Printer; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; final class DocBlockInliner { /** diff --git a/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php b/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php index 2f616e3ef..97a6cb6ec 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\Printer; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Comment; use PhpParser\Node\Stmt\InlineHTML; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php index f118cc0ad..e61201fad 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php @@ -5,7 +5,7 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Stringable; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class CurlyListNode extends \Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\AbstractValuesAwareNode { /** diff --git a/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php b/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php index 6cd353c78..181dc38ee 100644 --- a/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php +++ b/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php @@ -4,8 +4,8 @@ namespace Rector\Bootstrap; use Rector\ValueObject\Bootstrap\BootstrapConfigs; -use RectorPrefix202410\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202411\Webmozart\Assert\Assert; final class RectorConfigsResolver { public function provide() : BootstrapConfigs diff --git a/vendor/rector/rector/src/Bridge/SetRectorsResolver.php b/vendor/rector/rector/src/Bridge/SetRectorsResolver.php index dfd5634d3..38adc16de 100644 --- a/vendor/rector/rector/src/Bridge/SetRectorsResolver.php +++ b/vendor/rector/rector/src/Bridge/SetRectorsResolver.php @@ -5,31 +5,58 @@ use Rector\Config\RectorConfig; use Rector\Contract\Rector\RectorInterface; -use ReflectionProperty; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api * @experimental since 1.1.2 * Utils class to ease building bridges by 3rd-party tools + * + * @see \Rector\Tests\Bridge\SetRectorsResolverTest */ final class SetRectorsResolver { /** - * @return array> + * @param string[] $configFilePaths + * @return array|array, mixed[]>> */ - public function resolveFromFilePath(string $configFilePath) : array + public function resolveFromFilePathsIncludingConfiguration(array $configFilePaths) : array + { + Assert::allString($configFilePaths); + Assert::allFileExists($configFilePaths); + $combinedRectorRulesWithConfiguration = []; + foreach ($configFilePaths as $configFilePath) { + $rectorRulesWithConfiguration = $this->resolveFromFilePathIncludingConfiguration($configFilePath); + $combinedRectorRulesWithConfiguration = \array_merge($combinedRectorRulesWithConfiguration, $rectorRulesWithConfiguration); + } + return $combinedRectorRulesWithConfiguration; + } + /** + * @return array|array, mixed[]>> + */ + public function resolveFromFilePathIncludingConfiguration(string $configFilePath) : array + { + $rectorConfig = $this->loadRectorConfigFromFilePath($configFilePath); + $rectorClassesWithOptionalConfiguration = $rectorConfig->getRectorClasses(); + foreach ($rectorConfig->getRuleConfigurations() as $rectorClass => $configuration) { + // remove from non-configurable, if added again with better config + if (\in_array($rectorClass, $rectorClassesWithOptionalConfiguration)) { + $rectorRulePosition = \array_search($rectorClass, $rectorClassesWithOptionalConfiguration, \true); + if (\is_int($rectorRulePosition)) { + unset($rectorClassesWithOptionalConfiguration[$rectorRulePosition]); + } + } + $rectorClassesWithOptionalConfiguration[] = [$rectorClass => $configuration]; + } + // sort keys + return \array_values($rectorClassesWithOptionalConfiguration); + } + private function loadRectorConfigFromFilePath(string $configFilePath) : RectorConfig { Assert::fileExists($configFilePath); $rectorConfig = new RectorConfig(); /** @var callable $configCallable */ $configCallable = (require $configFilePath); $configCallable($rectorConfig); - // get tagged class-names - $tagsReflectionProperty = new ReflectionProperty($rectorConfig, 'tags'); - $tagsReflectionProperty->setAccessible(\true); - $tags = $tagsReflectionProperty->getValue($rectorConfig); - $rectorClasses = $tags[RectorInterface::class] ?? []; - \sort($rectorClasses); - return \array_unique($rectorClasses); + return $rectorConfig; } } diff --git a/vendor/rector/rector/src/Caching/CacheFactory.php b/vendor/rector/rector/src/Caching/CacheFactory.php index 90a716485..de80f5be9 100644 --- a/vendor/rector/rector/src/Caching/CacheFactory.php +++ b/vendor/rector/rector/src/Caching/CacheFactory.php @@ -7,7 +7,7 @@ use Rector\Caching\ValueObject\Storage\MemoryCacheStorage; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; -use RectorPrefix202410\Symfony\Component\Filesystem\Filesystem; +use RectorPrefix202411\Symfony\Component\Filesystem\Filesystem; final class CacheFactory { /** diff --git a/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php b/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php index b4035d2aa..61154a0a4 100644 --- a/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php +++ b/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php @@ -4,8 +4,8 @@ namespace Rector\Caching\ValueObject\Storage; use FilesystemIterator; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Random; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Random; use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface; use Rector\Caching\ValueObject\CacheFilePaths; use Rector\Caching\ValueObject\CacheItem; @@ -26,7 +26,7 @@ final class FileCacheStorage implements CacheStorageInterface * @var \Symfony\Component\Filesystem\Filesystem */ private $filesystem; - public function __construct(string $directory, \RectorPrefix202410\Symfony\Component\Filesystem\Filesystem $filesystem) + public function __construct(string $directory, \RectorPrefix202411\Symfony\Component\Filesystem\Filesystem $filesystem) { $this->directory = $directory; $this->filesystem = $filesystem; diff --git a/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php b/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php index b6cf89ebf..773b5c16f 100644 --- a/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php +++ b/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php @@ -3,13 +3,16 @@ declare (strict_types=1); namespace Rector\ChangesReporting\Output; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\ChangesReporting\Contract\Output\OutputFormatterInterface; +use Rector\Configuration\Option; +use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\ValueObject\Configuration; use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\ProcessResult; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class ConsoleOutputFormatter implements OutputFormatterInterface { /** @@ -70,7 +73,8 @@ private function reportFileDiffs(array $fileDiffs, bool $absoluteFilePath) : voi if ($firstLineNumber !== null) { $filePath .= ':' . $firstLineNumber; } - $message = \sprintf('%d) %s', ++$i, $filePath); + $filePathWithUrl = $this->addEditorUrl($filePath, $fileDiff->getAbsoluteFilePath(), $fileDiff->getRelativeFilePath(), (string) $fileDiff->getFirstLineNumber()); + $message = \sprintf('%d) %s', ++$i, $filePathWithUrl); $this->symfonyStyle->writeln($message); $this->symfonyStyle->newLine(); $this->symfonyStyle->writeln($fileDiff->getDiffConsoleFormatted()); @@ -111,4 +115,13 @@ private function createSuccessMessage(ProcessResult $processResult, Configuratio } return \sprintf('%d file%s %s by Rector', $changeCount, $changeCount > 1 ? 's' : '', $configuration->isDryRun() ? 'would have been changed (dry-run)' : ($changeCount === 1 ? 'has' : 'have') . ' been changed'); } + private function addEditorUrl(string $filePath, ?string $absoluteFilePath, ?string $relativeFilePath, ?string $lineNumber) : string + { + $editorUrl = SimpleParameterProvider::provideStringParameter(Option::EDITOR_URL, ''); + if ($editorUrl !== '') { + $editorUrl = \str_replace(['%file%', '%relFile%', '%line%'], [$absoluteFilePath, $relativeFilePath, $lineNumber], $editorUrl); + $filePath = '' . $filePath . ''; + } + return $filePath; + } } diff --git a/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php b/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php index ce190ce93..fee25e2bf 100644 --- a/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php +++ b/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\ChangesReporting\Output; -use RectorPrefix202410\Nette\Utils\Json; +use RectorPrefix202411\Nette\Utils\Json; use Rector\ChangesReporting\Contract\Output\OutputFormatterInterface; use Rector\Parallel\ValueObject\Bridge; use Rector\ValueObject\Configuration; diff --git a/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php b/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php index ac19bd23d..d25c60076 100644 --- a/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php +++ b/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php @@ -4,8 +4,8 @@ namespace Rector\ChangesReporting\ValueObject; use Rector\Contract\Rector\RectorInterface; -use RectorPrefix202410\Symplify\EasyParallel\Contract\SerializableInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface; +use RectorPrefix202411\Webmozart\Assert\Assert; final class RectorWithLineChange implements SerializableInterface { /** @@ -48,7 +48,7 @@ public function getRectorClass() : string * @param array $json * @return $this */ - public static function decode(array $json) : \RectorPrefix202410\Symplify\EasyParallel\Contract\SerializableInterface + public static function decode(array $json) : \RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface { /** @var class-string $rectorClass */ $rectorClass = $json[self::KEY_RECTOR_CLASS]; diff --git a/vendor/rector/rector/src/Composer/InstalledPackageResolver.php b/vendor/rector/rector/src/Composer/InstalledPackageResolver.php index 08753863c..9b895b4fb 100644 --- a/vendor/rector/rector/src/Composer/InstalledPackageResolver.php +++ b/vendor/rector/rector/src/Composer/InstalledPackageResolver.php @@ -3,11 +3,11 @@ declare (strict_types=1); namespace Rector\Composer; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Json; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Json; use Rector\Composer\ValueObject\InstalledPackage; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Composer\InstalledPackageResolverTest */ diff --git a/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php b/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php index 78c614e46..9260df3a7 100644 --- a/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php +++ b/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php @@ -11,6 +11,7 @@ use Rector\DeadCode\Rector\BooleanAnd\RemoveAndTrueRector; use Rector\DeadCode\Rector\Cast\RecastingRemovalRector; use Rector\DeadCode\Rector\ClassConst\RemoveUnusedPrivateClassConstantRector; +use Rector\DeadCode\Rector\ClassLike\RemoveTypedPropertyNonMockDocblockRector; use Rector\DeadCode\Rector\ClassMethod\RemoveEmptyClassMethodRector; use Rector\DeadCode\Rector\ClassMethod\RemoveNullTagValueNodeRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUnusedConstructorParamRector; @@ -95,6 +96,7 @@ final class DeadCodeLevel // prioritize safe belt on RemoveUseless*TagRector that registered previously first RemoveNullTagValueNodeRector::class, RemovePhpVersionIdCheckRector::class, + RemoveTypedPropertyNonMockDocblockRector::class, RemoveAlwaysTrueIfConditionRector::class, ReduceAlwaysFalseIfOrRector::class, RemoveUnusedPrivateClassConstantRector::class, diff --git a/vendor/rector/rector/src/Config/RectorConfig.php b/vendor/rector/rector/src/Config/RectorConfig.php index f52e772b6..c706b4ee7 100644 --- a/vendor/rector/rector/src/Config/RectorConfig.php +++ b/vendor/rector/rector/src/Config/RectorConfig.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Config; -use RectorPrefix202410\Illuminate\Container\Container; +use RectorPrefix202411\Illuminate\Container\Container; use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; @@ -18,11 +18,11 @@ use Rector\Validation\RectorConfigValidator; use Rector\ValueObject\PhpVersion; use Rector\ValueObject\PolyfillPackage; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\ArrayInput; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\ArrayInput; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api */ @@ -336,6 +336,10 @@ public function reportingRealPath(bool $absolute = \true) : void { SimpleParameterProvider::setParameter(Option::ABSOLUTE_FILE_PATH, $absolute); } + public function editorUrl(string $editorUrl) : void + { + SimpleParameterProvider::setParameter(Option::EDITOR_URL, $editorUrl); + } /** * @internal Used only for bridge * @return array, mixed> diff --git a/vendor/rector/rector/src/Configuration/ConfigInitializer.php b/vendor/rector/rector/src/Configuration/ConfigInitializer.php index 1f16a2090..ff789008d 100644 --- a/vendor/rector/rector/src/Configuration/ConfigInitializer.php +++ b/vendor/rector/rector/src/Configuration/ConfigInitializer.php @@ -3,11 +3,11 @@ declare (strict_types=1); namespace Rector\Configuration; -use RectorPrefix202410\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem; use Rector\Contract\Rector\RectorInterface; use Rector\FileSystem\InitFilePathsResolver; use Rector\PostRector\Contract\Rector\PostRectorInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class ConfigInitializer { /** diff --git a/vendor/rector/rector/src/Configuration/ConfigurationFactory.php b/vendor/rector/rector/src/Configuration/ConfigurationFactory.php index f7c8d14ff..2690e4d1a 100644 --- a/vendor/rector/rector/src/Configuration/ConfigurationFactory.php +++ b/vendor/rector/rector/src/Configuration/ConfigurationFactory.php @@ -6,8 +6,8 @@ use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\ValueObject\Configuration; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; /** * @see \Rector\Tests\Configuration\ConfigurationFactoryTest */ diff --git a/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php b/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php index 8bf282cff..63465aed3 100644 --- a/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php +++ b/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php @@ -5,7 +5,7 @@ use Rector\Contract\Rector\RectorInterface; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class LevelRulesResolver { /** diff --git a/vendor/rector/rector/src/Configuration/Option.php b/vendor/rector/rector/src/Configuration/Option.php index 2047e8d70..f5ea0d23f 100644 --- a/vendor/rector/rector/src/Configuration/Option.php +++ b/vendor/rector/rector/src/Configuration/Option.php @@ -216,4 +216,10 @@ final class Option * @var string */ public const ABSOLUTE_FILE_PATH = 'absolute_file_path'; + /** + * @internal To add editor links to console output + * @see \Rector\Config\RectorConfig::editorUrl() + * @var string + */ + public const EDITOR_URL = 'editor_url'; } diff --git a/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php b/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php index a0a749b74..a7a8d0bbf 100644 --- a/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php +++ b/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php @@ -5,7 +5,7 @@ use Rector\Configuration\Option; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api */ diff --git a/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php b/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php index b92b984e9..0585148ed 100644 --- a/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php +++ b/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php @@ -6,7 +6,7 @@ use Rector\Set\ValueObject\SetList; use Rector\Tests\Configuration\PhpLevelSetResolverTest; use Rector\ValueObject\PhpVersion; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see PhpLevelSetResolverTest */ diff --git a/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php b/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php index f595a48a8..a4086df15 100644 --- a/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php +++ b/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php @@ -3,8 +3,9 @@ declare (strict_types=1); namespace Rector\Configuration; -use RectorPrefix202410\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem; use Rector\Bridge\SetProviderCollector; +use Rector\Bridge\SetRectorsResolver; use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface; use Rector\Config\Level\CodeQualityLevel; use Rector\Config\Level\DeadCodeLevel; @@ -28,8 +29,8 @@ use Rector\Symfony\Set\SensiolabsSetList; use Rector\Symfony\Set\SymfonySetList; use Rector\ValueObject\PhpVersion; -use RectorPrefix202410\Symfony\Component\Finder\Finder; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\Finder\Finder; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api */ @@ -177,11 +178,19 @@ final class RectorConfigBuilder * @var string[] */ private $groupLoadedSets = []; + /** + * @var string|null + */ + private $editorUrl; /** * @api soon to be used * @var bool|null */ private $isWithPhpSetsUsed; + /** + * @var bool|null + */ + private $isWithPhpLevelUsed; public function __invoke(RectorConfig $rectorConfig) : void { // @experimental 2024-06 @@ -193,6 +202,9 @@ public function __invoke(RectorConfig $rectorConfig) : void // merge sets together $this->sets = \array_merge($this->sets, $this->groupLoadedSets); $uniqueSets = \array_unique($this->sets); + if ($this->isWithPhpLevelUsed && $this->isWithPhpSetsUsed) { + throw new InvalidConfigurationException(\sprintf('Your config uses "withPhp*()" and "withPhpLevel()" methods at the same time.%sPick one of them to avoid rule conflicts.', \PHP_EOL)); + } if (\in_array(SetList::TYPE_DECLARATION, $uniqueSets, \true) && $this->isTypeCoverageLevelUsed === \true) { throw new InvalidConfigurationException(\sprintf('Your config already enables type declarations set.%sRemove "->withTypeCoverageLevel()" as it only duplicates it, or remove type declaration set.', \PHP_EOL)); } @@ -288,6 +300,9 @@ public function __invoke(RectorConfig $rectorConfig) : void if ($this->reportingRealPath !== null) { $rectorConfig->reportingRealPath($this->reportingRealPath); } + if ($this->editorUrl !== null) { + $rectorConfig->editorUrl($this->editorUrl); + } } /** * @param string[] $paths @@ -756,6 +771,33 @@ public function withTypeCoverageLevel(int $level) : self $this->rules = \array_merge($this->rules, $levelRules); return $this; } + /** + * @experimental Since 1.2.5 Raise your PHP level from, one level at a time + */ + public function withPhpLevel(int $level) : self + { + Assert::natural($level); + $this->isWithPhpLevelUsed = \true; + $phpVersion = ComposerJsonPhpVersionResolver::resolveFromCwdOrFail(); + $setRectorsResolver = new SetRectorsResolver(); + $setFilePaths = \Rector\Configuration\PhpLevelSetResolver::resolveFromPhpVersion($phpVersion); + $rectorRulesWithConfiguration = $setRectorsResolver->resolveFromFilePathsIncludingConfiguration($setFilePaths); + foreach ($rectorRulesWithConfiguration as $position => $rectorRuleWithConfiguration) { + // add rules untill level is reached + if ($position > $level) { + continue; + } + if (\is_string($rectorRuleWithConfiguration)) { + $this->rules[] = $rectorRuleWithConfiguration; + } elseif (\is_array($rectorRuleWithConfiguration)) { + foreach ($rectorRuleWithConfiguration as $rectorRule => $rectorRuleConfiguration) { + /** @var class-string $rectorRule */ + $this->withConfiguredRule($rectorRule, $rectorRuleConfiguration); + } + } + } + return $this; + } /** * @experimental Raise your code quality from the safest rules * to more affecting ones, one level at a time @@ -815,4 +857,9 @@ public function withRealPathReporting(bool $absolutePath = \true) : self $this->reportingRealPath = $absolutePath; return $this; } + public function withEditorUrl(string $editorUrl) : self + { + $this->editorUrl = $editorUrl; + return $this; + } } diff --git a/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php b/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php index e0feb26c2..c248958dc 100644 --- a/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php +++ b/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php @@ -7,16 +7,16 @@ use DOMElement; use DOMXPath; use Generator; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\Exception\ShouldNotHappenException; use Rector\FileSystem\JsonFileSystem; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202410\Symfony\Component\Finder\Finder; -use RectorPrefix202410\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Finder\Finder; +use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; final class CustomRuleCommand extends Command { /** diff --git a/vendor/rector/rector/src/Console/Command/ListRulesCommand.php b/vendor/rector/rector/src/Console/Command/ListRulesCommand.php index 3688d629a..2de98e3cd 100644 --- a/vendor/rector/rector/src/Console/Command/ListRulesCommand.php +++ b/vendor/rector/rector/src/Console/Command/ListRulesCommand.php @@ -3,17 +3,17 @@ declare (strict_types=1); namespace Rector\Console\Command; -use RectorPrefix202410\Nette\Utils\Json; +use RectorPrefix202411\Nette\Utils\Json; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use Rector\Configuration\Option; use Rector\Contract\Rector\RectorInterface; use Rector\PostRector\Contract\Rector\PostRectorInterface; use Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class ListRulesCommand extends Command { /** diff --git a/vendor/rector/rector/src/Console/Command/ProcessCommand.php b/vendor/rector/rector/src/Console/Command/ProcessCommand.php index 65316e1e2..173b77f68 100644 --- a/vendor/rector/rector/src/Console/Command/ProcessCommand.php +++ b/vendor/rector/rector/src/Console/Command/ProcessCommand.php @@ -20,11 +20,11 @@ use Rector\Util\MemoryLimiter; use Rector\ValueObject\Configuration; use Rector\ValueObject\ProcessResult; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class ProcessCommand extends Command { /** diff --git a/vendor/rector/rector/src/Console/Command/SetupCICommand.php b/vendor/rector/rector/src/Console/Command/SetupCICommand.php index 05334ee88..4ee94f035 100644 --- a/vendor/rector/rector/src/Console/Command/SetupCICommand.php +++ b/vendor/rector/rector/src/Console/Command/SetupCICommand.php @@ -3,13 +3,13 @@ declare (strict_types=1); namespace Rector\Console\Command; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\OndraM\CiDetector\CiDetector; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\OndraM\CiDetector\CiDetector; use Rector\Git\RepositoryHelper; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; use function sprintf; final class SetupCICommand extends Command { diff --git a/vendor/rector/rector/src/Console/Command/WorkerCommand.php b/vendor/rector/rector/src/Console/Command/WorkerCommand.php index f68632c93..e51989759 100644 --- a/vendor/rector/rector/src/Console/Command/WorkerCommand.php +++ b/vendor/rector/rector/src/Console/Command/WorkerCommand.php @@ -3,11 +3,11 @@ declare (strict_types=1); namespace Rector\Console\Command; -use RectorPrefix202410\Clue\React\NDJson\Decoder; -use RectorPrefix202410\Clue\React\NDJson\Encoder; -use RectorPrefix202410\React\EventLoop\StreamSelectLoop; -use RectorPrefix202410\React\Socket\ConnectionInterface; -use RectorPrefix202410\React\Socket\TcpConnector; +use RectorPrefix202411\Clue\React\NDJson\Decoder; +use RectorPrefix202411\Clue\React\NDJson\Encoder; +use RectorPrefix202411\React\EventLoop\StreamSelectLoop; +use RectorPrefix202411\React\Socket\ConnectionInterface; +use RectorPrefix202411\React\Socket\TcpConnector; use Rector\Application\ApplicationFileProcessor; use Rector\Configuration\ConfigurationFactory; use Rector\Console\ProcessConfigureDecorator; @@ -16,14 +16,14 @@ use Rector\Util\MemoryLimiter; use Rector\ValueObject\Configuration; use Rector\ValueObject\Error\SystemError; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symplify\EasyParallel\Enum\Action; -use RectorPrefix202410\Symplify\EasyParallel\Enum\ReactCommand; -use RectorPrefix202410\Symplify\EasyParallel\Enum\ReactEvent; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symplify\EasyParallel\Enum\Action; +use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactCommand; +use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactEvent; use Throwable; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\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 diff --git a/vendor/rector/rector/src/Console/ConsoleApplication.php b/vendor/rector/rector/src/Console/ConsoleApplication.php index 2332bc9c9..f921daee5 100644 --- a/vendor/rector/rector/src/Console/ConsoleApplication.php +++ b/vendor/rector/rector/src/Console/ConsoleApplication.php @@ -3,17 +3,17 @@ declare (strict_types=1); namespace Rector\Console; -use RectorPrefix202410\Composer\XdebugHandler\XdebugHandler; +use RectorPrefix202411\Composer\XdebugHandler\XdebugHandler; use Rector\Application\VersionResolver; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use Rector\Configuration\Option; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Webmozart\Assert\Assert; final class ConsoleApplication extends Application { /** diff --git a/vendor/rector/rector/src/Console/ExitCode.php b/vendor/rector/rector/src/Console/ExitCode.php index 10626eca5..a87e73d6e 100644 --- a/vendor/rector/rector/src/Console/ExitCode.php +++ b/vendor/rector/rector/src/Console/ExitCode.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Console; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; /** * @api */ diff --git a/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php b/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php index 607858148..7ce6611f1 100644 --- a/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php +++ b/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\Console\Formatter; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\Util\NewLineSplitter; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; /** * Inspired by @see https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/master/src/Differ/DiffConsoleFormatter.php to be * used as standalone class, without need to require whole package by Dariusz Rumiński diff --git a/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php b/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php index 6e61a9ffc..51bcfabc6 100644 --- a/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php +++ b/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Console\Formatter; -use RectorPrefix202410\SebastianBergmann\Diff\Differ; -use RectorPrefix202410\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; +use RectorPrefix202411\SebastianBergmann\Diff\Differ; +use RectorPrefix202411\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; final class ConsoleDiffer { /** diff --git a/vendor/rector/rector/src/Console/Notifier.php b/vendor/rector/rector/src/Console/Notifier.php index 68fabed69..524f5dd48 100644 --- a/vendor/rector/rector/src/Console/Notifier.php +++ b/vendor/rector/rector/src/Console/Notifier.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\Console; -use RectorPrefix202410\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class Notifier { public static function notifyNotSuitableMethodForPHP74(string $calledMethod) : void diff --git a/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php b/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php index 2f648c161..ea26d34ab 100644 --- a/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php +++ b/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php @@ -5,9 +5,9 @@ use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use Rector\Configuration\Option; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; final class ProcessConfigureDecorator { public static function decorate(Command $command) : void diff --git a/vendor/rector/rector/src/Console/Style/RectorStyle.php b/vendor/rector/rector/src/Console/Style/RectorStyle.php index 2a66df44b..ab6cd5580 100644 --- a/vendor/rector/rector/src/Console/Style/RectorStyle.php +++ b/vendor/rector/rector/src/Console/Style/RectorStyle.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\Console\Style; -use RectorPrefix202410\OndraM\CiDetector\CiDetector; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Console\Helper\ProgressBar; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\OndraM\CiDetector\CiDetector; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Helper\ProgressBar; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class RectorStyle extends SymfonyStyle { /** diff --git a/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php b/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php index e53788c43..057ca57f0 100644 --- a/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php +++ b/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php @@ -4,10 +4,10 @@ namespace Rector\Console\Style; use Rector\Util\Reflection\PrivatesAccessor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; final class SymfonyStyleFactory { /** diff --git a/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php b/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php index 6e29f5120..836c18e3f 100644 --- a/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php +++ b/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\DependencyInjection\Laravel; -use RectorPrefix202410\Illuminate\Container\Container; +use RectorPrefix202411\Illuminate\Container\Container; use Rector\Util\Reflection\PrivatesAccessor; /** * Helper service to modify Laravel container diff --git a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php index 5cdc61f24..aef82bf63 100644 --- a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php +++ b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\DependencyInjection; -use RectorPrefix202410\Doctrine\Inflector\Inflector; -use RectorPrefix202410\Doctrine\Inflector\Rules\English\InflectorFactory; -use RectorPrefix202410\Illuminate\Container\Container; +use RectorPrefix202411\Doctrine\Inflector\Inflector; +use RectorPrefix202411\Doctrine\Inflector\Rules\English\InflectorFactory; +use RectorPrefix202411\Illuminate\Container\Container; use PhpParser\Lexer; use PHPStan\Analyser\NodeScopeResolver; use PHPStan\Analyser\ScopeFactory; @@ -175,10 +175,10 @@ use Rector\StaticTypeMapper\PhpParser\NullableTypeNodeMapper; use Rector\StaticTypeMapper\PhpParser\StringNodeMapper; use Rector\StaticTypeMapper\PhpParser\UnionTypeNodeMapper; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Webmozart\Assert\Assert; final class LazyContainerFactory { /** diff --git a/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php b/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php index dd6283ef3..45cd0ac27 100644 --- a/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php +++ b/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\DependencyInjection; -use RectorPrefix202410\Illuminate\Container\Container; +use RectorPrefix202411\Illuminate\Container\Container; use Rector\Autoloading\BootstrapFilesIncluder; use Rector\Caching\Detector\ChangedFilesDetector; use Rector\ValueObject\Bootstrap\BootstrapConfigs; diff --git a/vendor/rector/rector/src/Differ/DefaultDiffer.php b/vendor/rector/rector/src/Differ/DefaultDiffer.php index e3539d90c..d5e7e9d53 100644 --- a/vendor/rector/rector/src/Differ/DefaultDiffer.php +++ b/vendor/rector/rector/src/Differ/DefaultDiffer.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Differ; -use RectorPrefix202410\SebastianBergmann\Diff\Differ; -use RectorPrefix202410\SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder; +use RectorPrefix202411\SebastianBergmann\Diff\Differ; +use RectorPrefix202411\SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder; final class DefaultDiffer { /** diff --git a/vendor/rector/rector/src/Enum/ClassName.php b/vendor/rector/rector/src/Enum/ClassName.php new file mode 100644 index 000000000..80b446eca --- /dev/null +++ b/vendor/rector/rector/src/Enum/ClassName.php @@ -0,0 +1,12 @@ +isAnonymousClass($node->class); - } - if ($node->isAnonymous()) { - return \true; - } - $scope = $node->getAttribute(AttributeKey::SCOPE); - if (!$scope instanceof Scope) { - return \false; + if ($node instanceof New_) { + return $this->isAnonymousClass($node->class); } - $classReflection = $scope->getClassReflection(); - if ($classReflection instanceof ClassReflection) { - return $classReflection->isAnonymous(); + if ($node instanceof Class_) { + return $node->isAnonymous(); } return \false; } diff --git a/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php index acbf90b44..fc50a3965 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php @@ -19,6 +19,7 @@ use PhpParser\Node\Scalar\String_; use PHPStan\Analyser\Scope; use PHPStan\Type\MixedType; +use PHPStan\Type\ObjectWithoutClassType; use PHPStan\Type\UnionType; use Rector\Enum\ObjectReference; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -39,6 +40,9 @@ public function isNonTypedFromParam(Expr $expr) : bool return \true; } $type = $scope->getType($expr); + if ($nativeType instanceof ObjectWithoutClassType && !$type instanceof ObjectWithoutClassType) { + return \true; + } if ($nativeType instanceof UnionType) { return !$nativeType->equals($type); } diff --git a/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php index fbb465e96..43eaaf8b9 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php @@ -6,34 +6,19 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Stmt\Function_; use PHPStan\Reflection\FunctionReflection; use PHPStan\Reflection\MethodReflection; -use Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector; -use Rector\PhpParser\AstResolver; use Rector\Reflection\ReflectionResolver; final class VariadicAnalyzer { - /** - * @readonly - * @var \Rector\PhpParser\AstResolver - */ - private $astResolver; /** * @readonly * @var \Rector\Reflection\ReflectionResolver */ private $reflectionResolver; - /** - * @readonly - * @var \Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector - */ - private $variadicFunctionLikeDetector; - public function __construct(AstResolver $astResolver, ReflectionResolver $reflectionResolver, VariadicFunctionLikeDetector $variadicFunctionLikeDetector) + public function __construct(ReflectionResolver $reflectionResolver) { - $this->astResolver = $astResolver; $this->reflectionResolver = $reflectionResolver; - $this->variadicFunctionLikeDetector = $variadicFunctionLikeDetector; } /** * @param \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall $call @@ -44,17 +29,7 @@ public function hasVariadicParameters($call) : bool if ($functionLikeReflection === null) { return \false; } - if ($this->hasVariadicVariant($functionLikeReflection)) { - return \true; - } - if ($functionLikeReflection instanceof FunctionReflection) { - $function = $this->astResolver->resolveFunctionFromFunctionReflection($functionLikeReflection); - if (!$function instanceof Function_) { - return \false; - } - return $this->variadicFunctionLikeDetector->isVariadic($function); - } - return \false; + return $this->hasVariadicVariant($functionLikeReflection); } /** * @param \PHPStan\Reflection\MethodReflection|\PHPStan\Reflection\FunctionReflection $functionLikeReflection diff --git a/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php index 3e24022e9..0aaaa401a 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php @@ -23,6 +23,9 @@ use Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer; use Rector\ValueObject\MethodName; use Rector\ValueObject\PhpVersionFeature; +/** + * @see \Rector\Tests\NodeManipulator\ClassDependencyManipulatorTest + */ final class ClassDependencyManipulator { /** diff --git a/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php index ed48b4296..c669096d3 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\NodeManipulator; -use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\ClassMethod; @@ -24,19 +23,47 @@ public function __construct(NodeFactory $nodeFactory) } /** * @api - * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod $stmt + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod $addedStmt */ - public function addAsFirstMethod(Class_ $class, $stmt) : void + public function addAsFirstMethod(Class_ $class, $addedStmt) : void { $scope = $class->getAttribute(AttributeKey::SCOPE); - $stmt->setAttribute(AttributeKey::SCOPE, $scope); - if ($this->isSuccessToInsertBeforeFirstMethod($class, $stmt)) { + $addedStmt->setAttribute(AttributeKey::SCOPE, $scope); + // no stmts? add this one + if ($class->stmts === []) { + $class->stmts[] = $addedStmt; return; } - if ($this->isSuccessToInsertAfterLastProperty($class, $stmt)) { + $newClassStmts = []; + $isAdded = \false; + foreach ($class->stmts as $key => $classStmt) { + $nextStmt = $class->stmts[$key + 1] ?? null; + if ($isAdded === \false) { + // first class method + if ($classStmt instanceof ClassMethod) { + $newClassStmts[] = $addedStmt; + $newClassStmts[] = $classStmt; + $isAdded = \true; + continue; + } + // after last property + if ($classStmt instanceof Property && !$nextStmt instanceof Property) { + $newClassStmts[] = $classStmt; + $newClassStmts[] = $addedStmt; + $isAdded = \true; + continue; + } + } + $newClassStmts[] = $classStmt; + } + // still not added? try after last trait + // @todo + if ($isAdded) { + $class->stmts = $newClassStmts; return; } - $class->stmts[] = $stmt; + // keep added at least as first stmt + $class->stmts = \array_merge([$addedStmt], $class->stmts); } /** * @internal Use PropertyAdder service instead @@ -50,42 +77,4 @@ public function addPropertyToClass(Class_ $class, string $name, ?Type $type) : v $property = $this->nodeFactory->createPrivatePropertyFromNameAndType($name, $type); $this->addAsFirstMethod($class, $property); } - /** - * @param Stmt[] $stmts - * @return Stmt[] - */ - private function insertBefore(array $stmts, Stmt $stmt, int $key) : array - { - \array_splice($stmts, $key, 0, [$stmt]); - return $stmts; - } - /** - * @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $stmt - */ - private function isSuccessToInsertBeforeFirstMethod(Class_ $class, $stmt) : bool - { - foreach ($class->stmts as $key => $classStmt) { - if (!$classStmt instanceof ClassMethod) { - continue; - } - $class->stmts = $this->insertBefore($class->stmts, $stmt, $key); - return \true; - } - return \false; - } - /** - * @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $stmt - */ - private function isSuccessToInsertAfterLastProperty(Class_ $class, $stmt) : bool - { - $previousElement = null; - foreach ($class->stmts as $key => $classStmt) { - if ($previousElement instanceof Property && !$classStmt instanceof Property) { - $class->stmts = $this->insertBefore($class->stmts, $stmt, $key); - return \true; - } - $previousElement = $classStmt; - } - return \false; - } } diff --git a/vendor/rector/rector/src/NodeManipulator/IfManipulator.php b/vendor/rector/rector/src/NodeManipulator/IfManipulator.php index b2ea3821a..737044c82 100644 --- a/vendor/rector/rector/src/NodeManipulator/IfManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/IfManipulator.php @@ -5,6 +5,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\Exit_; use PhpParser\Node\Expr\Variable; @@ -124,6 +125,9 @@ public function collectNestedIfsWithNonBreaking(Foreach_ $foreach) : array if (!$onlyForeachStmt instanceof If_) { return []; } + if ($onlyForeachStmt->cond instanceof BooleanOr) { + return []; + } $ifs = []; $currentIf = $onlyForeachStmt; while ($this->isIfWithOnlyStmtIf($currentIf)) { diff --git a/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php b/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php index 784923d8c..819681c14 100644 --- a/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\NodeManipulator; -use RectorPrefix202410\Doctrine\ORM\Mapping\Table; +use RectorPrefix202411\Doctrine\ORM\Mapping\Table; use PhpParser\Node; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; @@ -92,7 +92,7 @@ final class PropertyManipulator /** * @var string[]|class-string[] */ - private const DOCTRINE_PROPERTY_ANNOTATIONS = ['Doctrine\\ORM\\Mapping\\Entity', 'Doctrine\\ORM\\Mapping\\Table', 'Doctrine\\ORM\\Mapping\\MappedSuperclass']; + private const DOCTRINE_PROPERTY_ANNOTATIONS = ['Doctrine\\ORM\\Mapping\\Entity', 'Doctrine\\ORM\\Mapping\\Table', 'Doctrine\\ORM\\Mapping\\MappedSuperclass', 'Doctrine\\ORM\\Mapping\\Embeddable']; public function __construct(\Rector\NodeManipulator\AssignManipulator $assignManipulator, BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory, PropertyFetchFinder $propertyFetchFinder, NodeNameResolver $nodeNameResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, NodeTypeResolver $nodeTypeResolver, PromotedPropertyResolver $promotedPropertyResolver, ConstructorAssignDetector $constructorAssignDetector, AstResolver $astResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer) { $this->assignManipulator = $assignManipulator; diff --git a/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php b/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php index b8407e10c..ca551ad06 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php +++ b/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php @@ -15,11 +15,11 @@ use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider; -use RectorPrefix202410\Symfony\Component\Console\Input\ArrayInput; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Input\ArrayInput; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; use Throwable; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * Factory so Symfony app can use services from PHPStan container * diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php index cf0bc8a07..5f8fcae3f 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php @@ -370,7 +370,14 @@ private function isMatchObjectWithoutClassType(ObjectWithoutClassType $objectWit } private function isAnonymousObjectType(Type $type) : bool { - return $type instanceof ObjectType && $this->classAnalyzer->isAnonymousClassName($type->getClassName()); + if (!$type instanceof ObjectType) { + return \false; + } + $classReflection = $type->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \false; + } + return $classReflection->isAnonymous(); } private function isUnionTypeable(Type $first, Type $second) : bool { diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php index 4b75dba56..73c610ed5 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php @@ -33,6 +33,7 @@ public function enterNode(Node $node) : ?Node if ($node->expr instanceof Assign) { $node->var->setAttribute(AttributeKey::IS_MULTI_ASSIGN, \true); $node->expr->setAttribute(AttributeKey::IS_MULTI_ASSIGN, \true); + $node->expr->var->setAttribute(AttributeKey::IS_ASSIGNED_TO, \true); } return null; } diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php index 44b0d69df..b56cd4c32 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php @@ -69,7 +69,7 @@ use Rector\PHPStan\NodeVisitor\UnreachableStatementNodeVisitor; use Rector\PHPStan\NodeVisitor\WrappedNodeRestoringNodeVisitor; use Rector\Util\Reflection\PrivatesAccessor; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @inspired by https://github.com/silverstripe/silverstripe-upgrader/blob/532182b23e854d02e0b27e68ebc394f436de0682/src/UpgradeRule/PHP/Visitor/PHPStanScopeVisitor.php * - https://github.com/silverstripe/silverstripe-upgrader/pull/57/commits/e5c7cfa166ad940d9d4ff69537d9f7608e992359#diff-5e0807bb3dc03d6a8d8b6ad049abd774 diff --git a/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php index fb02e9760..8d21fb3c9 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\NodeTypeResolver\PhpDocNodeVisitor; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node as PhpParserNode; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; diff --git a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php index 11eed12a7..5a5a4a6e0 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php +++ b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php @@ -10,6 +10,7 @@ use PHPStan\Type\BooleanType; use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\ConstantScalarType; +use PHPStan\Type\Generic\TemplateType; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\StaticType; @@ -64,6 +65,8 @@ public function __construct(TypeHasher $typeHasher, TypeNormalizer $typeNormaliz } public function areTypesEqual(Type $firstType, Type $secondType) : bool { + $firstType = $this->normalizeTemplateType($firstType); + $secondType = $this->normalizeTemplateType($secondType); $firstTypeHash = $this->typeHasher->createTypeHash($firstType); $secondTypeHash = $this->typeHasher->createTypeHash($secondType); if ($firstTypeHash === $secondTypeHash) { @@ -106,6 +109,8 @@ public function arePhpParserAndPhpStanPhpDocTypesEqual(Node $phpParserNode, Type } public function isSubtype(Type $checkedType, Type $mainType) : bool { + $checkedType = $this->normalizeTemplateType($checkedType); + $mainType = $this->normalizeTemplateType($mainType); if ($mainType instanceof MixedType) { return \false; } @@ -117,6 +122,14 @@ public function isSubtype(Type $checkedType, Type $mainType) : bool } return $this->arrayTypeComparator->isSubtype($checkedType, $mainType); } + /** + * unless it by ref, object param has its own life vs redefined variable + * see https://3v4l.org/dI5Pe vs https://3v4l.org/S8i71 + */ + private function normalizeTemplateType(Type $type) : Type + { + return $type instanceof TemplateType ? $type->getBound() : $type; + } private function areAliasedObjectMatchingFqnObject(Type $firstType, Type $secondType) : bool { if ($firstType instanceof AliasedObjectType && $secondType instanceof ObjectType) { diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php index 286ade283..6088256a3 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php @@ -11,7 +11,7 @@ use Rector\Exception\NotImplementedYetException; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class PHPStanStaticTypeMapper { /** diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php index 5e4b25841..f90685394 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Reflection\ClassReflection; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php index 70ba62242..659854f7f 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php @@ -6,15 +6,20 @@ use PhpParser\Node; use PhpParser\Node\Name\FullyQualified; use PHPStan\PhpDocParser\Ast\Node as AstNode; +use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; +use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; use PHPStan\Type\IntersectionType; +use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\ObjectWithoutClassType; use PHPStan\Type\Type; use Rector\Php\PhpVersionProvider; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; +use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; +use Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper; use Rector\ValueObject\PhpVersionFeature; /** * @implements TypeMapperInterface @@ -36,11 +41,17 @@ final class IntersectionTypeMapper implements TypeMapperInterface * @var \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectTypeMapper */ private $objectTypeMapper; - public function __construct(PhpVersionProvider $phpVersionProvider, \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper, \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectTypeMapper $objectTypeMapper) + /** + * @readonly + * @var \Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper + */ + private $scalarStringToTypeMapper; + public function __construct(PhpVersionProvider $phpVersionProvider, \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper, \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectTypeMapper $objectTypeMapper, ScalarStringToTypeMapper $scalarStringToTypeMapper) { $this->phpVersionProvider = $phpVersionProvider; $this->objectWithoutClassTypeMapper = $objectWithoutClassTypeMapper; $this->objectTypeMapper = $objectTypeMapper; + $this->scalarStringToTypeMapper = $scalarStringToTypeMapper; } public function getNodeClass() : string { @@ -53,12 +64,28 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode { $typeNode = $type->toPhpDocNode(); $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($typeNode, '', static function (AstNode $astNode) : ?IdentifierTypeNode { - if ($astNode instanceof IdentifierTypeNode) { - $astNode->name = '\\' . \ltrim($astNode->name, '\\'); - return $astNode; + $phpDocNodeTraverser->traverseWithCallable($typeNode, '', function (AstNode $astNode) { + if ($astNode instanceof UnionTypeNode) { + return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } - return null; + if ($astNode instanceof ArrayShapeItemNode) { + return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if (!$astNode instanceof IdentifierTypeNode) { + return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + $type = $this->scalarStringToTypeMapper->mapScalarStringToType($astNode->name); + if ($type->isScalar()->yes()) { + return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if ($type->isArray()->yes()) { + return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if ($type instanceof MixedType && $type->isExplicitMixed()) { + return PhpDocNodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + $astNode->name = '\\' . \ltrim($astNode->name, '\\'); + return $astNode; }); return $typeNode; } @@ -90,6 +117,9 @@ public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node if (\count($intersectionedTypeNodes) === 1) { return \current($intersectionedTypeNodes); } + if ($typeKind === TypeKind::UNION && !$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::UNION_INTERSECTION_TYPES)) { + return null; + } return new Node\IntersectionType($intersectionedTypeNodes); } } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php index 01be2f353..930c7991e 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php index ee90f5c45..83458d093 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php @@ -21,8 +21,8 @@ use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper; use Rector\ValueObject\PhpVersionFeature; -use RectorPrefix202410\Webmozart\Assert\Assert; -use RectorPrefix202410\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; /** * @implements TypeMapperInterface */ diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php index cea3977d6..687576043 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\Utils; +use PHPStan\Type\CallableType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; use PHPStan\Type\TypeWithClassName; @@ -22,8 +23,49 @@ public function unwrapFirstObjectTypeFromUnionType(Type $type) : Type } return $type; } + public function unwrapFirstCallableTypeFromUnionType(Type $type) : ?Type + { + if (!$type instanceof UnionType) { + return $type; + } + foreach ($type->getTypes() as $unionedType) { + if (!$unionedType instanceof CallableType) { + continue; + } + return $unionedType; + } + return $type; + } + public function isIterableTypeValue(string $className, Type $type) : bool + { + if (!$type instanceof TypeWithClassName) { + return \false; + } + // get the namespace from $className + $classNamespace = $this->namespace($className); + // get the namespace from $parameterReflection + $reflectionNamespace = $this->namespace($type->getClassName()); + // then match with + return $reflectionNamespace === $classNamespace && \substr_compare($type->getClassName(), '\\TValue', -\strlen('\\TValue')) === 0; + } + public function isIterableTypeKey(string $className, Type $type) : bool + { + if (!$type instanceof TypeWithClassName) { + return \false; + } + // get the namespace from $className + $classNamespace = $this->namespace($className); + // get the namespace from $parameterReflection + $reflectionNamespace = $this->namespace($type->getClassName()); + // then match with + return $reflectionNamespace === $classNamespace && \substr_compare($type->getClassName(), '\\TKey', -\strlen('\\TKey')) === 0; + } public function removeNullTypeFromUnionType(UnionType $unionType) : Type { return TypeCombinator::removeNull($unionType); } + private function namespace(string $class) : string + { + return \implode('\\', \array_slice(\explode('\\', $class), 0, -1)); + } } diff --git a/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php b/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php index 30fed0054..325b196a0 100644 --- a/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php +++ b/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\Parallel\Application; -use RectorPrefix202410\Clue\React\NDJson\Decoder; -use RectorPrefix202410\Clue\React\NDJson\Encoder; -use RectorPrefix202410\Nette\Utils\Random; -use RectorPrefix202410\React\EventLoop\StreamSelectLoop; -use RectorPrefix202410\React\Socket\ConnectionInterface; -use RectorPrefix202410\React\Socket\TcpServer; +use RectorPrefix202411\Clue\React\NDJson\Decoder; +use RectorPrefix202411\Clue\React\NDJson\Encoder; +use RectorPrefix202411\Nette\Utils\Random; +use RectorPrefix202411\React\EventLoop\StreamSelectLoop; +use RectorPrefix202411\React\Socket\ConnectionInterface; +use RectorPrefix202411\React\Socket\TcpServer; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Console\Command\ProcessCommand; @@ -17,15 +17,15 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\ProcessResult; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symplify\EasyParallel\Enum\Action; -use RectorPrefix202410\Symplify\EasyParallel\Enum\Content; -use RectorPrefix202410\Symplify\EasyParallel\Enum\ReactCommand; -use RectorPrefix202410\Symplify\EasyParallel\Enum\ReactEvent; -use RectorPrefix202410\Symplify\EasyParallel\ValueObject\ParallelProcess; -use RectorPrefix202410\Symplify\EasyParallel\ValueObject\ProcessPool; -use RectorPrefix202410\Symplify\EasyParallel\ValueObject\Schedule; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symplify\EasyParallel\Enum\Action; +use RectorPrefix202411\Symplify\EasyParallel\Enum\Content; +use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactCommand; +use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactEvent; +use RectorPrefix202411\Symplify\EasyParallel\ValueObject\ParallelProcess; +use RectorPrefix202411\Symplify\EasyParallel\ValueObject\ProcessPool; +use RectorPrefix202411\Symplify\EasyParallel\ValueObject\Schedule; use Throwable; /** * Inspired from @see diff --git a/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php b/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php index 478dc1a2e..971450bb5 100644 --- a/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php +++ b/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php @@ -6,10 +6,10 @@ use Rector\ChangesReporting\Output\JsonOutputFormatter; use Rector\Configuration\Option; use Rector\FileSystem\FilePathHelper; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; -use RectorPrefix202410\Symplify\EasyParallel\Reflection\CommandFromReflectionFactory; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; +use RectorPrefix202411\Symplify\EasyParallel\Reflection\CommandFromReflectionFactory; /** * @see \Rector\Tests\Parallel\Command\WorkerCommandLineFactoryTest * @todo possibly extract to symplify/easy-parallel @@ -146,8 +146,13 @@ private function mirrorCommandOptions(InputInterface $input, array $mainCommandO } continue; } - $workerCommandOptions[] = self::OPTION_DASHES . $mainCommandOptionName; - $workerCommandOptions[] = \escapeshellarg($optionValue); + if ($mainCommandOptionName === 'memory-limit') { + // symfony/console does not accept -1 as value without assign + $workerCommandOptions[] = self::OPTION_DASHES . $mainCommandOptionName . '=' . \escapeshellarg($optionValue); + } else { + $workerCommandOptions[] = self::OPTION_DASHES . $mainCommandOptionName; + $workerCommandOptions[] = \escapeshellarg($optionValue); + } } return $workerCommandOptions; } diff --git a/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php b/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php index 6e15a3fe5..e883592c7 100644 --- a/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php +++ b/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php\PhpVersionResolver; -use RectorPrefix202410\Composer\Semver\VersionParser; +use RectorPrefix202411\Composer\Semver\VersionParser; use Rector\Exception\Configuration\InvalidConfigurationException; use Rector\FileSystem\JsonFileSystem; use Rector\Util\PhpVersionFactory; diff --git a/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php b/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php index c5d5cd617..fc9d6459b 100644 --- a/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php +++ b/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Php; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Json; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Json; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\ValueObject\PolyfillPackage; diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php index 79fb3e89f..af74828e6 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php @@ -12,7 +12,7 @@ use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\PhpAttribute\AnnotationToAttributeMapper\AnnotationToAttributeMapperTest */ diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php index b582bd18b..2c921f395 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php @@ -13,7 +13,7 @@ use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; use Rector\PhpParser\Node\Value\ValueResolver; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @implements AnnotationToAttributeMapperInterface */ diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php index 34a66b41d..574273659 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php @@ -14,7 +14,7 @@ use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; use Rector\Validation\RectorAssert; -use RectorPrefix202410\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; /** * @implements AnnotationToAttributeMapperInterface */ diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php index 45198a850..3c442f96a 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php @@ -10,7 +10,7 @@ use Rector\PhpAttribute\AnnotationToAttributeMapper; use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @implements AnnotationToAttributeMapperInterface */ diff --git a/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php b/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php index 8ddd696ed..cb9fb8866 100644 --- a/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php +++ b/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php @@ -11,7 +11,7 @@ use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use Rector\Exception\NotImplementedYetException; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class AttributeArrayNameInliner { /** diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php index 638bce042..1d6c48fe7 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php @@ -15,7 +15,7 @@ use PHPStan\Type\Type; use PHPStan\Type\UnionType; use Rector\Php80\ValueObject\AnnotationToAttribute; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class AnnotationToAttributeIntegerValueCaster { /** diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php index 3b9c9960e..56be4debc 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpAttribute\NodeFactory; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\BuilderHelpers; use PhpParser\Node\Arg; use PhpParser\Node\Expr; diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php index fa656b78f..58ea15e9a 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpAttribute\NodeFactory; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Arg; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; @@ -26,7 +26,7 @@ use Rector\Php80\ValueObject\NestedAnnotationToAttribute; use Rector\PhpAttribute\AnnotationToAttributeMapper; use Rector\PhpAttribute\AttributeArrayNameInliner; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class PhpNestedAttributeGroupFactory { /** diff --git a/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php b/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php index 22ac80743..33a4c5287 100644 --- a/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php +++ b/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php @@ -19,7 +19,7 @@ use Rector\NodeAnalyzer\ClassAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\PhpParser\Node\BetterNodeFinder\BetterNodeFinderTest */ diff --git a/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php b/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php index a94028580..95c4e55db 100644 --- a/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php +++ b/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\PhpParser\Parser; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Scalar\Encapsed; diff --git a/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php b/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php index 2f1624273..b93aca502 100644 --- a/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php +++ b/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpParser\Parser; -use RectorPrefix202410\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem; use PhpParser\Node; use PhpParser\Node\Stmt\Expression; use PhpParser\NodeTraverser; diff --git a/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php b/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php index 586a8cc47..ce2ecbb7d 100644 --- a/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php +++ b/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpParser\Printer; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Comment; use PhpParser\Node; use PhpParser\Node\Arg; diff --git a/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php b/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php index 03790cf26..af588d681 100644 --- a/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php @@ -7,7 +7,7 @@ use PhpParser\NodeVisitorAbstract; use Rector\PostRector\Contract\Rector\PostRectorInterface; use Rector\ValueObject\Application\File; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; abstract class AbstractPostRector extends NodeVisitorAbstract implements PostRectorInterface { /** diff --git a/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php b/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php index c63025953..ab5685813 100644 --- a/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PostRector\Rector; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Comment; use PhpParser\Comment\Doc; use PhpParser\Node; @@ -41,23 +41,31 @@ public function enterNode(Node $node) : ?Node return null; } $hasChanged = \false; - $namespaceName = $node instanceof Namespace_ && $node->name instanceof Name ? $node->name : null; - $names = $this->resolveUsedPhpAndDocNames($node); - foreach ($node->stmts as $key => $namespaceStmt) { - if (!$namespaceStmt instanceof Use_) { + $namespaceOriginalCase = $node instanceof Namespace_ && $node->name instanceof Name ? $node->name->toString() : null; + $namesInOriginalCase = $this->resolveUsedPhpAndDocNames($node); + $namesInLowerCase = \array_map(\Closure::fromCallable('strtolower'), $namesInOriginalCase); + foreach ($node->stmts as $key => $stmt) { + if (!$stmt instanceof Use_) { continue; } - if ($namespaceStmt->uses === []) { + if ($stmt->uses === [] || $namesInOriginalCase === []) { unset($node->stmts[$key]); $hasChanged = \true; continue; } - $useUse = $namespaceStmt->uses[0]; - if ($this->isUseImportUsed($useUse, $names, $namespaceName)) { - continue; + $isCaseSensitive = $stmt->type === Use_::TYPE_CONSTANT; + $names = $isCaseSensitive ? $namesInOriginalCase : $namesInLowerCase; + $namespaceName = $namespaceOriginalCase === null ? null : ($isCaseSensitive ? $namespaceOriginalCase : \strtolower($namespaceOriginalCase)); + foreach ($stmt->uses as $useUseKey => $useUse) { + if ($this->isUseImportUsed($useUse, $isCaseSensitive, $names, $namespaceName)) { + continue; + } + unset($stmt->uses[$useUseKey]); + $hasChanged = \true; + } + if ($stmt->uses === []) { + unset($node->stmts[$key]); } - unset($node->stmts[$key]); - $hasChanged = \true; } if ($hasChanged === \false) { return null; @@ -140,20 +148,22 @@ private function resolveUsedPhpAndDocNames($namespace) : array return \array_unique($names); } /** - * @param string[] $names + * @param string[] $names */ - private function isUseImportUsed(UseUse $useUse, array $names, ?Name $namespaceName) : bool + private function isUseImportUsed(UseUse $useUse, bool $isCaseSensitive, array $names, ?string $namespaceName) : bool { $comparedName = $useUse->alias instanceof Identifier ? $useUse->alias->toString() : $useUse->name->toString(); + if (!$isCaseSensitive) { + $comparedName = \strtolower($comparedName); + } if (\in_array($comparedName, $names, \true)) { return \true; } - $namespacedPrefix = Strings::after($comparedName, '\\', -1) . '\\'; + $lastName = Strings::after($comparedName, '\\', -1); + $namespacedPrefix = $lastName . '\\'; if ($namespacedPrefix === '\\') { $namespacedPrefix = $comparedName . '\\'; } - $lastName = $useUse->name->getLast(); - $namespaceName = $namespaceName instanceof Name ? $namespaceName->toString() : null; // match partial import foreach ($names as $name) { if ($this->isSubNamespace($name, $comparedName, $namespacedPrefix)) { diff --git a/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php b/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php index 0dbfd2e51..a5e4188cd 100644 --- a/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php +++ b/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php @@ -6,7 +6,7 @@ use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class DeprecatedRulesReporter { /** diff --git a/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php b/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php index ae33878a3..904b6a89f 100644 --- a/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php +++ b/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php @@ -7,7 +7,7 @@ use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Configuration\VendorMissAnalyseGuard; use Rector\PostRector\Contract\Rector\PostRectorInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class MissConfigurationReporter { /** diff --git a/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php b/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php index 459f3cabc..d635332df 100644 --- a/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php +++ b/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php @@ -5,7 +5,7 @@ use Rector\Composer\ValueObject\InstalledPackage; use Rector\Set\Contract\SetInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api used by extensions */ diff --git a/vendor/rector/rector/src/Set/ValueObject/Set.php b/vendor/rector/rector/src/Set/ValueObject/Set.php index 90ed2a1e6..f2672e5f1 100644 --- a/vendor/rector/rector/src/Set/ValueObject/Set.php +++ b/vendor/rector/rector/src/Set/ValueObject/Set.php @@ -4,7 +4,7 @@ namespace Rector\Set\ValueObject; use Rector\Set\Contract\SetInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api used by extensions */ diff --git a/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php index be6aec110..590c21abf 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php @@ -3,8 +3,9 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\Mapper; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PHPStan\Type\Accessory\AccessoryNonEmptyStringType; +use PHPStan\Type\Accessory\NonEmptyArrayType; use PHPStan\Type\ArrayType; use PHPStan\Type\BooleanType; use PHPStan\Type\CallableType; @@ -27,7 +28,7 @@ final class ScalarStringToTypeMapper /** * @var array, string[]> */ - private const SCALAR_NAME_BY_TYPE = [StringType::class => ['string'], AccessoryNonEmptyStringType::class => ['non-empty-string'], ClassStringType::class => ['class-string'], FloatType::class => ['float', 'real', 'double'], IntegerType::class => ['int', 'integer'], BooleanType::class => ['bool', 'boolean'], NullType::class => ['null'], VoidType::class => ['void'], ResourceType::class => ['resource'], CallableType::class => ['callback', 'callable'], ObjectWithoutClassType::class => ['object'], NeverType::class => ['never', 'never-return', 'never-returns', 'no-return']]; + private const SCALAR_NAME_BY_TYPE = [StringType::class => ['string'], AccessoryNonEmptyStringType::class => ['non-empty-string'], NonEmptyArrayType::class => ['non-empty-array'], ClassStringType::class => ['class-string'], FloatType::class => ['float', 'real', 'double'], IntegerType::class => ['int', 'integer'], BooleanType::class => ['bool', 'boolean'], NullType::class => ['null'], VoidType::class => ['void'], ResourceType::class => ['resource'], CallableType::class => ['callback', 'callable'], ObjectWithoutClassType::class => ['object'], NeverType::class => ['never', 'never-return', 'never-returns', 'no-return']]; public function mapScalarStringToType(string $scalarName) : Type { $loweredScalarName = Strings::lower($scalarName); diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php index 0853c9ceb..7975cb0a1 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php @@ -9,7 +9,7 @@ use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Tests\StaticTypeMapper\PhpDoc\PhpDocTypeMapperTest */ diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php index 3200d9729..584d46739 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\PhpDocParser; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\Analyser\NameScope; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; diff --git a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php index d79bbb61e..21e6bdd9b 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php +++ b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\ValueObject\Type; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Name; use PhpParser\Node\Stmt\Use_; use PhpParser\Node\Stmt\UseUse; diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php b/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php index ce342e238..580402786 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php @@ -4,7 +4,7 @@ namespace Rector\Testing\Fixture; use Iterator; -use RectorPrefix202410\Symfony\Component\Finder\Finder; +use RectorPrefix202411\Symfony\Component\Finder\Finder; final class FixtureFileFinder { /** diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php b/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php index 633f0b789..cf4c17d40 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\Fixture; -use RectorPrefix202410\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem; final class FixtureFileUpdater { /** diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php b/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php index d803a41da..9768a02b8 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\Fixture; -use RectorPrefix202410\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem; /** * @api */ diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php b/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php index 2c0c8d186..23e29807c 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\Fixture; -use RectorPrefix202410\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem; /** * @api used in tests */ diff --git a/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php b/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php index cffb3bcff..1c0390887 100644 --- a/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php +++ b/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php @@ -3,10 +3,10 @@ declare (strict_types=1); namespace Rector\Testing\PHPUnit; -use RectorPrefix202410\Illuminate\Container\RewindableGenerator; +use RectorPrefix202411\Illuminate\Container\RewindableGenerator; use Iterator; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Strings; use PHPUnit\Framework\ExpectationFailedException; use Rector\Application\ApplicationFileProcessor; use Rector\Autoloading\AdditionalAutoloader; diff --git a/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php b/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php index 669862d52..d69ef0f38 100644 --- a/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php +++ b/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\TestingParser; -use RectorPrefix202410\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\FileSystem; use PhpParser\Node; use Rector\Application\Provider\CurrentFileProvider; use Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator; diff --git a/vendor/rector/rector/src/Util/MemoryLimiter.php b/vendor/rector/rector/src/Util/MemoryLimiter.php index 250d4ddf6..716344f8d 100644 --- a/vendor/rector/rector/src/Util/MemoryLimiter.php +++ b/vendor/rector/rector/src/Util/MemoryLimiter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\Exception\Configuration\InvalidConfigurationException; use Rector\ValueObject\Configuration; /** diff --git a/vendor/rector/rector/src/Util/NewLineSplitter.php b/vendor/rector/rector/src/Util/NewLineSplitter.php index a4b1738a5..65fdc1497 100644 --- a/vendor/rector/rector/src/Util/NewLineSplitter.php +++ b/vendor/rector/rector/src/Util/NewLineSplitter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; final class NewLineSplitter { /** diff --git a/vendor/rector/rector/src/Util/NodePrinter.php b/vendor/rector/rector/src/Util/NodePrinter.php index e347ca315..d2c5cb618 100644 --- a/vendor/rector/rector/src/Util/NodePrinter.php +++ b/vendor/rector/rector/src/Util/NodePrinter.php @@ -3,10 +3,10 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use Rector\CustomRules\SimpleNodeDumper; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; final class NodePrinter { /** diff --git a/vendor/rector/rector/src/Util/StringUtils.php b/vendor/rector/rector/src/Util/StringUtils.php index e7fc42caa..b585bb202 100644 --- a/vendor/rector/rector/src/Util/StringUtils.php +++ b/vendor/rector/rector/src/Util/StringUtils.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; final class StringUtils { public static function isMatch(string $value, string $regex) : bool diff --git a/vendor/rector/rector/src/Validation/RectorAssert.php b/vendor/rector/rector/src/Validation/RectorAssert.php index df5b77245..d6c08ebb4 100644 --- a/vendor/rector/rector/src/Validation/RectorAssert.php +++ b/vendor/rector/rector/src/Validation/RectorAssert.php @@ -4,7 +4,7 @@ namespace Rector\Validation; use Rector\Util\StringUtils; -use RectorPrefix202410\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; /** * @see \Rector\Tests\Validation\RectorAssertTest */ diff --git a/vendor/rector/rector/src/ValueObject/Configuration.php b/vendor/rector/rector/src/ValueObject/Configuration.php index 1b3b5d005..87c333e00 100644 --- a/vendor/rector/rector/src/ValueObject/Configuration.php +++ b/vendor/rector/rector/src/ValueObject/Configuration.php @@ -4,7 +4,7 @@ namespace Rector\ValueObject; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class Configuration { /** diff --git a/vendor/rector/rector/src/ValueObject/Error/SystemError.php b/vendor/rector/rector/src/ValueObject/Error/SystemError.php index a7d2e520d..9b40d61d4 100644 --- a/vendor/rector/rector/src/ValueObject/Error/SystemError.php +++ b/vendor/rector/rector/src/ValueObject/Error/SystemError.php @@ -4,7 +4,7 @@ namespace Rector\ValueObject\Error; use Rector\Parallel\ValueObject\BridgeItem; -use RectorPrefix202410\Symplify\EasyParallel\Contract\SerializableInterface; +use RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface; final class SystemError implements SerializableInterface { /** @@ -74,7 +74,7 @@ public function jsonSerialize() : array * @param mixed[] $json * @return $this */ - public static function decode(array $json) : \RectorPrefix202410\Symplify\EasyParallel\Contract\SerializableInterface + public static function decode(array $json) : \RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface { return new self($json[BridgeItem::MESSAGE], $json[BridgeItem::RELATIVE_FILE_PATH], $json[BridgeItem::LINE], $json[BridgeItem::RECTOR_CLASS]); } diff --git a/vendor/rector/rector/src/ValueObject/FileProcessResult.php b/vendor/rector/rector/src/ValueObject/FileProcessResult.php index 1cd1fb054..0ad0a13c2 100644 --- a/vendor/rector/rector/src/ValueObject/FileProcessResult.php +++ b/vendor/rector/rector/src/ValueObject/FileProcessResult.php @@ -5,7 +5,7 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class FileProcessResult { /** diff --git a/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php b/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php index 94f0c5c09..ef7271a67 100644 --- a/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php +++ b/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php @@ -479,6 +479,11 @@ final class PhpVersionFeature * @var int */ public const INTERSECTION_TYPES = \Rector\ValueObject\PhpVersion::PHP_81; + /** + * @see https://php.watch/versions/8.2/dnf-types + * @var int + */ + public const UNION_INTERSECTION_TYPES = \Rector\ValueObject\PhpVersion::PHP_82; /** * @see https://wiki.php.net/rfc/array_unpacking_string_keys * @var int @@ -555,4 +560,10 @@ final class PhpVersionFeature * @var int */ public const DEPRECATE_HOST_PORT_SEPARATE_ARGS = \Rector\ValueObject\PhpVersion::PHP_83; + /** + * @see https://www.php.net/manual/en/migration83.deprecated.php#migration83.deprecated.core.get-class + * @see https://php.watch/versions/8.3/get_class-get_parent_class-parameterless-deprecated + * @var int + */ + public const DEPRECATE_GET_CLASS_WITHOUT_ARGS = \Rector\ValueObject\PhpVersion::PHP_83; } diff --git a/vendor/rector/rector/src/ValueObject/ProcessResult.php b/vendor/rector/rector/src/ValueObject/ProcessResult.php index a5e94ad13..234bd9a28 100644 --- a/vendor/rector/rector/src/ValueObject/ProcessResult.php +++ b/vendor/rector/rector/src/ValueObject/ProcessResult.php @@ -5,7 +5,7 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class ProcessResult { /** diff --git a/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php b/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php index 5454f7f45..75a1c02dd 100644 --- a/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php +++ b/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\ValueObject\Reporting; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\ChangesReporting\ValueObject\RectorWithLineChange; use Rector\Contract\Rector\RectorInterface; use Rector\Parallel\ValueObject\BridgeItem; -use RectorPrefix202410\Symplify\EasyParallel\Contract\SerializableInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface; +use RectorPrefix202411\Webmozart\Assert\Assert; final class FileDiff implements SerializableInterface { /** @@ -116,7 +116,7 @@ public function jsonSerialize() : array * @param array $json * @return $this */ - public static function decode(array $json) : \RectorPrefix202410\Symplify\EasyParallel\Contract\SerializableInterface + public static function decode(array $json) : \RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface { $rectorWithLineChanges = []; foreach ($json[BridgeItem::RECTORS_WITH_LINE_CHANGES] as $rectorWithLineChangesJson) { diff --git a/vendor/rector/rector/src/functions/node_helper.php b/vendor/rector/rector/src/functions/node_helper.php index 8f7920444..520027530 100644 --- a/vendor/rector/rector/src/functions/node_helper.php +++ b/vendor/rector/rector/src/functions/node_helper.php @@ -1,14 +1,14 @@ $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', 'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', 'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', - 'RectorPrefix202410\\Clue\\React\\NDJson\\Decoder' => $vendorDir . '/clue/ndjson-react/src/Decoder.php', - 'RectorPrefix202410\\Clue\\React\\NDJson\\Encoder' => $vendorDir . '/clue/ndjson-react/src/Encoder.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchStrictGroupsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => $vendorDir . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchFlags.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => $vendorDir . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', - 'RectorPrefix202410\\Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', - 'RectorPrefix202410\\Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', - 'RectorPrefix202410\\Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', - 'RectorPrefix202410\\Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\UnexpectedNullMatchException' => $vendorDir . '/composer/pcre/src/UnexpectedNullMatchException.php', - 'RectorPrefix202410\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', - 'RectorPrefix202410\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', - 'RectorPrefix202410\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', - 'RectorPrefix202410\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', - 'RectorPrefix202410\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\CachedWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Inflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Language' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\LanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\NoopWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Pattern' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Patterns' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Ruleset' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Substitution' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Substitutions' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Transformation' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Transformations' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Word' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\RulesetInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\WordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', - 'RectorPrefix202410\\Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/EventEmitter.php', - 'RectorPrefix202410\\Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/EventEmitterInterface.php', - 'RectorPrefix202410\\Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/EventEmitterTrait.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => $vendorDir . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Diagnoser' => $vendorDir . '/fidry/cpu-core-counter/src/Diagnoser.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => $vendorDir . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\ParallelisationResult' => $vendorDir . '/fidry/cpu-core-counter/src/ParallelisationResult.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Auth' => $vendorDir . '/illuminate/container/Attributes/Auth.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Authenticated' => $vendorDir . '/illuminate/container/Attributes/Authenticated.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Cache' => $vendorDir . '/illuminate/container/Attributes/Cache.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Config' => $vendorDir . '/illuminate/container/Attributes/Config.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\CurrentUser' => $vendorDir . '/illuminate/container/Attributes/CurrentUser.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\DB' => $vendorDir . '/illuminate/container/Attributes/DB.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Database' => $vendorDir . '/illuminate/container/Attributes/Database.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Log' => $vendorDir . '/illuminate/container/Attributes/Log.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Storage' => $vendorDir . '/illuminate/container/Attributes/Storage.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Tag' => $vendorDir . '/illuminate/container/Attributes/Tag.php', - 'RectorPrefix202410\\Illuminate\\Container\\BoundMethod' => $vendorDir . '/illuminate/container/BoundMethod.php', - 'RectorPrefix202410\\Illuminate\\Container\\Container' => $vendorDir . '/illuminate/container/Container.php', - 'RectorPrefix202410\\Illuminate\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/container/ContextualBindingBuilder.php', - 'RectorPrefix202410\\Illuminate\\Container\\EntryNotFoundException' => $vendorDir . '/illuminate/container/EntryNotFoundException.php', - 'RectorPrefix202410\\Illuminate\\Container\\RewindableGenerator' => $vendorDir . '/illuminate/container/RewindableGenerator.php', - 'RectorPrefix202410\\Illuminate\\Container\\Util' => $vendorDir . '/illuminate/container/Util.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/illuminate/contracts/Auth/Access/Authorizable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/illuminate/contracts/Auth/Access/Gate.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/illuminate/contracts/Auth/Authenticatable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/illuminate/contracts/Auth/CanResetPassword.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/illuminate/contracts/Auth/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/illuminate/contracts/Auth/Guard.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/illuminate/contracts/Auth/MustVerifyEmail.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/illuminate/contracts/Auth/PasswordBroker.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/illuminate/contracts/Auth/StatefulGuard.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/illuminate/contracts/Auth/SupportsBasicAuth.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/illuminate/contracts/Auth/UserProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/illuminate/contracts/Broadcasting/Broadcaster.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/illuminate/contracts/Broadcasting/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => $vendorDir . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/illuminate/contracts/Bus/Dispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/illuminate/contracts/Bus/QueueingDispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/illuminate/contracts/Cache/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/illuminate/contracts/Cache/Lock.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/illuminate/contracts/Cache/LockProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Cache/LockTimeoutException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/illuminate/contracts/Cache/Repository.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/illuminate/contracts/Cache/Store.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Concurrency\\Driver' => $vendorDir . '/illuminate/contracts/Concurrency/Driver.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/illuminate/contracts/Config/Repository.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/illuminate/contracts/Console/Application.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\Isolatable' => $vendorDir . '/illuminate/contracts/Console/Isolatable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/illuminate/contracts/Console/Kernel.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => $vendorDir . '/illuminate/contracts/Console/PromptsForMissingInput.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/illuminate/contracts/Container/BindingResolutionException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\CircularDependencyException' => $vendorDir . '/illuminate/contracts/Container/CircularDependencyException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/illuminate/contracts/Container/Container.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\ContextualAttribute' => $vendorDir . '/illuminate/contracts/Container/ContextualAttribute.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/contracts/Container/ContextualBindingBuilder.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/illuminate/contracts/Cookie/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/illuminate/contracts/Cookie/QueueingFactory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Builder.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Castable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/illuminate/contracts/Database/Events/MigrationEvent.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/illuminate/contracts/Database/ModelIdentifier.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Query\\Builder' => $vendorDir . '/illuminate/contracts/Database/Query/Builder.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => $vendorDir . '/illuminate/contracts/Database/Query/ConditionExpression.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Query\\Expression' => $vendorDir . '/illuminate/contracts/Database/Query/Expression.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/illuminate/contracts/Debug/ExceptionHandler.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Debug\\ShouldntReport' => $vendorDir . '/illuminate/contracts/Debug/ShouldntReport.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/illuminate/contracts/Encryption/DecryptException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/illuminate/contracts/Encryption/EncryptException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/illuminate/contracts/Encryption/Encrypter.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => $vendorDir . '/illuminate/contracts/Encryption/StringEncrypter.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/illuminate/contracts/Events/Dispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/illuminate/contracts/Filesystem/Cloud.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/illuminate/contracts/Filesystem/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/illuminate/contracts/Filesystem/FileNotFoundException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/illuminate/contracts/Filesystem/Filesystem.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Filesystem/LockTimeoutException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/illuminate/contracts/Foundation/Application.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/illuminate/contracts/Foundation/CachesConfiguration.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/illuminate/contracts/Foundation/CachesRoutes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => $vendorDir . '/illuminate/contracts/Foundation/ExceptionRenderer.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => $vendorDir . '/illuminate/contracts/Foundation/MaintenanceMode.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/illuminate/contracts/Hashing/Hasher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/illuminate/contracts/Http/Kernel.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Attachable' => $vendorDir . '/illuminate/contracts/Mail/Attachable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/illuminate/contracts/Mail/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/illuminate/contracts/Mail/MailQueue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/illuminate/contracts/Mail/Mailable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/illuminate/contracts/Mail/Mailer.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/illuminate/contracts/Notifications/Dispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/illuminate/contracts/Notifications/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => $vendorDir . '/illuminate/contracts/Pagination/CursorPaginator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/illuminate/contracts/Pagination/Paginator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/illuminate/contracts/Pipeline/Hub.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/illuminate/contracts/Pipeline/Pipeline.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Process\\InvokedProcess' => $vendorDir . '/illuminate/contracts/Process/InvokedProcess.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Process\\ProcessResult' => $vendorDir . '/illuminate/contracts/Process/ProcessResult.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ClearableQueue' => $vendorDir . '/illuminate/contracts/Queue/ClearableQueue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/illuminate/contracts/Queue/EntityNotFoundException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/illuminate/contracts/Queue/EntityResolver.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/illuminate/contracts/Queue/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/illuminate/contracts/Queue/Job.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/illuminate/contracts/Queue/Monitor.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/illuminate/contracts/Queue/Queue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/illuminate/contracts/Queue/QueueableCollection.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUnique.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/illuminate/contracts/Routing/Registrar.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/illuminate/contracts/Routing/ResponseFactory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/illuminate/contracts/Routing/UrlGenerator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/illuminate/contracts/Routing/UrlRoutable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => $vendorDir . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/illuminate/contracts/Session/Session.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/illuminate/contracts/Support/Arrayable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/illuminate/contracts/Support/DeferrableProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/illuminate/contracts/Support/DeferringDisplayableValue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/illuminate/contracts/Support/Htmlable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/illuminate/contracts/Support/Jsonable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/illuminate/contracts/Support/MessageBag.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/illuminate/contracts/Support/MessageProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/illuminate/contracts/Support/Renderable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/illuminate/contracts/Support/Responsable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\ValidatedData' => $vendorDir . '/illuminate/contracts/Support/ValidatedData.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/illuminate/contracts/Translation/HasLocalePreference.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/illuminate/contracts/Translation/Loader.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/illuminate/contracts/Translation/Translator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\DataAwareRule' => $vendorDir . '/illuminate/contracts/Validation/DataAwareRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/illuminate/contracts/Validation/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/illuminate/contracts/Validation/ImplicitRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\InvokableRule' => $vendorDir . '/illuminate/contracts/Validation/InvokableRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/illuminate/contracts/Validation/Rule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => $vendorDir . '/illuminate/contracts/Validation/UncompromisedVerifier.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ValidationRule' => $vendorDir . '/illuminate/contracts/Validation/ValidationRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/illuminate/contracts/Validation/Validator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => $vendorDir . '/illuminate/contracts/Validation/ValidatorAwareRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/illuminate/contracts/View/Engine.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/illuminate/contracts/View/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\View' => $vendorDir . '/illuminate/contracts/View/View.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\ViewCompilationException' => $vendorDir . '/illuminate/contracts/View/ViewCompilationException.php', - 'RectorPrefix202410\\Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php', - 'RectorPrefix202410\\Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php', - 'RectorPrefix202410\\Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php', - 'RectorPrefix202410\\Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php', - 'RectorPrefix202410\\Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php', - 'RectorPrefix202410\\Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php', - 'RectorPrefix202410\\Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php', - 'RectorPrefix202410\\Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php', - 'RectorPrefix202410\\Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php', - 'RectorPrefix202410\\Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php', - 'RectorPrefix202410\\Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php', - 'RectorPrefix202410\\Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php', - 'RectorPrefix202410\\Nette\\Utils\\FileInfo' => $vendorDir . '/nette/utils/src/Utils/FileInfo.php', - 'RectorPrefix202410\\Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php', - 'RectorPrefix202410\\Nette\\Utils\\Finder' => $vendorDir . '/nette/utils/src/Utils/Finder.php', - 'RectorPrefix202410\\Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php', - 'RectorPrefix202410\\Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php', - 'RectorPrefix202410\\Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php', - 'RectorPrefix202410\\Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php', - 'RectorPrefix202410\\Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php', - 'RectorPrefix202410\\Nette\\Utils\\ImageColor' => $vendorDir . '/nette/utils/src/Utils/ImageColor.php', - 'RectorPrefix202410\\Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\ImageType' => $vendorDir . '/nette/utils/src/Utils/ImageType.php', - 'RectorPrefix202410\\Nette\\Utils\\Iterables' => $vendorDir . '/nette/utils/src/Utils/Iterables.php', - 'RectorPrefix202410\\Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php', - 'RectorPrefix202410\\Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php', - 'RectorPrefix202410\\Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php', - 'RectorPrefix202410\\Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php', - 'RectorPrefix202410\\Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', - 'RectorPrefix202410\\Nette\\Utils\\ReflectionMethod' => $vendorDir . '/nette/utils/src/Utils/ReflectionMethod.php', - 'RectorPrefix202410\\Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', - 'RectorPrefix202410\\Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php', - 'RectorPrefix202410\\Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\CiDetector' => $vendorDir . '/ondram/ci-detector/src/CiDetector.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\CiDetectorInterface' => $vendorDir . '/ondram/ci-detector/src/CiDetectorInterface.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AbstractCi' => $vendorDir . '/ondram/ci-detector/src/Ci/AbstractCi.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AppVeyor' => $vendorDir . '/ondram/ci-detector/src/Ci/AppVeyor.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => $vendorDir . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AzurePipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/AzurePipelines.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Bamboo' => $vendorDir . '/ondram/ci-detector/src/Ci/Bamboo.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Buddy' => $vendorDir . '/ondram/ci-detector/src/Ci/Buddy.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\CiInterface' => $vendorDir . '/ondram/ci-detector/src/Ci/CiInterface.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Circle' => $vendorDir . '/ondram/ci-detector/src/Ci/Circle.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Codeship' => $vendorDir . '/ondram/ci-detector/src/Ci/Codeship.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Continuousphp' => $vendorDir . '/ondram/ci-detector/src/Ci/Continuousphp.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Drone' => $vendorDir . '/ondram/ci-detector/src/Ci/Drone.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\GitHubActions' => $vendorDir . '/ondram/ci-detector/src/Ci/GitHubActions.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\GitLab' => $vendorDir . '/ondram/ci-detector/src/Ci/GitLab.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Jenkins' => $vendorDir . '/ondram/ci-detector/src/Ci/Jenkins.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\SourceHut' => $vendorDir . '/ondram/ci-detector/src/Ci/SourceHut.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\TeamCity' => $vendorDir . '/ondram/ci-detector/src/Ci/TeamCity.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Travis' => $vendorDir . '/ondram/ci-detector/src/Ci/Travis.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Wercker' => $vendorDir . '/ondram/ci-detector/src/Ci/Wercker.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Env' => $vendorDir . '/ondram/ci-detector/src/Env.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => $vendorDir . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\TrinaryLogic' => $vendorDir . '/ondram/ci-detector/src/TrinaryLogic.php', - 'RectorPrefix202410\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', - 'RectorPrefix202410\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', - 'RectorPrefix202410\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', - 'RectorPrefix202410\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', - 'RectorPrefix202410\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', - 'RectorPrefix202410\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', - 'RectorPrefix202410\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', - 'RectorPrefix202410\\Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', - 'RectorPrefix202410\\Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', - 'RectorPrefix202410\\Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', - 'RectorPrefix202410\\React\\Cache\\ArrayCache' => $vendorDir . '/react/cache/src/ArrayCache.php', - 'RectorPrefix202410\\React\\Cache\\CacheInterface' => $vendorDir . '/react/cache/src/CacheInterface.php', - 'RectorPrefix202410\\React\\ChildProcess\\Process' => $vendorDir . '/react/child-process/src/Process.php', - 'RectorPrefix202410\\React\\Dns\\BadServerException' => $vendorDir . '/react/dns/src/BadServerException.php', - 'RectorPrefix202410\\React\\Dns\\Config\\Config' => $vendorDir . '/react/dns/src/Config/Config.php', - 'RectorPrefix202410\\React\\Dns\\Config\\HostsFile' => $vendorDir . '/react/dns/src/Config/HostsFile.php', - 'RectorPrefix202410\\React\\Dns\\Model\\Message' => $vendorDir . '/react/dns/src/Model/Message.php', - 'RectorPrefix202410\\React\\Dns\\Model\\Record' => $vendorDir . '/react/dns/src/Model/Record.php', - 'RectorPrefix202410\\React\\Dns\\Protocol\\BinaryDumper' => $vendorDir . '/react/dns/src/Protocol/BinaryDumper.php', - 'RectorPrefix202410\\React\\Dns\\Protocol\\Parser' => $vendorDir . '/react/dns/src/Protocol/Parser.php', - 'RectorPrefix202410\\React\\Dns\\Query\\CachingExecutor' => $vendorDir . '/react/dns/src/Query/CachingExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\CancellationException' => $vendorDir . '/react/dns/src/Query/CancellationException.php', - 'RectorPrefix202410\\React\\Dns\\Query\\CoopExecutor' => $vendorDir . '/react/dns/src/Query/CoopExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\ExecutorInterface' => $vendorDir . '/react/dns/src/Query/ExecutorInterface.php', - 'RectorPrefix202410\\React\\Dns\\Query\\FallbackExecutor' => $vendorDir . '/react/dns/src/Query/FallbackExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\HostsFileExecutor' => $vendorDir . '/react/dns/src/Query/HostsFileExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\Query' => $vendorDir . '/react/dns/src/Query/Query.php', - 'RectorPrefix202410\\React\\Dns\\Query\\RetryExecutor' => $vendorDir . '/react/dns/src/Query/RetryExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\SelectiveTransportExecutor' => $vendorDir . '/react/dns/src/Query/SelectiveTransportExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\TcpTransportExecutor' => $vendorDir . '/react/dns/src/Query/TcpTransportExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\TimeoutException' => $vendorDir . '/react/dns/src/Query/TimeoutException.php', - 'RectorPrefix202410\\React\\Dns\\Query\\TimeoutExecutor' => $vendorDir . '/react/dns/src/Query/TimeoutExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\UdpTransportExecutor' => $vendorDir . '/react/dns/src/Query/UdpTransportExecutor.php', - 'RectorPrefix202410\\React\\Dns\\RecordNotFoundException' => $vendorDir . '/react/dns/src/RecordNotFoundException.php', - 'RectorPrefix202410\\React\\Dns\\Resolver\\Factory' => $vendorDir . '/react/dns/src/Resolver/Factory.php', - 'RectorPrefix202410\\React\\Dns\\Resolver\\Resolver' => $vendorDir . '/react/dns/src/Resolver/Resolver.php', - 'RectorPrefix202410\\React\\Dns\\Resolver\\ResolverInterface' => $vendorDir . '/react/dns/src/Resolver/ResolverInterface.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtEvLoop' => $vendorDir . '/react/event-loop/src/ExtEvLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtEventLoop' => $vendorDir . '/react/event-loop/src/ExtEventLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtLibevLoop' => $vendorDir . '/react/event-loop/src/ExtLibevLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtLibeventLoop' => $vendorDir . '/react/event-loop/src/ExtLibeventLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtUvLoop' => $vendorDir . '/react/event-loop/src/ExtUvLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\Factory' => $vendorDir . '/react/event-loop/src/Factory.php', - 'RectorPrefix202410\\React\\EventLoop\\Loop' => $vendorDir . '/react/event-loop/src/Loop.php', - 'RectorPrefix202410\\React\\EventLoop\\LoopInterface' => $vendorDir . '/react/event-loop/src/LoopInterface.php', - 'RectorPrefix202410\\React\\EventLoop\\SignalsHandler' => $vendorDir . '/react/event-loop/src/SignalsHandler.php', - 'RectorPrefix202410\\React\\EventLoop\\StreamSelectLoop' => $vendorDir . '/react/event-loop/src/StreamSelectLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\Tick\\FutureTickQueue' => $vendorDir . '/react/event-loop/src/Tick/FutureTickQueue.php', - 'RectorPrefix202410\\React\\EventLoop\\TimerInterface' => $vendorDir . '/react/event-loop/src/TimerInterface.php', - 'RectorPrefix202410\\React\\EventLoop\\Timer\\Timer' => $vendorDir . '/react/event-loop/src/Timer/Timer.php', - 'RectorPrefix202410\\React\\EventLoop\\Timer\\Timers' => $vendorDir . '/react/event-loop/src/Timer/Timers.php', - 'RectorPrefix202410\\React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php', - 'RectorPrefix202410\\React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php', - 'RectorPrefix202410\\React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php', - 'RectorPrefix202410\\React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php', - 'RectorPrefix202410\\React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php', - 'RectorPrefix202410\\React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php', - 'RectorPrefix202410\\React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php', - 'RectorPrefix202410\\React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php', - 'RectorPrefix202410\\React\\Socket\\Connection' => $vendorDir . '/react/socket/src/Connection.php', - 'RectorPrefix202410\\React\\Socket\\ConnectionInterface' => $vendorDir . '/react/socket/src/ConnectionInterface.php', - 'RectorPrefix202410\\React\\Socket\\Connector' => $vendorDir . '/react/socket/src/Connector.php', - 'RectorPrefix202410\\React\\Socket\\ConnectorInterface' => $vendorDir . '/react/socket/src/ConnectorInterface.php', - 'RectorPrefix202410\\React\\Socket\\DnsConnector' => $vendorDir . '/react/socket/src/DnsConnector.php', - 'RectorPrefix202410\\React\\Socket\\FdServer' => $vendorDir . '/react/socket/src/FdServer.php', - 'RectorPrefix202410\\React\\Socket\\FixedUriConnector' => $vendorDir . '/react/socket/src/FixedUriConnector.php', - 'RectorPrefix202410\\React\\Socket\\HappyEyeBallsConnectionBuilder' => $vendorDir . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', - 'RectorPrefix202410\\React\\Socket\\HappyEyeBallsConnector' => $vendorDir . '/react/socket/src/HappyEyeBallsConnector.php', - 'RectorPrefix202410\\React\\Socket\\LimitingServer' => $vendorDir . '/react/socket/src/LimitingServer.php', - 'RectorPrefix202410\\React\\Socket\\SecureConnector' => $vendorDir . '/react/socket/src/SecureConnector.php', - 'RectorPrefix202410\\React\\Socket\\SecureServer' => $vendorDir . '/react/socket/src/SecureServer.php', - 'RectorPrefix202410\\React\\Socket\\Server' => $vendorDir . '/react/socket/src/Server.php', - 'RectorPrefix202410\\React\\Socket\\ServerInterface' => $vendorDir . '/react/socket/src/ServerInterface.php', - 'RectorPrefix202410\\React\\Socket\\SocketServer' => $vendorDir . '/react/socket/src/SocketServer.php', - 'RectorPrefix202410\\React\\Socket\\StreamEncryption' => $vendorDir . '/react/socket/src/StreamEncryption.php', - 'RectorPrefix202410\\React\\Socket\\TcpConnector' => $vendorDir . '/react/socket/src/TcpConnector.php', - 'RectorPrefix202410\\React\\Socket\\TcpServer' => $vendorDir . '/react/socket/src/TcpServer.php', - 'RectorPrefix202410\\React\\Socket\\TimeoutConnector' => $vendorDir . '/react/socket/src/TimeoutConnector.php', - 'RectorPrefix202410\\React\\Socket\\UnixConnector' => $vendorDir . '/react/socket/src/UnixConnector.php', - 'RectorPrefix202410\\React\\Socket\\UnixServer' => $vendorDir . '/react/socket/src/UnixServer.php', - 'RectorPrefix202410\\React\\Stream\\CompositeStream' => $vendorDir . '/react/stream/src/CompositeStream.php', - 'RectorPrefix202410\\React\\Stream\\DuplexResourceStream' => $vendorDir . '/react/stream/src/DuplexResourceStream.php', - 'RectorPrefix202410\\React\\Stream\\DuplexStreamInterface' => $vendorDir . '/react/stream/src/DuplexStreamInterface.php', - 'RectorPrefix202410\\React\\Stream\\ReadableResourceStream' => $vendorDir . '/react/stream/src/ReadableResourceStream.php', - 'RectorPrefix202410\\React\\Stream\\ReadableStreamInterface' => $vendorDir . '/react/stream/src/ReadableStreamInterface.php', - 'RectorPrefix202410\\React\\Stream\\ThroughStream' => $vendorDir . '/react/stream/src/ThroughStream.php', - 'RectorPrefix202410\\React\\Stream\\Util' => $vendorDir . '/react/stream/src/Util.php', - 'RectorPrefix202410\\React\\Stream\\WritableResourceStream' => $vendorDir . '/react/stream/src/WritableResourceStream.php', - 'RectorPrefix202410\\React\\Stream\\WritableStreamInterface' => $vendorDir . '/react/stream/src/WritableStreamInterface.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Debug\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => $vendorDir . '/symfony/process/Exception/RunProcessFailedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => $vendorDir . '/symfony/process/Messenger/RunProcessContext.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => $vendorDir . '/symfony/process/Messenger/RunProcessMessage.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => $vendorDir . '/symfony/process/Messenger/RunProcessMessageHandler.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\PhpSubprocess' => $vendorDir . '/symfony/process/PhpSubprocess.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => $vendorDir . '/symfony/service-contracts/ServiceCollectionInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => $vendorDir . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => $vendorDir . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\CpuCoreCountProvider' => $vendorDir . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\Action' => $vendorDir . '/symplify/easy-parallel/src/Enum/Action.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\Content' => $vendorDir . '/symplify/easy-parallel/src/Enum/Content.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\ReactCommand' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactCommand.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\ReactEvent' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactEvent.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => $vendorDir . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => $vendorDir . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ScheduleFactory' => $vendorDir . '/symplify/easy-parallel/src/ScheduleFactory.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\Schedule' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/Schedule.php', - 'RectorPrefix202410\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', - 'RectorPrefix202410\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', - 'RectorPrefix202410\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', + 'RectorPrefix202411\\Clue\\React\\NDJson\\Decoder' => $vendorDir . '/clue/ndjson-react/src/Decoder.php', + 'RectorPrefix202411\\Clue\\React\\NDJson\\Encoder' => $vendorDir . '/clue/ndjson-react/src/Encoder.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchStrictGroupsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => $vendorDir . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchFlags.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => $vendorDir . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', + 'RectorPrefix202411\\Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', + 'RectorPrefix202411\\Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', + 'RectorPrefix202411\\Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', + 'RectorPrefix202411\\Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\UnexpectedNullMatchException' => $vendorDir . '/composer/pcre/src/UnexpectedNullMatchException.php', + 'RectorPrefix202411\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', + 'RectorPrefix202411\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', + 'RectorPrefix202411\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', + 'RectorPrefix202411\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', + 'RectorPrefix202411\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\CachedWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Inflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Language' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\LanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\NoopWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Pattern' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Patterns' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Ruleset' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitution' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitutions' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformation' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformations' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Word' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\RulesetInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\WordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', + 'RectorPrefix202411\\Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/EventEmitter.php', + 'RectorPrefix202411\\Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/EventEmitterInterface.php', + 'RectorPrefix202411\\Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/EventEmitterTrait.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => $vendorDir . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Diagnoser' => $vendorDir . '/fidry/cpu-core-counter/src/Diagnoser.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => $vendorDir . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\ParallelisationResult' => $vendorDir . '/fidry/cpu-core-counter/src/ParallelisationResult.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Auth' => $vendorDir . '/illuminate/container/Attributes/Auth.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Authenticated' => $vendorDir . '/illuminate/container/Attributes/Authenticated.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Cache' => $vendorDir . '/illuminate/container/Attributes/Cache.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Config' => $vendorDir . '/illuminate/container/Attributes/Config.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\CurrentUser' => $vendorDir . '/illuminate/container/Attributes/CurrentUser.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\DB' => $vendorDir . '/illuminate/container/Attributes/DB.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Database' => $vendorDir . '/illuminate/container/Attributes/Database.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Log' => $vendorDir . '/illuminate/container/Attributes/Log.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\RouteParameter' => $vendorDir . '/illuminate/container/Attributes/RouteParameter.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Storage' => $vendorDir . '/illuminate/container/Attributes/Storage.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Tag' => $vendorDir . '/illuminate/container/Attributes/Tag.php', + 'RectorPrefix202411\\Illuminate\\Container\\BoundMethod' => $vendorDir . '/illuminate/container/BoundMethod.php', + 'RectorPrefix202411\\Illuminate\\Container\\Container' => $vendorDir . '/illuminate/container/Container.php', + 'RectorPrefix202411\\Illuminate\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/container/ContextualBindingBuilder.php', + 'RectorPrefix202411\\Illuminate\\Container\\EntryNotFoundException' => $vendorDir . '/illuminate/container/EntryNotFoundException.php', + 'RectorPrefix202411\\Illuminate\\Container\\RewindableGenerator' => $vendorDir . '/illuminate/container/RewindableGenerator.php', + 'RectorPrefix202411\\Illuminate\\Container\\Util' => $vendorDir . '/illuminate/container/Util.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/illuminate/contracts/Auth/Access/Gate.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/illuminate/contracts/Auth/Authenticatable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/illuminate/contracts/Auth/CanResetPassword.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/illuminate/contracts/Auth/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/illuminate/contracts/Auth/Guard.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/illuminate/contracts/Auth/PasswordBroker.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/illuminate/contracts/Auth/StatefulGuard.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/illuminate/contracts/Auth/UserProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/illuminate/contracts/Broadcasting/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => $vendorDir . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/illuminate/contracts/Bus/Dispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/illuminate/contracts/Cache/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/illuminate/contracts/Cache/Lock.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/illuminate/contracts/Cache/LockProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/illuminate/contracts/Cache/Repository.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/illuminate/contracts/Cache/Store.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Concurrency\\Driver' => $vendorDir . '/illuminate/contracts/Concurrency/Driver.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/illuminate/contracts/Config/Repository.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/illuminate/contracts/Console/Application.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Isolatable' => $vendorDir . '/illuminate/contracts/Console/Isolatable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/illuminate/contracts/Console/Kernel.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => $vendorDir . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/illuminate/contracts/Container/BindingResolutionException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\CircularDependencyException' => $vendorDir . '/illuminate/contracts/Container/CircularDependencyException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/illuminate/contracts/Container/Container.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualAttribute' => $vendorDir . '/illuminate/contracts/Container/ContextualAttribute.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/illuminate/contracts/Cookie/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/illuminate/contracts/Database/ModelIdentifier.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Builder' => $vendorDir . '/illuminate/contracts/Database/Query/Builder.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => $vendorDir . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Expression' => $vendorDir . '/illuminate/contracts/Database/Query/Expression.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ShouldntReport' => $vendorDir . '/illuminate/contracts/Debug/ShouldntReport.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/illuminate/contracts/Encryption/DecryptException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/illuminate/contracts/Encryption/EncryptException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/illuminate/contracts/Encryption/Encrypter.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => $vendorDir . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/illuminate/contracts/Events/Dispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/illuminate/contracts/Filesystem/Cloud.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/illuminate/contracts/Filesystem/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/illuminate/contracts/Filesystem/Filesystem.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/illuminate/contracts/Foundation/Application.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => $vendorDir . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => $vendorDir . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/illuminate/contracts/Hashing/Hasher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/illuminate/contracts/Http/Kernel.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Attachable' => $vendorDir . '/illuminate/contracts/Mail/Attachable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/illuminate/contracts/Mail/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/illuminate/contracts/Mail/MailQueue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/illuminate/contracts/Mail/Mailable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/illuminate/contracts/Mail/Mailer.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/illuminate/contracts/Notifications/Dispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/illuminate/contracts/Notifications/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => $vendorDir . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/illuminate/contracts/Pagination/Paginator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/illuminate/contracts/Pipeline/Hub.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/illuminate/contracts/Pipeline/Pipeline.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\InvokedProcess' => $vendorDir . '/illuminate/contracts/Process/InvokedProcess.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\ProcessResult' => $vendorDir . '/illuminate/contracts/Process/ProcessResult.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ClearableQueue' => $vendorDir . '/illuminate/contracts/Queue/ClearableQueue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/illuminate/contracts/Queue/EntityResolver.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/illuminate/contracts/Queue/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/illuminate/contracts/Queue/Job.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/illuminate/contracts/Queue/Monitor.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/illuminate/contracts/Queue/Queue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/illuminate/contracts/Queue/QueueableCollection.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/illuminate/contracts/Routing/Registrar.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/illuminate/contracts/Routing/ResponseFactory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/illuminate/contracts/Routing/UrlGenerator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/illuminate/contracts/Routing/UrlRoutable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => $vendorDir . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/illuminate/contracts/Session/Session.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/illuminate/contracts/Support/Arrayable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/illuminate/contracts/Support/DeferrableProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/illuminate/contracts/Support/Htmlable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/illuminate/contracts/Support/Jsonable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/illuminate/contracts/Support/MessageBag.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/illuminate/contracts/Support/MessageProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/illuminate/contracts/Support/Renderable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/illuminate/contracts/Support/Responsable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\ValidatedData' => $vendorDir . '/illuminate/contracts/Support/ValidatedData.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/illuminate/contracts/Translation/Loader.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/illuminate/contracts/Translation/Translator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\DataAwareRule' => $vendorDir . '/illuminate/contracts/Validation/DataAwareRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/illuminate/contracts/Validation/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/illuminate/contracts/Validation/ImplicitRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\InvokableRule' => $vendorDir . '/illuminate/contracts/Validation/InvokableRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/illuminate/contracts/Validation/Rule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => $vendorDir . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidationRule' => $vendorDir . '/illuminate/contracts/Validation/ValidationRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/illuminate/contracts/Validation/Validator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => $vendorDir . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/illuminate/contracts/View/Engine.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/illuminate/contracts/View/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\View' => $vendorDir . '/illuminate/contracts/View/View.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\ViewCompilationException' => $vendorDir . '/illuminate/contracts/View/ViewCompilationException.php', + 'RectorPrefix202411\\Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php', + 'RectorPrefix202411\\Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php', + 'RectorPrefix202411\\Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php', + 'RectorPrefix202411\\Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php', + 'RectorPrefix202411\\Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php', + 'RectorPrefix202411\\Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php', + 'RectorPrefix202411\\Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php', + 'RectorPrefix202411\\Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php', + 'RectorPrefix202411\\Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php', + 'RectorPrefix202411\\Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php', + 'RectorPrefix202411\\Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php', + 'RectorPrefix202411\\Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php', + 'RectorPrefix202411\\Nette\\Utils\\FileInfo' => $vendorDir . '/nette/utils/src/Utils/FileInfo.php', + 'RectorPrefix202411\\Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php', + 'RectorPrefix202411\\Nette\\Utils\\Finder' => $vendorDir . '/nette/utils/src/Utils/Finder.php', + 'RectorPrefix202411\\Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php', + 'RectorPrefix202411\\Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php', + 'RectorPrefix202411\\Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php', + 'RectorPrefix202411\\Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php', + 'RectorPrefix202411\\Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php', + 'RectorPrefix202411\\Nette\\Utils\\ImageColor' => $vendorDir . '/nette/utils/src/Utils/ImageColor.php', + 'RectorPrefix202411\\Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\ImageType' => $vendorDir . '/nette/utils/src/Utils/ImageType.php', + 'RectorPrefix202411\\Nette\\Utils\\Iterables' => $vendorDir . '/nette/utils/src/Utils/Iterables.php', + 'RectorPrefix202411\\Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php', + 'RectorPrefix202411\\Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php', + 'RectorPrefix202411\\Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php', + 'RectorPrefix202411\\Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php', + 'RectorPrefix202411\\Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', + 'RectorPrefix202411\\Nette\\Utils\\ReflectionMethod' => $vendorDir . '/nette/utils/src/Utils/ReflectionMethod.php', + 'RectorPrefix202411\\Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', + 'RectorPrefix202411\\Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php', + 'RectorPrefix202411\\Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetector' => $vendorDir . '/ondram/ci-detector/src/CiDetector.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetectorInterface' => $vendorDir . '/ondram/ci-detector/src/CiDetectorInterface.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AbstractCi' => $vendorDir . '/ondram/ci-detector/src/Ci/AbstractCi.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AppVeyor' => $vendorDir . '/ondram/ci-detector/src/Ci/AppVeyor.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => $vendorDir . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AzurePipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/AzurePipelines.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Bamboo' => $vendorDir . '/ondram/ci-detector/src/Ci/Bamboo.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Buddy' => $vendorDir . '/ondram/ci-detector/src/Ci/Buddy.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\CiInterface' => $vendorDir . '/ondram/ci-detector/src/Ci/CiInterface.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Circle' => $vendorDir . '/ondram/ci-detector/src/Ci/Circle.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Codeship' => $vendorDir . '/ondram/ci-detector/src/Ci/Codeship.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Continuousphp' => $vendorDir . '/ondram/ci-detector/src/Ci/Continuousphp.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Drone' => $vendorDir . '/ondram/ci-detector/src/Ci/Drone.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitHubActions' => $vendorDir . '/ondram/ci-detector/src/Ci/GitHubActions.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitLab' => $vendorDir . '/ondram/ci-detector/src/Ci/GitLab.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Jenkins' => $vendorDir . '/ondram/ci-detector/src/Ci/Jenkins.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\SourceHut' => $vendorDir . '/ondram/ci-detector/src/Ci/SourceHut.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\TeamCity' => $vendorDir . '/ondram/ci-detector/src/Ci/TeamCity.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Travis' => $vendorDir . '/ondram/ci-detector/src/Ci/Travis.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Wercker' => $vendorDir . '/ondram/ci-detector/src/Ci/Wercker.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Env' => $vendorDir . '/ondram/ci-detector/src/Env.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => $vendorDir . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\TrinaryLogic' => $vendorDir . '/ondram/ci-detector/src/TrinaryLogic.php', + 'RectorPrefix202411\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', + 'RectorPrefix202411\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', + 'RectorPrefix202411\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', + 'RectorPrefix202411\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', + 'RectorPrefix202411\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', + 'RectorPrefix202411\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', + 'RectorPrefix202411\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', + 'RectorPrefix202411\\Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', + 'RectorPrefix202411\\Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', + 'RectorPrefix202411\\Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', + 'RectorPrefix202411\\React\\Cache\\ArrayCache' => $vendorDir . '/react/cache/src/ArrayCache.php', + 'RectorPrefix202411\\React\\Cache\\CacheInterface' => $vendorDir . '/react/cache/src/CacheInterface.php', + 'RectorPrefix202411\\React\\ChildProcess\\Process' => $vendorDir . '/react/child-process/src/Process.php', + 'RectorPrefix202411\\React\\Dns\\BadServerException' => $vendorDir . '/react/dns/src/BadServerException.php', + 'RectorPrefix202411\\React\\Dns\\Config\\Config' => $vendorDir . '/react/dns/src/Config/Config.php', + 'RectorPrefix202411\\React\\Dns\\Config\\HostsFile' => $vendorDir . '/react/dns/src/Config/HostsFile.php', + 'RectorPrefix202411\\React\\Dns\\Model\\Message' => $vendorDir . '/react/dns/src/Model/Message.php', + 'RectorPrefix202411\\React\\Dns\\Model\\Record' => $vendorDir . '/react/dns/src/Model/Record.php', + 'RectorPrefix202411\\React\\Dns\\Protocol\\BinaryDumper' => $vendorDir . '/react/dns/src/Protocol/BinaryDumper.php', + 'RectorPrefix202411\\React\\Dns\\Protocol\\Parser' => $vendorDir . '/react/dns/src/Protocol/Parser.php', + 'RectorPrefix202411\\React\\Dns\\Query\\CachingExecutor' => $vendorDir . '/react/dns/src/Query/CachingExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\CancellationException' => $vendorDir . '/react/dns/src/Query/CancellationException.php', + 'RectorPrefix202411\\React\\Dns\\Query\\CoopExecutor' => $vendorDir . '/react/dns/src/Query/CoopExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\ExecutorInterface' => $vendorDir . '/react/dns/src/Query/ExecutorInterface.php', + 'RectorPrefix202411\\React\\Dns\\Query\\FallbackExecutor' => $vendorDir . '/react/dns/src/Query/FallbackExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\HostsFileExecutor' => $vendorDir . '/react/dns/src/Query/HostsFileExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\Query' => $vendorDir . '/react/dns/src/Query/Query.php', + 'RectorPrefix202411\\React\\Dns\\Query\\RetryExecutor' => $vendorDir . '/react/dns/src/Query/RetryExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\SelectiveTransportExecutor' => $vendorDir . '/react/dns/src/Query/SelectiveTransportExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\TcpTransportExecutor' => $vendorDir . '/react/dns/src/Query/TcpTransportExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutException' => $vendorDir . '/react/dns/src/Query/TimeoutException.php', + 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutExecutor' => $vendorDir . '/react/dns/src/Query/TimeoutExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\UdpTransportExecutor' => $vendorDir . '/react/dns/src/Query/UdpTransportExecutor.php', + 'RectorPrefix202411\\React\\Dns\\RecordNotFoundException' => $vendorDir . '/react/dns/src/RecordNotFoundException.php', + 'RectorPrefix202411\\React\\Dns\\Resolver\\Factory' => $vendorDir . '/react/dns/src/Resolver/Factory.php', + 'RectorPrefix202411\\React\\Dns\\Resolver\\Resolver' => $vendorDir . '/react/dns/src/Resolver/Resolver.php', + 'RectorPrefix202411\\React\\Dns\\Resolver\\ResolverInterface' => $vendorDir . '/react/dns/src/Resolver/ResolverInterface.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtEvLoop' => $vendorDir . '/react/event-loop/src/ExtEvLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtEventLoop' => $vendorDir . '/react/event-loop/src/ExtEventLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtLibevLoop' => $vendorDir . '/react/event-loop/src/ExtLibevLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtLibeventLoop' => $vendorDir . '/react/event-loop/src/ExtLibeventLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtUvLoop' => $vendorDir . '/react/event-loop/src/ExtUvLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\Factory' => $vendorDir . '/react/event-loop/src/Factory.php', + 'RectorPrefix202411\\React\\EventLoop\\Loop' => $vendorDir . '/react/event-loop/src/Loop.php', + 'RectorPrefix202411\\React\\EventLoop\\LoopInterface' => $vendorDir . '/react/event-loop/src/LoopInterface.php', + 'RectorPrefix202411\\React\\EventLoop\\SignalsHandler' => $vendorDir . '/react/event-loop/src/SignalsHandler.php', + 'RectorPrefix202411\\React\\EventLoop\\StreamSelectLoop' => $vendorDir . '/react/event-loop/src/StreamSelectLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\Tick\\FutureTickQueue' => $vendorDir . '/react/event-loop/src/Tick/FutureTickQueue.php', + 'RectorPrefix202411\\React\\EventLoop\\TimerInterface' => $vendorDir . '/react/event-loop/src/TimerInterface.php', + 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timer' => $vendorDir . '/react/event-loop/src/Timer/Timer.php', + 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timers' => $vendorDir . '/react/event-loop/src/Timer/Timers.php', + 'RectorPrefix202411\\React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php', + 'RectorPrefix202411\\React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php', + 'RectorPrefix202411\\React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php', + 'RectorPrefix202411\\React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php', + 'RectorPrefix202411\\React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php', + 'RectorPrefix202411\\React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php', + 'RectorPrefix202411\\React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php', + 'RectorPrefix202411\\React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php', + 'RectorPrefix202411\\React\\Socket\\Connection' => $vendorDir . '/react/socket/src/Connection.php', + 'RectorPrefix202411\\React\\Socket\\ConnectionInterface' => $vendorDir . '/react/socket/src/ConnectionInterface.php', + 'RectorPrefix202411\\React\\Socket\\Connector' => $vendorDir . '/react/socket/src/Connector.php', + 'RectorPrefix202411\\React\\Socket\\ConnectorInterface' => $vendorDir . '/react/socket/src/ConnectorInterface.php', + 'RectorPrefix202411\\React\\Socket\\DnsConnector' => $vendorDir . '/react/socket/src/DnsConnector.php', + 'RectorPrefix202411\\React\\Socket\\FdServer' => $vendorDir . '/react/socket/src/FdServer.php', + 'RectorPrefix202411\\React\\Socket\\FixedUriConnector' => $vendorDir . '/react/socket/src/FixedUriConnector.php', + 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnectionBuilder' => $vendorDir . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', + 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnector' => $vendorDir . '/react/socket/src/HappyEyeBallsConnector.php', + 'RectorPrefix202411\\React\\Socket\\LimitingServer' => $vendorDir . '/react/socket/src/LimitingServer.php', + 'RectorPrefix202411\\React\\Socket\\SecureConnector' => $vendorDir . '/react/socket/src/SecureConnector.php', + 'RectorPrefix202411\\React\\Socket\\SecureServer' => $vendorDir . '/react/socket/src/SecureServer.php', + 'RectorPrefix202411\\React\\Socket\\Server' => $vendorDir . '/react/socket/src/Server.php', + 'RectorPrefix202411\\React\\Socket\\ServerInterface' => $vendorDir . '/react/socket/src/ServerInterface.php', + 'RectorPrefix202411\\React\\Socket\\SocketServer' => $vendorDir . '/react/socket/src/SocketServer.php', + 'RectorPrefix202411\\React\\Socket\\StreamEncryption' => $vendorDir . '/react/socket/src/StreamEncryption.php', + 'RectorPrefix202411\\React\\Socket\\TcpConnector' => $vendorDir . '/react/socket/src/TcpConnector.php', + 'RectorPrefix202411\\React\\Socket\\TcpServer' => $vendorDir . '/react/socket/src/TcpServer.php', + 'RectorPrefix202411\\React\\Socket\\TimeoutConnector' => $vendorDir . '/react/socket/src/TimeoutConnector.php', + 'RectorPrefix202411\\React\\Socket\\UnixConnector' => $vendorDir . '/react/socket/src/UnixConnector.php', + 'RectorPrefix202411\\React\\Socket\\UnixServer' => $vendorDir . '/react/socket/src/UnixServer.php', + 'RectorPrefix202411\\React\\Stream\\CompositeStream' => $vendorDir . '/react/stream/src/CompositeStream.php', + 'RectorPrefix202411\\React\\Stream\\DuplexResourceStream' => $vendorDir . '/react/stream/src/DuplexResourceStream.php', + 'RectorPrefix202411\\React\\Stream\\DuplexStreamInterface' => $vendorDir . '/react/stream/src/DuplexStreamInterface.php', + 'RectorPrefix202411\\React\\Stream\\ReadableResourceStream' => $vendorDir . '/react/stream/src/ReadableResourceStream.php', + 'RectorPrefix202411\\React\\Stream\\ReadableStreamInterface' => $vendorDir . '/react/stream/src/ReadableStreamInterface.php', + 'RectorPrefix202411\\React\\Stream\\ThroughStream' => $vendorDir . '/react/stream/src/ThroughStream.php', + 'RectorPrefix202411\\React\\Stream\\Util' => $vendorDir . '/react/stream/src/Util.php', + 'RectorPrefix202411\\React\\Stream\\WritableResourceStream' => $vendorDir . '/react/stream/src/WritableResourceStream.php', + 'RectorPrefix202411\\React\\Stream\\WritableStreamInterface' => $vendorDir . '/react/stream/src/WritableStreamInterface.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Debug\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => $vendorDir . '/symfony/process/Exception/RunProcessFailedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => $vendorDir . '/symfony/process/Messenger/RunProcessContext.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => $vendorDir . '/symfony/process/Messenger/RunProcessMessage.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => $vendorDir . '/symfony/process/Messenger/RunProcessMessageHandler.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpSubprocess' => $vendorDir . '/symfony/process/PhpSubprocess.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => $vendorDir . '/symfony/service-contracts/ServiceCollectionInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => $vendorDir . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => $vendorDir . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\CpuCoreCountProvider' => $vendorDir . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Action' => $vendorDir . '/symplify/easy-parallel/src/Enum/Action.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Content' => $vendorDir . '/symplify/easy-parallel/src/Enum/Content.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactCommand' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactCommand.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactEvent' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactEvent.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => $vendorDir . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => $vendorDir . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ScheduleFactory' => $vendorDir . '/symplify/easy-parallel/src/ScheduleFactory.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\Schedule' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/Schedule.php', + 'RectorPrefix202411\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', + 'RectorPrefix202411\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', + 'RectorPrefix202411\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', 'Rector\\Application\\ApplicationFileProcessor' => $baseDir . '/src/Application/ApplicationFileProcessor.php', 'Rector\\Application\\ChangedNodeScopeRefresher' => $baseDir . '/src/Application/ChangedNodeScopeRefresher.php', 'Rector\\Application\\FileProcessor' => $baseDir . '/src/Application/FileProcessor.php', @@ -1093,6 +1094,7 @@ 'Rector\\CodeQuality\\NodeAnalyzer\\VariableDimFetchAssignResolver' => $baseDir . '/rules/CodeQuality/NodeAnalyzer/VariableDimFetchAssignResolver.php', 'Rector\\CodeQuality\\NodeFactory\\MissingPropertiesFactory' => $baseDir . '/rules/CodeQuality/NodeFactory/MissingPropertiesFactory.php', 'Rector\\CodeQuality\\NodeFactory\\PropertyTypeDecorator' => $baseDir . '/rules/CodeQuality/NodeFactory/PropertyTypeDecorator.php', + 'Rector\\CodeQuality\\NodeFactory\\TypedPropertyFactory' => $baseDir . '/rules/CodeQuality/NodeFactory/TypedPropertyFactory.php', 'Rector\\CodeQuality\\NodeManipulator\\ExprBoolCaster' => $baseDir . '/rules/CodeQuality/NodeManipulator/ExprBoolCaster.php', 'Rector\\CodeQuality\\Rector\\Assign\\CombinedAssignRector' => $baseDir . '/rules/CodeQuality/Rector/Assign/CombinedAssignRector.php', 'Rector\\CodeQuality\\Rector\\BooleanAnd\\RemoveUselessIsObjectCheckRector' => $baseDir . '/rules/CodeQuality/Rector/BooleanAnd/RemoveUselessIsObjectCheckRector.php', @@ -1106,6 +1108,7 @@ 'Rector\\CodeQuality\\Rector\\ClassMethod\\LocallyCalledStaticMethodToNonStaticRector' => $baseDir . '/rules/CodeQuality/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php', 'Rector\\CodeQuality\\Rector\\ClassMethod\\OptionalParametersAfterRequiredRector' => $baseDir . '/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php', 'Rector\\CodeQuality\\Rector\\Class_\\CompleteDynamicPropertiesRector' => $baseDir . '/rules/CodeQuality/Rector/Class_/CompleteDynamicPropertiesRector.php', + 'Rector\\CodeQuality\\Rector\\Class_\\DynamicDocBlockPropertyToNativePropertyRector' => $baseDir . '/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php', 'Rector\\CodeQuality\\Rector\\Class_\\InlineConstructorDefaultToPropertyRector' => $baseDir . '/rules/CodeQuality/Rector/Class_/InlineConstructorDefaultToPropertyRector.php', 'Rector\\CodeQuality\\Rector\\Class_\\StaticToSelfStaticMethodCallOnFinalClassRector' => $baseDir . '/rules/CodeQuality/Rector/Class_/StaticToSelfStaticMethodCallOnFinalClassRector.php', 'Rector\\CodeQuality\\Rector\\Concat\\JoinStringConcatRector' => $baseDir . '/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php', @@ -1276,6 +1279,7 @@ 'Rector\\DeadCode\\PhpDoc\\DeadReturnTagValueNodeAnalyzer' => $baseDir . '/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php', 'Rector\\DeadCode\\PhpDoc\\DeadVarTagValueNodeAnalyzer' => $baseDir . '/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php', 'Rector\\DeadCode\\PhpDoc\\Guard\\StandaloneTypeRemovalGuard' => $baseDir . '/rules/DeadCode/PhpDoc/Guard/StandaloneTypeRemovalGuard.php', + 'Rector\\DeadCode\\PhpDoc\\Guard\\TemplateTypeRemovalGuard' => $baseDir . '/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php', 'Rector\\DeadCode\\PhpDoc\\TagRemover\\ParamTagRemover' => $baseDir . '/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php', 'Rector\\DeadCode\\PhpDoc\\TagRemover\\ReturnTagRemover' => $baseDir . '/rules/DeadCode/PhpDoc/TagRemover/ReturnTagRemover.php', 'Rector\\DeadCode\\PhpDoc\\TagRemover\\VarTagRemover' => $baseDir . '/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php', @@ -1286,6 +1290,7 @@ 'Rector\\DeadCode\\Rector\\Cast\\RecastingRemovalRector' => $baseDir . '/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php', 'Rector\\DeadCode\\Rector\\ClassConst\\RemoveUnusedPrivateClassConstantRector' => $baseDir . '/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveAnnotationRector' => $baseDir . '/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php', + 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveTypedPropertyNonMockDocblockRector' => $baseDir . '/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveEmptyClassMethodRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveNullTagValueNodeRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedConstructorParamRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php', @@ -1511,6 +1516,7 @@ 'Rector\\EarlyReturn\\Rector\\Return_\\ReturnBinaryOrToEarlyReturnRector' => $baseDir . '/rules/EarlyReturn/Rector/Return_/ReturnBinaryOrToEarlyReturnRector.php', 'Rector\\EarlyReturn\\Rector\\StmtsAwareInterface\\ReturnEarlyIfVariableRector' => $baseDir . '/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php', 'Rector\\EarlyReturn\\ValueObject\\BareSingleAssignIf' => $baseDir . '/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php', + 'Rector\\Enum\\ClassName' => $baseDir . '/src/Enum/ClassName.php', 'Rector\\Enum\\JsonConstant' => $vendorDir . '/rector/rector-downgrade-php/src/Enum/JsonConstant.php', 'Rector\\Enum\\ObjectReference' => $baseDir . '/src/Enum/ObjectReference.php', 'Rector\\Exception\\Cache\\CachingException' => $baseDir . '/src/Exception/Cache/CachingException.php', @@ -1736,17 +1742,23 @@ 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\AnnotationWithValueToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\CoversAnnotationWithValueToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\TicketAnnotationToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\DoctrineEntityDocumentAnalyser' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeFactory\\NestedClosureAssertFactory' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\CreateMockToAnonymousClassRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\DataProviderArrayItemsNewLinedRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\EntityDocumentCreateMockToDirectNewRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\RemoveEmptyTestMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/RemoveEmptyTestMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\ReplaceTestAnnotationWithPrefixedFunctionRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestAnnotationWithPrefixedFunctionRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\ReplaceTestFunctionPrefixWithAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\AddCoversClassAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddCoversClassAttributeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\AddParentSetupCallOnSetupRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddParentSetupCallOnSetupRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\AddSeeTestAnnotationRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddSeeTestAnnotationRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\ConstructClassMethodToSetUpTestCaseRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/ConstructClassMethodToSetUpTestCaseRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\NarrowUnusedSetUpDefinedPropertyRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitSelfCallRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitThisCallRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SetUpBeforeClassToSetUpRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SingleMockPropertyTypeRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TestWithToDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\YieldDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php', @@ -1765,6 +1777,7 @@ 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertSameBoolNullToSpecificMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameBoolNullToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertSameTrueFalseToAssertTrueFalseRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameTrueFalseToAssertTrueFalseRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertTrueFalseToSpecificMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\FlipAssertRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\NarrowIdenticalWithConsecutiveRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowIdenticalWithConsecutiveRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\NarrowSingleWillReturnCallbackRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowSingleWillReturnCallbackRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\RemoveExpectAnyFromMockRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/RemoveExpectAnyFromMockRector.php', @@ -1774,7 +1787,9 @@ 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\MatchAndReturnMatch' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php', 'Rector\\PHPUnit\\Composer\\ProjectPackageVersionResolver' => $vendorDir . '/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php', 'Rector\\PHPUnit\\Enum\\AssertMethod' => $vendorDir . '/rector/rector-phpunit/src/Enum/AssertMethod.php', + 'Rector\\PHPUnit\\Enum\\ConsecutiveMethodName' => $vendorDir . '/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php', 'Rector\\PHPUnit\\Enum\\ConsecutiveVariable' => $vendorDir . '/rector/rector-phpunit/src/Enum/ConsecutiveVariable.php', + 'Rector\\PHPUnit\\MethodCallRemover' => $vendorDir . '/rector/rector-phpunit/src/MethodCallRemover.php', 'Rector\\PHPUnit\\Naming\\TestClassNameResolver' => $vendorDir . '/rector/rector-phpunit/src/Naming/TestClassNameResolver.php', 'Rector\\PHPUnit\\NodeAnalyzer\\ArgumentMover' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/ArgumentMover.php', 'Rector\\PHPUnit\\NodeAnalyzer\\AssertCallAnalyzer' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php', @@ -1787,13 +1802,16 @@ 'Rector\\PHPUnit\\NodeFactory\\ExpectExceptionMethodCallFactory' => $vendorDir . '/rector/rector-phpunit/src/NodeFactory/ExpectExceptionMethodCallFactory.php', 'Rector\\PHPUnit\\NodeFactory\\MatcherInvocationCountMethodCallNodeFactory' => $vendorDir . '/rector/rector-phpunit/src/NodeFactory/MatcherInvocationCountMethodCallNodeFactory.php', 'Rector\\PHPUnit\\NodeFactory\\UsedVariablesResolver' => $vendorDir . '/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php', - 'Rector\\PHPUnit\\NodeFactory\\WithConsecutiveMatchFactory' => $vendorDir . '/rector/rector-phpunit/src/NodeFactory/WithConsecutiveMatchFactory.php', 'Rector\\PHPUnit\\NodeFinder\\DataProviderClassMethodFinder' => $vendorDir . '/rector/rector-phpunit/src/NodeFinder/DataProviderClassMethodFinder.php', + 'Rector\\PHPUnit\\NodeFinder\\MethodCallNodeFinder' => $vendorDir . '/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php', + 'Rector\\PHPUnit\\PHPUnit100\\NodeDecorator\\WillReturnIfNodeDecorator' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php', + 'Rector\\PHPUnit\\PHPUnit100\\NodeFactory\\WillReturnCallbackFactory' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\AddProphecyTraitRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\PublicDataProviderClassMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\StaticDataProviderClassMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\AssertIssetToAssertObjectHasPropertyRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\RemoveSetMethodsMethodCallRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\ExpectsMethodCallDecorator' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php', 'Rector\\PHPUnit\\PHPUnit110\\Rector\\Class_\\NamedArgumentForDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php', 'Rector\\PHPUnit\\PHPUnit50\\Rector\\StaticCall\\GetMockRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php', @@ -1980,6 +1998,7 @@ 'Rector\\Php83\\Rector\\ClassConst\\AddTypeToConstRector' => $baseDir . '/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php', 'Rector\\Php83\\Rector\\ClassMethod\\AddOverrideAttributeToOverriddenMethodsRector' => $baseDir . '/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php', 'Rector\\Php83\\Rector\\FuncCall\\CombineHostPortLdapUriRector' => $baseDir . '/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php', + 'Rector\\Php83\\Rector\\FuncCall\\RemoveGetClassGetParentClassNoArgsRector' => $baseDir . '/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php', 'Rector\\Php84\\Rector\\Param\\ExplicitNullableParamTypeRector' => $baseDir . '/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper' => $baseDir . '/src/PhpAttribute/AnnotationToAttributeMapper.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper\\ArrayAnnotationToAttributeMapper' => $baseDir . '/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php', @@ -2188,6 +2207,7 @@ 'Rector\\Symfony\\CodeQuality\\Rector\\Closure\\StringExtensionToConfigBuilderRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\AssertSameResponseCodeWithDebugContentsRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\LiteralGetToRequestClassConstantRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\Trait_\\AddTraitGetterReturnTypeBasedOnSetterRequiredRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php', 'Rector\\Symfony\\Configs\\ConfigArrayHandler\\NestedConfigCallsFactory' => $vendorDir . '/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php', 'Rector\\Symfony\\Configs\\ConfigArrayHandler\\SecurityAccessDecisionManagerConfigArrayHandler' => $vendorDir . '/rector/rector-symfony/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php', 'Rector\\Symfony\\Configs\\Enum\\DoctrineConfigKey' => $vendorDir . '/rector/rector-symfony/rules/Configs/Enum/DoctrineConfigKey.php', @@ -2387,6 +2407,7 @@ 'Rector\\Transform\\Rector\\FuncCall\\FuncCallToNewRector' => $baseDir . '/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php', 'Rector\\Transform\\Rector\\FuncCall\\FuncCallToStaticCallRector' => $baseDir . '/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php', 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToFuncCallRector' => $baseDir . '/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php', + 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToNewRector' => $baseDir . '/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php', 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToPropertyFetchRector' => $baseDir . '/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php', 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToStaticCallRector' => $baseDir . '/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php', 'Rector\\Transform\\Rector\\MethodCall\\ReplaceParentCallByPropertyCallRector' => $baseDir . '/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php', @@ -2403,6 +2424,7 @@ 'Rector\\Transform\\ValueObject\\FuncCallToMethodCall' => $baseDir . '/rules/Transform/ValueObject/FuncCallToMethodCall.php', 'Rector\\Transform\\ValueObject\\FuncCallToStaticCall' => $baseDir . '/rules/Transform/ValueObject/FuncCallToStaticCall.php', 'Rector\\Transform\\ValueObject\\MethodCallToFuncCall' => $baseDir . '/rules/Transform/ValueObject/MethodCallToFuncCall.php', + 'Rector\\Transform\\ValueObject\\MethodCallToNew' => $baseDir . '/rules/Transform/ValueObject/MethodCallToNew.php', 'Rector\\Transform\\ValueObject\\MethodCallToPropertyFetch' => $baseDir . '/rules/Transform/ValueObject/MethodCallToPropertyFetch.php', 'Rector\\Transform\\ValueObject\\MethodCallToStaticCall' => $baseDir . '/rules/Transform/ValueObject/MethodCallToStaticCall.php', 'Rector\\Transform\\ValueObject\\NewToStaticCall' => $baseDir . '/rules/Transform/ValueObject/NewToStaticCall.php', @@ -2496,6 +2518,7 @@ 'Rector\\TypeDeclaration\\Rector\\Empty_\\EmptyOnNullableObjectToInstanceOfRector' => $baseDir . '/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php', 'Rector\\TypeDeclaration\\Rector\\Expression\\InlineVarDocTagToAssertRector' => $baseDir . '/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromArgRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php', + 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromIterableMethodCallRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromObjectRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddParamTypeSplFixedArrayRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php', diff --git a/vendor/rector/rector/vendor/composer/autoload_psr4.php b/vendor/rector/rector/vendor/composer/autoload_psr4.php index 8e441342f..20f9a02e1 100644 --- a/vendor/rector/rector/vendor/composer/autoload_psr4.php +++ b/vendor/rector/rector/vendor/composer/autoload_psr4.php @@ -14,34 +14,34 @@ 'Rector\\PHPUnit\\' => array($vendorDir . '/rector/rector-phpunit/src', $vendorDir . '/rector/rector-phpunit/rules'), 'Rector\\Doctrine\\' => array($vendorDir . '/rector/rector-doctrine/src', $vendorDir . '/rector/rector-doctrine/rules'), 'Rector\\' => array($baseDir . '/rules', $baseDir . '/src', $vendorDir . '/rector/rector-downgrade-php/src', $vendorDir . '/rector/rector-downgrade-php/rules'), - 'RectorPrefix202410\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), - 'RectorPrefix202410\\Symplify\\EasyParallel\\' => array($vendorDir . '/symplify/easy-parallel/src'), - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), - 'RectorPrefix202410\\Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), - 'RectorPrefix202410\\Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), - 'RectorPrefix202410\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), - 'RectorPrefix202410\\React\\Stream\\' => array($vendorDir . '/react/stream/src'), - 'RectorPrefix202410\\React\\Socket\\' => array($vendorDir . '/react/socket/src'), - 'RectorPrefix202410\\React\\Promise\\' => array($vendorDir . '/react/promise/src'), - 'RectorPrefix202410\\React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'), - 'RectorPrefix202410\\React\\Dns\\' => array($vendorDir . '/react/dns/src'), - 'RectorPrefix202410\\React\\ChildProcess\\' => array($vendorDir . '/react/child-process/src'), - 'RectorPrefix202410\\React\\Cache\\' => array($vendorDir . '/react/cache/src'), - 'RectorPrefix202410\\Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), - 'RectorPrefix202410\\Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'RectorPrefix202410\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'RectorPrefix202410\\OndraM\\CiDetector\\' => array($vendorDir . '/ondram/ci-detector/src'), - 'RectorPrefix202410\\Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), - 'RectorPrefix202410\\Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), - 'RectorPrefix202410\\Evenement\\' => array($vendorDir . '/evenement/evenement/src'), - 'RectorPrefix202410\\Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), - 'RectorPrefix202410\\Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), - 'RectorPrefix202410\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), - 'RectorPrefix202410\\Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), - 'RectorPrefix202410\\Clue\\React\\NDJson\\' => array($vendorDir . '/clue/ndjson-react/src'), + 'RectorPrefix202411\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), + 'RectorPrefix202411\\Symplify\\EasyParallel\\' => array($vendorDir . '/symplify/easy-parallel/src'), + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), + 'RectorPrefix202411\\Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), + 'RectorPrefix202411\\Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), + 'RectorPrefix202411\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'RectorPrefix202411\\React\\Stream\\' => array($vendorDir . '/react/stream/src'), + 'RectorPrefix202411\\React\\Socket\\' => array($vendorDir . '/react/socket/src'), + 'RectorPrefix202411\\React\\Promise\\' => array($vendorDir . '/react/promise/src'), + 'RectorPrefix202411\\React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'), + 'RectorPrefix202411\\React\\Dns\\' => array($vendorDir . '/react/dns/src'), + 'RectorPrefix202411\\React\\ChildProcess\\' => array($vendorDir . '/react/child-process/src'), + 'RectorPrefix202411\\React\\Cache\\' => array($vendorDir . '/react/cache/src'), + 'RectorPrefix202411\\Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), + 'RectorPrefix202411\\Psr\\Log\\' => array($vendorDir . '/psr/log/src'), + 'RectorPrefix202411\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'RectorPrefix202411\\OndraM\\CiDetector\\' => array($vendorDir . '/ondram/ci-detector/src'), + 'RectorPrefix202411\\Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), + 'RectorPrefix202411\\Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), + 'RectorPrefix202411\\Evenement\\' => array($vendorDir . '/evenement/evenement/src'), + 'RectorPrefix202411\\Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), + 'RectorPrefix202411\\Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), + 'RectorPrefix202411\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), + 'RectorPrefix202411\\Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), + 'RectorPrefix202411\\Clue\\React\\NDJson\\' => array($vendorDir . '/clue/ndjson-react/src'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), ); diff --git a/vendor/rector/rector/vendor/composer/autoload_real.php b/vendor/rector/rector/vendor/composer/autoload_real.php index 82f820f61..f74af415e 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 ComposerAutoloaderInit7c12491db1a700dd78980ecb6595c088 +class ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7 { private static $loader; @@ -22,17 +22,17 @@ public static function getLoader() return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit7c12491db1a700dd78980ecb6595c088', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit7c12491db1a700dd78980ecb6595c088', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit7c12491db1a700dd78980ecb6595c088::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit7c12491db1a700dd78980ecb6595c088::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$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 8a5537adf..d3446c721 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 ComposerStaticInit7c12491db1a700dd78980ecb6595c088 +class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -27,34 +27,34 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\PHPUnit\\' => 15, 'Rector\\Doctrine\\' => 16, 'Rector\\' => 7, - 'RectorPrefix202410\\Webmozart\\Assert\\' => 36, - 'RectorPrefix202410\\Symplify\\EasyParallel\\' => 41, - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\' => 45, - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\' => 42, - 'RectorPrefix202410\\Symfony\\Component\\Process\\' => 45, - 'RectorPrefix202410\\Symfony\\Component\\Finder\\' => 44, - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\' => 48, - 'RectorPrefix202410\\Symfony\\Component\\Console\\' => 45, - 'RectorPrefix202410\\React\\Stream\\' => 32, - 'RectorPrefix202410\\React\\Socket\\' => 32, - 'RectorPrefix202410\\React\\Promise\\' => 33, - 'RectorPrefix202410\\React\\EventLoop\\' => 35, - 'RectorPrefix202410\\React\\Dns\\' => 29, - 'RectorPrefix202410\\React\\ChildProcess\\' => 38, - 'RectorPrefix202410\\React\\Cache\\' => 31, - 'RectorPrefix202410\\Psr\\SimpleCache\\' => 35, - 'RectorPrefix202410\\Psr\\Log\\' => 27, - 'RectorPrefix202410\\Psr\\Container\\' => 33, - 'RectorPrefix202410\\OndraM\\CiDetector\\' => 37, - 'RectorPrefix202410\\Illuminate\\Contracts\\' => 40, - 'RectorPrefix202410\\Illuminate\\Container\\' => 40, - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\' => 40, - 'RectorPrefix202410\\Evenement\\' => 29, - 'RectorPrefix202410\\Doctrine\\Inflector\\' => 38, - 'RectorPrefix202410\\Composer\\XdebugHandler\\' => 42, - 'RectorPrefix202410\\Composer\\Semver\\' => 35, - 'RectorPrefix202410\\Composer\\Pcre\\' => 33, - 'RectorPrefix202410\\Clue\\React\\NDJson\\' => 37, + 'RectorPrefix202411\\Webmozart\\Assert\\' => 36, + 'RectorPrefix202411\\Symplify\\EasyParallel\\' => 41, + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\' => 45, + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\' => 42, + 'RectorPrefix202411\\Symfony\\Component\\Process\\' => 45, + 'RectorPrefix202411\\Symfony\\Component\\Finder\\' => 44, + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\' => 48, + 'RectorPrefix202411\\Symfony\\Component\\Console\\' => 45, + 'RectorPrefix202411\\React\\Stream\\' => 32, + 'RectorPrefix202411\\React\\Socket\\' => 32, + 'RectorPrefix202411\\React\\Promise\\' => 33, + 'RectorPrefix202411\\React\\EventLoop\\' => 35, + 'RectorPrefix202411\\React\\Dns\\' => 29, + 'RectorPrefix202411\\React\\ChildProcess\\' => 38, + 'RectorPrefix202411\\React\\Cache\\' => 31, + 'RectorPrefix202411\\Psr\\SimpleCache\\' => 35, + 'RectorPrefix202411\\Psr\\Log\\' => 27, + 'RectorPrefix202411\\Psr\\Container\\' => 33, + 'RectorPrefix202411\\OndraM\\CiDetector\\' => 37, + 'RectorPrefix202411\\Illuminate\\Contracts\\' => 40, + 'RectorPrefix202411\\Illuminate\\Container\\' => 40, + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\' => 40, + 'RectorPrefix202411\\Evenement\\' => 29, + 'RectorPrefix202411\\Doctrine\\Inflector\\' => 38, + 'RectorPrefix202411\\Composer\\XdebugHandler\\' => 42, + 'RectorPrefix202411\\Composer\\Semver\\' => 35, + 'RectorPrefix202411\\Composer\\Pcre\\' => 33, + 'RectorPrefix202411\\Clue\\React\\NDJson\\' => 37, ), 'P' => array ( @@ -102,115 +102,115 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 2 => __DIR__ . '/..' . '/rector/rector-downgrade-php/src', 3 => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules', ), - 'RectorPrefix202410\\Webmozart\\Assert\\' => + 'RectorPrefix202411\\Webmozart\\Assert\\' => array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), - 'RectorPrefix202410\\Symplify\\EasyParallel\\' => + 'RectorPrefix202411\\Symplify\\EasyParallel\\' => array ( 0 => __DIR__ . '/..' . '/symplify/easy-parallel/src', ), - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\' => + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\' => + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\' => array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), - 'RectorPrefix202410\\Symfony\\Component\\Process\\' => + 'RectorPrefix202411\\Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), - 'RectorPrefix202410\\Symfony\\Component\\Finder\\' => + 'RectorPrefix202411\\Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\' => + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), - 'RectorPrefix202410\\Symfony\\Component\\Console\\' => + 'RectorPrefix202411\\Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), - 'RectorPrefix202410\\React\\Stream\\' => + 'RectorPrefix202411\\React\\Stream\\' => array ( 0 => __DIR__ . '/..' . '/react/stream/src', ), - 'RectorPrefix202410\\React\\Socket\\' => + 'RectorPrefix202411\\React\\Socket\\' => array ( 0 => __DIR__ . '/..' . '/react/socket/src', ), - 'RectorPrefix202410\\React\\Promise\\' => + 'RectorPrefix202411\\React\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/react/promise/src', ), - 'RectorPrefix202410\\React\\EventLoop\\' => + 'RectorPrefix202411\\React\\EventLoop\\' => array ( 0 => __DIR__ . '/..' . '/react/event-loop/src', ), - 'RectorPrefix202410\\React\\Dns\\' => + 'RectorPrefix202411\\React\\Dns\\' => array ( 0 => __DIR__ . '/..' . '/react/dns/src', ), - 'RectorPrefix202410\\React\\ChildProcess\\' => + 'RectorPrefix202411\\React\\ChildProcess\\' => array ( 0 => __DIR__ . '/..' . '/react/child-process/src', ), - 'RectorPrefix202410\\React\\Cache\\' => + 'RectorPrefix202411\\React\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/react/cache/src', ), - 'RectorPrefix202410\\Psr\\SimpleCache\\' => + 'RectorPrefix202411\\Psr\\SimpleCache\\' => array ( 0 => __DIR__ . '/..' . '/psr/simple-cache/src', ), - 'RectorPrefix202410\\Psr\\Log\\' => + 'RectorPrefix202411\\Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), - 'RectorPrefix202410\\Psr\\Container\\' => + 'RectorPrefix202411\\Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), - 'RectorPrefix202410\\OndraM\\CiDetector\\' => + 'RectorPrefix202411\\OndraM\\CiDetector\\' => array ( 0 => __DIR__ . '/..' . '/ondram/ci-detector/src', ), - 'RectorPrefix202410\\Illuminate\\Contracts\\' => + 'RectorPrefix202411\\Illuminate\\Contracts\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/contracts', ), - 'RectorPrefix202410\\Illuminate\\Container\\' => + 'RectorPrefix202411\\Illuminate\\Container\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/container', ), - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\' => + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\' => array ( 0 => __DIR__ . '/..' . '/fidry/cpu-core-counter/src', ), - 'RectorPrefix202410\\Evenement\\' => + 'RectorPrefix202411\\Evenement\\' => array ( 0 => __DIR__ . '/..' . '/evenement/evenement/src', ), - 'RectorPrefix202410\\Doctrine\\Inflector\\' => + 'RectorPrefix202411\\Doctrine\\Inflector\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector', ), - 'RectorPrefix202410\\Composer\\XdebugHandler\\' => + 'RectorPrefix202411\\Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', ), - 'RectorPrefix202410\\Composer\\Semver\\' => + 'RectorPrefix202411\\Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), - 'RectorPrefix202410\\Composer\\Pcre\\' => + 'RectorPrefix202411\\Composer\\Pcre\\' => array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), - 'RectorPrefix202410\\Clue\\React\\NDJson\\' => + 'RectorPrefix202411\\Clue\\React\\NDJson\\' => array ( 0 => __DIR__ . '/..' . '/clue/ndjson-react/src', ), @@ -564,649 +564,650 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', 'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', 'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', - 'RectorPrefix202410\\Clue\\React\\NDJson\\Decoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Decoder.php', - 'RectorPrefix202410\\Clue\\React\\NDJson\\Encoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Encoder.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchStrictGroupsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchFlags.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', - 'RectorPrefix202410\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', - 'RectorPrefix202410\\Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', - 'RectorPrefix202410\\Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', - 'RectorPrefix202410\\Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', - 'RectorPrefix202410\\Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', - 'RectorPrefix202410\\Composer\\Pcre\\UnexpectedNullMatchException' => __DIR__ . '/..' . '/composer/pcre/src/UnexpectedNullMatchException.php', - 'RectorPrefix202410\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', - 'RectorPrefix202410\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', - 'RectorPrefix202410\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', - 'RectorPrefix202410\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', - 'RectorPrefix202410\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', - 'RectorPrefix202410\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', - 'RectorPrefix202410\\Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\CachedWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Inflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Language' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\LanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\NoopWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Pattern' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Patterns' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Ruleset' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Substitution' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Substitutions' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Transformation' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Transformations' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\Rules\\Word' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\RulesetInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', - 'RectorPrefix202410\\Doctrine\\Inflector\\WordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', - 'RectorPrefix202410\\Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitter.php', - 'RectorPrefix202410\\Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterInterface.php', - 'RectorPrefix202410\\Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterTrait.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Diagnoser' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Diagnoser.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', - 'RectorPrefix202410\\Fidry\\CpuCoreCounter\\ParallelisationResult' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/ParallelisationResult.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Auth' => __DIR__ . '/..' . '/illuminate/container/Attributes/Auth.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Authenticated' => __DIR__ . '/..' . '/illuminate/container/Attributes/Authenticated.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Cache' => __DIR__ . '/..' . '/illuminate/container/Attributes/Cache.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Config' => __DIR__ . '/..' . '/illuminate/container/Attributes/Config.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\CurrentUser' => __DIR__ . '/..' . '/illuminate/container/Attributes/CurrentUser.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\DB' => __DIR__ . '/..' . '/illuminate/container/Attributes/DB.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Database' => __DIR__ . '/..' . '/illuminate/container/Attributes/Database.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Log' => __DIR__ . '/..' . '/illuminate/container/Attributes/Log.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Storage' => __DIR__ . '/..' . '/illuminate/container/Attributes/Storage.php', - 'RectorPrefix202410\\Illuminate\\Container\\Attributes\\Tag' => __DIR__ . '/..' . '/illuminate/container/Attributes/Tag.php', - 'RectorPrefix202410\\Illuminate\\Container\\BoundMethod' => __DIR__ . '/..' . '/illuminate/container/BoundMethod.php', - 'RectorPrefix202410\\Illuminate\\Container\\Container' => __DIR__ . '/..' . '/illuminate/container/Container.php', - 'RectorPrefix202410\\Illuminate\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/container/ContextualBindingBuilder.php', - 'RectorPrefix202410\\Illuminate\\Container\\EntryNotFoundException' => __DIR__ . '/..' . '/illuminate/container/EntryNotFoundException.php', - 'RectorPrefix202410\\Illuminate\\Container\\RewindableGenerator' => __DIR__ . '/..' . '/illuminate/container/RewindableGenerator.php', - 'RectorPrefix202410\\Illuminate\\Container\\Util' => __DIR__ . '/..' . '/illuminate/container/Util.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Authorizable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Gate.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Authenticatable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/illuminate/contracts/Auth/CanResetPassword.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Guard.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/illuminate/contracts/Auth/MustVerifyEmail.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBroker.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/StatefulGuard.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/illuminate/contracts/Auth/SupportsBasicAuth.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/illuminate/contracts/Auth/UserProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Broadcaster.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/Dispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/QueueingDispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Lock.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockTimeoutException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Repository.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Store.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Concurrency\\Driver' => __DIR__ . '/..' . '/illuminate/contracts/Concurrency/Driver.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Config/Repository.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Console/Application.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\Isolatable' => __DIR__ . '/..' . '/illuminate/contracts/Console/Isolatable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Console/Kernel.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => __DIR__ . '/..' . '/illuminate/contracts/Console/PromptsForMissingInput.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/illuminate/contracts/Container/BindingResolutionException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\CircularDependencyException' => __DIR__ . '/..' . '/illuminate/contracts/Container/CircularDependencyException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/illuminate/contracts/Container/Container.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\ContextualAttribute' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualAttribute.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualBindingBuilder.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/QueueingFactory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Builder.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Castable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/illuminate/contracts/Database/Events/MigrationEvent.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/illuminate/contracts/Database/ModelIdentifier.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Query\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Builder.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/ConditionExpression.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Database\\Query\\Expression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Expression.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ExceptionHandler.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Debug\\ShouldntReport' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ShouldntReport.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/DecryptException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/EncryptException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/Encrypter.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/StringEncrypter.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Events/Dispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Cloud.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/FileNotFoundException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Filesystem.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/LockTimeoutException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/Application.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesConfiguration.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesRoutes.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/ExceptionRenderer.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/MaintenanceMode.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/illuminate/contracts/Hashing/Hasher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Http/Kernel.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Attachable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Attachable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/illuminate/contracts/Mail/MailQueue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailer.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Dispatcher.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/CursorPaginator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/Paginator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Hub.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Pipeline.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Process\\InvokedProcess' => __DIR__ . '/..' . '/illuminate/contracts/Process/InvokedProcess.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Process\\ProcessResult' => __DIR__ . '/..' . '/illuminate/contracts/Process/ProcessResult.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ClearableQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ClearableQueue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityNotFoundException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityResolver.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Job.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Monitor.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Queue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableCollection.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableEntity.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUnique.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connection.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connector.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Redis/LimiterTimeoutException.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/BindingRegistrar.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/Registrar.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/illuminate/contracts/Routing/ResponseFactory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlGenerator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlRoutable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => __DIR__ . '/..' . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/illuminate/contracts/Session/Session.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Arrayable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferrableProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferringDisplayableValue.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Htmlable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Jsonable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageBag.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageProvider.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Renderable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Responsable.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Support\\ValidatedData' => __DIR__ . '/..' . '/illuminate/contracts/Support/ValidatedData.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/illuminate/contracts/Translation/HasLocalePreference.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Loader.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Translator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\DataAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/DataAwareRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ImplicitRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\InvokableRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/InvokableRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Rule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => __DIR__ . '/..' . '/illuminate/contracts/Validation/UncompromisedVerifier.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ValidationRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidationRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Validator.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatorAwareRule.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/illuminate/contracts/View/Engine.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/View/Factory.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/illuminate/contracts/View/View.php', - 'RectorPrefix202410\\Illuminate\\Contracts\\View\\ViewCompilationException' => __DIR__ . '/..' . '/illuminate/contracts/View/ViewCompilationException.php', - 'RectorPrefix202410\\Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php', - 'RectorPrefix202410\\Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php', - 'RectorPrefix202410\\Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php', - 'RectorPrefix202410\\Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', - 'RectorPrefix202410\\Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php', - 'RectorPrefix202410\\Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php', - 'RectorPrefix202410\\Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php', - 'RectorPrefix202410\\Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php', - 'RectorPrefix202410\\Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php', - 'RectorPrefix202410\\Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php', - 'RectorPrefix202410\\Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php', - 'RectorPrefix202410\\Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php', - 'RectorPrefix202410\\Nette\\Utils\\FileInfo' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileInfo.php', - 'RectorPrefix202410\\Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php', - 'RectorPrefix202410\\Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/utils/src/Utils/Finder.php', - 'RectorPrefix202410\\Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php', - 'RectorPrefix202410\\Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php', - 'RectorPrefix202410\\Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php', - 'RectorPrefix202410\\Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', - 'RectorPrefix202410\\Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php', - 'RectorPrefix202410\\Nette\\Utils\\ImageColor' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageColor.php', - 'RectorPrefix202410\\Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\ImageType' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageType.php', - 'RectorPrefix202410\\Nette\\Utils\\Iterables' => __DIR__ . '/..' . '/nette/utils/src/Utils/Iterables.php', - 'RectorPrefix202410\\Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php', - 'RectorPrefix202410\\Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php', - 'RectorPrefix202410\\Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php', - 'RectorPrefix202410\\Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php', - 'RectorPrefix202410\\Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', - 'RectorPrefix202410\\Nette\\Utils\\ReflectionMethod' => __DIR__ . '/..' . '/nette/utils/src/Utils/ReflectionMethod.php', - 'RectorPrefix202410\\Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', - 'RectorPrefix202410\\Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php', - 'RectorPrefix202410\\Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202410\\Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\CiDetector' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetector.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\CiDetectorInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetectorInterface.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AbstractCi' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AbstractCi.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AppVeyor' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AppVeyor.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\AzurePipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AzurePipelines.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Bamboo' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Bamboo.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Buddy' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Buddy.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\CiInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/CiInterface.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Circle' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Circle.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Codeship' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Codeship.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Continuousphp' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Continuousphp.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Drone' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Drone.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\GitHubActions' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitHubActions.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\GitLab' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitLab.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Jenkins' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Jenkins.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\SourceHut' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/SourceHut.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\TeamCity' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/TeamCity.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Travis' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Travis.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Ci\\Wercker' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Wercker.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Env' => __DIR__ . '/..' . '/ondram/ci-detector/src/Env.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => __DIR__ . '/..' . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', - 'RectorPrefix202410\\OndraM\\CiDetector\\TrinaryLogic' => __DIR__ . '/..' . '/ondram/ci-detector/src/TrinaryLogic.php', - 'RectorPrefix202410\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', - 'RectorPrefix202410\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', - 'RectorPrefix202410\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', - 'RectorPrefix202410\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', - 'RectorPrefix202410\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', - 'RectorPrefix202410\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', - 'RectorPrefix202410\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', - 'RectorPrefix202410\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', - 'RectorPrefix202410\\Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', - 'RectorPrefix202410\\Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', - 'RectorPrefix202410\\Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', - 'RectorPrefix202410\\React\\Cache\\ArrayCache' => __DIR__ . '/..' . '/react/cache/src/ArrayCache.php', - 'RectorPrefix202410\\React\\Cache\\CacheInterface' => __DIR__ . '/..' . '/react/cache/src/CacheInterface.php', - 'RectorPrefix202410\\React\\ChildProcess\\Process' => __DIR__ . '/..' . '/react/child-process/src/Process.php', - 'RectorPrefix202410\\React\\Dns\\BadServerException' => __DIR__ . '/..' . '/react/dns/src/BadServerException.php', - 'RectorPrefix202410\\React\\Dns\\Config\\Config' => __DIR__ . '/..' . '/react/dns/src/Config/Config.php', - 'RectorPrefix202410\\React\\Dns\\Config\\HostsFile' => __DIR__ . '/..' . '/react/dns/src/Config/HostsFile.php', - 'RectorPrefix202410\\React\\Dns\\Model\\Message' => __DIR__ . '/..' . '/react/dns/src/Model/Message.php', - 'RectorPrefix202410\\React\\Dns\\Model\\Record' => __DIR__ . '/..' . '/react/dns/src/Model/Record.php', - 'RectorPrefix202410\\React\\Dns\\Protocol\\BinaryDumper' => __DIR__ . '/..' . '/react/dns/src/Protocol/BinaryDumper.php', - 'RectorPrefix202410\\React\\Dns\\Protocol\\Parser' => __DIR__ . '/..' . '/react/dns/src/Protocol/Parser.php', - 'RectorPrefix202410\\React\\Dns\\Query\\CachingExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CachingExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\CancellationException' => __DIR__ . '/..' . '/react/dns/src/Query/CancellationException.php', - 'RectorPrefix202410\\React\\Dns\\Query\\CoopExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CoopExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\ExecutorInterface' => __DIR__ . '/..' . '/react/dns/src/Query/ExecutorInterface.php', - 'RectorPrefix202410\\React\\Dns\\Query\\FallbackExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/FallbackExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\HostsFileExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/HostsFileExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\Query' => __DIR__ . '/..' . '/react/dns/src/Query/Query.php', - 'RectorPrefix202410\\React\\Dns\\Query\\RetryExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/RetryExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\SelectiveTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/SelectiveTransportExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\TcpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TcpTransportExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\TimeoutException' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutException.php', - 'RectorPrefix202410\\React\\Dns\\Query\\TimeoutExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutExecutor.php', - 'RectorPrefix202410\\React\\Dns\\Query\\UdpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/UdpTransportExecutor.php', - 'RectorPrefix202410\\React\\Dns\\RecordNotFoundException' => __DIR__ . '/..' . '/react/dns/src/RecordNotFoundException.php', - 'RectorPrefix202410\\React\\Dns\\Resolver\\Factory' => __DIR__ . '/..' . '/react/dns/src/Resolver/Factory.php', - 'RectorPrefix202410\\React\\Dns\\Resolver\\Resolver' => __DIR__ . '/..' . '/react/dns/src/Resolver/Resolver.php', - 'RectorPrefix202410\\React\\Dns\\Resolver\\ResolverInterface' => __DIR__ . '/..' . '/react/dns/src/Resolver/ResolverInterface.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtEvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEvLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtEventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEventLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtLibevLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibevLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtLibeventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibeventLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\ExtUvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtUvLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\Factory' => __DIR__ . '/..' . '/react/event-loop/src/Factory.php', - 'RectorPrefix202410\\React\\EventLoop\\Loop' => __DIR__ . '/..' . '/react/event-loop/src/Loop.php', - 'RectorPrefix202410\\React\\EventLoop\\LoopInterface' => __DIR__ . '/..' . '/react/event-loop/src/LoopInterface.php', - 'RectorPrefix202410\\React\\EventLoop\\SignalsHandler' => __DIR__ . '/..' . '/react/event-loop/src/SignalsHandler.php', - 'RectorPrefix202410\\React\\EventLoop\\StreamSelectLoop' => __DIR__ . '/..' . '/react/event-loop/src/StreamSelectLoop.php', - 'RectorPrefix202410\\React\\EventLoop\\Tick\\FutureTickQueue' => __DIR__ . '/..' . '/react/event-loop/src/Tick/FutureTickQueue.php', - 'RectorPrefix202410\\React\\EventLoop\\TimerInterface' => __DIR__ . '/..' . '/react/event-loop/src/TimerInterface.php', - 'RectorPrefix202410\\React\\EventLoop\\Timer\\Timer' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timer.php', - 'RectorPrefix202410\\React\\EventLoop\\Timer\\Timers' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timers.php', - 'RectorPrefix202410\\React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php', - 'RectorPrefix202410\\React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php', - 'RectorPrefix202410\\React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php', - 'RectorPrefix202410\\React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php', - 'RectorPrefix202410\\React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php', - 'RectorPrefix202410\\React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php', - 'RectorPrefix202410\\React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php', - 'RectorPrefix202410\\React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php', - 'RectorPrefix202410\\React\\Socket\\Connection' => __DIR__ . '/..' . '/react/socket/src/Connection.php', - 'RectorPrefix202410\\React\\Socket\\ConnectionInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectionInterface.php', - 'RectorPrefix202410\\React\\Socket\\Connector' => __DIR__ . '/..' . '/react/socket/src/Connector.php', - 'RectorPrefix202410\\React\\Socket\\ConnectorInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectorInterface.php', - 'RectorPrefix202410\\React\\Socket\\DnsConnector' => __DIR__ . '/..' . '/react/socket/src/DnsConnector.php', - 'RectorPrefix202410\\React\\Socket\\FdServer' => __DIR__ . '/..' . '/react/socket/src/FdServer.php', - 'RectorPrefix202410\\React\\Socket\\FixedUriConnector' => __DIR__ . '/..' . '/react/socket/src/FixedUriConnector.php', - 'RectorPrefix202410\\React\\Socket\\HappyEyeBallsConnectionBuilder' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', - 'RectorPrefix202410\\React\\Socket\\HappyEyeBallsConnector' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnector.php', - 'RectorPrefix202410\\React\\Socket\\LimitingServer' => __DIR__ . '/..' . '/react/socket/src/LimitingServer.php', - 'RectorPrefix202410\\React\\Socket\\SecureConnector' => __DIR__ . '/..' . '/react/socket/src/SecureConnector.php', - 'RectorPrefix202410\\React\\Socket\\SecureServer' => __DIR__ . '/..' . '/react/socket/src/SecureServer.php', - 'RectorPrefix202410\\React\\Socket\\Server' => __DIR__ . '/..' . '/react/socket/src/Server.php', - 'RectorPrefix202410\\React\\Socket\\ServerInterface' => __DIR__ . '/..' . '/react/socket/src/ServerInterface.php', - 'RectorPrefix202410\\React\\Socket\\SocketServer' => __DIR__ . '/..' . '/react/socket/src/SocketServer.php', - 'RectorPrefix202410\\React\\Socket\\StreamEncryption' => __DIR__ . '/..' . '/react/socket/src/StreamEncryption.php', - 'RectorPrefix202410\\React\\Socket\\TcpConnector' => __DIR__ . '/..' . '/react/socket/src/TcpConnector.php', - 'RectorPrefix202410\\React\\Socket\\TcpServer' => __DIR__ . '/..' . '/react/socket/src/TcpServer.php', - 'RectorPrefix202410\\React\\Socket\\TimeoutConnector' => __DIR__ . '/..' . '/react/socket/src/TimeoutConnector.php', - 'RectorPrefix202410\\React\\Socket\\UnixConnector' => __DIR__ . '/..' . '/react/socket/src/UnixConnector.php', - 'RectorPrefix202410\\React\\Socket\\UnixServer' => __DIR__ . '/..' . '/react/socket/src/UnixServer.php', - 'RectorPrefix202410\\React\\Stream\\CompositeStream' => __DIR__ . '/..' . '/react/stream/src/CompositeStream.php', - 'RectorPrefix202410\\React\\Stream\\DuplexResourceStream' => __DIR__ . '/..' . '/react/stream/src/DuplexResourceStream.php', - 'RectorPrefix202410\\React\\Stream\\DuplexStreamInterface' => __DIR__ . '/..' . '/react/stream/src/DuplexStreamInterface.php', - 'RectorPrefix202410\\React\\Stream\\ReadableResourceStream' => __DIR__ . '/..' . '/react/stream/src/ReadableResourceStream.php', - 'RectorPrefix202410\\React\\Stream\\ReadableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/ReadableStreamInterface.php', - 'RectorPrefix202410\\React\\Stream\\ThroughStream' => __DIR__ . '/..' . '/react/stream/src/ThroughStream.php', - 'RectorPrefix202410\\React\\Stream\\Util' => __DIR__ . '/..' . '/react/stream/src/Util.php', - 'RectorPrefix202410\\React\\Stream\\WritableResourceStream' => __DIR__ . '/..' . '/react/stream/src/WritableResourceStream.php', - 'RectorPrefix202410\\React\\Stream\\WritableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/WritableStreamInterface.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', - 'RectorPrefix202410\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Command\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Debug\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', - 'RectorPrefix202410\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', - 'RectorPrefix202410\\Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', - 'RectorPrefix202410\\Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/RunProcessFailedException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessContext.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessage.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessageHandler.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\PhpSubprocess' => __DIR__ . '/..' . '/symfony/process/PhpSubprocess.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', - 'RectorPrefix202410\\Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php', - 'RectorPrefix202410\\Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceCollectionInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', - 'RectorPrefix202410\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\CpuCoreCountProvider' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\Action' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Action.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\Content' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Content.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\ReactCommand' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactCommand.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Enum\\ReactEvent' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactEvent.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ScheduleFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ScheduleFactory.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', - 'RectorPrefix202410\\Symplify\\EasyParallel\\ValueObject\\Schedule' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/Schedule.php', - 'RectorPrefix202410\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', - 'RectorPrefix202410\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', - 'RectorPrefix202410\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', + 'RectorPrefix202411\\Clue\\React\\NDJson\\Decoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Decoder.php', + 'RectorPrefix202411\\Clue\\React\\NDJson\\Encoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Encoder.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchStrictGroupsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchFlags.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', + 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', + 'RectorPrefix202411\\Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', + 'RectorPrefix202411\\Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', + 'RectorPrefix202411\\Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', + 'RectorPrefix202411\\Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', + 'RectorPrefix202411\\Composer\\Pcre\\UnexpectedNullMatchException' => __DIR__ . '/..' . '/composer/pcre/src/UnexpectedNullMatchException.php', + 'RectorPrefix202411\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', + 'RectorPrefix202411\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', + 'RectorPrefix202411\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', + 'RectorPrefix202411\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', + 'RectorPrefix202411\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', + 'RectorPrefix202411\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', + 'RectorPrefix202411\\Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\CachedWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Inflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Language' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\LanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\NoopWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Pattern' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Patterns' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Ruleset' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitution' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitutions' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformation' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformations' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Word' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\RulesetInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', + 'RectorPrefix202411\\Doctrine\\Inflector\\WordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', + 'RectorPrefix202411\\Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitter.php', + 'RectorPrefix202411\\Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterInterface.php', + 'RectorPrefix202411\\Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterTrait.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Diagnoser' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Diagnoser.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', + 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\ParallelisationResult' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/ParallelisationResult.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Auth' => __DIR__ . '/..' . '/illuminate/container/Attributes/Auth.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Authenticated' => __DIR__ . '/..' . '/illuminate/container/Attributes/Authenticated.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Cache' => __DIR__ . '/..' . '/illuminate/container/Attributes/Cache.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Config' => __DIR__ . '/..' . '/illuminate/container/Attributes/Config.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\CurrentUser' => __DIR__ . '/..' . '/illuminate/container/Attributes/CurrentUser.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\DB' => __DIR__ . '/..' . '/illuminate/container/Attributes/DB.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Database' => __DIR__ . '/..' . '/illuminate/container/Attributes/Database.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Log' => __DIR__ . '/..' . '/illuminate/container/Attributes/Log.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\RouteParameter' => __DIR__ . '/..' . '/illuminate/container/Attributes/RouteParameter.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Storage' => __DIR__ . '/..' . '/illuminate/container/Attributes/Storage.php', + 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Tag' => __DIR__ . '/..' . '/illuminate/container/Attributes/Tag.php', + 'RectorPrefix202411\\Illuminate\\Container\\BoundMethod' => __DIR__ . '/..' . '/illuminate/container/BoundMethod.php', + 'RectorPrefix202411\\Illuminate\\Container\\Container' => __DIR__ . '/..' . '/illuminate/container/Container.php', + 'RectorPrefix202411\\Illuminate\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/container/ContextualBindingBuilder.php', + 'RectorPrefix202411\\Illuminate\\Container\\EntryNotFoundException' => __DIR__ . '/..' . '/illuminate/container/EntryNotFoundException.php', + 'RectorPrefix202411\\Illuminate\\Container\\RewindableGenerator' => __DIR__ . '/..' . '/illuminate/container/RewindableGenerator.php', + 'RectorPrefix202411\\Illuminate\\Container\\Util' => __DIR__ . '/..' . '/illuminate/container/Util.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Gate.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Authenticatable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/illuminate/contracts/Auth/CanResetPassword.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Guard.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBroker.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/StatefulGuard.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/illuminate/contracts/Auth/UserProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/Dispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Lock.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Repository.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Store.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Concurrency\\Driver' => __DIR__ . '/..' . '/illuminate/contracts/Concurrency/Driver.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Config/Repository.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Console/Application.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Isolatable' => __DIR__ . '/..' . '/illuminate/contracts/Console/Isolatable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Console/Kernel.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => __DIR__ . '/..' . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/illuminate/contracts/Container/BindingResolutionException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\CircularDependencyException' => __DIR__ . '/..' . '/illuminate/contracts/Container/CircularDependencyException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/illuminate/contracts/Container/Container.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualAttribute' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualAttribute.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/illuminate/contracts/Database/ModelIdentifier.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Builder.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Expression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Expression.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ShouldntReport' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ShouldntReport.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/DecryptException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/EncryptException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/Encrypter.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Events/Dispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Cloud.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Filesystem.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/Application.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/illuminate/contracts/Hashing/Hasher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Http/Kernel.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Attachable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Attachable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/illuminate/contracts/Mail/MailQueue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailer.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Dispatcher.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/Paginator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Hub.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Pipeline.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\InvokedProcess' => __DIR__ . '/..' . '/illuminate/contracts/Process/InvokedProcess.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\ProcessResult' => __DIR__ . '/..' . '/illuminate/contracts/Process/ProcessResult.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ClearableQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ClearableQueue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityResolver.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Job.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Monitor.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Queue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableCollection.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableEntity.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connection.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connector.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/Registrar.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/illuminate/contracts/Routing/ResponseFactory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlGenerator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlRoutable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => __DIR__ . '/..' . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/illuminate/contracts/Session/Session.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Arrayable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferrableProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Htmlable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Jsonable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageBag.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageProvider.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Renderable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Responsable.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\ValidatedData' => __DIR__ . '/..' . '/illuminate/contracts/Support/ValidatedData.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Loader.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Translator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\DataAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/DataAwareRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ImplicitRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\InvokableRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/InvokableRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Rule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => __DIR__ . '/..' . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidationRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidationRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Validator.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/illuminate/contracts/View/Engine.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/View/Factory.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/illuminate/contracts/View/View.php', + 'RectorPrefix202411\\Illuminate\\Contracts\\View\\ViewCompilationException' => __DIR__ . '/..' . '/illuminate/contracts/View/ViewCompilationException.php', + 'RectorPrefix202411\\Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php', + 'RectorPrefix202411\\Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php', + 'RectorPrefix202411\\Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php', + 'RectorPrefix202411\\Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', + 'RectorPrefix202411\\Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php', + 'RectorPrefix202411\\Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php', + 'RectorPrefix202411\\Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php', + 'RectorPrefix202411\\Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php', + 'RectorPrefix202411\\Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php', + 'RectorPrefix202411\\Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php', + 'RectorPrefix202411\\Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php', + 'RectorPrefix202411\\Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php', + 'RectorPrefix202411\\Nette\\Utils\\FileInfo' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileInfo.php', + 'RectorPrefix202411\\Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php', + 'RectorPrefix202411\\Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/utils/src/Utils/Finder.php', + 'RectorPrefix202411\\Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php', + 'RectorPrefix202411\\Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php', + 'RectorPrefix202411\\Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php', + 'RectorPrefix202411\\Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', + 'RectorPrefix202411\\Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php', + 'RectorPrefix202411\\Nette\\Utils\\ImageColor' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageColor.php', + 'RectorPrefix202411\\Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\ImageType' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageType.php', + 'RectorPrefix202411\\Nette\\Utils\\Iterables' => __DIR__ . '/..' . '/nette/utils/src/Utils/Iterables.php', + 'RectorPrefix202411\\Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php', + 'RectorPrefix202411\\Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php', + 'RectorPrefix202411\\Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php', + 'RectorPrefix202411\\Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php', + 'RectorPrefix202411\\Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', + 'RectorPrefix202411\\Nette\\Utils\\ReflectionMethod' => __DIR__ . '/..' . '/nette/utils/src/Utils/ReflectionMethod.php', + 'RectorPrefix202411\\Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', + 'RectorPrefix202411\\Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php', + 'RectorPrefix202411\\Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202411\\Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetector' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetector.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetectorInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetectorInterface.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AbstractCi' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AbstractCi.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AppVeyor' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AppVeyor.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AzurePipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AzurePipelines.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Bamboo' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Bamboo.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Buddy' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Buddy.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\CiInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/CiInterface.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Circle' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Circle.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Codeship' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Codeship.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Continuousphp' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Continuousphp.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Drone' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Drone.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitHubActions' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitHubActions.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitLab' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitLab.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Jenkins' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Jenkins.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\SourceHut' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/SourceHut.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\TeamCity' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/TeamCity.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Travis' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Travis.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Wercker' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Wercker.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Env' => __DIR__ . '/..' . '/ondram/ci-detector/src/Env.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => __DIR__ . '/..' . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', + 'RectorPrefix202411\\OndraM\\CiDetector\\TrinaryLogic' => __DIR__ . '/..' . '/ondram/ci-detector/src/TrinaryLogic.php', + 'RectorPrefix202411\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', + 'RectorPrefix202411\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', + 'RectorPrefix202411\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', + 'RectorPrefix202411\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', + 'RectorPrefix202411\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', + 'RectorPrefix202411\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', + 'RectorPrefix202411\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', + 'RectorPrefix202411\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', + 'RectorPrefix202411\\Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', + 'RectorPrefix202411\\Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', + 'RectorPrefix202411\\Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', + 'RectorPrefix202411\\React\\Cache\\ArrayCache' => __DIR__ . '/..' . '/react/cache/src/ArrayCache.php', + 'RectorPrefix202411\\React\\Cache\\CacheInterface' => __DIR__ . '/..' . '/react/cache/src/CacheInterface.php', + 'RectorPrefix202411\\React\\ChildProcess\\Process' => __DIR__ . '/..' . '/react/child-process/src/Process.php', + 'RectorPrefix202411\\React\\Dns\\BadServerException' => __DIR__ . '/..' . '/react/dns/src/BadServerException.php', + 'RectorPrefix202411\\React\\Dns\\Config\\Config' => __DIR__ . '/..' . '/react/dns/src/Config/Config.php', + 'RectorPrefix202411\\React\\Dns\\Config\\HostsFile' => __DIR__ . '/..' . '/react/dns/src/Config/HostsFile.php', + 'RectorPrefix202411\\React\\Dns\\Model\\Message' => __DIR__ . '/..' . '/react/dns/src/Model/Message.php', + 'RectorPrefix202411\\React\\Dns\\Model\\Record' => __DIR__ . '/..' . '/react/dns/src/Model/Record.php', + 'RectorPrefix202411\\React\\Dns\\Protocol\\BinaryDumper' => __DIR__ . '/..' . '/react/dns/src/Protocol/BinaryDumper.php', + 'RectorPrefix202411\\React\\Dns\\Protocol\\Parser' => __DIR__ . '/..' . '/react/dns/src/Protocol/Parser.php', + 'RectorPrefix202411\\React\\Dns\\Query\\CachingExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CachingExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\CancellationException' => __DIR__ . '/..' . '/react/dns/src/Query/CancellationException.php', + 'RectorPrefix202411\\React\\Dns\\Query\\CoopExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CoopExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\ExecutorInterface' => __DIR__ . '/..' . '/react/dns/src/Query/ExecutorInterface.php', + 'RectorPrefix202411\\React\\Dns\\Query\\FallbackExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/FallbackExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\HostsFileExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/HostsFileExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\Query' => __DIR__ . '/..' . '/react/dns/src/Query/Query.php', + 'RectorPrefix202411\\React\\Dns\\Query\\RetryExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/RetryExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\SelectiveTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/SelectiveTransportExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\TcpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TcpTransportExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutException' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutException.php', + 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutExecutor.php', + 'RectorPrefix202411\\React\\Dns\\Query\\UdpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/UdpTransportExecutor.php', + 'RectorPrefix202411\\React\\Dns\\RecordNotFoundException' => __DIR__ . '/..' . '/react/dns/src/RecordNotFoundException.php', + 'RectorPrefix202411\\React\\Dns\\Resolver\\Factory' => __DIR__ . '/..' . '/react/dns/src/Resolver/Factory.php', + 'RectorPrefix202411\\React\\Dns\\Resolver\\Resolver' => __DIR__ . '/..' . '/react/dns/src/Resolver/Resolver.php', + 'RectorPrefix202411\\React\\Dns\\Resolver\\ResolverInterface' => __DIR__ . '/..' . '/react/dns/src/Resolver/ResolverInterface.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtEvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEvLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtEventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEventLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtLibevLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibevLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtLibeventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibeventLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\ExtUvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtUvLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\Factory' => __DIR__ . '/..' . '/react/event-loop/src/Factory.php', + 'RectorPrefix202411\\React\\EventLoop\\Loop' => __DIR__ . '/..' . '/react/event-loop/src/Loop.php', + 'RectorPrefix202411\\React\\EventLoop\\LoopInterface' => __DIR__ . '/..' . '/react/event-loop/src/LoopInterface.php', + 'RectorPrefix202411\\React\\EventLoop\\SignalsHandler' => __DIR__ . '/..' . '/react/event-loop/src/SignalsHandler.php', + 'RectorPrefix202411\\React\\EventLoop\\StreamSelectLoop' => __DIR__ . '/..' . '/react/event-loop/src/StreamSelectLoop.php', + 'RectorPrefix202411\\React\\EventLoop\\Tick\\FutureTickQueue' => __DIR__ . '/..' . '/react/event-loop/src/Tick/FutureTickQueue.php', + 'RectorPrefix202411\\React\\EventLoop\\TimerInterface' => __DIR__ . '/..' . '/react/event-loop/src/TimerInterface.php', + 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timer' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timer.php', + 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timers' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timers.php', + 'RectorPrefix202411\\React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php', + 'RectorPrefix202411\\React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php', + 'RectorPrefix202411\\React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php', + 'RectorPrefix202411\\React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php', + 'RectorPrefix202411\\React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php', + 'RectorPrefix202411\\React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php', + 'RectorPrefix202411\\React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php', + 'RectorPrefix202411\\React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php', + 'RectorPrefix202411\\React\\Socket\\Connection' => __DIR__ . '/..' . '/react/socket/src/Connection.php', + 'RectorPrefix202411\\React\\Socket\\ConnectionInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectionInterface.php', + 'RectorPrefix202411\\React\\Socket\\Connector' => __DIR__ . '/..' . '/react/socket/src/Connector.php', + 'RectorPrefix202411\\React\\Socket\\ConnectorInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectorInterface.php', + 'RectorPrefix202411\\React\\Socket\\DnsConnector' => __DIR__ . '/..' . '/react/socket/src/DnsConnector.php', + 'RectorPrefix202411\\React\\Socket\\FdServer' => __DIR__ . '/..' . '/react/socket/src/FdServer.php', + 'RectorPrefix202411\\React\\Socket\\FixedUriConnector' => __DIR__ . '/..' . '/react/socket/src/FixedUriConnector.php', + 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnectionBuilder' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', + 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnector' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnector.php', + 'RectorPrefix202411\\React\\Socket\\LimitingServer' => __DIR__ . '/..' . '/react/socket/src/LimitingServer.php', + 'RectorPrefix202411\\React\\Socket\\SecureConnector' => __DIR__ . '/..' . '/react/socket/src/SecureConnector.php', + 'RectorPrefix202411\\React\\Socket\\SecureServer' => __DIR__ . '/..' . '/react/socket/src/SecureServer.php', + 'RectorPrefix202411\\React\\Socket\\Server' => __DIR__ . '/..' . '/react/socket/src/Server.php', + 'RectorPrefix202411\\React\\Socket\\ServerInterface' => __DIR__ . '/..' . '/react/socket/src/ServerInterface.php', + 'RectorPrefix202411\\React\\Socket\\SocketServer' => __DIR__ . '/..' . '/react/socket/src/SocketServer.php', + 'RectorPrefix202411\\React\\Socket\\StreamEncryption' => __DIR__ . '/..' . '/react/socket/src/StreamEncryption.php', + 'RectorPrefix202411\\React\\Socket\\TcpConnector' => __DIR__ . '/..' . '/react/socket/src/TcpConnector.php', + 'RectorPrefix202411\\React\\Socket\\TcpServer' => __DIR__ . '/..' . '/react/socket/src/TcpServer.php', + 'RectorPrefix202411\\React\\Socket\\TimeoutConnector' => __DIR__ . '/..' . '/react/socket/src/TimeoutConnector.php', + 'RectorPrefix202411\\React\\Socket\\UnixConnector' => __DIR__ . '/..' . '/react/socket/src/UnixConnector.php', + 'RectorPrefix202411\\React\\Socket\\UnixServer' => __DIR__ . '/..' . '/react/socket/src/UnixServer.php', + 'RectorPrefix202411\\React\\Stream\\CompositeStream' => __DIR__ . '/..' . '/react/stream/src/CompositeStream.php', + 'RectorPrefix202411\\React\\Stream\\DuplexResourceStream' => __DIR__ . '/..' . '/react/stream/src/DuplexResourceStream.php', + 'RectorPrefix202411\\React\\Stream\\DuplexStreamInterface' => __DIR__ . '/..' . '/react/stream/src/DuplexStreamInterface.php', + 'RectorPrefix202411\\React\\Stream\\ReadableResourceStream' => __DIR__ . '/..' . '/react/stream/src/ReadableResourceStream.php', + 'RectorPrefix202411\\React\\Stream\\ReadableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/ReadableStreamInterface.php', + 'RectorPrefix202411\\React\\Stream\\ThroughStream' => __DIR__ . '/..' . '/react/stream/src/ThroughStream.php', + 'RectorPrefix202411\\React\\Stream\\Util' => __DIR__ . '/..' . '/react/stream/src/Util.php', + 'RectorPrefix202411\\React\\Stream\\WritableResourceStream' => __DIR__ . '/..' . '/react/stream/src/WritableResourceStream.php', + 'RectorPrefix202411\\React\\Stream\\WritableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/WritableStreamInterface.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', + 'RectorPrefix202411\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Debug\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', + 'RectorPrefix202411\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', + 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', + 'RectorPrefix202411\\Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/RunProcessFailedException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessContext.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessage.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessageHandler.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpSubprocess' => __DIR__ . '/..' . '/symfony/process/PhpSubprocess.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', + 'RectorPrefix202411\\Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php', + 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceCollectionInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\CpuCoreCountProvider' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Action' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Action.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Content' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Content.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactCommand' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactCommand.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactEvent' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactEvent.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ScheduleFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ScheduleFactory.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', + 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\Schedule' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/Schedule.php', + 'RectorPrefix202411\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', + 'RectorPrefix202411\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', + 'RectorPrefix202411\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', 'Rector\\Application\\ApplicationFileProcessor' => __DIR__ . '/../..' . '/src/Application/ApplicationFileProcessor.php', 'Rector\\Application\\ChangedNodeScopeRefresher' => __DIR__ . '/../..' . '/src/Application/ChangedNodeScopeRefresher.php', 'Rector\\Application\\FileProcessor' => __DIR__ . '/../..' . '/src/Application/FileProcessor.php', @@ -1312,6 +1313,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\CodeQuality\\NodeAnalyzer\\VariableDimFetchAssignResolver' => __DIR__ . '/../..' . '/rules/CodeQuality/NodeAnalyzer/VariableDimFetchAssignResolver.php', 'Rector\\CodeQuality\\NodeFactory\\MissingPropertiesFactory' => __DIR__ . '/../..' . '/rules/CodeQuality/NodeFactory/MissingPropertiesFactory.php', 'Rector\\CodeQuality\\NodeFactory\\PropertyTypeDecorator' => __DIR__ . '/../..' . '/rules/CodeQuality/NodeFactory/PropertyTypeDecorator.php', + 'Rector\\CodeQuality\\NodeFactory\\TypedPropertyFactory' => __DIR__ . '/../..' . '/rules/CodeQuality/NodeFactory/TypedPropertyFactory.php', 'Rector\\CodeQuality\\NodeManipulator\\ExprBoolCaster' => __DIR__ . '/../..' . '/rules/CodeQuality/NodeManipulator/ExprBoolCaster.php', 'Rector\\CodeQuality\\Rector\\Assign\\CombinedAssignRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Assign/CombinedAssignRector.php', 'Rector\\CodeQuality\\Rector\\BooleanAnd\\RemoveUselessIsObjectCheckRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/BooleanAnd/RemoveUselessIsObjectCheckRector.php', @@ -1325,6 +1327,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\CodeQuality\\Rector\\ClassMethod\\LocallyCalledStaticMethodToNonStaticRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php', 'Rector\\CodeQuality\\Rector\\ClassMethod\\OptionalParametersAfterRequiredRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php', 'Rector\\CodeQuality\\Rector\\Class_\\CompleteDynamicPropertiesRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Class_/CompleteDynamicPropertiesRector.php', + 'Rector\\CodeQuality\\Rector\\Class_\\DynamicDocBlockPropertyToNativePropertyRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php', 'Rector\\CodeQuality\\Rector\\Class_\\InlineConstructorDefaultToPropertyRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Class_/InlineConstructorDefaultToPropertyRector.php', 'Rector\\CodeQuality\\Rector\\Class_\\StaticToSelfStaticMethodCallOnFinalClassRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Class_/StaticToSelfStaticMethodCallOnFinalClassRector.php', 'Rector\\CodeQuality\\Rector\\Concat\\JoinStringConcatRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php', @@ -1495,6 +1498,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\DeadCode\\PhpDoc\\DeadReturnTagValueNodeAnalyzer' => __DIR__ . '/../..' . '/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php', 'Rector\\DeadCode\\PhpDoc\\DeadVarTagValueNodeAnalyzer' => __DIR__ . '/../..' . '/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php', 'Rector\\DeadCode\\PhpDoc\\Guard\\StandaloneTypeRemovalGuard' => __DIR__ . '/../..' . '/rules/DeadCode/PhpDoc/Guard/StandaloneTypeRemovalGuard.php', + 'Rector\\DeadCode\\PhpDoc\\Guard\\TemplateTypeRemovalGuard' => __DIR__ . '/../..' . '/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php', 'Rector\\DeadCode\\PhpDoc\\TagRemover\\ParamTagRemover' => __DIR__ . '/../..' . '/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php', 'Rector\\DeadCode\\PhpDoc\\TagRemover\\ReturnTagRemover' => __DIR__ . '/../..' . '/rules/DeadCode/PhpDoc/TagRemover/ReturnTagRemover.php', 'Rector\\DeadCode\\PhpDoc\\TagRemover\\VarTagRemover' => __DIR__ . '/../..' . '/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php', @@ -1505,6 +1509,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\DeadCode\\Rector\\Cast\\RecastingRemovalRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php', 'Rector\\DeadCode\\Rector\\ClassConst\\RemoveUnusedPrivateClassConstantRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveAnnotationRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php', + 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveTypedPropertyNonMockDocblockRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveEmptyClassMethodRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveNullTagValueNodeRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedConstructorParamRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php', @@ -1730,6 +1735,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\EarlyReturn\\Rector\\Return_\\ReturnBinaryOrToEarlyReturnRector' => __DIR__ . '/../..' . '/rules/EarlyReturn/Rector/Return_/ReturnBinaryOrToEarlyReturnRector.php', 'Rector\\EarlyReturn\\Rector\\StmtsAwareInterface\\ReturnEarlyIfVariableRector' => __DIR__ . '/../..' . '/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php', 'Rector\\EarlyReturn\\ValueObject\\BareSingleAssignIf' => __DIR__ . '/../..' . '/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php', + 'Rector\\Enum\\ClassName' => __DIR__ . '/../..' . '/src/Enum/ClassName.php', 'Rector\\Enum\\JsonConstant' => __DIR__ . '/..' . '/rector/rector-downgrade-php/src/Enum/JsonConstant.php', 'Rector\\Enum\\ObjectReference' => __DIR__ . '/../..' . '/src/Enum/ObjectReference.php', 'Rector\\Exception\\Cache\\CachingException' => __DIR__ . '/../..' . '/src/Exception/Cache/CachingException.php', @@ -1955,17 +1961,23 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\AnnotationWithValueToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\CoversAnnotationWithValueToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\TicketAnnotationToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\DoctrineEntityDocumentAnalyser' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeFactory\\NestedClosureAssertFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\CreateMockToAnonymousClassRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\DataProviderArrayItemsNewLinedRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\EntityDocumentCreateMockToDirectNewRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\RemoveEmptyTestMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/RemoveEmptyTestMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\ReplaceTestAnnotationWithPrefixedFunctionRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestAnnotationWithPrefixedFunctionRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\ReplaceTestFunctionPrefixWithAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\AddCoversClassAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddCoversClassAttributeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\AddParentSetupCallOnSetupRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddParentSetupCallOnSetupRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\AddSeeTestAnnotationRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddSeeTestAnnotationRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\ConstructClassMethodToSetUpTestCaseRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/ConstructClassMethodToSetUpTestCaseRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\NarrowUnusedSetUpDefinedPropertyRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitSelfCallRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitThisCallRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SetUpBeforeClassToSetUpRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SingleMockPropertyTypeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TestWithToDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\YieldDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php', @@ -1984,6 +1996,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertSameBoolNullToSpecificMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameBoolNullToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertSameTrueFalseToAssertTrueFalseRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameTrueFalseToAssertTrueFalseRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertTrueFalseToSpecificMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\FlipAssertRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\NarrowIdenticalWithConsecutiveRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowIdenticalWithConsecutiveRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\NarrowSingleWillReturnCallbackRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowSingleWillReturnCallbackRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\RemoveExpectAnyFromMockRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/RemoveExpectAnyFromMockRector.php', @@ -1993,7 +2006,9 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\MatchAndReturnMatch' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php', 'Rector\\PHPUnit\\Composer\\ProjectPackageVersionResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php', 'Rector\\PHPUnit\\Enum\\AssertMethod' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Enum/AssertMethod.php', + 'Rector\\PHPUnit\\Enum\\ConsecutiveMethodName' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php', 'Rector\\PHPUnit\\Enum\\ConsecutiveVariable' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Enum/ConsecutiveVariable.php', + 'Rector\\PHPUnit\\MethodCallRemover' => __DIR__ . '/..' . '/rector/rector-phpunit/src/MethodCallRemover.php', 'Rector\\PHPUnit\\Naming\\TestClassNameResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Naming/TestClassNameResolver.php', 'Rector\\PHPUnit\\NodeAnalyzer\\ArgumentMover' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/ArgumentMover.php', 'Rector\\PHPUnit\\NodeAnalyzer\\AssertCallAnalyzer' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php', @@ -2006,13 +2021,16 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\PHPUnit\\NodeFactory\\ExpectExceptionMethodCallFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFactory/ExpectExceptionMethodCallFactory.php', 'Rector\\PHPUnit\\NodeFactory\\MatcherInvocationCountMethodCallNodeFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFactory/MatcherInvocationCountMethodCallNodeFactory.php', 'Rector\\PHPUnit\\NodeFactory\\UsedVariablesResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php', - 'Rector\\PHPUnit\\NodeFactory\\WithConsecutiveMatchFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFactory/WithConsecutiveMatchFactory.php', 'Rector\\PHPUnit\\NodeFinder\\DataProviderClassMethodFinder' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFinder/DataProviderClassMethodFinder.php', + 'Rector\\PHPUnit\\NodeFinder\\MethodCallNodeFinder' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php', + 'Rector\\PHPUnit\\PHPUnit100\\NodeDecorator\\WillReturnIfNodeDecorator' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php', + 'Rector\\PHPUnit\\PHPUnit100\\NodeFactory\\WillReturnCallbackFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\AddProphecyTraitRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\PublicDataProviderClassMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\StaticDataProviderClassMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\AssertIssetToAssertObjectHasPropertyRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\RemoveSetMethodsMethodCallRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\ExpectsMethodCallDecorator' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php', 'Rector\\PHPUnit\\PHPUnit110\\Rector\\Class_\\NamedArgumentForDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php', 'Rector\\PHPUnit\\PHPUnit50\\Rector\\StaticCall\\GetMockRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php', @@ -2199,6 +2217,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\Php83\\Rector\\ClassConst\\AddTypeToConstRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php', 'Rector\\Php83\\Rector\\ClassMethod\\AddOverrideAttributeToOverriddenMethodsRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php', 'Rector\\Php83\\Rector\\FuncCall\\CombineHostPortLdapUriRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php', + 'Rector\\Php83\\Rector\\FuncCall\\RemoveGetClassGetParentClassNoArgsRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php', 'Rector\\Php84\\Rector\\Param\\ExplicitNullableParamTypeRector' => __DIR__ . '/../..' . '/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper' => __DIR__ . '/../..' . '/src/PhpAttribute/AnnotationToAttributeMapper.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper\\ArrayAnnotationToAttributeMapper' => __DIR__ . '/../..' . '/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php', @@ -2407,6 +2426,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\Symfony\\CodeQuality\\Rector\\Closure\\StringExtensionToConfigBuilderRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\AssertSameResponseCodeWithDebugContentsRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\LiteralGetToRequestClassConstantRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\Trait_\\AddTraitGetterReturnTypeBasedOnSetterRequiredRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php', 'Rector\\Symfony\\Configs\\ConfigArrayHandler\\NestedConfigCallsFactory' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php', 'Rector\\Symfony\\Configs\\ConfigArrayHandler\\SecurityAccessDecisionManagerConfigArrayHandler' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php', 'Rector\\Symfony\\Configs\\Enum\\DoctrineConfigKey' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/Enum/DoctrineConfigKey.php', @@ -2606,6 +2626,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\Transform\\Rector\\FuncCall\\FuncCallToNewRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php', 'Rector\\Transform\\Rector\\FuncCall\\FuncCallToStaticCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php', 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToFuncCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php', + 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToNewRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php', 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToPropertyFetchRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php', 'Rector\\Transform\\Rector\\MethodCall\\MethodCallToStaticCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php', 'Rector\\Transform\\Rector\\MethodCall\\ReplaceParentCallByPropertyCallRector' => __DIR__ . '/../..' . '/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php', @@ -2622,6 +2643,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\Transform\\ValueObject\\FuncCallToMethodCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/FuncCallToMethodCall.php', 'Rector\\Transform\\ValueObject\\FuncCallToStaticCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/FuncCallToStaticCall.php', 'Rector\\Transform\\ValueObject\\MethodCallToFuncCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/MethodCallToFuncCall.php', + 'Rector\\Transform\\ValueObject\\MethodCallToNew' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/MethodCallToNew.php', 'Rector\\Transform\\ValueObject\\MethodCallToPropertyFetch' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/MethodCallToPropertyFetch.php', 'Rector\\Transform\\ValueObject\\MethodCallToStaticCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/MethodCallToStaticCall.php', 'Rector\\Transform\\ValueObject\\NewToStaticCall' => __DIR__ . '/../..' . '/rules/Transform/ValueObject/NewToStaticCall.php', @@ -2715,6 +2737,7 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 'Rector\\TypeDeclaration\\Rector\\Empty_\\EmptyOnNullableObjectToInstanceOfRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php', 'Rector\\TypeDeclaration\\Rector\\Expression\\InlineVarDocTagToAssertRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromArgRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php', + 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromIterableMethodCallRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromObjectRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddParamTypeSplFixedArrayRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php', @@ -2808,9 +2831,9 @@ class ComposerStaticInit7c12491db1a700dd78980ecb6595c088 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit7c12491db1a700dd78980ecb6595c088::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit7c12491db1a700dd78980ecb6595c088::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit7c12491db1a700dd78980ecb6595c088::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/rector/rector/vendor/composer/installed.json b/vendor/rector/rector/vendor/composer/installed.json index 6f7a29d19..b11c03e7d 100644 --- a/vendor/rector/rector/vendor/composer/installed.json +++ b/vendor/rector/rector/vendor/composer/installed.json @@ -28,7 +28,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Clue\\React\\NDJson\\": "src\/" + "RectorPrefix202411\\Clue\\React\\NDJson\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -108,7 +108,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Composer\\Pcre\\": "src" + "RectorPrefix202411\\Composer\\Pcre\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -181,7 +181,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Composer\\Semver\\": "src" + "RectorPrefix202411\\Composer\\Semver\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -263,7 +263,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Composer\\XdebugHandler\\": "src" + "RectorPrefix202411\\Composer\\XdebugHandler\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -333,7 +333,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" + "RectorPrefix202411\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -422,7 +422,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Evenement\\": "src\/" + "RectorPrefix202411\\Evenement\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -480,7 +480,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Fidry\\CpuCoreCounter\\": "src\/" + "RectorPrefix202411\\Fidry\\CpuCoreCounter\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -512,17 +512,17 @@ }, { "name": "illuminate\/container", - "version": "v11.26.0", - "version_normalized": "11.26.0.0", + "version": "v11.30.0", + "version_normalized": "11.30.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/container.git", - "reference": "d6aca7c315d68cb6807c139facd7ea134b4f5104" + "reference": "06dfc614aff58384b28ba5ad191f6a02d6b192cb" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/illuminate\/container\/zipball\/d6aca7c315d68cb6807c139facd7ea134b4f5104", - "reference": "d6aca7c315d68cb6807c139facd7ea134b4f5104", + "url": "https:\/\/api.github.com\/repos\/illuminate\/container\/zipball\/06dfc614aff58384b28ba5ad191f6a02d6b192cb", + "reference": "06dfc614aff58384b28ba5ad191f6a02d6b192cb", "shasum": "" }, "require": { @@ -533,7 +533,7 @@ "provide": { "psr\/container-implementation": "1.1|2.0" }, - "time": "2024-09-20T12:51:05+00:00", + "time": "2024-10-11T15:30:11+00:00", "type": "library", "extra": { "branch-alias": { @@ -546,7 +546,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Illuminate\\Container\\": "" + "RectorPrefix202411\\Illuminate\\Container\\": "" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -569,8 +569,8 @@ }, { "name": "illuminate\/contracts", - "version": "v11.26.0", - "version_normalized": "11.26.0.0", + "version": "v11.30.0", + "version_normalized": "11.30.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/contracts.git", @@ -597,7 +597,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Illuminate\\Contracts\\": "" + "RectorPrefix202411\\Illuminate\\Contracts\\": "" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -816,7 +816,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\OndraM\\CiDetector\\": "src\/" + "RectorPrefix202411\\OndraM\\CiDetector\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -867,17 +867,17 @@ }, { "name": "phpstan\/phpdoc-parser", - "version": "1.32.0", - "version_normalized": "1.32.0.0", + "version": "1.33.0", + "version_normalized": "1.33.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/phpstan\/phpdoc-parser.git", - "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", - "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", "shasum": "" }, "require": { @@ -894,7 +894,7 @@ "phpunit\/phpunit": "^9.5", "symfony\/process": "^5.2" }, - "time": "2024-09-26T07:23:32+00:00", + "time": "2024-10-13T11:25:22+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -911,7 +911,7 @@ "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.32.0" + "source": "https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/1.33.0" }, "install-path": "..\/phpstan\/phpdoc-parser" }, @@ -943,7 +943,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Psr\\Container\\": "src\/" + "RectorPrefix202411\\Psr\\Container\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -999,7 +999,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Psr\\Log\\": "src" + "RectorPrefix202411\\Psr\\Log\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1052,7 +1052,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Psr\\SimpleCache\\": "src\/" + "RectorPrefix202411\\Psr\\SimpleCache\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1105,7 +1105,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\React\\Cache\\": "src\/" + "RectorPrefix202411\\React\\Cache\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1184,7 +1184,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\React\\ChildProcess\\": "src" + "RectorPrefix202411\\React\\ChildProcess\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1266,7 +1266,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\React\\Dns\\": "src\/" + "RectorPrefix202411\\React\\Dns\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1343,7 +1343,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\React\\EventLoop\\": "src\/" + "RectorPrefix202411\\React\\EventLoop\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1419,7 +1419,7 @@ "src\/functions_include.php" ], "psr-4": { - "RectorPrefix202410\\React\\Promise\\": "src\/" + "RectorPrefix202411\\React\\Promise\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1499,7 +1499,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\React\\Socket\\": "src\/" + "RectorPrefix202411\\React\\Socket\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1577,7 +1577,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\React\\Stream\\": "src\/" + "RectorPrefix202411\\React\\Stream\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1811,12 +1811,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-phpunit.git", - "reference": "3e592ec6ce25d67c26faf78c91a8ac11fb310d25" + "reference": "38bdce4187f0466d89d37383cf7376489e25ea2d" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/3e592ec6ce25d67c26faf78c91a8ac11fb310d25", - "reference": "3e592ec6ce25d67c26faf78c91a8ac11fb310d25", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/38bdce4187f0466d89d37383cf7376489e25ea2d", + "reference": "38bdce4187f0466d89d37383cf7376489e25ea2d", "shasum": "" }, "require": { @@ -1827,20 +1827,20 @@ }, "require-dev": { "phpstan\/extension-installer": "^1.4", - "phpstan\/phpstan": "^1.11", + "phpstan\/phpstan": "^1.12", "phpstan\/phpstan-webmozart-assert": "^1.2", "phpunit\/phpunit": "^10.5", "rector\/rector-src": "dev-main", - "rector\/swiss-knife": "^0.2.35", - "rector\/type-perfect": "^0.2", + "rector\/swiss-knife": "^1.0", + "rector\/type-perfect": "^1.0", "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.2", + "symplify\/phpstan-extensions": "^11.4", "symplify\/phpstan-rules": "^13.0", - "symplify\/vendor-patches": "^11.2", - "tomasvotruba\/class-leak": "^0.2", + "symplify\/vendor-patches": "^11.3", + "tomasvotruba\/class-leak": "^1.0", "tracy\/tracy": "^2.10" }, - "time": "2024-09-30T08:22:49+00:00", + "time": "2024-11-08T08:46:53+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1876,12 +1876,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-symfony.git", - "reference": "14fcc873fdd271467bc7d9d9aec4d0cd4359d360" + "reference": "799b454b63c240edc962c8fafea2c5a2a61e5393" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/14fcc873fdd271467bc7d9d9aec4d0cd4359d360", - "reference": "14fcc873fdd271467bc7d9d9aec4d0cd4359d360", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/799b454b63c240edc962c8fafea2c5a2a61e5393", + "reference": "799b454b63c240edc962c8fafea2c5a2a61e5393", "shasum": "" }, "require": { @@ -1910,7 +1910,7 @@ "tomasvotruba\/unused-public": "^0.4", "tracy\/tracy": "^2.10" }, - "time": "2024-09-27T14:39:18+00:00", + "time": "2024-10-28T21:03:13+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -2008,17 +2008,17 @@ }, { "name": "symfony\/console", - "version": "v6.4.12", - "version_normalized": "6.4.12.0", + "version": "v6.4.14", + "version_normalized": "6.4.14.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/console.git", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" + "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/72d080eb9edf80e36c19be61f72c98ed8273b765", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", + "url": "https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/897c2441ed4eec8a8a2c37b943427d24dba3f26b", + "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b", "shasum": "" }, "require": { @@ -2051,7 +2051,7 @@ "symfony\/stopwatch": "^5.4|^6.0|^7.0", "symfony\/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2024-09-20T08:15:52+00:00", + "time": "2024-11-05T15:34:40+00:00", "type": "library", "extra": { "patches_applied": [ @@ -2061,7 +2061,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Console\\": "" + "RectorPrefix202411\\Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2090,7 +2090,7 @@ "terminal" ], "support": { - "source": "https:\/\/github.com\/symfony\/console\/tree\/v6.4.12" + "source": "https:\/\/github.com\/symfony\/console\/tree\/v6.4.14" }, "funding": [ { @@ -2180,17 +2180,17 @@ }, { "name": "symfony\/filesystem", - "version": "v6.4.12", - "version_normalized": "6.4.12.0", + "version": "v6.4.13", + "version_normalized": "6.4.13.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/filesystem.git", - "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/filesystem\/zipball\/f810e3cbdf7fdc35983968523d09f349fa9ada12", - "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", + "url": "https:\/\/api.github.com\/repos\/symfony\/filesystem\/zipball\/4856c9cf585d5a0313d8d35afd681a526f038dd3", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", "shasum": "" }, "require": { @@ -2201,12 +2201,12 @@ "require-dev": { "symfony\/process": "^5.4|^6.4|^7.0" }, - "time": "2024-09-16T16:01:33+00:00", + "time": "2024-10-25T15:07:50+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Filesystem\\": "" + "RectorPrefix202411\\Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2229,7 +2229,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/filesystem\/tree\/v6.4.12" + "source": "https:\/\/github.com\/symfony\/filesystem\/tree\/v6.4.13" }, "funding": [ { @@ -2249,17 +2249,17 @@ }, { "name": "symfony\/finder", - "version": "v6.4.11", - "version_normalized": "6.4.11.0", + "version": "v6.4.13", + "version_normalized": "6.4.13.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/finder.git", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/finder\/zipball\/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "url": "https:\/\/api.github.com\/repos\/symfony\/finder\/zipball\/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -2268,12 +2268,12 @@ "require-dev": { "symfony\/filesystem": "^6.0|^7.0" }, - "time": "2024-08-13T14:27:37+00:00", + "time": "2024-10-01T08:30:56+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Finder\\": "" + "RectorPrefix202411\\Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2296,7 +2296,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/finder\/tree\/v6.4.11" + "source": "https:\/\/github.com\/symfony\/finder\/tree\/v6.4.13" }, "funding": [ { @@ -2399,28 +2399,28 @@ }, { "name": "symfony\/process", - "version": "v6.4.12", - "version_normalized": "6.4.12.0", + "version": "v6.4.14", + "version_normalized": "6.4.14.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/process.git", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" + "reference": "25214adbb0996d18112548de20c281be9f27279f" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/3f94e5f13ff58df371a7ead461b6e8068900fbb3", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "url": "https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/25214adbb0996d18112548de20c281be9f27279f", + "reference": "25214adbb0996d18112548de20c281be9f27279f", "shasum": "" }, "require": { "php": ">=8.1" }, - "time": "2024-09-17T12:47:12+00:00", + "time": "2024-11-06T09:25:01+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Process\\": "" + "RectorPrefix202411\\Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2443,7 +2443,7 @@ "description": "Executes commands in sub-processes", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/process\/tree\/v6.4.12" + "source": "https:\/\/github.com\/symfony\/process\/tree\/v6.4.14" }, "funding": [ { @@ -2498,7 +2498,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Contracts\\Service\\": "" + "RectorPrefix202411\\Symfony\\Contracts\\Service\\": "" }, "exclude-from-classmap": [ "\/Test\/" @@ -2549,17 +2549,17 @@ }, { "name": "symfony\/yaml", - "version": "v7.1.5", - "version_normalized": "7.1.5.0", + "version": "v7.1.6", + "version_normalized": "7.1.6.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "url": "https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", "shasum": "" }, "require": { @@ -2572,7 +2572,7 @@ "require-dev": { "symfony\/console": "^6.4|^7.0" }, - "time": "2024-09-17T12:49:58+00:00", + "time": "2024-09-25T14:20:29+00:00", "bin": [ "Resources\/bin\/yaml-lint" ], @@ -2580,7 +2580,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Yaml\\": "" + "RectorPrefix202411\\Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2603,7 +2603,7 @@ "description": "Loads and dumps YAML files", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/yaml\/tree\/v7.1.5" + "source": "https:\/\/github.com\/symfony\/yaml\/tree\/v7.1.6" }, "funding": [ { @@ -2657,7 +2657,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Symplify\\EasyParallel\\": "src" + "RectorPrefix202411\\Symplify\\EasyParallel\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -2779,7 +2779,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202410\\Webmozart\\Assert\\": "src\/" + "RectorPrefix202411\\Webmozart\\Assert\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", diff --git a/vendor/rector/rector/vendor/composer/installed.php b/vendor/rector/rector/vendor/composer/installed.php index a6c872d92..6db00cf39 100644 --- a/vendor/rector/rector/vendor/composer/installed.php +++ b/vendor/rector/rector/vendor/composer/installed.php @@ -1,5 +1,5 @@ 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.3.1', 'version' => '3.3.1.0', 'reference' => '63aaeac21d7e775ff9bc9d45021e1745c97521c4', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.4.3', 'version' => '3.4.3.0', 'reference' => '4313d26ada5e0c4edfbd1dc481a92ff7bff91f12', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.5', 'version' => '3.0.5.0', 'reference' => '6c1925561632e83d60a44492e0b344cf48ab85ef', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/inflector' => array('pretty_version' => '2.0.10', 'version' => '2.0.10.0', 'reference' => '5817d0659c5b50c9b950feb9af7b9668e2c436bc', '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' => '1.2.0', 'version' => '1.2.0.0', 'reference' => '8520451a140d3f46ac33042715115e290cf5785f', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/container' => array('pretty_version' => 'v11.26.0', 'version' => '11.26.0.0', 'reference' => 'd6aca7c315d68cb6807c139facd7ea134b4f5104', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v11.26.0', 'version' => '11.26.0.0', 'reference' => '56312862af937bd6da8e6dc8bbd88188dfb478f8', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'dev_requirement' => \false), 'nette/utils' => array('pretty_version' => 'v4.0.5', 'version' => '4.0.5.0', 'reference' => '736c567e257dbe0fcf6ce81b4d6dbe05c6899f96', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => \false), 'nikic/php-parser' => array('pretty_version' => 'v4.19.4', 'version' => '4.19.4.0', 'reference' => '715f4d25e225bc47b293a8b997fe6ce99bf987d2', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \false), 'ondram/ci-detector' => array('pretty_version' => '4.2.0', 'version' => '4.2.0.0', 'reference' => '8b0223b5ed235fd377c75fdd1bfcad05c0f168b8', 'type' => 'library', 'install_path' => __DIR__ . '/../ondram/ci-detector', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '1.32.0', 'version' => '1.32.0.0', 'reference' => '6ca22b154efdd9e3c68c56f5d94670920a1c19a4', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('dev_requirement' => \false, 'replaced' => array(0 => '1.12.5')), '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.2', 'version' => '3.0.2.0', 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', '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.13.0', 'version' => '1.13.0.0', 'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5', 'type' => 'library', 'install_path' => __DIR__ . '/../react/dns', 'aliases' => array(), 'dev_requirement' => \false), 'react/event-loop' => array('pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', 'reference' => 'bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354', 'type' => 'library', 'install_path' => __DIR__ . '/../react/event-loop', 'aliases' => array(), 'dev_requirement' => \false), 'react/promise' => array('pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => '8a164643313c71354582dc850b42b33fa12a4b63', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => \false), 'react/socket' => array('pretty_version' => 'v1.16.0', 'version' => '1.16.0.0', 'reference' => '23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1', 'type' => 'library', 'install_path' => __DIR__ . '/../react/socket', 'aliases' => array(), 'dev_requirement' => \false), 'react/stream' => array('pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d', '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' => 'e75008c293679e0bb0637bf09cf6dd43ff34526a', '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' => 'd9cef571617b93e642b3ac45981b7092e1a2e89a', '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' => '3e592ec6ce25d67c26faf78c91a8ac11fb310d25', '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' => '14fcc873fdd271467bc7d9d9aec4d0cd4359d360', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-symfony', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'sebastian/diff' => array('pretty_version' => '5.1.1', 'version' => '5.1.1.0', 'reference' => 'c41e007b4b62af48218231d6c2275e4c9b975b2e', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.4.12', 'version' => '6.4.12.0', 'reference' => '72d080eb9edf80e36c19be61f72c98ed8273b765', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/filesystem' => array('pretty_version' => 'v6.4.12', 'version' => '6.4.12.0', 'reference' => 'f810e3cbdf7fdc35983968523d09f349fa9ada12', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/finder' => array('pretty_version' => 'v6.4.11', 'version' => '6.4.11.0', 'reference' => 'd7eb6daf8cd7e9ac4976e9576b32042ef7253453', '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.31.0', 'version' => '1.31.0.0', 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v6.4.12', 'version' => '6.4.12.0', 'reference' => '3f94e5f13ff58df371a7ead461b6e8068900fbb3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => 'bd1d9e59a81d8fa4acdcea3f617c581f7475a80f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/yaml' => array('pretty_version' => 'v7.1.5', 'version' => '7.1.5.0', 'reference' => '4e561c316e135e053bd758bf3b3eb291d9919de4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/easy-parallel' => array('pretty_version' => '11.2.2', 'version' => '11.2.2.0', 'reference' => '8586c18bb8efb31cd192a4e5cc94ae7813f72ed9', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/easy-parallel', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator-contracts' => array('pretty_version' => '11.2.0', 'version' => '11.2.0.0', 'reference' => '479cfcfd46047f80624aba931d9789e50475b5c6', '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.3.1', 'version' => '3.3.1.0', 'reference' => '63aaeac21d7e775ff9bc9d45021e1745c97521c4', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.4.3', 'version' => '3.4.3.0', 'reference' => '4313d26ada5e0c4edfbd1dc481a92ff7bff91f12', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.5', 'version' => '3.0.5.0', 'reference' => '6c1925561632e83d60a44492e0b344cf48ab85ef', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/inflector' => array('pretty_version' => '2.0.10', 'version' => '2.0.10.0', 'reference' => '5817d0659c5b50c9b950feb9af7b9668e2c436bc', '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' => '1.2.0', 'version' => '1.2.0.0', 'reference' => '8520451a140d3f46ac33042715115e290cf5785f', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/container' => array('pretty_version' => 'v11.30.0', 'version' => '11.30.0.0', 'reference' => '06dfc614aff58384b28ba5ad191f6a02d6b192cb', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v11.30.0', 'version' => '11.30.0.0', 'reference' => '56312862af937bd6da8e6dc8bbd88188dfb478f8', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'dev_requirement' => \false), 'nette/utils' => array('pretty_version' => 'v4.0.5', 'version' => '4.0.5.0', 'reference' => '736c567e257dbe0fcf6ce81b4d6dbe05c6899f96', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => \false), 'nikic/php-parser' => array('pretty_version' => 'v4.19.4', 'version' => '4.19.4.0', 'reference' => '715f4d25e225bc47b293a8b997fe6ce99bf987d2', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \false), 'ondram/ci-detector' => array('pretty_version' => '4.2.0', 'version' => '4.2.0.0', 'reference' => '8b0223b5ed235fd377c75fdd1bfcad05c0f168b8', 'type' => 'library', 'install_path' => __DIR__ . '/../ondram/ci-detector', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '1.33.0', 'version' => '1.33.0.0', 'reference' => '82a311fd3690fb2bf7b64d5c98f912b3dd746140', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('dev_requirement' => \false, 'replaced' => array(0 => '1.12.8')), '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.2', 'version' => '3.0.2.0', 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', '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.13.0', 'version' => '1.13.0.0', 'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5', 'type' => 'library', 'install_path' => __DIR__ . '/../react/dns', 'aliases' => array(), 'dev_requirement' => \false), 'react/event-loop' => array('pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', 'reference' => 'bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354', 'type' => 'library', 'install_path' => __DIR__ . '/../react/event-loop', 'aliases' => array(), 'dev_requirement' => \false), 'react/promise' => array('pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => '8a164643313c71354582dc850b42b33fa12a4b63', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => \false), 'react/socket' => array('pretty_version' => 'v1.16.0', 'version' => '1.16.0.0', 'reference' => '23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1', 'type' => 'library', 'install_path' => __DIR__ . '/../react/socket', 'aliases' => array(), 'dev_requirement' => \false), 'react/stream' => array('pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d', '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' => 'e75008c293679e0bb0637bf09cf6dd43ff34526a', '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' => 'd9cef571617b93e642b3ac45981b7092e1a2e89a', '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' => '38bdce4187f0466d89d37383cf7376489e25ea2d', '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' => '799b454b63c240edc962c8fafea2c5a2a61e5393', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-symfony', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'sebastian/diff' => array('pretty_version' => '5.1.1', 'version' => '5.1.1.0', 'reference' => 'c41e007b4b62af48218231d6c2275e4c9b975b2e', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.4.14', 'version' => '6.4.14.0', 'reference' => '897c2441ed4eec8a8a2c37b943427d24dba3f26b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/filesystem' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => '4856c9cf585d5a0313d8d35afd681a526f038dd3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/finder' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => 'daea9eca0b08d0ed1dc9ab702a46128fd1be4958', '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.31.0', 'version' => '1.31.0.0', 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v6.4.14', 'version' => '6.4.14.0', 'reference' => '25214adbb0996d18112548de20c281be9f27279f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => 'bd1d9e59a81d8fa4acdcea3f617c581f7475a80f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/yaml' => array('pretty_version' => 'v7.1.6', 'version' => '7.1.6.0', 'reference' => '3ced3f29e4f0d6bce2170ff26719f1fe9aacc671', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/easy-parallel' => array('pretty_version' => '11.2.2', 'version' => '11.2.2.0', 'reference' => '8586c18bb8efb31cd192a4e5cc94ae7813f72ed9', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/easy-parallel', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator-contracts' => array('pretty_version' => '11.2.0', 'version' => '11.2.0.0', 'reference' => '479cfcfd46047f80624aba931d9789e50475b5c6', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/rule-doc-generator-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false))); diff --git a/vendor/rector/rector/vendor/composer/pcre/composer.json b/vendor/rector/rector/vendor/composer/pcre/composer.json index ebe3fe8d2..f770a0b6a 100644 --- a/vendor/rector/rector/vendor/composer/pcre/composer.json +++ b/vendor/rector/rector/vendor/composer/pcre/composer.json @@ -29,12 +29,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Composer\\Pcre\\": "src" + "RectorPrefix202411\\Composer\\Pcre\\": "src" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202410\\Composer\\Pcre\\": "tests" + "RectorPrefix202411\\Composer\\Pcre\\": "tests" } }, "extra": { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php index 511d96e16..7fbb97270 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202410\Composer\Pcre; +namespace RectorPrefix202411\Composer\Pcre; final class MatchAllResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php index 4658c18f1..7edaf97b3 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202410\Composer\Pcre; +namespace RectorPrefix202411\Composer\Pcre; final class MatchAllStrictGroupsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php index eacd1090c..b6b8c31a8 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202410\Composer\Pcre; +namespace RectorPrefix202411\Composer\Pcre; final class MatchAllWithOffsetsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php index d5af0fd93..9ed8b2f7b 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202410\Composer\Pcre; +namespace RectorPrefix202411\Composer\Pcre; final class MatchResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php index 315309ba7..793415a4f 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202410\Composer\Pcre; +namespace RectorPrefix202411\Composer\Pcre; final class MatchStrictGroupsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php index 4260bfc8c..c9c75d7b7 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202410\Composer\Pcre; +namespace RectorPrefix202411\Composer\Pcre; final class MatchWithOffsetsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php b/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php index e5fa71c72..99647af82 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php @@ -1,13 +1,13 @@ diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php index 353ff21c4..ceb9daf51 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php @@ -9,9 +9,9 @@ * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); -namespace RectorPrefix202410\Composer\XdebugHandler; +namespace RectorPrefix202411\Composer\XdebugHandler; -use RectorPrefix202410\Composer\Pcre\Preg; +use RectorPrefix202411\Composer\Pcre\Preg; /** * Process utility functions * diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php index ff9c7ef24..e35df9159 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php @@ -9,10 +9,10 @@ * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); -namespace RectorPrefix202410\Composer\XdebugHandler; +namespace RectorPrefix202411\Composer\XdebugHandler; -use RectorPrefix202410\Psr\Log\LoggerInterface; -use RectorPrefix202410\Psr\Log\LogLevel; +use RectorPrefix202411\Psr\Log\LoggerInterface; +use RectorPrefix202411\Psr\Log\LogLevel; /** * @author John Stevenson * @internal diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php index 27ddc2c29..cb200c8c0 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php @@ -9,10 +9,10 @@ * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); -namespace RectorPrefix202410\Composer\XdebugHandler; +namespace RectorPrefix202411\Composer\XdebugHandler; -use RectorPrefix202410\Composer\Pcre\Preg; -use RectorPrefix202410\Psr\Log\LoggerInterface; +use RectorPrefix202411\Composer\Pcre\Preg; +use RectorPrefix202411\Psr\Log\LoggerInterface; /** * @author John Stevenson * diff --git a/vendor/rector/rector/vendor/doctrine/inflector/composer.json b/vendor/rector/rector/vendor/doctrine/inflector/composer.json index 4ccec43f9..2c0f21044 100644 --- a/vendor/rector/rector/vendor/doctrine/inflector/composer.json +++ b/vendor/rector/rector/vendor/doctrine/inflector/composer.json @@ -51,12 +51,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" + "RectorPrefix202411\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202410\\Doctrine\\Tests\\Inflector\\": "tests\/Doctrine\/Tests\/Inflector" + "RectorPrefix202411\\Doctrine\\Tests\\Inflector\\": "tests\/Doctrine\/Tests\/Inflector" } }, "config": { diff --git a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php index 2a2594329..f3d80a6fd 100644 --- a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php +++ b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php @@ -1,7 +1,7 @@ ' ', '/([A-Z]+)([A-Z][a-z])/' => 'RectorPrefix202410\\1_\\2', '/([a-z\\d])([A-Z])/' => 'RectorPrefix202410\\1_\\2', '/[^A-Z^a-z^0-9^\\/]+/' => '-']; + $replacements = ['/\\W/' => ' ', '/([A-Z]+)([A-Z][a-z])/' => 'RectorPrefix202411\\1_\\2', '/([a-z\\d])([A-Z])/' => 'RectorPrefix202411\\1_\\2', '/[^A-Z^a-z^0-9^\\/]+/' => '-']; $urlized = $lowered; foreach ($replacements as $pattern => $replacement) { $replaced = preg_replace($pattern, $replacement, $urlized); diff --git a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php index c3b53f1b4..c930a46a0 100644 --- a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php +++ b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php @@ -1,14 +1,14 @@ parameter = $parameter; + } + /** + * Resolve the route parameter. + * + * @param self $attribute + * @param \Illuminate\Contracts\Container\Container $container + * @return mixed + */ + public static function resolve(self $attribute, Container $container) + { + return $container->make('request')->route($attribute->parameter); + } +} diff --git a/vendor/rector/rector/vendor/illuminate/container/Attributes/Storage.php b/vendor/rector/rector/vendor/illuminate/container/Attributes/Storage.php index a71b3e3e8..10f1b7bdf 100644 --- a/vendor/rector/rector/vendor/illuminate/container/Attributes/Storage.php +++ b/vendor/rector/rector/vendor/illuminate/container/Attributes/Storage.php @@ -1,10 +1,10 @@ parameters(); $parameters->set(Option::SKIP, [__DIR__ . '/tests/PropertiesPrinterHelper.php']); diff --git a/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php b/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php index a8c3d2297..3e58603a4 100644 --- a/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php +++ b/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php @@ -1,9 +1,9 @@ tryParseCallable($tokens, $type, \false); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); - } elseif (in_array($type->name, ['array', 'list', 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + } elseif (in_array($type->name, [Ast\Type\ArrayShapeNode::KIND_ARRAY, Ast\Type\ArrayShapeNode::KIND_LIST, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST, 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { if ($type->name === 'object') { $type = $this->parseObjectShape($tokens); } else { @@ -474,7 +474,7 @@ private function parseCallableReturnType(\PHPStan\PhpDocParser\Parser\TokenItera } } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - } elseif (in_array($type->name, ['array', 'list', 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + } elseif (in_array($type->name, [Ast\Type\ArrayShapeNode::KIND_ARRAY, Ast\Type\ArrayShapeNode::KIND_LIST, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST, 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { if ($type->name === 'object') { $type = $this->parseObjectShape($tokens); } else { diff --git a/vendor/rector/rector/vendor/psr/container/composer.json b/vendor/rector/rector/vendor/psr/container/composer.json index b838a4376..43736592e 100644 --- a/vendor/rector/rector/vendor/psr/container/composer.json +++ b/vendor/rector/rector/vendor/psr/container/composer.json @@ -22,7 +22,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Psr\\Container\\": "src\/" + "RectorPrefix202411\\Psr\\Container\\": "src\/" } }, "extra": { diff --git a/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php b/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php index cb7b3eb11..1d8d4a574 100644 --- a/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php +++ b/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php @@ -1,6 +1,6 @@ class !== Message::CLASS_IN ? 'CLASS' . $this->class . ' ' : ''; $type = 'TYPE' . $this->type; - $ref = new \ReflectionClass('RectorPrefix202410\\React\\Dns\\Model\\Message'); + $ref = new \ReflectionClass('RectorPrefix202411\\React\\Dns\\Model\\Message'); foreach ($ref->getConstants() as $name => $value) { if ($value === $this->type && \strpos($name, 'TYPE_') === 0) { $type = \substr($name, 5); diff --git a/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php b/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php index b89bf148e..5c828836f 100644 --- a/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php +++ b/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php @@ -1,9 +1,9 @@ dumper->toBinary($request); $length = \strlen($queryData); if ($length > 0xffff) { - return \RectorPrefix202410\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for TCP transport')); + return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for TCP transport')); } $queryData = \pack('n', $length) . $queryData; if ($this->socket === null) { // create async TCP/IP connection (may take a while) $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT); if ($socket === \false) { - return \RectorPrefix202410\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); + return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); } // set socket to non-blocking and wait for it to become writable (connection success/rejected) \stream_set_blocking($socket, \false); diff --git a/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php b/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php index 08de51c2d..c1373141e 100644 --- a/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php +++ b/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php @@ -1,6 +1,6 @@ dumper->toBinary($request); if (isset($queryData[$this->maxPacketSize])) { - return \RectorPrefix202410\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for UDP transport', \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90)); + return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for UDP transport', \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90)); } // UDP connections are instant, so try connection without a loop or timeout $errno = 0; $errstr = ''; $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0); if ($socket === \false) { - return \RectorPrefix202410\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); + return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); } // set socket to non-blocking and immediately try to send (fill write buffer) \stream_set_blocking($socket, \false); @@ -142,7 +142,7 @@ public function query(Query $query) $written = \fwrite($socket, $queryData); \restore_error_handler(); if ($written !== \strlen($queryData)) { - return \RectorPrefix202410\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); + return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); } $loop = $this->loop; $deferred = new Deferred(function () use($loop, $socket, $query) { diff --git a/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php b/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php index 74c838e4a..035144c2c 100644 --- a/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php +++ b/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php @@ -1,6 +1,6 @@ loop = new EventLoop(); diff --git a/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php b/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php index cd0567c93..5769d23c3 100644 --- a/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php +++ b/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php @@ -1,12 +1,12 @@ streamEvents[(int) $stream])) { - $this->streamEvents[(int) $stream] = \RectorPrefix202410\uv_poll_init_socket($this->uv, $stream); + $this->streamEvents[(int) $stream] = \RectorPrefix202411\uv_poll_init_socket($this->uv, $stream); } if ($this->streamEvents[(int) $stream] !== \false) { $this->pollStream($stream); diff --git a/vendor/rector/rector/vendor/react/event-loop/src/Factory.php b/vendor/rector/rector/vendor/react/event-loop/src/Factory.php index 4999c89eb..0694191b7 100644 --- a/vendor/rector/rector/vendor/react/event-loop/src/Factory.php +++ b/vendor/rector/rector/vendor/react/event-loop/src/Factory.php @@ -1,6 +1,6 @@ diff --git a/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php b/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php index da5bd721f..366bd0c64 100644 --- a/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php +++ b/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php @@ -1,6 +1,6 @@ connectors[$scheme])) { - return \RectorPrefix202410\React\Promise\reject(new \RuntimeException('No connector available for URI scheme "' . $scheme . '" (EINVAL)', \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22))); + return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('No connector available for URI scheme "' . $scheme . '" (EINVAL)', \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22))); } return $this->connectors[$scheme]->connect($uri); } diff --git a/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php b/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php index 5424a618d..830253ab1 100644 --- a/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php +++ b/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php @@ -1,6 +1,6 @@ then($resolve, $reject); }, function ($_, $reject) use(&$promise, $uri, &$connected) { if ($connected) { diff --git a/vendor/rector/rector/vendor/react/socket/src/SecureServer.php b/vendor/rector/rector/vendor/react/socket/src/SecureServer.php index 2df050e98..1bb281268 100644 --- a/vendor/rector/rector/vendor/react/socket/src/SecureServer.php +++ b/vendor/rector/rector/vendor/react/socket/src/SecureServer.php @@ -1,10 +1,10 @@ services(); $services->set(TypedPropertyRector::class); diff --git a/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php b/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php index 3b4c22e58..9a605e7f4 100644 --- a/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php +++ b/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php @@ -9,7 +9,7 @@ */ final class GeneratedConfig { - public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main e75008c'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main d9cef57'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 3e592ec'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 14fcc87')); + public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main e75008c'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main d9cef57'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 38bdce4'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 799b454')); private function __construct() { } diff --git a/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php b/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php index 14b5b985d..1d778b426 100644 --- a/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php +++ b/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php @@ -3,11 +3,11 @@ declare (strict_types=1); namespace Rector\RectorInstaller; -use RectorPrefix202410\Composer\Installer\InstallationManager; -use RectorPrefix202410\Composer\IO\IOInterface; -use RectorPrefix202410\Composer\Package\PackageInterface; -use RectorPrefix202410\Composer\Repository\InstalledRepositoryInterface; -use RectorPrefix202410\Composer\Util\Filesystem as ComposerFilesystem; +use RectorPrefix202411\Composer\Installer\InstallationManager; +use RectorPrefix202411\Composer\IO\IOInterface; +use RectorPrefix202411\Composer\Package\PackageInterface; +use RectorPrefix202411\Composer\Repository\InstalledRepositoryInterface; +use RectorPrefix202411\Composer\Util\Filesystem as ComposerFilesystem; /** * @see \Rector\RectorInstaller\Tests\PluginInstallerTest */ diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php index 4e88bc225..4e0170b99 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php @@ -1,7 +1,7 @@ rules([TestListenerToHooksRector::class, ExplicitPhpErrorApiRector::class, SpecificAssertContainsWithoutIdentityRector::class]); + $rectorConfig->rules([TestListenerToHooksRector::class, ExplicitPhpErrorApiRector::class, SpecificAssertContainsWithoutIdentityRector::class, WithConsecutiveRector::class]); $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ // see https://github.com/sebastianbergmann/phpunit/issues/3957 new MethodCallRename('PHPUnit\\Framework\\TestCase', 'expectExceptionMessageRegExp', 'expectExceptionMessageMatches'), 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 1b1195fff..148a20775 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 @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\AnnotationsToAttributes\Rector\ClassMethod; -use RectorPrefix202410\Nette\Utils\Json; +use RectorPrefix202411\Nette\Utils\Json; use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; 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 53731426f..af81b0766 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 @@ -14,13 +14,14 @@ use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory; +use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\PHPUnit\ValueObject\AnnotationWithValueToAttribute; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\Class_\AnnotationWithValueToAttributeRector\AnnotationWithValueToAttributeRectorTest */ @@ -46,16 +47,22 @@ final class AnnotationWithValueToAttributeRector extends AbstractRector implemen * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer + */ + private $testsNodeAnalyzer; /** * @var AnnotationWithValueToAttribute[] */ private $annotationWithValueToAttributes = []; - public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) + public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->phpDocTagRemover = $phpDocTagRemover; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -96,6 +103,9 @@ public function provideMinPhpVersion() : int */ public function refactor(Node $node) : ?Node { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); if (!$phpDocInfo instanceof PhpDocInfo) { return null; 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 9afac4aff..e5330b182 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 @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\AnnotationsToAttributes\Rector\Class_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\AttributeGroup; use PhpParser\Node\Stmt\Class_; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php new file mode 100644 index 000000000..6940e70c7 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php @@ -0,0 +1,28 @@ +getResolvedPhpDoc(); + if (!$resolvedPhpDocBlock instanceof ResolvedPhpDocBlock) { + return \false; + } + foreach (self::ENTITY_DOCBLOCK_MARKERS as $entityDocBlockMarkers) { + if (\strpos($resolvedPhpDocBlock->getPhpDocString(), $entityDocBlockMarkers) !== \false) { + return \true; + } + } + // @todo apply attributes as well + return \false; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php new file mode 100644 index 000000000..8eac3ac12 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php @@ -0,0 +1,78 @@ +getArgs()[0]; + if ($callableFirstArg->value instanceof ArrowFunction) { + $arrowFunction = $callableFirstArg->value; + if ($arrowFunction->expr instanceof Identical) { + // unwrap closure arrow function to direct assert as more readalbe + $identical = $arrowFunction->expr; + if ($identical->left instanceof Variable) { + return $this->createAssertSameParameters($identical->right, $assertKey); + } + if ($identical->right instanceof Variable) { + return $this->createAssertSameParameters($identical->left, $assertKey); + } + } + if ($arrowFunction->expr instanceof BooleanNot && $arrowFunction->expr->expr instanceof Empty_) { + return $this->createAssertNotEmpty($assertKey, 'assertNotEmpty'); + } + if ($arrowFunction->expr instanceof Empty_) { + return $this->createAssertNotEmpty($assertKey, 'assertEmpty'); + } + } + $callbackVariable = new Variable('callback'); + $callbackAssign = new Assign($callbackVariable, $callableFirstArg->value); + $stmts = [new Expression($callbackAssign)]; + $parametersArrayDimFetch = new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)); + $callbackFuncCall = new FuncCall($callbackVariable, [new Arg($parametersArrayDimFetch)]); + // add assert true to the callback + $assertTrueMethodCall = new MethodCall(new Variable('this'), 'assertTrue', [new Arg($callbackFuncCall)]); + $stmts[] = new Expression($assertTrueMethodCall); + return $stmts; + } + /** + * @return Expression[] + */ + private function createAssertSameParameters(Expr $comparedExpr, int $assertKey) : array + { + // use assert same directly instead + $args = [new Arg($comparedExpr), new Arg(new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)))]; + $assertSameMethodCall = new MethodCall(new Variable('this'), new Identifier('assertSame'), $args); + return [new Expression($assertSameMethodCall)]; + } + /** + * @return Expression[] + */ + private function createAssertNotEmpty(int $assertKey, string $emptyMethodName) : array + { + $arrayDimFetch = new ArrayDimFetch(new Variable(ConsecutiveVariable::PARAMETERS), new LNumber($assertKey)); + $assertEmptyMethodCall = new MethodCall(new Variable('this'), new Identifier($emptyMethodName), [new Arg($arrayDimFetch)]); + return [new Expression($assertEmptyMethodCall)]; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php new file mode 100644 index 000000000..5048239dc --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php @@ -0,0 +1,251 @@ +valueResolver = $valueResolver; + $this->reflectionProvider = $reflectionProvider; + $this->doctrineEntityDocumentAnalyser = $doctrineEntityDocumentAnalyser; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Move from entity mock, to direct use of class instance and setters', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeFileTest extends TestCase +{ + public function test() + { + $tableMock = $this->createMock(Table::class); + + $tableMock->expects(self::once()) + ->method('isLocked') + ->willReturn(true); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeFileTest extends TestCase +{ + public function test() + { + $table = new Table(); + $table->setLocked(true); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + if ($node->stmts === null) { + return null; + } + $mockedVariablesToTypes = $this->collectMockedVariableToTypeAndRefactorAssign($node); + if ($mockedVariablesToTypes === []) { + return null; + } + foreach ($mockedVariablesToTypes as $mockedVariableName => $mockedClass) { + foreach ($node->stmts as $key => $stmt) { + if (!$stmt instanceof Expression) { + continue; + } + if (!$stmt->expr instanceof MethodCall) { + continue; + } + $methodCall = $stmt->expr; + $onVariableMethodCall = $this->findMethodCallOnVariableNamed($methodCall, $mockedVariableName); + if (!$onVariableMethodCall instanceof Node) { + continue; + } + // 2. find $mock->method("name") + $methodName = $this->resolveMethodCallFirstArgValue($methodCall, 'method'); + if (!\is_string($methodName)) { + throw new ShouldNotHappenException('Unable to resolve method name'); + } + // is set method mocked? Just remove it + if (\strncmp($methodName, 'set', \strlen('set')) === 0) { + unset($node->stmts[$key]); + } + $methodName = $this->resolveMethodName($methodName, $mockedClass); + $willReturnExpr = $this->resolveMethodCallFirstArgValue($methodCall, 'willReturn'); + if ($methodName && $willReturnExpr instanceof Expr) { + $stmt->expr = new MethodCall(new Variable($mockedVariableName), new Identifier($methodName), [new Arg($willReturnExpr)]); + } + } + } + // 3. replace value without "mock" in name + $mockedVariableNames = \array_keys($mockedVariablesToTypes); + $this->traverseNodesWithCallable($node, function (Node $node) use($mockedVariableNames) : ?Variable { + if (!$node instanceof Variable) { + return null; + } + if (!\is_string($node->name)) { + return null; + } + if (!\in_array($node->name, $mockedVariableNames)) { + return null; + } + return new Variable(\str_replace('Mock', '', $node->name)); + }); + return $node; + } + /** + * @return array + */ + private function collectMockedVariableToTypeAndRefactorAssign(ClassMethod $classMethod) : array + { + if ($classMethod->stmts === null) { + return []; + } + $mockedVariablesToTypes = []; + foreach ($classMethod->stmts as $stmt) { + // find assign mock + if (!$stmt instanceof Expression) { + continue; + } + $stmtExpr = $stmt->expr; + if (!$stmtExpr instanceof Assign) { + continue; + } + /** @var Assign $assign */ + $assign = $stmtExpr; + if (!$assign->expr instanceof MethodCall) { + continue; + } + $methodCall = $assign->expr; + if (!$this->isName($methodCall->name, 'createMock')) { + continue; + } + $firstArg = $methodCall->getArgs()[0]; + $mockedClass = $this->valueResolver->getValue($firstArg->value); + if (!\is_string($mockedClass)) { + continue; + } + if (!$this->reflectionProvider->hasClass($mockedClass)) { + continue; + } + $mockClassReflection = $this->reflectionProvider->getClass($mockedClass); + if ($mockClassReflection->isAbstract()) { + continue; + } + if (!$this->doctrineEntityDocumentAnalyser->isEntityClass($mockClassReflection)) { + continue; + } + // ready to replace :) + $assign->expr = new New_(new FullyQualified($mockedClass)); + $mockedVariableName = $this->getName($assign->var); + $mockedVariablesToTypes[$mockedVariableName] = $mockedClass; + } + return $mockedVariablesToTypes; + } + /** + * @return string|\PhpParser\Node\Expr|null + */ + private function resolveMethodCallFirstArgValue(MethodCall $methodCall, string $methodName) + { + $nodeFinder = new NodeFinder(); + $methodNameMethodCall = $nodeFinder->findFirst($methodCall, function (Node $node) use($methodName) : bool { + if (!$node instanceof MethodCall) { + return \false; + } + return $this->isName($node->name, $methodName); + }); + if (!$methodNameMethodCall instanceof MethodCall) { + return null; + } + $methodNameArg = $methodNameMethodCall->getArgs()[0]; + if ($methodNameArg->value instanceof String_) { + return $methodNameArg->value->value; + } + return $methodNameArg->value; + } + private function resolveMethodName(string $methodName, string $mockedClass) : string + { + // guess the setter name + if (\strncmp($methodName, 'get', \strlen('get')) === 0) { + return 'set' . \ucfirst(\substr($methodName, 3)); + } + if (\strncmp($methodName, 'is', \strlen('is')) === 0) { + $mockedClassReflection = $this->reflectionProvider->getClass($mockedClass); + $isSetterMethodNames = ['set' . \ucfirst($methodName), 'set' . \substr($methodName, 2)]; + foreach ($isSetterMethodNames as $isSetterMethodName) { + if ($mockedClassReflection->hasMethod($isSetterMethodName)) { + return $isSetterMethodName; + } + } + } + return $methodName; + } + private function findMethodCallOnVariableNamed(MethodCall $methodCall, string $desiredVariableName) : ?MethodCall + { + $nodeFinder = new NodeFinder(); + $foundMethodCall = $nodeFinder->findFirst($methodCall, function (Node $node) use($desiredVariableName) : bool { + if (!$node instanceof MethodCall) { + return \false; + } + if (!$node->var instanceof Variable) { + return \false; + } + return $this->isName($node->var, $desiredVariableName); + }); + if (!$foundMethodCall instanceof MethodCall) { + return null; + } + return $foundMethodCall; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php new file mode 100644 index 000000000..d88971883 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php @@ -0,0 +1,101 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; + $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Replace @test with prefixed function', [new CodeSample(<<<'CODE_SAMPLE' +class SomeTest extends \PHPUnit\Framework\TestCase +{ + public function testOnePlusOneShouldBeTwo() + { + $this->assertSame(2, 1+1); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeTest extends \PHPUnit\Framework\TestCase +{ + #[Test] + public function onePlusOneShouldBeTwo() + { + $this->assertSame(2, 1+1); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + if (\strncmp($node->name->toString(), 'test', \strlen('test')) !== 0) { + return null; + } + if ($this->phpAttributeAnalyzer->hasPhpAttributes($node, ['PHPUnit\\Framework\\Attributes\\Test'])) { + return null; + } + if ($node->name->toString() !== 'test' && $node->name->toString() !== 'test_') { + if (\strncmp($node->name->toString(), 'test_', \strlen('test_')) === 0) { + $node->name->name = \lcfirst(\substr($node->name->name, 5)); + } elseif (\strncmp($node->name->toString(), 'test', \strlen('test')) === 0) { + $node->name->name = \lcfirst(\substr($node->name->name, 4)); + } + } + $coversAttributeGroup = $this->createAttributeGroup(); + $node->attrGroups = \array_merge($node->attrGroups, [$coversAttributeGroup]); + return $node; + } + private function createAttributeGroup() : AttributeGroup + { + $attributeClass = 'PHPUnit\\Framework\\Attributes\\Test'; + return $this->phpAttributeGroupFactory->createFromClassWithItems($attributeClass, []); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php new file mode 100644 index 000000000..127072a13 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php @@ -0,0 +1,183 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->reflectionResolver = $reflectionResolver; + $this->propertyManipulator = $propertyManipulator; + $this->nodeFinder = new NodeFinder(); + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Turn property used only in setUp() to variable', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +class SomeServiceTest extends TestCase +{ + private $someServiceMock; + + public function setUp(): void + { + $this->someServiceMock = $this->createMock(SomeService::class); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +class SomeServiceTest extends TestCase +{ + public function setUp(): void + { + $someServiceMock = $this->createMock(SomeService::class); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $setUpClassMethod = $node->getMethod(MethodName::SET_UP); + if (!$setUpClassMethod instanceof ClassMethod) { + return null; + } + $hasChanged = \false; + $isFinalClass = $node->isFinal(); + $classReflection = $this->reflectionResolver->resolveClassReflection($node); + if (!$classReflection instanceof ClassReflection) { + return null; + } + foreach ($node->stmts as $key => $classStmt) { + if (!$classStmt instanceof Property) { + continue; + } + $property = $classStmt; + if (\count($property->props) !== 1) { + continue; + } + $propertyName = $property->props[0]->name->toString(); + if ($this->shouldSkipProperty($isFinalClass, $property, $classReflection, $propertyName)) { + continue; + } + if ($this->isPropertyUsedOutsideSetUpClassMethod($node, $setUpClassMethod, $property)) { + continue; + } + $hasChanged = \true; + unset($node->stmts[$key]); + // change property to variable in setUp() method + $this->traverseNodesWithCallable($setUpClassMethod, function (Node $node) use($propertyName) : ?Variable { + if (!$node instanceof PropertyFetch) { + return null; + } + if (!$this->isName($node->var, 'this')) { + return null; + } + if (!$this->isName($node->name, $propertyName)) { + return null; + } + return new Variable($propertyName); + }); + } + if ($hasChanged) { + return $node; + } + return null; + } + private function isPropertyUsedOutsideSetUpClassMethod(Class_ $class, ClassMethod $setUpClassMethod, Property $property) : bool + { + $isPropertyUsed = \false; + $propertyName = $property->props[0]->name->toString(); + foreach ($class->getMethods() as $classMethod) { + // skip setUp() method + if ($classMethod === $setUpClassMethod) { + continue; + } + // check if property is used anywhere else than setup + $usedPropertyFetch = $this->nodeFinder->findFirst($classMethod, function (Node $node) use($propertyName) : bool { + if (!$node instanceof PropertyFetch) { + return \false; + } + if (!$this->isName($node->var, 'this')) { + return \false; + } + return $this->isName($node->name, $propertyName); + }); + if ($usedPropertyFetch instanceof PropertyFetch) { + $isPropertyUsed = \true; + } + } + return $isPropertyUsed; + } + private function shouldSkipProperty(bool $isFinalClass, Property $property, ClassReflection $classReflection, string $propertyName) : bool + { + // possibly used by child + if (!$isFinalClass && !$property->isPrivate()) { + return \true; + } + // possibly used for caching or re-use + if ($property->isStatic()) { + return \true; + } + if ($property->props[0]->default instanceof Expr) { + return \true; + } + return $this->propertyManipulator->isUsedByTrait($classReflection, $propertyName); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php new file mode 100644 index 000000000..8504919f9 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php @@ -0,0 +1,98 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Make properties in tests with intersection mock object either object type or mock type', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\MockObject\MockObject; + +final class MockingEntity extends TestCase +{ + private SimpleObject|MockObject $someEntityMock; + + protected function setUp(): void + { + $this->someEntityMock = $this->createMock(SimpleObject::class); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\MockObject\MockObject; + +final class MockingEntity extends TestCase +{ + private MockObject $someEntityMock; + + protected function setUp(): void + { + $this->someEntityMock = $this->createMock(SimpleObject::class); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $hasChanged = \false; + foreach ($node->getProperties() as $property) { + if (!$property->type instanceof IntersectionType && !$property->type instanceof UnionType) { + continue; + } + $complexType = $property->type; + if (\count($complexType->types) !== 2) { + continue; + } + foreach ($complexType->types as $intersectionType) { + if ($this->isName($intersectionType, MockObject::class)) { + $property->type = $intersectionType; + $hasChanged = \true; + break; + } + } + } + if (!$hasChanged) { + return null; + } + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php index 66786fddf..def483940 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\PHPUnit\CodeQuality\Rector\Class_; -use RectorPrefix202410\Nette\Utils\Json; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php index 084af3091..5d2ba5e6b 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; @@ -56,15 +57,23 @@ public function refactor(Node $node) if ($node->isFirstClassCallable()) { return null; } - if (\count($node->getArgs()) < 2) { + $assertArgs = $node->getArgs(); + if (\count($assertArgs) < 2) { return null; } - $right = $node->getArgs()[1]->value; - if ($right instanceof MethodCall && $right->name instanceof Identifier && $right->name->toLowerString() === 'count' && $right->getArgs() === []) { - $type = $this->getType($right->var); + $comparedExpr = $assertArgs[1]->value; + if ($comparedExpr instanceof FuncCall && $this->isName($comparedExpr->name, 'count')) { + $countArg = $comparedExpr->getArgs()[0]; + $assertArgs[1] = new Arg($countArg->value); + $node->args = $assertArgs; + $node->name = new Identifier('assertCount'); + return $node; + } + if ($comparedExpr instanceof MethodCall && $this->isName($comparedExpr->name, 'count') && $comparedExpr->getArgs() === []) { + $type = $this->getType($comparedExpr->var); if ((new ObjectType('Countable'))->isSuperTypeOf($type)->yes()) { - $args = $node->getArgs(); - $args[1] = new Arg($right->var); + $args = $assertArgs; + $args[1] = new Arg($comparedExpr->var); $node->args = $args; $node->name = new Identifier('assertCount'); } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php index a769f36ea..3555e982a 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Scalar\Encapsed; @@ -81,7 +82,7 @@ public function refactor(Node $node) : ?Node return null; } $firstArgValue = $args[0]->value; - if (!$this->isScalarValue($firstArgValue)) { + if (!$this->isScalarOrEnumValue($firstArgValue)) { return null; } if ($this->shouldSkipConstantArrayType($firstArgValue)) { @@ -125,8 +126,11 @@ private function isScalarType(Type $valueNodeType) : bool } return \false; } - private function isScalarValue(Expr $expr) : bool + private function isScalarOrEnumValue(Expr $expr) : bool { + if ($expr instanceof ClassConstFetch) { + return \true; + } if ($expr instanceof Encapsed) { return \true; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php new file mode 100644 index 000000000..93340e40f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php @@ -0,0 +1,106 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Turns accidentally flipped assert order to right one, with expected expr to left', [new CodeSample(<<<'CODE_SAMPLE' +assertSame($result, 'expected'); + } +} +\class_alias('SomeTest', 'SomeTest', \false); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +assertSame('expected', $result); + } +} +\class_alias('SomeTest', 'SomeTest', \false); +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [MethodCall::class, StaticCall::class]; + } + /** + * @param MethodCall|StaticCall $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, ['assertSame', 'assertEquals'])) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $firstArg = $node->getArgs()[0]; + $secondArg = $node->getArgs()[1]; + // correct location + if ($this->isScalarValue($firstArg->value)) { + return null; + } + if (!$this->isScalarValue($secondArg->value)) { + return null; + } + $oldArgs = $node->getArgs(); + // flip args + [$oldArgs[0], $oldArgs[1]] = [$oldArgs[1], $oldArgs[0]]; + $node->args = $oldArgs; + return $node; + } + private function isScalarValue(Expr $expr) : bool + { + if ($expr instanceof Scalar) { + return \true; + } + return $expr instanceof ClassConstFetch; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php index 42bed297a..77ab4cde9 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php @@ -81,13 +81,12 @@ public function refactor(Node $node) : ?Node if ($node->isFirstClassCallable()) { return null; } - $callArgs = $node->getArgs(); - $firstArg = $callArgs[0]; + $firstArg = $node->getArgs()[0]; // special case for new map if ($firstArg->value instanceof New_) { return $this->refactorNew($firstArg->value, $node); } - if (!$firstArg->value instanceof MethodCall) { + if (!$firstArg->value instanceof MethodCall && !$firstArg->value instanceof StaticCall) { return null; } $nestedMethodCall = $firstArg->value; @@ -96,7 +95,6 @@ public function refactor(Node $node) : ?Node continue; } $node->name = new Identifier($newParentMethodName); - // move args up $node->args = $nestedMethodCall->args; return $node; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php new file mode 100644 index 000000000..600f3579f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php @@ -0,0 +1,25 @@ +stmts as $key => $stmt) { + if (!$stmt instanceof If_) { + continue; + } + $currentArg = $willReturnOnConsecutiveMethodCall->getArgs()[$key]; + $stmt->stmts[] = new Return_($currentArg->value); + } + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/WithConsecutiveMatchFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php similarity index 54% rename from vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/WithConsecutiveMatchFactory.php rename to vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php index 68ac29e5a..aea1e40ef 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/WithConsecutiveMatchFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php @@ -1,29 +1,26 @@ builderFactory = $builderFactory; $this->usedVariablesResolver = $usedVariablesResolver; $this->matcherInvocationCountMethodCallNodeFactory = $matcherInvocationCountMethodCallNodeFactory; - $this->nodeFinder = $nodeFinder; - $this->nodeNameResolver = $nodeNameResolver; $this->consecutiveIfsFactory = $consecutiveIfsFactory; } /** - * @param Stmt[] $returnStmts * @param \PhpParser\Node\Expr\Variable|\PhpParser\Node\Expr|null $referenceVariable */ - public function createClosure(MethodCall $withConsecutiveMethodCall, array $returnStmts, $referenceVariable) : Closure + public function createClosure(MethodCall $withConsecutiveMethodCall, ?Stmt $returnStmt, $referenceVariable) : Closure { $matcherVariable = new Variable(ConsecutiveVariable::MATCHER); - $usedVariables = $this->usedVariablesResolver->resolveUsedVariables($withConsecutiveMethodCall, $returnStmts); - $matchOrIfs = $this->createParametersMatch($withConsecutiveMethodCall); - if (\is_array($matchOrIfs)) { - $closureStmts = \array_merge($matchOrIfs, $returnStmts); - } else { - $closureStmts = \array_merge([new Expression($matchOrIfs)], $returnStmts); + $usedVariables = $this->usedVariablesResolver->resolveUsedVariables($withConsecutiveMethodCall, $returnStmt); + $closureStmts = $this->createParametersMatch($withConsecutiveMethodCall); + if ($returnStmt instanceof Stmt) { + $closureStmts[] = $returnStmt; } $parametersParam = new Param(new Variable(ConsecutiveVariable::PARAMETERS)); $parametersParam->variadic = \true; return new Closure(['byRef' => $this->isByRef($referenceVariable), 'uses' => $this->createClosureUses($matcherVariable, $usedVariables), 'params' => [$parametersParam], 'stmts' => $closureStmts]); } /** - * @return Match_|MethodCall|Stmt\If_[] + * @return Stmt[] */ - public function createParametersMatch(MethodCall $withConsecutiveMethodCall) + public function createParametersMatch(MethodCall $withConsecutiveMethodCall) : array { $parametersVariable = new Variable(ConsecutiveVariable::PARAMETERS); $firstArg = $withConsecutiveMethodCall->getArgs()[0] ?? null; if ($firstArg instanceof Arg && $firstArg->unpack) { - return $this->createAssertSameDimFetch($firstArg, $parametersVariable); + $assertSameMethodCall = $this->createAssertSameDimFetch($firstArg, $parametersVariable); + return [new Expression($assertSameMethodCall)]; } $numberOfInvocationsMethodCall = $this->matcherInvocationCountMethodCallNodeFactory->create(); - // A. has assert inside the on consecutive? create ifs - if ($this->hasInnerAssertCall($withConsecutiveMethodCall)) { - return $this->consecutiveIfsFactory->createIfs($withConsecutiveMethodCall); - } - // B. if not, create match - $matchArms = []; - foreach ($withConsecutiveMethodCall->getArgs() as $key => $arg) { - $assertEquals = $this->builderFactory->staticCall('self', 'assertEquals', [$arg, $parametersVariable]); - $matchArms[] = new MatchArm([new LNumber($key + 1)], $assertEquals); - } - return new Match_($numberOfInvocationsMethodCall, $matchArms); + return $this->consecutiveIfsFactory->createIfs($withConsecutiveMethodCall, $numberOfInvocationsMethodCall); } private function createAssertSameDimFetch(Arg $firstArg, Variable $variable) : MethodCall { @@ -131,26 +104,4 @@ private function createClosureUses(Variable $matcherVariable, array $usedVariabl } return $uses; } - /** - * We look for $this->assert/equals*() calls inside the consecutive calls - */ - private function hasInnerAssertCall(MethodCall $withConsecutiveMethodCall) : bool - { - return (bool) $this->nodeFinder->findFirst($withConsecutiveMethodCall->getArgs(), function (Node $node) : bool { - if (!$node instanceof MethodCall) { - return \false; - } - if (!$node->var instanceof Variable) { - return \false; - } - if (!$this->nodeNameResolver->isName($node->var, 'this')) { - return \false; - } - if (!$node->name instanceof Identifier) { - return \false; - } - // is one of assert methods - return \strncmp($node->name->toString(), 'equal', \strlen('equal')) === 0; - }); - } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php index d46a28ccd..ec6ebf168 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php @@ -131,6 +131,9 @@ private function hasMagicIsset(Expr $expr) : bool if ($classReflection->hasMethod('__isset')) { return \true; } + if ($classReflection->hasMethod('__get')) { + return \true; + } if (!$classReflection->isClass()) { return \false; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php new file mode 100644 index 000000000..fa17bbb3b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php @@ -0,0 +1,79 @@ +simpleCallableNodeTraverser = $simpleCallableNodeTraverser; + $this->nodeNameResolver = $nodeNameResolver; + } + /** + * Replace $this->expects(...) + * with + * $expects = ... + * + * @param Expression $expression + * @return \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null + */ + public function decorate(Expression $expression) + { + /** @var MethodCall|StaticCall|null $expectsExactlyCall */ + $expectsExactlyCall = null; + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($expression, function (Node $node) use(&$expectsExactlyCall) : ?MethodCall { + if (!$node instanceof MethodCall) { + return null; + } + if (!$this->nodeNameResolver->isName($node->name, 'expects')) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $firstArg = $node->getArgs()[0]; + if (!$firstArg->value instanceof MethodCall && !$firstArg->value instanceof StaticCall) { + return null; + } + $expectsExactlyCall = $firstArg->value; + $node->args = [new Arg(new Variable(ConsecutiveVariable::MATCHER))]; + return $node; + }); + // add expects() method + if (!$expectsExactlyCall instanceof Expr) { + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($expression, function (Node $node) : ?int { + if (!$node instanceof MethodCall) { + return null; + } + if ($node->var instanceof MethodCall) { + return null; + } + $node->var = new MethodCall($node->var, 'expects', [new Arg(new Variable(ConsecutiveVariable::MATCHER))]); + return NodeTraverser::STOP_TRAVERSAL; + }); + } + return $expectsExactlyCall; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php index 15c19e3e1..ea981f241 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php @@ -9,34 +9,31 @@ use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\Match_; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; -use PhpParser\Node\MatchArm; use PhpParser\Node\Param; use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Throw_; -use PhpParser\NodeTraverser; use Rector\Exception\ShouldNotHappenException; -use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPUnit\Enum\ConsecutiveMethodName; use Rector\PHPUnit\Enum\ConsecutiveVariable; +use Rector\PHPUnit\MethodCallRemover; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; -use Rector\PHPUnit\NodeFactory\MatcherInvocationCountMethodCallNodeFactory; -use Rector\PHPUnit\NodeFactory\WithConsecutiveMatchFactory; +use Rector\PHPUnit\NodeFinder\MethodCallNodeFinder; +use Rector\PHPUnit\PHPUnit100\NodeDecorator\WillReturnIfNodeDecorator; +use Rector\PHPUnit\PHPUnit100\NodeFactory\WillReturnCallbackFactory; use Rector\Rector\AbstractRector; -use Rector\ValueObject\PhpVersion; -use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\PHPUnit\Tests\PHPUnit100\Rector\StmtsAwareInterface\WithConsecutiveRector\WithConsecutiveRectorTest */ -final class WithConsecutiveRector extends AbstractRector implements MinPhpVersionInterface +final class WithConsecutiveRector extends AbstractRector { /** * @readonly @@ -45,29 +42,37 @@ final class WithConsecutiveRector extends AbstractRector implements MinPhpVersio private $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder + * @var \Rector\PHPUnit\PHPUnit100\NodeFactory\WillReturnCallbackFactory */ - private $betterNodeFinder; + private $willReturnCallbackFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\WithConsecutiveMatchFactory + * @var \Rector\PHPUnit\MethodCallRemover */ - private $withConsecutiveMatchFactory; + private $methodCallRemover; /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\MatcherInvocationCountMethodCallNodeFactory + * @var \Rector\PHPUnit\NodeFinder\MethodCallNodeFinder */ - private $matcherInvocationCountMethodCallNodeFactory; + private $methodCallNodeFinder; /** - * @var string + * @readonly + * @var \Rector\PHPUnit\PHPUnit100\Rector\StmtsAwareInterface\ExpectsMethodCallDecorator + */ + private $expectsMethodCallDecorator; + /** + * @readonly + * @var \Rector\PHPUnit\PHPUnit100\NodeDecorator\WillReturnIfNodeDecorator */ - private const WITH_CONSECUTIVE_METHOD = 'withConsecutive'; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder, WithConsecutiveMatchFactory $withConsecutiveMatchFactory, MatcherInvocationCountMethodCallNodeFactory $matcherInvocationCountMethodCallNodeFactory) + private $willReturnIfNodeDecorator; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, WillReturnCallbackFactory $willReturnCallbackFactory, MethodCallRemover $methodCallRemover, MethodCallNodeFinder $methodCallNodeFinder, \Rector\PHPUnit\PHPUnit100\Rector\StmtsAwareInterface\ExpectsMethodCallDecorator $expectsMethodCallDecorator, WillReturnIfNodeDecorator $willReturnIfNodeDecorator) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; - $this->betterNodeFinder = $betterNodeFinder; - $this->withConsecutiveMatchFactory = $withConsecutiveMatchFactory; - $this->matcherInvocationCountMethodCallNodeFactory = $matcherInvocationCountMethodCallNodeFactory; + $this->willReturnCallbackFactory = $willReturnCallbackFactory; + $this->methodCallRemover = $methodCallRemover; + $this->methodCallNodeFinder = $methodCallNodeFinder; + $this->expectsMethodCallDecorator = $expectsMethodCallDecorator; + $this->willReturnIfNodeDecorator = $willReturnIfNodeDecorator; } public function getRuleDefinition() : RuleDefinition { @@ -99,9 +104,12 @@ public function run() $this->personServiceMock->expects($matcher) ->method('prepare') ->willReturnCallback(function (...$parameters) use ($matcher) { - match ($matcher->numberOfInvocations()) { - 1 => self::assertEquals([1, 2], $parameters), - 2 => self::assertEquals([3, 4], $parameters), + if ($matcher->numberOfInvocations() === 1) { + self::assertEquals([1, 2], $parameters); + } + + if ($matcher->numberOfInvocations() === 2) { + self::assertEquals([3, 4], $parameters), }; }); } @@ -124,141 +132,76 @@ public function refactor(Node $node) if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } - $withConsecutiveMethodCall = $this->findMethodCall($node, self::WITH_CONSECUTIVE_METHOD); + $withConsecutiveMethodCall = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WITH_CONSECUTIVE); if (!$withConsecutiveMethodCall instanceof MethodCall) { return null; } - if ($this->hasWillReturnMapOrWill($node)) { + if ($this->methodCallNodeFinder->hasByNames($node, ['willReturnMap', 'will'])) { return null; } - $returnStmts = []; - $willReturn = $this->findMethodCall($node, 'willReturn'); + $returnStmt = null; + $willReturn = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN); if ($willReturn instanceof MethodCall) { - $returnStmts[] = $this->createWillReturnStmt($willReturn); + $this->methodCallRemover->removeMethodCall($node, ConsecutiveMethodName::WILL_RETURN); + $expr = $this->getFirstArgValue($willReturn); + $returnStmt = new Return_($expr); } - $willReturnSelf = $this->findMethodCall($node, 'willReturnSelf'); + $willReturnSelf = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN_SELF); if ($willReturnSelf instanceof MethodCall) { - $returnStmts[] = $this->createWillReturnSelfStmts($willReturnSelf); + $this->methodCallRemover->removeMethodCall($node, ConsecutiveMethodName::WILL_RETURN_SELF); + $returnStmt = $this->createWillReturnSelfStmts($willReturnSelf); } - $willReturnArgument = $this->findMethodCall($node, 'willReturnArgument'); + $willReturnArgument = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN_ARGUMENT); if ($willReturnArgument instanceof MethodCall) { - $returnStmts[] = $this->createWillReturnArgument($willReturnArgument); + $this->methodCallRemover->removeMethodCall($node, ConsecutiveMethodName::WILL_RETURN_ARGUMENT); + $returnStmt = $this->createWillReturnArgument($willReturnArgument); } - $willReturnOnConsecutiveCallsArgument = $this->findMethodCall($node, 'willReturnOnConsecutiveCalls'); - if ($willReturnOnConsecutiveCallsArgument instanceof MethodCall) { - $returnStmts[] = $this->createReturnMatch($willReturnOnConsecutiveCallsArgument); + $willReturnOnConsecutiveMethodCall = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN_ON_CONSECUTIVE_CALLS); + if ($willReturnOnConsecutiveMethodCall instanceof MethodCall) { + $this->methodCallRemover->removeMethodCall($node, ConsecutiveMethodName::WILL_RETURN_ON_CONSECUTIVE_CALLS); } - $willThrowException = $this->findMethodCall($node, 'willThrowException'); + $willThrowException = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_THROW_EXCEPTION); if ($willThrowException instanceof MethodCall) { - $returnStmts[] = $this->createWillThrowException($willThrowException); + $this->methodCallRemover->removeMethodCall($node, ConsecutiveMethodName::WILL_THROW_EXCEPTION); + $expr = $this->getFirstArgValue($willThrowException); + $returnStmt = new Throw_($expr); } - $willReturnReferenceArgument = $this->findMethodCall($node, 'willReturnReference'); + $willReturnReferenceArgument = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN_REFERENCE); $referenceVariable = null; if ($willReturnReferenceArgument instanceof MethodCall) { - $returnStmts[] = $this->createWillReturn($willReturnReferenceArgument); + $this->methodCallRemover->removeMethodCall($node, ConsecutiveMethodName::WILL_RETURN_REFERENCE); + $expr = $this->getFirstArgValue($willReturnReferenceArgument); + $returnStmt = new Return_($expr); // returns passed args $referenceVariable = new Variable('parameters'); } - $this->removeMethodCalls($node, ['willReturn', 'willReturnArgument', 'willReturnSelf', 'willReturnOnConsecutiveCalls', 'willReturnReference', 'willThrowException']); - $expectsCall = $this->matchAndRefactorExpectsMethodCall($node); + $expectsCall = $this->expectsMethodCallDecorator->decorate($node); if (!$expectsCall instanceof MethodCall && !$expectsCall instanceof StaticCall) { // fallback to default by case count $lNumber = new LNumber(\count($withConsecutiveMethodCall->args)); $expectsCall = new MethodCall(new Variable('this'), new Identifier('exactly'), [new Arg($lNumber)]); } - // 2. does willReturnCallback() exist? just merge - $existingWillReturnCallback = $this->findMethodCall($node, 'willReturnCallback'); + // 2. does willReturnCallback() exist? just merge them together + $existingWillReturnCallback = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN_CALLBACK); if ($existingWillReturnCallback instanceof MethodCall) { return $this->refactorWithExistingWillReturnCallback($existingWillReturnCallback, $withConsecutiveMethodCall, $node); } // 3. rename and replace withConsecutive() - return $this->refactorToWillReturnCallback($withConsecutiveMethodCall, $returnStmts, $referenceVariable, $expectsCall, $node); - } - public function provideMinPhpVersion() : int - { - // This rule uses PHP 8.0 match - return PhpVersion::PHP_80; - } - /** - * Replace $this->expects(...) - * - * @param Expression $expression - * @return \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null - */ - private function matchAndRefactorExpectsMethodCall(Expression $expression) - { - /** @var MethodCall|StaticCall|null $exactlyCall */ - $exactlyCall = null; - $this->traverseNodesWithCallable($expression, function (Node $node) use(&$exactlyCall) : ?MethodCall { - if (!$node instanceof MethodCall) { - return null; - } - if (!$this->isName($node->name, 'expects')) { - return null; - } - if ($node->isFirstClassCallable()) { - return null; - } - $firstArg = $node->getArgs()[0]; - if (!$firstArg->value instanceof MethodCall && !$firstArg->value instanceof StaticCall) { - return null; - } - $exactlyCall = $firstArg->value; - $node->args = [new Arg(new Variable(ConsecutiveVariable::MATCHER))]; - return $node; - }); - // add expects() method - if (!$exactlyCall instanceof Expr) { - $this->traverseNodesWithCallable($expression, function (Node $node) : ?int { - if (!$node instanceof MethodCall) { - return null; - } - if ($node->var instanceof MethodCall) { - return null; - } - $node->var = new MethodCall($node->var, 'expects', [new Arg(new Variable(ConsecutiveVariable::MATCHER))]); - return NodeTraverser::STOP_TRAVERSAL; - }); - } - return $exactlyCall; - } - private function findMethodCall(Expression $expression, string $methodName) : ?MethodCall - { - if (!$expression->expr instanceof MethodCall) { - return null; - } - /** @var MethodCall|null $methodCall */ - $methodCall = $this->betterNodeFinder->findFirst($expression->expr, function (Node $node) use($methodName) : bool { - if (!$node instanceof MethodCall) { - return \false; - } - return $this->isName($node->name, $methodName); - }); - return $methodCall; - } - private function hasWillReturnMapOrWill(Expression $expression) : bool - { - $nodesWithWillReturnMap = $this->betterNodeFinder->find($expression, function (Node $node) : bool { - if (!$node instanceof MethodCall) { - return \false; - } - return $this->isNames($node->name, ['willReturnMap', 'will']); - }); - return $nodesWithWillReturnMap !== []; + return $this->refactorToWillReturnCallback($withConsecutiveMethodCall, $returnStmt, $referenceVariable, $expectsCall, $node, $willReturnOnConsecutiveMethodCall); } /** - * @param Stmt[] $returnStmts * @return Stmt[] * @param \PhpParser\Node\Expr|\PhpParser\Node\Expr\Variable|null $referenceVariable * @param \PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall $expectsCall */ - private function refactorToWillReturnCallback(MethodCall $withConsecutiveMethodCall, array $returnStmts, $referenceVariable, $expectsCall, Expression $expression) : array + private function refactorToWillReturnCallback(MethodCall $withConsecutiveMethodCall, ?Stmt $returnStmt, $referenceVariable, $expectsCall, Expression $expression, ?MethodCall $willReturnOnConsecutiveMethodCall) : array { - $closure = $this->withConsecutiveMatchFactory->createClosure($withConsecutiveMethodCall, $returnStmts, $referenceVariable); - $withConsecutiveMethodCall->name = new Identifier('willReturnCallback'); + $closure = $this->willReturnCallbackFactory->createClosure($withConsecutiveMethodCall, $returnStmt, $referenceVariable); + $withConsecutiveMethodCall->name = new Identifier(ConsecutiveMethodName::WILL_RETURN_CALLBACK); $withConsecutiveMethodCall->args = [new Arg($closure)]; $matcherVariable = new Variable(ConsecutiveVariable::MATCHER); $matcherAssign = new Assign($matcherVariable, $expectsCall); + $this->willReturnIfNodeDecorator->decorate($closure, $willReturnOnConsecutiveMethodCall); return [new Expression($matcherAssign), $expression]; } private function refactorWithExistingWillReturnCallback(MethodCall $existingWillReturnCallback, MethodCall $withConsecutiveMethodCall, Expression $expression) : Expression @@ -269,38 +212,11 @@ private function refactorWithExistingWillReturnCallback(MethodCall $existingWill } $callbackClosure = $callbackArg->value; $callbackClosure->params[] = new Param(new Variable(ConsecutiveVariable::PARAMETERS)); - $parametersMatch = $this->withConsecutiveMatchFactory->createParametersMatch($withConsecutiveMethodCall); - if (\is_array($parametersMatch)) { - $callbackClosure->stmts = \array_merge($parametersMatch, $callbackClosure->stmts); - } else { - $callbackClosure->stmts = \array_merge([new Expression($parametersMatch)], $callbackClosure->stmts); - } - $this->removeMethodCalls($expression, [self::WITH_CONSECUTIVE_METHOD]); + $parametersMatch = $this->willReturnCallbackFactory->createParametersMatch($withConsecutiveMethodCall); + $callbackClosure->stmts = \array_merge($parametersMatch, $callbackClosure->stmts); + $this->methodCallRemover->removeMethodCall($expression, ConsecutiveMethodName::WITH_CONSECUTIVE); return $expression; } - /** - * @param string[] $methodNames - */ - private function removeMethodCalls(Expression $expression, array $methodNames) : void - { - $this->traverseNodesWithCallable($expression, function (Node $node) use($methodNames) : ?Node { - if (!$node instanceof MethodCall) { - return null; - } - if (!$this->isNames($node->name, $methodNames)) { - return null; - } - return $node->var; - }); - } - private function createWillReturnStmt(MethodCall $willReturnMethodCall) : Return_ - { - $firstArg = $willReturnMethodCall->getArgs()[0] ?? null; - if (!$firstArg instanceof Arg) { - throw new ShouldNotHappenException(); - } - return new Return_($firstArg->value); - } private function createWillReturnSelfStmts(MethodCall $willReturnSelfMethodCall) : Return_ { $selfVariable = $willReturnSelfMethodCall; @@ -312,42 +228,18 @@ private function createWillReturnSelfStmts(MethodCall $willReturnSelfMethodCall) } return new Return_($selfVariable); } - private function createWillThrowException(MethodCall $willThrowExceptionMethodCall) : Throw_ - { - $firstArg = $willThrowExceptionMethodCall->getArgs()[0] ?? null; - if (!$firstArg instanceof Arg) { - throw new ShouldNotHappenException(); - } - return new Throw_($firstArg->value); - } - private function createWillReturn(MethodCall $willReturnReferenceMethodCall) : Return_ - { - $firstArg = $willReturnReferenceMethodCall->getArgs()[0] ?? null; - if (!$firstArg instanceof Arg) { - throw new ShouldNotHappenException(); - } - $referenceVariable = $firstArg->value; - if (!$referenceVariable instanceof Variable) { - throw new ShouldNotHappenException(); - } - return new Return_($referenceVariable); - } private function createWillReturnArgument(MethodCall $willReturnArgumentMethodCall) : Return_ { $parametersVariable = new Variable(ConsecutiveVariable::PARAMETERS); - $firstArgs = $willReturnArgumentMethodCall->getArgs()[0]; - if (!$firstArgs instanceof Arg) { - throw new ShouldNotHappenException(); - } - return new Return_(new ArrayDimFetch($parametersVariable, $firstArgs->value)); + $expr = $this->getFirstArgValue($willReturnArgumentMethodCall); + return new Return_(new ArrayDimFetch($parametersVariable, $expr)); } - private function createReturnMatch(MethodCall $willReturnOnConsecutiveCallsMethodCall) : Return_ + private function getFirstArgValue(MethodCall $methodCall) : Expr { - $numberOfInvocationsMethodCall = $this->matcherInvocationCountMethodCallNodeFactory->create(); - $matchArms = []; - foreach ($willReturnOnConsecutiveCallsMethodCall->getArgs() as $key => $arg) { - $matchArms[] = new MatchArm([new LNumber($key + 1)], $arg->value); + $firstArg = $methodCall->getArgs()[0] ?? null; + if (!$firstArg instanceof Arg) { + throw new ShouldNotHappenException(); } - return new Return_(new Match_($numberOfInvocationsMethodCall, $matchArms)); + return $firstArg->value; } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php index ab9d07729..228425023 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\PHPUnit70\Rector\Class_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Class_; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php new file mode 100644 index 000000000..3896064c8 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php @@ -0,0 +1,40 @@ +simpleCallableNodeTraverser = $simpleCallableNodeTraverser; + $this->nodeNameResolver = $nodeNameResolver; + } + public function removeMethodCall(Expression $expression, string $methodName) : void + { + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($expression, function (Node $node) use($methodName) : ?Node { + if (!$node instanceof MethodCall) { + return null; + } + if (!$this->nodeNameResolver->isName($node->name, $methodName)) { + return null; + } + return $node->var; + }); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php index 7aadda048..5cb050076 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php @@ -7,69 +7,91 @@ use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\ArrayItem; -use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\BinaryOp\Identical; -use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use Rector\Exception\NotImplementedYetException; -use Rector\Exception\ShouldNotHappenException; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\PHPUnit\CodeQuality\NodeFactory\NestedClosureAssertFactory; use Rector\PHPUnit\Enum\ConsecutiveVariable; final class ConsecutiveIfsFactory { /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\MatcherInvocationCountMethodCallNodeFactory + * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $matcherInvocationCountMethodCallNodeFactory; + private $nodeNameResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver + * @var \Rector\PHPUnit\CodeQuality\NodeFactory\NestedClosureAssertFactory */ - private $nodeNameResolver; - public function __construct(\Rector\PHPUnit\NodeFactory\MatcherInvocationCountMethodCallNodeFactory $matcherInvocationCountMethodCallNodeFactory, NodeNameResolver $nodeNameResolver) + private $nestedClosureAssertFactory; + public function __construct(NodeNameResolver $nodeNameResolver, NestedClosureAssertFactory $nestedClosureAssertFactory) { - $this->matcherInvocationCountMethodCallNodeFactory = $matcherInvocationCountMethodCallNodeFactory; $this->nodeNameResolver = $nodeNameResolver; + $this->nestedClosureAssertFactory = $nestedClosureAssertFactory; } /** - * @return If_[] + * @return Stmt[] */ - public function createIfs(MethodCall $withConsecutiveMethodCall) : array + public function createIfs(MethodCall $withConsecutiveMethodCall, MethodCall $numberOfInvocationsMethodCall) : array { $ifs = []; - $matcherMethodCall = $this->matcherInvocationCountMethodCallNodeFactory->create(); $parametersVariable = new Variable(ConsecutiveVariable::PARAMETERS); foreach ($withConsecutiveMethodCall->getArgs() as $key => $withConsecutiveArg) { - if (!$withConsecutiveArg->value instanceof Array_) { - throw new ShouldNotHappenException(); - } $ifStmts = []; - foreach ($withConsecutiveArg->value->items as $assertKey => $assertArrayItem) { - if (!$assertArrayItem instanceof ArrayItem) { - continue; - } - if (!$assertArrayItem->value instanceof MethodCall) { - throw new NotImplementedYetException(); + if ($withConsecutiveArg->value instanceof Array_) { + $array = $withConsecutiveArg->value; + foreach ($array->items as $assertKey => $assertArrayItem) { + if (!$assertArrayItem instanceof ArrayItem) { + continue; + } + if (!$assertArrayItem->value instanceof MethodCall) { + $parametersDimFetch = new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)); + $args = [new Arg($assertArrayItem), new Arg($parametersDimFetch)]; + $ifStmts[] = new Expression(new MethodCall(new Variable('this'), 'assertSame', $args)); + continue; + } + $assertMethodCall = $assertArrayItem->value; + if ($this->nodeNameResolver->isName($assertMethodCall->name, 'equalTo')) { + $ifStmts[] = $this->createAssertMethodCall($assertMethodCall, $parametersVariable, $assertKey); + } elseif ($this->nodeNameResolver->isName($assertMethodCall->name, 'callback')) { + $ifStmts = \array_merge($ifStmts, $this->nestedClosureAssertFactory->create($assertMethodCall, $assertKey)); + } else { + $args = [new Arg($assertMethodCall), new Arg(new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)))]; + $assertSameMethodCall = new MethodCall(new Variable('this'), new Identifier('assertSame'), $args); + $ifStmts[] = new Expression($assertSameMethodCall); + } } - $assertMethodCall = $assertArrayItem->value; - if ($this->nodeNameResolver->isName($assertMethodCall->name, 'equalTo')) { - $assertMethodCallExpression = $this->createAssertMethodCall($assertMethodCall, $parametersVariable, $assertKey); - $ifStmts[] = $assertMethodCallExpression; - } elseif ($this->nodeNameResolver->isName($assertMethodCall->name, 'callback')) { - $ifStmts[] = $this->createClosureAssignExpression($assertMethodCall); - $ifStmts[] = $this->createAssertClosureExpression($parametersVariable, $assertKey); - } else { - $methodName = $this->nodeNameResolver->getName($assertMethodCall->name); - throw new NotImplementedYetException($methodName ?? 'dynamic name'); + } elseif ($withConsecutiveArg->value instanceof MethodCall) { + $methodCall = $withConsecutiveArg->value; + if ($this->nodeNameResolver->isName($methodCall->name, 'callback')) { + // special callable case + $firstArg = $methodCall->getArgs()[0]; + if ($firstArg->value instanceof ArrowFunction) { + $arrowFunction = $firstArg->value; + if ($arrowFunction->expr instanceof Identical) { + $identicalCompare = $arrowFunction->expr; + // @todo improve in time + if ($identicalCompare->left instanceof Variable) { + $parametersArrayDimFetch = new ArrayDimFetch(new Variable('parameters'), new LNumber(0)); + $assertSameMethodCall = new MethodCall(new Variable('this'), new Identifier('assertSame')); + $assertSameMethodCall->args[] = new Arg($identicalCompare->right); + $assertSameMethodCall->args[] = new Arg($parametersArrayDimFetch); + return [new Expression($assertSameMethodCall)]; + } + } + } } + throw new NotImplementedYetException(); } - $ifs[] = new If_(new Identical($matcherMethodCall, new LNumber($key + 1)), ['stmts' => $ifStmts]); + $ifs[] = new If_(new Identical($numberOfInvocationsMethodCall, new LNumber($key + 1)), ['stmts' => $ifStmts]); } return $ifs; } @@ -80,20 +102,4 @@ private function createAssertMethodCall(MethodCall $assertMethodCall, Variable $ $assertMethodCall->args[] = new Arg($parametersArrayDimFetch); return new Expression($assertMethodCall); } - private function createClosureAssignExpression(MethodCall $assertMethodCall) : Expression - { - $callableFirstArg = $assertMethodCall->getArgs()[0]; - $callbackVariable = new Variable('callback'); - $callbackAssign = new Assign($callbackVariable, $callableFirstArg->value); - return new Expression($callbackAssign); - } - private function createAssertClosureExpression(Variable $parametersVariable, int $parameterPositionKey) : Expression - { - $callbackVariable = new Variable('callback'); - $parametersArrayDimFetch = new ArrayDimFetch($parametersVariable, new LNumber($parameterPositionKey)); - $callbackFuncCall = new FuncCall($callbackVariable, [new Arg($parametersArrayDimFetch)]); - // add assert true to the callback - $assertTrueMethodCall = new MethodCall(new Variable('this'), 'assertTrue', [new Arg($callbackFuncCall)]); - return new Expression($assertTrueMethodCall); - } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php index 236597ca8..1a3c21bf4 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php @@ -28,13 +28,12 @@ public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $this->nodeNameResolver = $nodeNameResolver; } /** - * @param Stmt[] $returnStmts * @return Variable[] */ - public function resolveUsedVariables(MethodCall $withConsecutiveMethodCall, array $returnStmts) : array + public function resolveUsedVariables(MethodCall $withConsecutiveMethodCall, ?Stmt $returnStmt) : array { $consecutiveArgs = $withConsecutiveMethodCall->getArgs(); - $stmtVariables = $this->resolveUniqueVariables($returnStmts); + $stmtVariables = $returnStmt instanceof Stmt ? $this->resolveUniqueVariables([$returnStmt]) : []; return $this->resolveUniqueVariables(\array_merge($consecutiveArgs, $stmtVariables)); } /** diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php new file mode 100644 index 000000000..4bf595063 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php @@ -0,0 +1,55 @@ +betterNodeFinder = $betterNodeFinder; + $this->nodeNameResolver = $nodeNameResolver; + } + /** + * @param string[] $methodNames + */ + public function hasByNames(Expression $expression, array $methodNames) : bool + { + $desiredMethodCalls = $this->betterNodeFinder->find($expression, function (Node $node) use($methodNames) : bool { + if (!$node instanceof MethodCall) { + return \false; + } + return $this->nodeNameResolver->isNames($node->name, $methodNames); + }); + return $desiredMethodCalls !== []; + } + public function findByName(Expression $expression, string $methodName) : ?MethodCall + { + if (!$expression->expr instanceof MethodCall) { + return null; + } + /** @var MethodCall|null $methodCall */ + $methodCall = $this->betterNodeFinder->findFirst($expression->expr, function (Node $node) use($methodName) : bool { + if (!$node instanceof MethodCall) { + return \false; + } + return $this->nodeNameResolver->isName($node->name, $methodName); + }); + return $methodCall; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php index e5bf7c61a..119ee5b5c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\PhpDoc; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Stmt\Class_; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/README.md b/vendor/rector/rector/vendor/rector/rector-symfony/README.md index 3ad57a824..f1bb2df83 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/README.md +++ b/vendor/rector/rector/vendor/rector/rector-symfony/README.md @@ -85,7 +85,8 @@ The version of your Symfony can be quite old. Public methods are stable from Sym --- -Note: in this case, container cache PHP file located in `/var/cache//appProjectContainer.php` is not enough. Why? Few services require Kernel to be set, e.g. routes that are resolved in lazy way. This container file is only dumped without Kernel and [would crash with missing "kernel" error](https://github.com/symfony/symfony/issues/19840). That's why the rule needs full blown container. +> [!NOTE] +> In this case, container cache PHP file located in `/var/cache//appProjectContainer.php` is not enough. Why? Few services require Kernel to be set, e.g. routes that are resolved in lazy way. This container file is only dumped without Kernel and [would crash with missing "kernel" error](https://github.com/symfony/symfony/issues/19840). That's why the rule needs full blown container.
diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php index 0d3ec3762..44cc94207 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php @@ -1,7 +1,7 @@ withConfiguredRule(RenameAttributeRector::class, [new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireIterator'), new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireLocator')])->withConfiguredRule(RenameMethodRector::class, [ // typo fix - new MethodCallRename('̈́Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractNormalizerContextBuilder', 'withDefaultContructorArguments', 'withDefaultConstructorArguments'), + new MethodCallRename('Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractNormalizerContextBuilder', 'withDefaultContructorArguments', 'withDefaultConstructorArguments'), ]); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php index ad99f00e3..ff5bd4119 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php @@ -1,7 +1,7 @@ withSets([__DIR__ . '/twig-underscore-to-namespace.php']); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php index 7ca9ed39b..410cb0ad5 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php @@ -1,7 +1,7 @@ withSets([__DIR__ . '/twig-underscore-to-namespace.php']); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php index d50c72c67..33630fb0f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\CodeQuality\Rector\ClassMethod; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassMethod; 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 2086e6bfe..78b91676c 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 @@ -5,12 +5,15 @@ use PhpParser\Node; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; +use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; use Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractRector; +use Rector\Rector\AbstractScopeAwareRector; use Rector\Reflection\ReflectionResolver; use Rector\Symfony\TypeAnalyzer\ControllerAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -18,7 +21,7 @@ /** * @see \Rector\Symfony\Tests\CodeQuality\Rector\ClassMethod\RemoveUnusedRequestParamRector\RemoveUnusedRequestParamRectorTest */ -final class RemoveUnusedRequestParamRector extends AbstractRector +final class RemoveUnusedRequestParamRector extends AbstractScopeAwareRector { /** * @readonly @@ -40,12 +43,18 @@ final class RemoveUnusedRequestParamRector extends AbstractRector * @var \Rector\PhpParser\Node\BetterNodeFinder */ private $betterNodeFinder; - public function __construct(ControllerAnalyzer $controllerAnalyzer, ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, BetterNodeFinder $betterNodeFinder) + /** + * @readonly + * @var \Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer + */ + private $isClassMethodUsedAnalyzer; + public function __construct(ControllerAnalyzer $controllerAnalyzer, ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, BetterNodeFinder $betterNodeFinder, IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer) { $this->controllerAnalyzer = $controllerAnalyzer; $this->reflectionResolver = $reflectionResolver; $this->classChildAnalyzer = $classChildAnalyzer; $this->betterNodeFinder = $betterNodeFinder; + $this->isClassMethodUsedAnalyzer = $isClassMethodUsedAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -80,45 +89,54 @@ public function run(int $id) */ public function getNodeTypes() : array { - return [ClassMethod::class]; + return [Class_::class]; } /** - * @param ClassMethod $node + * @param Class_ $node */ - public function refactor(Node $node) : ?Node + public function refactorWithScope(Node $node, Scope $scope) : ?Node { - if (!$node->isPublic()) { - return null; - } - if ($node->isAbstract() || $this->hasAbstractParentClassMethod($node)) { - return null; - } if (!$this->controllerAnalyzer->isInsideController($node)) { return null; } - if ($node->getParams() === []) { - return null; - } - // skip empty method - if ($node->stmts === null) { - return null; - } - foreach ($node->getParams() as $paramPosition => $param) { - if (!$param->type instanceof Node) { + $hasChanged = \false; + foreach ($node->getMethods() as $classMethod) { + if (!$classMethod->isPublic()) { + continue; + } + if ($classMethod->isAbstract() || $this->hasAbstractParentClassMethod($classMethod)) { + continue; + } + if ($classMethod->getParams() === []) { continue; } - if (!$this->isObjectType($param->type, new ObjectType('Symfony\\Component\\HttpFoundation\\Request'))) { + // skip empty method + if ($classMethod->stmts === null) { continue; } - /** @var string $requestParamName */ - $requestParamName = $this->getName($param); - // we have request param here - $requestVariable = $this->betterNodeFinder->findVariableOfName($node->stmts, $requestParamName); - // is variable used? - if ($requestVariable instanceof Variable) { - return null; + foreach ($classMethod->getParams() as $paramPosition => $param) { + if (!$param->type instanceof Node) { + continue; + } + if (!$this->isObjectType($param->type, new ObjectType('Symfony\\Component\\HttpFoundation\\Request'))) { + continue; + } + /** @var string $requestParamName */ + $requestParamName = $this->getName($param); + // we have request param here + $requestVariable = $this->betterNodeFinder->findVariableOfName($classMethod->stmts, $requestParamName); + // is variable used? + if ($requestVariable instanceof Variable) { + continue 2; + } + if ($this->isClassMethodUsedAnalyzer->isClassMethodUsed($node, $classMethod, $scope)) { + continue 2; + } + unset($classMethod->params[$paramPosition]); + $hasChanged = \true; } - unset($node->params[$paramPosition]); + } + if ($hasChanged) { return $node; } return null; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php index ac32ebaaf..850800a19 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\CodeQuality\Rector\Class_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; 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 8c1855dff..67e492ec0 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 @@ -25,7 +25,7 @@ use Rector\Symfony\ValueObject\ExtensionKeyAndConfiguration; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @changelog https://symfony.com/blog/new-in-symfony-5-3-config-builder-classes * diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php new file mode 100644 index 000000000..9da4a7012 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php @@ -0,0 +1,161 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add trait getter return type based on setter with @required annotation or #[\\Symfony\\Contracts\\Service\\Attribute\\Required] attribute', [new CodeSample(<<<'CODE_SAMPLE' +use stdClass; + +trait SomeTrait +{ + private $service; + + public function getService() + { + return $this->service; + } + + /** + * @required + */ + public function setService(stdClass $stdClass) + { + $this->stdClass = $stdClass; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use stdClass; + +trait SomeTrait +{ + private $service; + + public function getService(): stdClass + { + return $this->service; + } + + /** + * @required + */ + public function setService(stdClass $stdClass) + { + $this->stdClass = $stdClass; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Trait_::class]; + } + /** + * @param Trait_ $node + */ + public function refactor(Node $node) : ?Node + { + $methods = $node->getMethods(); + if (\count($methods) !== 2) { + return null; + } + $props = $node->getProperties(); + if (\count($props) !== 1) { + return null; + } + $getMethod = null; + foreach ($methods as $method) { + $methodName = (string) $this->getName($method); + if (\strncmp($methodName, 'set', \strlen('set')) !== 0) { + continue; + } + $getterMethod = 'get' . \ltrim($methodName, 'set'); + $getMethod = $node->getMethod($getterMethod); + // getter for setter is not exists + if (!$getMethod instanceof ClassMethod) { + return null; + } + // already returned + if ($getMethod->returnType instanceof Node) { + return null; + } + if (\count((array) $method->getStmts()) !== 1) { + return null; + } + if (!$this->shouldProcess($method)) { + return null; + } + if (\count($method->params) !== 1) { + return null; + } + if (!$method->params[0]->type instanceof Node) { + return null; + } + $stmts = (array) $method->getStmts(); + if (!$stmts[0] instanceof Expression || !$stmts[0]->expr instanceof Assign || !$stmts[0]->expr->var instanceof PropertyFetch || !$this->nodeComparator->areNodesEqual($stmts[0]->expr->expr, $method->params[0]->var)) { + return null; + } + $getterStmts = (array) $getMethod->getStmts(); + if (\count($getterStmts) !== 1) { + return null; + } + if (!$getterStmts[0] instanceof Return_ || !$getterStmts[0]->expr instanceof PropertyFetch) { + return null; + } + $getMethod->returnType = $method->params[0]->type; + return $node; + } + return null; + } + private function shouldProcess(ClassMethod $classMethod) : bool + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod); + if ($phpDocInfo instanceof PhpDocInfo && $phpDocInfo->hasByName('required')) { + return \true; + } + return $this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, self::REQUIRED_ATTRIBUTE); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php index 2a09cb6b7..5120f3506 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php @@ -10,7 +10,7 @@ use Rector\Symfony\Configs\Enum\GroupingMethods; use Rector\Symfony\Configs\Enum\SecurityConfigKey; use Rector\Symfony\Utils\StringUtils; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class NestedConfigCallsFactory { /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php index 9c9a8cdec..3852bc766 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php @@ -7,7 +7,7 @@ use Rector\Symfony\Configs\NodeVisitor\CollectServiceArgumentsNodeVisitor; use Rector\Symfony\Configs\ValueObject\ServiceArguments; use Rector\Symfony\PhpParser\NamedSimplePhpParser; -use RectorPrefix202410\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; final class ConfigServiceArgumentsResolver { /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php index 2da59b656..f57902496 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Configs\NodeVisitor; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php index 3a1e0c44a..e3a440da4 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php @@ -20,11 +20,11 @@ use Rector\Symfony\Configs\NodeAnalyser\ConfigServiceArgumentsResolver; use Rector\Symfony\Enum\SymfonyAttribute; use Rector\ValueObject\MethodName; -use RectorPrefix202410\Symfony\Component\Finder\Finder; -use RectorPrefix202410\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202411\Symfony\Component\Finder\Finder; +use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * The param/env is only available since Symfony 6.3 * @see https://symfony.com/blog/new-in-symfony-6-3-dependency-injection-improvements#new-options-for-autowire-attribute 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 00d4fb443..5e83c6c00 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 @@ -23,7 +23,7 @@ use Rector\Symfony\MinimalSharedStringSolver; use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; use Rector\Symfony\ValueObject\ClassNameAndFilePath; -use RectorPrefix202410\Symfony\Component\Filesystem\Filesystem; +use RectorPrefix202411\Symfony\Component\Filesystem\Filesystem; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** 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 49b4a146e..bd315beaf 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 @@ -9,7 +9,7 @@ use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\Symfony\TypeAnalyzer\ControllerAnalyzer; -use RectorPrefix202410\Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use RectorPrefix202411\Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php index 6bcd1522a..0c671fe10 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony28\Rector\StaticCall; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\StaticCall; 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 62b7bbe08..361e58bbc 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 @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony30\Rector\ClassMethod; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php index ef811186f..86c4b9e34 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php @@ -17,7 +17,7 @@ use Rector\PhpParser\NodeTransformer; use Rector\Rector\AbstractRector; use Rector\Util\Reflection\PrivatesAccessor; -use RectorPrefix202410\Symfony\Component\Console\Input\StringInput; +use RectorPrefix202411\Symfony\Component\Console\Input\StringInput; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** 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 8c34364f8..2e563fcbd 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 @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony43\Rector\MethodCall; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; 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 931e8af1d..a952967d8 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 @@ -13,7 +13,7 @@ use Rector\Symfony\ValueObject\ReplaceServiceArgument; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @see \Rector\Symfony\Tests\Symfony60\Rector\FuncCall\ReplaceServiceArgumentRector\ReplaceServiceArgumentRectorTest */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php index 060914113..a578409e1 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php @@ -22,7 +22,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @changelog https://symfony.com/doc/current/console.html#registering-the-command * 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 5141d86c2..d52601b61 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 @@ -16,8 +16,8 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Rector\Rector\AbstractRector; -use RectorPrefix202410\Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; -use RectorPrefix202410\Symfony\Component\HttpKernel\Controller\ValueResolverInterface; +use RectorPrefix202411\Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use RectorPrefix202411\Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php index 26e96f2fc..6174d82e4 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony62\Rector\Class_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php index 3dcf1a98e..67aca1d02 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony63\Rector\Class_; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Identifier; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php index 9ebb7b4bd..b4474f071 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php @@ -6,8 +6,8 @@ use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202410\Symfony\Component\DependencyInjection\Container; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\DependencyInjection\Container; +use RectorPrefix202411\Webmozart\Assert\Assert; final class ContainerServiceProvider { /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php index 117fbce3a..7da3cb2bb 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php @@ -6,8 +6,8 @@ use Rector\Symfony\Bridge\Symfony\ContainerServiceProvider; use Rector\Symfony\Contract\Bridge\Symfony\Routing\SymfonyRoutesProviderInterface; use Rector\Symfony\ValueObject\SymfonyRouteMetadata; -use RectorPrefix202410\Symfony\Component\Routing\RouterInterface; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Symfony\Component\Routing\RouterInterface; +use RectorPrefix202411\Webmozart\Assert\Assert; /** * @api part of AddRouteAnnotationRector */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/FormHelper/FormTypeStringToTypeProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/FormHelper/FormTypeStringToTypeProvider.php index 284ec60e0..992c53aa2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/FormHelper/FormTypeStringToTypeProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/FormHelper/FormTypeStringToTypeProvider.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\FormHelper; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\Symfony\Contract\Tag\TagInterface; use Rector\Symfony\DataProvider\ServiceMapProvider; final class FormTypeStringToTypeProvider diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php index 851a091e8..f75e873ca 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Helper; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php index a25bcb319..54a27c814 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php @@ -4,7 +4,7 @@ namespace Rector\Symfony\ValueObject; use Rector\Validation\RectorAssert; -use RectorPrefix202410\Webmozart\Assert\Assert; +use RectorPrefix202411\Webmozart\Assert\Assert; final class IntlBundleClassToNewClass { /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php index 4e72737b7..a8ce89a08 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\Symfony\ValueObjectFactory; -use RectorPrefix202410\Nette\Utils\FileSystem; -use RectorPrefix202410\Nette\Utils\Json; -use RectorPrefix202410\Nette\Utils\Strings; +use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202411\Nette\Utils\Strings; use Rector\Symfony\Exception\XmlContainerNotExistsException; use Rector\Symfony\ValueObject\ServiceDefinition; use Rector\Symfony\ValueObject\ServiceMap\ServiceMap; diff --git a/vendor/rector/rector/vendor/scoper-autoload.php b/vendor/rector/rector/vendor/scoper-autoload.php index 3cb9c4e9e..649b05f47 100644 --- a/vendor/rector/rector/vendor/scoper-autoload.php +++ b/vendor/rector/rector/vendor/scoper-autoload.php @@ -14,7 +14,7 @@ // Restore the backup and ensure the excluded files are properly marked as loaded $GLOBALS['__composer_autoload_files'] = \array_merge( $existingComposerAutoloadFiles, - \array_fill_keys(['5928a00fa978807cf85d90ec3f4b0147', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a'], true) + \array_fill_keys(['0e6d7bf4a5811bfa5cf40c5ccd6fae6a', '5928a00fa978807cf85d90ec3f4b0147'], true) ); return $loader; @@ -29,63 +29,64 @@ function humbug_phpscoper_expose_class($exposed, $prefixed) { } } } -humbug_phpscoper_expose_class('AutoloadIncluder', 'RectorPrefix202410\AutoloadIncluder'); -humbug_phpscoper_expose_class('ComposerAutoloaderInit7c12491db1a700dd78980ecb6595c088', 'RectorPrefix202410\ComposerAutoloaderInit7c12491db1a700dd78980ecb6595c088'); -humbug_phpscoper_expose_class('Product', 'RectorPrefix202410\Product'); +humbug_phpscoper_expose_class('AutoloadIncluder', 'RectorPrefix202411\AutoloadIncluder'); +humbug_phpscoper_expose_class('ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7', 'RectorPrefix202411\ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7'); +humbug_phpscoper_expose_class('Product', 'RectorPrefix202411\Product'); +humbug_phpscoper_expose_class('SomeTest', 'RectorPrefix202411\SomeTest'); // Function aliases. For more information see: // https://github.com/humbug/php-scoper/blob/master/docs/further-reading.md#function-aliases -if (!function_exists('dump_node')) { function dump_node() { return \RectorPrefix202410\dump_node(...func_get_args()); } } -if (!function_exists('formatErrorMessage')) { function formatErrorMessage() { return \RectorPrefix202410\formatErrorMessage(...func_get_args()); } } -if (!function_exists('includeIfExists')) { function includeIfExists() { return \RectorPrefix202410\includeIfExists(...func_get_args()); } } -if (!function_exists('mb_check_encoding')) { function mb_check_encoding() { return \RectorPrefix202410\mb_check_encoding(...func_get_args()); } } -if (!function_exists('mb_chr')) { function mb_chr() { return \RectorPrefix202410\mb_chr(...func_get_args()); } } -if (!function_exists('mb_convert_case')) { function mb_convert_case() { return \RectorPrefix202410\mb_convert_case(...func_get_args()); } } -if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding() { return \RectorPrefix202410\mb_convert_encoding(...func_get_args()); } } -if (!function_exists('mb_convert_variables')) { function mb_convert_variables() { return \RectorPrefix202410\mb_convert_variables(...func_get_args()); } } -if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader() { return \RectorPrefix202410\mb_decode_mimeheader(...func_get_args()); } } -if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity() { return \RectorPrefix202410\mb_decode_numericentity(...func_get_args()); } } -if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding() { return \RectorPrefix202410\mb_detect_encoding(...func_get_args()); } } -if (!function_exists('mb_detect_order')) { function mb_detect_order() { return \RectorPrefix202410\mb_detect_order(...func_get_args()); } } -if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader() { return \RectorPrefix202410\mb_encode_mimeheader(...func_get_args()); } } -if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity() { return \RectorPrefix202410\mb_encode_numericentity(...func_get_args()); } } -if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases() { return \RectorPrefix202410\mb_encoding_aliases(...func_get_args()); } } -if (!function_exists('mb_get_info')) { function mb_get_info() { return \RectorPrefix202410\mb_get_info(...func_get_args()); } } -if (!function_exists('mb_http_input')) { function mb_http_input() { return \RectorPrefix202410\mb_http_input(...func_get_args()); } } -if (!function_exists('mb_http_output')) { function mb_http_output() { return \RectorPrefix202410\mb_http_output(...func_get_args()); } } -if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding() { return \RectorPrefix202410\mb_internal_encoding(...func_get_args()); } } -if (!function_exists('mb_language')) { function mb_language() { return \RectorPrefix202410\mb_language(...func_get_args()); } } -if (!function_exists('mb_lcfirst')) { function mb_lcfirst() { return \RectorPrefix202410\mb_lcfirst(...func_get_args()); } } -if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return \RectorPrefix202410\mb_list_encodings(...func_get_args()); } } -if (!function_exists('mb_ltrim')) { function mb_ltrim() { return \RectorPrefix202410\mb_ltrim(...func_get_args()); } } -if (!function_exists('mb_ord')) { function mb_ord() { return \RectorPrefix202410\mb_ord(...func_get_args()); } } -if (!function_exists('mb_output_handler')) { function mb_output_handler() { return \RectorPrefix202410\mb_output_handler(...func_get_args()); } } -if (!function_exists('mb_parse_str')) { function mb_parse_str() { return \RectorPrefix202410\mb_parse_str(...func_get_args()); } } -if (!function_exists('mb_rtrim')) { function mb_rtrim() { return \RectorPrefix202410\mb_rtrim(...func_get_args()); } } -if (!function_exists('mb_scrub')) { function mb_scrub() { return \RectorPrefix202410\mb_scrub(...func_get_args()); } } -if (!function_exists('mb_str_pad')) { function mb_str_pad() { return \RectorPrefix202410\mb_str_pad(...func_get_args()); } } -if (!function_exists('mb_str_split')) { function mb_str_split() { return \RectorPrefix202410\mb_str_split(...func_get_args()); } } -if (!function_exists('mb_stripos')) { function mb_stripos() { return \RectorPrefix202410\mb_stripos(...func_get_args()); } } -if (!function_exists('mb_stristr')) { function mb_stristr() { return \RectorPrefix202410\mb_stristr(...func_get_args()); } } -if (!function_exists('mb_strlen')) { function mb_strlen() { return \RectorPrefix202410\mb_strlen(...func_get_args()); } } -if (!function_exists('mb_strpos')) { function mb_strpos() { return \RectorPrefix202410\mb_strpos(...func_get_args()); } } -if (!function_exists('mb_strrchr')) { function mb_strrchr() { return \RectorPrefix202410\mb_strrchr(...func_get_args()); } } -if (!function_exists('mb_strrichr')) { function mb_strrichr() { return \RectorPrefix202410\mb_strrichr(...func_get_args()); } } -if (!function_exists('mb_strripos')) { function mb_strripos() { return \RectorPrefix202410\mb_strripos(...func_get_args()); } } -if (!function_exists('mb_strrpos')) { function mb_strrpos() { return \RectorPrefix202410\mb_strrpos(...func_get_args()); } } -if (!function_exists('mb_strstr')) { function mb_strstr() { return \RectorPrefix202410\mb_strstr(...func_get_args()); } } -if (!function_exists('mb_strtolower')) { function mb_strtolower() { return \RectorPrefix202410\mb_strtolower(...func_get_args()); } } -if (!function_exists('mb_strtoupper')) { function mb_strtoupper() { return \RectorPrefix202410\mb_strtoupper(...func_get_args()); } } -if (!function_exists('mb_strwidth')) { function mb_strwidth() { return \RectorPrefix202410\mb_strwidth(...func_get_args()); } } -if (!function_exists('mb_substitute_character')) { function mb_substitute_character() { return \RectorPrefix202410\mb_substitute_character(...func_get_args()); } } -if (!function_exists('mb_substr')) { function mb_substr() { return \RectorPrefix202410\mb_substr(...func_get_args()); } } -if (!function_exists('mb_substr_count')) { function mb_substr_count() { return \RectorPrefix202410\mb_substr_count(...func_get_args()); } } -if (!function_exists('mb_trim')) { function mb_trim() { return \RectorPrefix202410\mb_trim(...func_get_args()); } } -if (!function_exists('mb_ucfirst')) { function mb_ucfirst() { return \RectorPrefix202410\mb_ucfirst(...func_get_args()); } } -if (!function_exists('parseArgs')) { function parseArgs() { return \RectorPrefix202410\parseArgs(...func_get_args()); } } -if (!function_exists('print_node')) { function print_node() { return \RectorPrefix202410\print_node(...func_get_args()); } } -if (!function_exists('showHelp')) { function showHelp() { return \RectorPrefix202410\showHelp(...func_get_args()); } } -if (!function_exists('trigger_deprecation')) { function trigger_deprecation() { return \RectorPrefix202410\trigger_deprecation(...func_get_args()); } } -if (!function_exists('uv_poll_init_socket')) { function uv_poll_init_socket() { return \RectorPrefix202410\uv_poll_init_socket(...func_get_args()); } } +if (!function_exists('dump_node')) { function dump_node() { return \RectorPrefix202411\dump_node(...func_get_args()); } } +if (!function_exists('formatErrorMessage')) { function formatErrorMessage() { return \RectorPrefix202411\formatErrorMessage(...func_get_args()); } } +if (!function_exists('includeIfExists')) { function includeIfExists() { return \RectorPrefix202411\includeIfExists(...func_get_args()); } } +if (!function_exists('mb_check_encoding')) { function mb_check_encoding() { return \RectorPrefix202411\mb_check_encoding(...func_get_args()); } } +if (!function_exists('mb_chr')) { function mb_chr() { return \RectorPrefix202411\mb_chr(...func_get_args()); } } +if (!function_exists('mb_convert_case')) { function mb_convert_case() { return \RectorPrefix202411\mb_convert_case(...func_get_args()); } } +if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding() { return \RectorPrefix202411\mb_convert_encoding(...func_get_args()); } } +if (!function_exists('mb_convert_variables')) { function mb_convert_variables() { return \RectorPrefix202411\mb_convert_variables(...func_get_args()); } } +if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader() { return \RectorPrefix202411\mb_decode_mimeheader(...func_get_args()); } } +if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity() { return \RectorPrefix202411\mb_decode_numericentity(...func_get_args()); } } +if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding() { return \RectorPrefix202411\mb_detect_encoding(...func_get_args()); } } +if (!function_exists('mb_detect_order')) { function mb_detect_order() { return \RectorPrefix202411\mb_detect_order(...func_get_args()); } } +if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader() { return \RectorPrefix202411\mb_encode_mimeheader(...func_get_args()); } } +if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity() { return \RectorPrefix202411\mb_encode_numericentity(...func_get_args()); } } +if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases() { return \RectorPrefix202411\mb_encoding_aliases(...func_get_args()); } } +if (!function_exists('mb_get_info')) { function mb_get_info() { return \RectorPrefix202411\mb_get_info(...func_get_args()); } } +if (!function_exists('mb_http_input')) { function mb_http_input() { return \RectorPrefix202411\mb_http_input(...func_get_args()); } } +if (!function_exists('mb_http_output')) { function mb_http_output() { return \RectorPrefix202411\mb_http_output(...func_get_args()); } } +if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding() { return \RectorPrefix202411\mb_internal_encoding(...func_get_args()); } } +if (!function_exists('mb_language')) { function mb_language() { return \RectorPrefix202411\mb_language(...func_get_args()); } } +if (!function_exists('mb_lcfirst')) { function mb_lcfirst() { return \RectorPrefix202411\mb_lcfirst(...func_get_args()); } } +if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return \RectorPrefix202411\mb_list_encodings(...func_get_args()); } } +if (!function_exists('mb_ltrim')) { function mb_ltrim() { return \RectorPrefix202411\mb_ltrim(...func_get_args()); } } +if (!function_exists('mb_ord')) { function mb_ord() { return \RectorPrefix202411\mb_ord(...func_get_args()); } } +if (!function_exists('mb_output_handler')) { function mb_output_handler() { return \RectorPrefix202411\mb_output_handler(...func_get_args()); } } +if (!function_exists('mb_parse_str')) { function mb_parse_str() { return \RectorPrefix202411\mb_parse_str(...func_get_args()); } } +if (!function_exists('mb_rtrim')) { function mb_rtrim() { return \RectorPrefix202411\mb_rtrim(...func_get_args()); } } +if (!function_exists('mb_scrub')) { function mb_scrub() { return \RectorPrefix202411\mb_scrub(...func_get_args()); } } +if (!function_exists('mb_str_pad')) { function mb_str_pad() { return \RectorPrefix202411\mb_str_pad(...func_get_args()); } } +if (!function_exists('mb_str_split')) { function mb_str_split() { return \RectorPrefix202411\mb_str_split(...func_get_args()); } } +if (!function_exists('mb_stripos')) { function mb_stripos() { return \RectorPrefix202411\mb_stripos(...func_get_args()); } } +if (!function_exists('mb_stristr')) { function mb_stristr() { return \RectorPrefix202411\mb_stristr(...func_get_args()); } } +if (!function_exists('mb_strlen')) { function mb_strlen() { return \RectorPrefix202411\mb_strlen(...func_get_args()); } } +if (!function_exists('mb_strpos')) { function mb_strpos() { return \RectorPrefix202411\mb_strpos(...func_get_args()); } } +if (!function_exists('mb_strrchr')) { function mb_strrchr() { return \RectorPrefix202411\mb_strrchr(...func_get_args()); } } +if (!function_exists('mb_strrichr')) { function mb_strrichr() { return \RectorPrefix202411\mb_strrichr(...func_get_args()); } } +if (!function_exists('mb_strripos')) { function mb_strripos() { return \RectorPrefix202411\mb_strripos(...func_get_args()); } } +if (!function_exists('mb_strrpos')) { function mb_strrpos() { return \RectorPrefix202411\mb_strrpos(...func_get_args()); } } +if (!function_exists('mb_strstr')) { function mb_strstr() { return \RectorPrefix202411\mb_strstr(...func_get_args()); } } +if (!function_exists('mb_strtolower')) { function mb_strtolower() { return \RectorPrefix202411\mb_strtolower(...func_get_args()); } } +if (!function_exists('mb_strtoupper')) { function mb_strtoupper() { return \RectorPrefix202411\mb_strtoupper(...func_get_args()); } } +if (!function_exists('mb_strwidth')) { function mb_strwidth() { return \RectorPrefix202411\mb_strwidth(...func_get_args()); } } +if (!function_exists('mb_substitute_character')) { function mb_substitute_character() { return \RectorPrefix202411\mb_substitute_character(...func_get_args()); } } +if (!function_exists('mb_substr')) { function mb_substr() { return \RectorPrefix202411\mb_substr(...func_get_args()); } } +if (!function_exists('mb_substr_count')) { function mb_substr_count() { return \RectorPrefix202411\mb_substr_count(...func_get_args()); } } +if (!function_exists('mb_trim')) { function mb_trim() { return \RectorPrefix202411\mb_trim(...func_get_args()); } } +if (!function_exists('mb_ucfirst')) { function mb_ucfirst() { return \RectorPrefix202411\mb_ucfirst(...func_get_args()); } } +if (!function_exists('parseArgs')) { function parseArgs() { return \RectorPrefix202411\parseArgs(...func_get_args()); } } +if (!function_exists('print_node')) { function print_node() { return \RectorPrefix202411\print_node(...func_get_args()); } } +if (!function_exists('showHelp')) { function showHelp() { return \RectorPrefix202411\showHelp(...func_get_args()); } } +if (!function_exists('trigger_deprecation')) { function trigger_deprecation() { return \RectorPrefix202411\trigger_deprecation(...func_get_args()); } } +if (!function_exists('uv_poll_init_socket')) { function uv_poll_init_socket() { return \RectorPrefix202411\uv_poll_init_socket(...func_get_args()); } } return $loader; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php b/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php index f691a0ad0..0452dbdea 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use ArrayIterator; use IteratorAggregate; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php b/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php index 6a29b038f..a2ef00e09 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use ArrayIterator; use IteratorAggregate; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php b/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php index 9eec32e08..e00ae91c3 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use const PHP_INT_SIZE; use const PREG_SPLIT_DELIM_CAPTURE; @@ -28,7 +28,7 @@ use function reset; use function str_ends_with; use function substr; -use RectorPrefix202410\SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; +use RectorPrefix202411\SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; final class Differ { public const OLD = 0; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php index b5f139c91..5906ae725 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use function gettype; use function is_object; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php index bbfa0f538..a823a0246 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use Throwable; interface Exception extends Throwable diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php index b2489154a..0b11514dc 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; class InvalidArgumentException extends \InvalidArgumentException implements Exception { diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Line.php b/vendor/rector/rector/vendor/sebastian/diff/src/Line.php index ba5fac5e8..b589f35b4 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Line.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Line.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; final class Line { diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php b/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php index e05ec276e..67cbb4a48 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; interface LongestCommonSubsequenceCalculator { diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php index 05c24abfe..4a683914a 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use function array_fill; use function array_merge; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php index f20a19a00..f4a0b8162 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff\Output; +namespace RectorPrefix202411\SebastianBergmann\Diff\Output; use function count; abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php index f1ff4ccd2..3d77f2854 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff\Output; +namespace RectorPrefix202411\SebastianBergmann\Diff\Output; use function fclose; use function fopen; @@ -17,7 +17,7 @@ use function str_ends_with; use function stream_get_contents; use function substr; -use RectorPrefix202410\SebastianBergmann\Diff\Differ; +use RectorPrefix202411\SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in a loose unified diff format * listing only changes lines. Does not include line numbers. diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php index 1ad66a3b4..2902a0fab 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff\Output; +namespace RectorPrefix202411\SebastianBergmann\Diff\Output; /** * Defines how an output builder should take a generated diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php index c07c4e5be..b624ea54e 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff\Output; +namespace RectorPrefix202411\SebastianBergmann\Diff\Output; use function array_merge; use function array_splice; @@ -25,8 +25,8 @@ use function sprintf; use function stream_get_contents; use function substr; -use RectorPrefix202410\SebastianBergmann\Diff\ConfigurationException; -use RectorPrefix202410\SebastianBergmann\Diff\Differ; +use RectorPrefix202411\SebastianBergmann\Diff\ConfigurationException; +use RectorPrefix202411\SebastianBergmann\Diff\Differ; /** * Strict Unified diff output builder. * diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php index 08b83a92c..a67863b6d 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff\Output; +namespace RectorPrefix202411\SebastianBergmann\Diff\Output; use function array_splice; use function count; @@ -21,7 +21,7 @@ use function str_ends_with; use function stream_get_contents; use function substr; -use RectorPrefix202410\SebastianBergmann\Diff\Differ; +use RectorPrefix202411\SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in unified diff format in chunks. */ diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php b/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php index 9b7a0ee77..af2cf273f 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use function array_pop; use function assert; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php index 74f6cd3ec..59664c7d7 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\SebastianBergmann\Diff; +namespace RectorPrefix202411\SebastianBergmann\Diff; use function array_reverse; use function count; diff --git a/vendor/rector/rector/vendor/symfony/console/Application.php b/vendor/rector/rector/vendor/symfony/console/Application.php index 2f6a855a4..e806dd2a7 100644 --- a/vendor/rector/rector/vendor/symfony/console/Application.php +++ b/vendor/rector/rector/vendor/symfony/console/Application.php @@ -8,51 +8,51 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console; +namespace RectorPrefix202411\Symfony\Component\Console; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Command\CompleteCommand; -use RectorPrefix202410\Symfony\Component\Console\Command\DumpCompletionCommand; -use RectorPrefix202410\Symfony\Component\Console\Command\HelpCommand; -use RectorPrefix202410\Symfony\Component\Console\Command\LazyCommand; -use RectorPrefix202410\Symfony\Component\Console\Command\ListCommand; -use RectorPrefix202410\Symfony\Component\Console\Command\SignalableCommandInterface; -use RectorPrefix202410\Symfony\Component\Console\CommandLoader\CommandLoaderInterface; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleCommandEvent; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleErrorEvent; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleSignalEvent; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleTerminateEvent; -use RectorPrefix202410\Symfony\Component\Console\Exception\CommandNotFoundException; -use RectorPrefix202410\Symfony\Component\Console\Exception\ExceptionInterface; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Console\Exception\NamespaceNotFoundException; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Helper\DebugFormatterHelper; -use RectorPrefix202410\Symfony\Component\Console\Helper\DescriptorHelper; -use RectorPrefix202410\Symfony\Component\Console\Helper\FormatterHelper; -use RectorPrefix202410\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202410\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202410\Symfony\Component\Console\Helper\ProcessHelper; -use RectorPrefix202410\Symfony\Component\Console\Helper\QuestionHelper; -use RectorPrefix202410\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202410\Symfony\Component\Console\Input\ArrayInput; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputAwareInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\SignalRegistry\SignalRegistry; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202410\Symfony\Component\ErrorHandler\ErrorHandler; -use RectorPrefix202410\Symfony\Contracts\EventDispatcher\EventDispatcherInterface; -use RectorPrefix202410\Symfony\Contracts\Service\ResetInterface; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Command\CompleteCommand; +use RectorPrefix202411\Symfony\Component\Console\Command\DumpCompletionCommand; +use RectorPrefix202411\Symfony\Component\Console\Command\HelpCommand; +use RectorPrefix202411\Symfony\Component\Console\Command\LazyCommand; +use RectorPrefix202411\Symfony\Component\Console\Command\ListCommand; +use RectorPrefix202411\Symfony\Component\Console\Command\SignalableCommandInterface; +use RectorPrefix202411\Symfony\Component\Console\CommandLoader\CommandLoaderInterface; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleCommandEvent; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleErrorEvent; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleSignalEvent; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleTerminateEvent; +use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202411\Symfony\Component\Console\Exception\ExceptionInterface; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Exception\NamespaceNotFoundException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Helper\DebugFormatterHelper; +use RectorPrefix202411\Symfony\Component\Console\Helper\DescriptorHelper; +use RectorPrefix202411\Symfony\Component\Console\Helper\FormatterHelper; +use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202411\Symfony\Component\Console\Helper\ProcessHelper; +use RectorPrefix202411\Symfony\Component\Console\Helper\QuestionHelper; +use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202411\Symfony\Component\Console\Input\ArrayInput; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputAwareInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\SignalRegistry\SignalRegistry; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\ErrorHandler\ErrorHandler; +use RectorPrefix202411\Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use RectorPrefix202411\Symfony\Contracts\Service\ResetInterface; /** * An Application is the container for a collection of commands. * @@ -211,8 +211,8 @@ public function run(?InputInterface $input = null, ?OutputInterface $output = nu $phpHandler[0]->setExceptionHandler($errorHandler); } } - $this->configureIO($input, $output); try { + $this->configureIO($input, $output); $exitCode = $this->doRun($input, $output); } catch (\Throwable $e) { if ($e instanceof \Exception && !$this->catchExceptions) { @@ -787,7 +787,7 @@ protected function doRenderThrowable(\Throwable $e, OutputInterface $output) : v $len = 0; } if (\strpos($message, "@anonymous\x00") !== \false) { - $message = \preg_replace_callback('/[a-zA-Z_\\x7f-\\xff][\\\\a-zA-Z0-9_\\x7f-\\xff]*+@anonymous\\x00.*?\\.php(?:0x?|:[0-9]++\\$)[0-9a-fA-F]++/', function ($m) { + $message = \preg_replace_callback('/[a-zA-Z_\\x7f-\\xff][\\\\a-zA-Z0-9_\\x7f-\\xff]*+@anonymous\\x00.*?\\.php(?:0x?|:[0-9]++\\$)?[0-9a-fA-F]++/', function ($m) { return \class_exists($m[0], \false) ? ((\get_parent_class($m[0]) ?: \key(\class_implements($m[0]))) ?: 'class') . '@anonymous' : $m[0]; }, $message); } diff --git a/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php b/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php index f68d3421f..ca2070741 100644 --- a/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Attribute; +namespace RectorPrefix202411\Symfony\Component\Console\Attribute; /** * Service tag to autoconfigure commands. diff --git a/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php b/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php index 5cf1a22fe..d4b8c18d7 100644 --- a/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php +++ b/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\CI; +namespace RectorPrefix202411\Symfony\Component\Console\CI; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Utility class for Github actions. * diff --git a/vendor/rector/rector/vendor/symfony/console/Color.php b/vendor/rector/rector/vendor/symfony/console/Color.php index df9444136..f6dd50df6 100644 --- a/vendor/rector/rector/vendor/symfony/console/Color.php +++ b/vendor/rector/rector/vendor/symfony/console/Color.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console; +namespace RectorPrefix202411\Symfony\Component\Console; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Fabien Potencier */ diff --git a/vendor/rector/rector/vendor/symfony/console/Command/Command.php b/vendor/rector/rector/vendor/symfony/console/Command/Command.php index 47e9d7d4c..381f988c5 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/Command.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/Command.php @@ -8,23 +8,23 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202410\Symfony\Component\Console\Exception\ExceptionInterface; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Console\Helper\HelperInterface; -use RectorPrefix202410\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202411\Symfony\Component\Console\Exception\ExceptionInterface; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Helper\HelperInterface; +use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Base class for all commands. * diff --git a/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php index d0c067c62..76ca835cf 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php @@ -8,20 +8,20 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; -use RectorPrefix202410\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Completion\Output\BashCompletionOutput; -use RectorPrefix202410\Symfony\Component\Console\Completion\Output\CompletionOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Completion\Output\FishCompletionOutput; -use RectorPrefix202410\Symfony\Component\Console\Completion\Output\ZshCompletionOutput; -use RectorPrefix202410\Symfony\Component\Console\Exception\CommandNotFoundException; -use RectorPrefix202410\Symfony\Component\Console\Exception\ExceptionInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Completion\Output\BashCompletionOutput; +use RectorPrefix202411\Symfony\Component\Console\Completion\Output\CompletionOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Completion\Output\FishCompletionOutput; +use RectorPrefix202411\Symfony\Component\Console\Completion\Output\ZshCompletionOutput; +use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202411\Symfony\Component\Console\Exception\ExceptionInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Responsible for providing the values to the shell completion. * diff --git a/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php index 921222e1f..eff8e22a4 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; -use RectorPrefix202410\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * Dumps the completion script for the current shell. * diff --git a/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php index acb3801ce..3a6c5c59a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; -use RectorPrefix202410\Symfony\Component\Console\Descriptor\ApplicationDescription; -use RectorPrefix202410\Symfony\Component\Console\Helper\DescriptorHelper; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Descriptor\ApplicationDescription; +use RectorPrefix202411\Symfony\Component\Console\Helper\DescriptorHelper; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * HelpCommand displays the help for a given command. * diff --git a/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php index 32efe7309..ea0860957 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php @@ -8,17 +8,17 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202410\Symfony\Component\Console\Helper\HelperInterface; -use RectorPrefix202410\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202411\Symfony\Component\Console\Helper\HelperInterface; +use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Nicolas Grekas */ diff --git a/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php index bfc24ac2f..10c8a094e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; - -use RectorPrefix202410\Symfony\Component\Console\Descriptor\ApplicationDescription; -use RectorPrefix202410\Symfony\Component\Console\Helper\DescriptorHelper; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +namespace RectorPrefix202411\Symfony\Component\Console\Command; + +use RectorPrefix202411\Symfony\Component\Console\Descriptor\ApplicationDescription; +use RectorPrefix202411\Symfony\Component\Console\Helper\DescriptorHelper; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * ListCommand displays the list of all available commands for the application. * diff --git a/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php b/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php index 7fc272805..d1785fc58 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Lock\LockFactory; -use RectorPrefix202410\Symfony\Component\Lock\LockInterface; -use RectorPrefix202410\Symfony\Component\Lock\Store\FlockStore; -use RectorPrefix202410\Symfony\Component\Lock\Store\SemaphoreStore; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Lock\LockFactory; +use RectorPrefix202411\Symfony\Component\Lock\LockInterface; +use RectorPrefix202411\Symfony\Component\Lock\Store\FlockStore; +use RectorPrefix202411\Symfony\Component\Lock\Store\SemaphoreStore; /** * Basic lock feature for commands. * diff --git a/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php b/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php index 8f41e2808..1321e295f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; /** * Interface for command reacting to signal. diff --git a/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php index 0b0372038..6eb8e3d22 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php @@ -8,18 +8,18 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Command; +namespace RectorPrefix202411\Symfony\Component\Console\Command; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Helper\HelperInterface; -use RectorPrefix202410\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Stopwatch\Stopwatch; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Helper\HelperInterface; +use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Stopwatch\Stopwatch; /** * @internal * diff --git a/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php b/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php index 89d20e31d..95c4262c1 100644 --- a/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\CommandLoader; +namespace RectorPrefix202411\Symfony\Component\Console\CommandLoader; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; /** * @author Robin Chalas */ diff --git a/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php b/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php index d25efbcea..2e15cbb8f 100644 --- a/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php +++ b/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\CommandLoader; +namespace RectorPrefix202411\Symfony\Component\Console\CommandLoader; -use RectorPrefix202410\Psr\Container\ContainerInterface; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202411\Psr\Container\ContainerInterface; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; /** * Loads commands from a PSR-11 container. * diff --git a/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php b/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php index 69614d907..59d29f02e 100644 --- a/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php +++ b/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\CommandLoader; +namespace RectorPrefix202411\Symfony\Component\Console\CommandLoader; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; /** * A simple command loader using factories to instantiate commands lazily. * diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php index 5dc1660db..ea1dd6c3f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Completion; +namespace RectorPrefix202411\Symfony\Component\Console\Completion; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; /** * An input specialized for shell completion. * diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php index 6a5e98fe4..bf862445f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Completion; +namespace RectorPrefix202411\Symfony\Component\Console\Completion; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; /** * Stores all completion suggestions for the current input. * diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php index 5977ea607..94d2e9d73 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Wouter de Jong */ diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php index b9e465a29..76442724c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Transforms the {@see CompletionSuggestions} object into output readable by the shell completion. * diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php index e79b430a3..5fdc93a94 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Guillaume Aveline */ diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php index 2e920bfac..1a7fa94db 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Jitendra A */ diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php b/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php index 800c7f266..49a2a744b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Completion; +namespace RectorPrefix202411\Symfony\Component\Console\Completion; /** * Represents a single suggested value. diff --git a/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php b/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php index 11fc70a68..f42b186f0 100644 --- a/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php +++ b/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console; +namespace RectorPrefix202411\Symfony\Component\Console; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleCommandEvent; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleErrorEvent; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleSignalEvent; -use RectorPrefix202410\Symfony\Component\Console\Event\ConsoleTerminateEvent; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleCommandEvent; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleErrorEvent; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleSignalEvent; +use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleTerminateEvent; /** * Contains all events dispatched by an Application. * diff --git a/vendor/rector/rector/vendor/symfony/console/Cursor.php b/vendor/rector/rector/vendor/symfony/console/Cursor.php index 846a86c04..7c9d35bb8 100644 --- a/vendor/rector/rector/vendor/symfony/console/Cursor.php +++ b/vendor/rector/rector/vendor/symfony/console/Cursor.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console; +namespace RectorPrefix202411\Symfony\Component\Console; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Pierre du Plessis */ diff --git a/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php b/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php index 3e3310576..1882b6dd1 100644 --- a/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php +++ b/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php @@ -8,16 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\DataCollector; +namespace RectorPrefix202411\Symfony\Component\Console\DataCollector; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Debug\CliRequest; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\SignalRegistry\SignalMap; -use RectorPrefix202410\Symfony\Component\HttpFoundation\Request; -use RectorPrefix202410\Symfony\Component\HttpFoundation\Response; -use RectorPrefix202410\Symfony\Component\HttpKernel\DataCollector\DataCollector; -use RectorPrefix202410\Symfony\Component\VarDumper\Cloner\Data; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Debug\CliRequest; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\SignalRegistry\SignalMap; +use RectorPrefix202411\Symfony\Component\HttpFoundation\Request; +use RectorPrefix202411\Symfony\Component\HttpFoundation\Response; +use RectorPrefix202411\Symfony\Component\HttpKernel\DataCollector\DataCollector; +use RectorPrefix202411\Symfony\Component\VarDumper\Cloner\Data; /** * @internal * diff --git a/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php b/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php index d85757a86..6d22a589c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php +++ b/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Debug; +namespace RectorPrefix202411\Symfony\Component\Console\Debug; -use RectorPrefix202410\Symfony\Component\Console\Command\TraceableCommand; -use RectorPrefix202410\Symfony\Component\HttpFoundation\Request; -use RectorPrefix202410\Symfony\Component\HttpFoundation\Response; +use RectorPrefix202411\Symfony\Component\Console\Command\TraceableCommand; +use RectorPrefix202411\Symfony\Component\HttpFoundation\Request; +use RectorPrefix202411\Symfony\Component\HttpFoundation\Response; /** * @internal */ diff --git a/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php index 1f5be2939..58335bc4e 100644 --- a/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +++ b/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php @@ -8,18 +8,18 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\DependencyInjection; +namespace RectorPrefix202411\Symfony\Component\Console\DependencyInjection; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Command\LazyCommand; -use RectorPrefix202410\Symfony\Component\Console\CommandLoader\ContainerCommandLoader; -use RectorPrefix202410\Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use RectorPrefix202410\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use RectorPrefix202410\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; -use RectorPrefix202410\Symfony\Component\DependencyInjection\ContainerBuilder; -use RectorPrefix202410\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\DependencyInjection\Reference; -use RectorPrefix202410\Symfony\Component\DependencyInjection\TypedReference; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Command\LazyCommand; +use RectorPrefix202411\Symfony\Component\Console\CommandLoader\ContainerCommandLoader; +use RectorPrefix202411\Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; +use RectorPrefix202411\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use RectorPrefix202411\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use RectorPrefix202411\Symfony\Component\DependencyInjection\ContainerBuilder; +use RectorPrefix202411\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\DependencyInjection\Reference; +use RectorPrefix202411\Symfony\Component\DependencyInjection\TypedReference; /** * Registers console commands. * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php index 703444b69..2bde48b4b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; /** * @author Jean-François Simon * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php index 5de43aade..1c2f5c016 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Jean-François Simon * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php index 3a99a53df..777465324 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Descriptor interface. * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php index 42bc8cdef..69c751f7a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; /** * JSON descriptor. * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php index 1588deacb..6419ab188 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Markdown descriptor. * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php index 155aa5a6f..ff2a35a1f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php @@ -8,16 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\String\UnicodeString; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\String\UnicodeString; class ReStructuredTextDescriptor extends Descriptor { //

diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php index ee2b5ccb5..b1bfc0bcf 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; /** * Text descriptor. * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php index 684a503b9..8760d717c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; /** * XML descriptor. * diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php b/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php index c6d777da1..4af29ce06 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * Represents an incorrect command name typed in the console. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php b/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php index 649dd1c8c..8f206d6ba 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * ExceptionInterface. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php index 5d0ba69b5..184a3fba2 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php index 755499e90..22299b70d 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * Represents an incorrect option name or value typed in the console. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php b/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php index 90719f99b..999549f9b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php b/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php index baeac115d..d478e4c7e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * Represents failure to read input from stdin. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php b/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php index 70431edf2..1a6c58f2d 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * Represents an incorrect namespace typed in the console. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php b/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php index 83b18979a..e72fb3343 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; -use RectorPrefix202410\Symfony\Component\Console\Messenger\RunCommandContext; +use RectorPrefix202411\Symfony\Component\Console\Messenger\RunCommandContext; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php index a63b4e347..cf53f0e31 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Exception; +namespace RectorPrefix202411\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php index e17eee015..24abc9dbf 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; /** * @author Tien Xuan Vo diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php index f5cd8984d..8190f899f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; /** * @author Tien Xuan Vo diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php index 6f7da50a1..2e634fc72 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use function RectorPrefix202410\Symfony\Component\String\b; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use function RectorPrefix202411\Symfony\Component\String\b; /** * Formatter class for console output. * diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php index 7a233d263..5861884a8 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; /** * Formatter interface for console output. diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php index 5228e8646..b449e74c5 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; -use RectorPrefix202410\Symfony\Component\Console\Color; +use RectorPrefix202411\Symfony\Component\Console\Color; /** * Formatter style class for defining styles. * diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php index c21bbf401..fb441251d 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; /** * Formatter style interface for defining styles. diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php index d8641e59f..21e632809 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Contracts\Service\ResetInterface; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Contracts\Service\ResetInterface; /** * @author Jean-François Simon */ diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php b/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php index 9a72c3f3b..9f96a8430 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Formatter; +namespace RectorPrefix202411\Symfony\Component\Console\Formatter; /** * Formatter interface for console output that supports word wrapping. diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php index ad906d891..7d90acdb7 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; /** * Helps outputting debug information when running an external program from a command. diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php index b89300927..3db8ec92a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php @@ -8,16 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Descriptor\DescriptorInterface; -use RectorPrefix202410\Symfony\Component\Console\Descriptor\JsonDescriptor; -use RectorPrefix202410\Symfony\Component\Console\Descriptor\MarkdownDescriptor; -use RectorPrefix202410\Symfony\Component\Console\Descriptor\ReStructuredTextDescriptor; -use RectorPrefix202410\Symfony\Component\Console\Descriptor\TextDescriptor; -use RectorPrefix202410\Symfony\Component\Console\Descriptor\XmlDescriptor; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Descriptor\DescriptorInterface; +use RectorPrefix202411\Symfony\Component\Console\Descriptor\JsonDescriptor; +use RectorPrefix202411\Symfony\Component\Console\Descriptor\MarkdownDescriptor; +use RectorPrefix202411\Symfony\Component\Console\Descriptor\ReStructuredTextDescriptor; +use RectorPrefix202411\Symfony\Component\Console\Descriptor\TextDescriptor; +use RectorPrefix202411\Symfony\Component\Console\Descriptor\XmlDescriptor; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * This class adds helper method to describe objects in various formats. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php b/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php index 7fef0ef07..d5a34600b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\VarDumper\Cloner\ClonerInterface; -use RectorPrefix202410\Symfony\Component\VarDumper\Cloner\VarCloner; -use RectorPrefix202410\Symfony\Component\VarDumper\Dumper\CliDumper; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\VarDumper\Cloner\ClonerInterface; +use RectorPrefix202411\Symfony\Component\VarDumper\Cloner\VarCloner; +use RectorPrefix202411\Symfony\Component\VarDumper\Dumper\CliDumper; /** * @author Roland Franssen */ diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php index 87d7beb42..a071ec188 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; /** * The Formatter class provides helpers to format messages. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php b/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php index 15d208c06..23231a5cd 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; -use RectorPrefix202410\Symfony\Component\String\UnicodeString; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\String\UnicodeString; /** * Helper is the base class for all helper classes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php b/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php index a112548cc..9e802d471 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; /** * HelperInterface is the interface all helpers must implement. diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php b/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php index 27391278d..05c687023 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; /** * HelperSet represents a set of helpers to be used with a command. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php index 8c6066b38..cc739c8cf 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Input\InputAwareInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputAwareInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; /** * An implementation of InputAwareInterface for Helpers. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php b/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php index 0a410127c..e5175cd99 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; /** * Simple output wrapper for "tagged outputs" instead of wordwrap(). This solution is based on a StackOverflow diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php index 91b8d8dc4..c9e3f0533 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Process\Exception\ProcessFailedException; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessFailedException; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * The ProcessHelper class provides helpers to run external processes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php index 7bded0741..b97670fc0 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Cursor; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Terminal; +use RectorPrefix202411\Symfony\Component\Console\Cursor; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Terminal; /** * The ProgressBar provides helpers to display progress output. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php index 64a0457b6..1a85e306a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php index f2e961d14..160129d23 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php @@ -8,22 +8,22 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Cursor; -use RectorPrefix202410\Symfony\Component\Console\Exception\MissingInputException; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterStyle; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\StreamableInputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Question\ChoiceQuestion; -use RectorPrefix202410\Symfony\Component\Console\Question\Question; -use RectorPrefix202410\Symfony\Component\Console\Terminal; -use function RectorPrefix202410\Symfony\Component\String\s; +use RectorPrefix202411\Symfony\Component\Console\Cursor; +use RectorPrefix202411\Symfony\Component\Console\Exception\MissingInputException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterStyle; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\StreamableInputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Question\ChoiceQuestion; +use RectorPrefix202411\Symfony\Component\Console\Question\Question; +use RectorPrefix202411\Symfony\Component\Console\Terminal; +use function RectorPrefix202411\Symfony\Component\String\s; /** * The QuestionHelper class provides helpers to interact with the user. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php index a719aa14e..b854b2971 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Question\ChoiceQuestion; -use RectorPrefix202410\Symfony\Component\Console\Question\ConfirmationQuestion; -use RectorPrefix202410\Symfony\Component\Console\Question\Question; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Question\ChoiceQuestion; +use RectorPrefix202411\Symfony\Component\Console\Question\ConfirmationQuestion; +use RectorPrefix202411\Symfony\Component\Console\Question\Question; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; /** * Symfony Style Guide compliant question helper. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/Table.php b/vendor/rector/rector/vendor/symfony/console/Helper/Table.php index 1e7a6b3cb..84c76164f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/Table.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/Table.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Provides helpers to display a table. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php index 5239c2ddf..e02c7476c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Abdellatif Ait boudad */ diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php index 8d0928408..77c459b29 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Yewhen Khoptynskyi */ diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php index e48c04bd8..5254f307e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; /** * @internal diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php index 07f3f1f76..5974741ea 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; /** * Marks a row as being a separator. diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php index fa32b13b2..53e8a1814 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Helper; +namespace RectorPrefix202411\Symfony\Component\Console\Helper; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; /** * Defines the styles for a Table. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php b/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php index 743926b6c..aba785517 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; /** * ArgvInput represents an input coming from the CLI arguments. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php b/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php index fda304485..f1ae5220f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidOptionException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidOptionException; /** * ArrayInput represents an input provided as an array. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/Input.php b/vendor/rector/rector/vendor/symfony/console/Input/Input.php index 06b66c818..566c54aa5 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/Input.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/Input.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; /** * Input is the base class for all concrete Input classes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php b/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php index f523be7d1..bb68479d7 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; /** * Represents a command line argument. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php b/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php index a04e48cc4..9a5f23fcf 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; /** * InputAwareInterface should be implemented by classes that depends on the diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php b/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php index 971b5c283..f4ffc3b7b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; /** * A InputDefinition represents a set of valid command line arguments and options. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php b/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php index d0993c98b..759ffa2da 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; /** * InputInterface is the interface implemented by all input classes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php b/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php index abbc9b33f..d35c4da56 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; /** * Represents a command line option. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php b/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php index f5d75b6fc..f11e390f0 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; /** * StreamableInputInterface is the interface implemented by all input classes diff --git a/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php b/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php index ff1eba2d9..04f4cc2c5 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Input; +namespace RectorPrefix202411\Symfony\Component\Console\Input; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; /** * StringInput represents an input provided as a string. * diff --git a/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php b/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php index 759f71bc8..06eaaf908 100644 --- a/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php +++ b/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Logger; +namespace RectorPrefix202411\Symfony\Component\Console\Logger; -use RectorPrefix202410\Psr\Log\AbstractLogger; -use RectorPrefix202410\Psr\Log\InvalidArgumentException; -use RectorPrefix202410\Psr\Log\LogLevel; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Psr\Log\AbstractLogger; +use RectorPrefix202411\Psr\Log\InvalidArgumentException; +use RectorPrefix202411\Psr\Log\LogLevel; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * PSR-3 compliant console logger. * diff --git a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php index 60b89d5f0..45f6da0aa 100644 --- a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php +++ b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Messenger; +namespace RectorPrefix202411\Symfony\Component\Console\Messenger; /** * @author Kevin Bond diff --git a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php index 2e981691e..259961006 100644 --- a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php +++ b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Messenger; +namespace RectorPrefix202411\Symfony\Component\Console\Messenger; -use RectorPrefix202410\Symfony\Component\Console\Exception\RunCommandFailedException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RunCommandFailedException; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php index 106b25b84..b3cc1d462 100644 --- a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php +++ b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Messenger; +namespace RectorPrefix202411\Symfony\Component\Console\Messenger; -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Exception\RunCommandFailedException; -use RectorPrefix202410\Symfony\Component\Console\Input\StringInput; -use RectorPrefix202410\Symfony\Component\Console\Output\BufferedOutput; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Exception\RunCommandFailedException; +use RectorPrefix202411\Symfony\Component\Console\Input\StringInput; +use RectorPrefix202411\Symfony\Component\Console\Output\BufferedOutput; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php b/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php index 3f540f668..97ff4b80c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; class AnsiColorMode { public const Ansi4 = 'ansi4'; diff --git a/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php index d135ac8e0..64980ffbb 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; /** * @author Jean-François Simon diff --git a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php index 472cc42a1..a8ca03c0a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR. * diff --git a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php index 315ae392e..f8d36d5d9 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; /** * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. diff --git a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php index e759414f7..ae18ee0b1 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; -use RectorPrefix202410\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202410\Symfony\Component\Console\Terminal; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202411\Symfony\Component\Console\Terminal; /** * @author Pierre du Plessis * @author Gabriel Ostrolucký diff --git a/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php index db030ec11..1d848d655 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Formatter\NullOutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Formatter\NullOutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * NullOutput suppresses all output. * diff --git a/vendor/rector/rector/vendor/symfony/console/Output/Output.php b/vendor/rector/rector/vendor/symfony/console/Output/Output.php index b8e2a9757..c2d3a0a4e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/Output.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/Output.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * Base class for output classes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php b/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php index ed64411e9..651edfce1 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * OutputInterface is the interface implemented by all Output classes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php index 7178e3eaa..ea3cf26ce 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * StreamOutput writes the output to a given stream. * diff --git a/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php index acca9c208..5571338ab 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Output; +namespace RectorPrefix202411\Symfony\Component\Console\Output; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * A BufferedOutput that keeps only the last N chars. * diff --git a/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php b/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php index 963284306..2071649b3 100644 --- a/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php +++ b/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Question; +namespace RectorPrefix202411\Symfony\Component\Console\Question; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; /** * Represents a choice question. * diff --git a/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php b/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php index 5360d1420..a18ee5686 100644 --- a/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php +++ b/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Question; +namespace RectorPrefix202411\Symfony\Component\Console\Question; /** * Represents a yes/no question. diff --git a/vendor/rector/rector/vendor/symfony/console/Question/Question.php b/vendor/rector/rector/vendor/symfony/console/Question/Question.php index 6de89cfca..67a55c24e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Question/Question.php +++ b/vendor/rector/rector/vendor/symfony/console/Question/Question.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Question; +namespace RectorPrefix202411\Symfony\Component\Console\Question; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; /** * Represents a Question. * diff --git a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php index 4b8596948..925aa5a4e 100644 --- a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php +++ b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\SignalRegistry; +namespace RectorPrefix202411\Symfony\Component\Console\SignalRegistry; /** * @author Grégoire Pineau diff --git a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php index 9ded1ce8c..dfb4a1e1d 100644 --- a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php +++ b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\SignalRegistry; +namespace RectorPrefix202411\Symfony\Component\Console\SignalRegistry; final class SignalRegistry { diff --git a/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php b/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php index e7db8173d..ee2b7bf89 100644 --- a/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php +++ b/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console; +namespace RectorPrefix202411\Symfony\Component\Console; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * @author Grégoire Pineau */ diff --git a/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php b/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php index 361d25185..62add6fff 100644 --- a/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Style; +namespace RectorPrefix202411\Symfony\Component\Console\Style; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatterInterface; -use RectorPrefix202410\Symfony\Component\Console\Helper\ProgressBar; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202411\Symfony\Component\Console\Helper\ProgressBar; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; /** * Decorates output to add console style guide helpers. * diff --git a/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php b/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php index 5e2b64c0f..1566ffa13 100644 --- a/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Style; +namespace RectorPrefix202411\Symfony\Component\Console\Style; /** * Output style helpers. diff --git a/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php index 14ad54c90..03e77ca3e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php @@ -8,27 +8,27 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console\Style; +namespace RectorPrefix202411\Symfony\Component\Console\Style; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202410\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202410\Symfony\Component\Console\Helper\OutputWrapper; -use RectorPrefix202410\Symfony\Component\Console\Helper\ProgressBar; -use RectorPrefix202410\Symfony\Component\Console\Helper\SymfonyQuestionHelper; -use RectorPrefix202410\Symfony\Component\Console\Helper\Table; -use RectorPrefix202410\Symfony\Component\Console\Helper\TableCell; -use RectorPrefix202410\Symfony\Component\Console\Helper\TableSeparator; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Output\TrimmedBufferOutput; -use RectorPrefix202410\Symfony\Component\Console\Question\ChoiceQuestion; -use RectorPrefix202410\Symfony\Component\Console\Question\ConfirmationQuestion; -use RectorPrefix202410\Symfony\Component\Console\Question\Question; -use RectorPrefix202410\Symfony\Component\Console\Terminal; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202411\Symfony\Component\Console\Helper\OutputWrapper; +use RectorPrefix202411\Symfony\Component\Console\Helper\ProgressBar; +use RectorPrefix202411\Symfony\Component\Console\Helper\SymfonyQuestionHelper; +use RectorPrefix202411\Symfony\Component\Console\Helper\Table; +use RectorPrefix202411\Symfony\Component\Console\Helper\TableCell; +use RectorPrefix202411\Symfony\Component\Console\Helper\TableSeparator; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Output\TrimmedBufferOutput; +use RectorPrefix202411\Symfony\Component\Console\Question\ChoiceQuestion; +use RectorPrefix202411\Symfony\Component\Console\Question\ConfirmationQuestion; +use RectorPrefix202411\Symfony\Component\Console\Question\Question; +use RectorPrefix202411\Symfony\Component\Console\Terminal; /** * Output decorator helpers for the Symfony Style Guide. * diff --git a/vendor/rector/rector/vendor/symfony/console/Terminal.php b/vendor/rector/rector/vendor/symfony/console/Terminal.php index 17feb7a92..c9a521f3f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Terminal.php +++ b/vendor/rector/rector/vendor/symfony/console/Terminal.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Console; +namespace RectorPrefix202411\Symfony\Component\Console; -use RectorPrefix202410\Symfony\Component\Console\Output\AnsiColorMode; +use RectorPrefix202411\Symfony\Component\Console\Output\AnsiColorMode; class Terminal { public const DEFAULT_COLOR_MODE = AnsiColorMode::Ansi4; @@ -193,7 +193,7 @@ private static function readFromProcess($command) : ?string } $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; $cp = \function_exists('sapi_windows_cp_set') ? \sapi_windows_cp_get() : 0; - if (!($process = \proc_open(\is_array($command) ? \implode(' ', \array_map('escapeshellarg', $command)) : $command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]))) { + if (!($process = @\proc_open(\is_array($command) ? \implode(' ', \array_map('escapeshellarg', $command)) : $command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]))) { return null; } $info = \stream_get_contents($pipes[1]); diff --git a/vendor/rector/rector/vendor/symfony/console/composer.json b/vendor/rector/rector/vendor/symfony/console/composer.json index 709f84c9e..d49732db0 100644 --- a/vendor/rector/rector/vendor/symfony/console/composer.json +++ b/vendor/rector/rector/vendor/symfony/console/composer.json @@ -52,7 +52,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Console\\": "" + "RectorPrefix202411\\Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php b/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php index 01ad89154..6852f8e03 100644 --- a/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php +++ b/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php @@ -1,6 +1,6 @@ diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php index ec473a30c..026947997 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Filesystem\Exception; +namespace RectorPrefix202411\Symfony\Component\Filesystem\Exception; /** * @author Théo Fidry diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php b/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php index d31b26c20..056647442 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Filesystem; +namespace RectorPrefix202411\Symfony\Component\Filesystem; -use RectorPrefix202410\Symfony\Component\Filesystem\Exception\FileNotFoundException; -use RectorPrefix202410\Symfony\Component\Filesystem\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Filesystem\Exception\IOException; +use RectorPrefix202411\Symfony\Component\Filesystem\Exception\FileNotFoundException; +use RectorPrefix202411\Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Filesystem\Exception\IOException; /** * Provides basic utility to manipulate the file system. * @@ -44,7 +44,7 @@ public function copy(string $originFile, string $targetFile, bool $overwriteNewe } $this->mkdir(\dirname($targetFile)); $doCopy = \true; - if (!$overwriteNewerFiles && null === \parse_url($originFile, \PHP_URL_HOST) && \is_file($targetFile)) { + if (!$overwriteNewerFiles && !\parse_url($originFile, \PHP_URL_HOST) && \is_file($targetFile)) { $doCopy = \filemtime($originFile) > \filemtime($targetFile); } if ($doCopy) { @@ -212,6 +212,7 @@ public function chmod($files, int $mode, int $umask = 00, bool $recursive = \fal * Change the owner of an array of files or directories. * * This method always throws on Windows, as the underlying PHP function is not supported. + * * @see https://www.php.net/chown * * @param string|int $user A user name or number @@ -243,6 +244,7 @@ public function chown($files, $user, bool $recursive = \false) * Change the group of an array of files or directories. * * This method always throws on Windows, as the underlying PHP function is not supported. + * * @see https://www.php.net/chgrp * * @param string|int $group A group name or number diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Path.php b/vendor/rector/rector/vendor/symfony/filesystem/Path.php index b9fa7c960..9137dc9ea 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Path.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Path.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Filesystem; +namespace RectorPrefix202411\Symfony\Component\Filesystem; -use RectorPrefix202410\Symfony\Component\Filesystem\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Filesystem\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Filesystem\Exception\RuntimeException; /** * Contains utility methods for handling path strings. * diff --git a/vendor/rector/rector/vendor/symfony/filesystem/composer.json b/vendor/rector/rector/vendor/symfony/filesystem/composer.json index 8e03be27c..9d9cb3ef7 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/composer.json +++ b/vendor/rector/rector/vendor/symfony/filesystem/composer.json @@ -25,7 +25,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Filesystem\\": "" + "RectorPrefix202411\\Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php b/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php index e3adac9f5..7d5dee03f 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Comparator; +namespace RectorPrefix202411\Symfony\Component\Finder\Comparator; /** * @author Fabien Potencier diff --git a/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php b/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php index d7417d04a..28ab81ba3 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Comparator; +namespace RectorPrefix202411\Symfony\Component\Finder\Comparator; /** * DateCompare compiles date comparisons. diff --git a/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php b/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php index 33d8f7904..4c8c276ad 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Comparator; +namespace RectorPrefix202411\Symfony\Component\Finder\Comparator; /** * NumberComparator compiles a simple comparison to an anonymous diff --git a/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php b/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php index 9957e100e..1e8cb11e8 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php +++ b/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Exception; +namespace RectorPrefix202411\Symfony\Component\Finder\Exception; /** * @author Jean-François Simon diff --git a/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php b/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php index 5bfd1c5a5..aac16801f 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php +++ b/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Exception; +namespace RectorPrefix202411\Symfony\Component\Finder\Exception; /** * @author Andreas Erhard diff --git a/vendor/rector/rector/vendor/symfony/finder/Finder.php b/vendor/rector/rector/vendor/symfony/finder/Finder.php index 246f82b20..93626dca6 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Finder.php +++ b/vendor/rector/rector/vendor/symfony/finder/Finder.php @@ -8,20 +8,20 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder; +namespace RectorPrefix202411\Symfony\Component\Finder; -use RectorPrefix202410\Symfony\Component\Finder\Comparator\DateComparator; -use RectorPrefix202410\Symfony\Component\Finder\Comparator\NumberComparator; -use RectorPrefix202410\Symfony\Component\Finder\Exception\DirectoryNotFoundException; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\CustomFilterIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\DateRangeFilterIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\FilecontentFilterIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\FilenameFilterIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\LazyIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; -use RectorPrefix202410\Symfony\Component\Finder\Iterator\SortableIterator; +use RectorPrefix202411\Symfony\Component\Finder\Comparator\DateComparator; +use RectorPrefix202411\Symfony\Component\Finder\Comparator\NumberComparator; +use RectorPrefix202411\Symfony\Component\Finder\Exception\DirectoryNotFoundException; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\CustomFilterIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\DateRangeFilterIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\FilecontentFilterIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\FilenameFilterIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\LazyIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; +use RectorPrefix202411\Symfony\Component\Finder\Iterator\SortableIterator; /** * Finder allows to build rules to find files and directories. * diff --git a/vendor/rector/rector/vendor/symfony/finder/Gitignore.php b/vendor/rector/rector/vendor/symfony/finder/Gitignore.php index 372fbc58e..e0a633171 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Gitignore.php +++ b/vendor/rector/rector/vendor/symfony/finder/Gitignore.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder; +namespace RectorPrefix202411\Symfony\Component\Finder; /** * Gitignore matches against text. diff --git a/vendor/rector/rector/vendor/symfony/finder/Glob.php b/vendor/rector/rector/vendor/symfony/finder/Glob.php index 64fcc9882..535643c35 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Glob.php +++ b/vendor/rector/rector/vendor/symfony/finder/Glob.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder; +namespace RectorPrefix202411\Symfony\Component\Finder; /** * Glob matches globbing patterns against text. diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/CustomFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/CustomFilterIterator.php index c2c2b59ba..6ac8b712d 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/CustomFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/CustomFilterIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; /** * CustomFilterIterator filters files by applying anonymous functions. diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php index 2a35c5bf1..ca117157d 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\Comparator\DateComparator; +use RectorPrefix202411\Symfony\Component\Finder\Comparator\DateComparator; /** * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates). * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php index a97f25c74..d1a6caae0 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; /** * DepthRangeFilterIterator limits the directory depth. diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php index 6fbe79829..08adee9af 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; /** * ExcludeDirectoryFilterIterator filters out directories. * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php index e94b62402..414bc1c32 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; /** * FileTypeFilterIterator only keeps files, directories, or both. diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php index 79fc5f43a..cdddea993 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; /** * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings). * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php index 738a1220c..2527abaa6 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\Glob; +use RectorPrefix202411\Symfony\Component\Finder\Glob; /** * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string). * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php index 9742a38f2..60fd79492 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; /** * @author Jérémy Derussé diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php index ed76ecd24..82749e3c7 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; /** * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings). diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php index e961bdf41..c46edbae2 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; /** * PathFilterIterator filters files by path patterns (e.g. some/special/dir). * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php index d794cb8f2..d510527bb 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\Exception\AccessDeniedException; -use RectorPrefix202410\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202411\Symfony\Component\Finder\Exception\AccessDeniedException; +use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; /** * Extends the \RecursiveDirectoryIterator to support relative paths. * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php index 76f720e86..628ddd141 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\Comparator\NumberComparator; +use RectorPrefix202411\Symfony\Component\Finder\Comparator\NumberComparator; /** * SizeRangeFilterIterator filters out files that are not in the given size range. * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php index 976c3e25d..fc3cb50b3 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; /** * SortableIterator applies a sort on a given Iterator. diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php index ff0469e24..8dbddf3c2 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; -use RectorPrefix202410\Symfony\Component\Finder\Gitignore; +use RectorPrefix202411\Symfony\Component\Finder\Gitignore; /** * @extends \FilterIterator */ diff --git a/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php b/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php index e05322c45..ccf4f71b8 100644 --- a/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php +++ b/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Finder; +namespace RectorPrefix202411\Symfony\Component\Finder; /** * Extends \SplFileInfo to support relative paths. diff --git a/vendor/rector/rector/vendor/symfony/finder/composer.json b/vendor/rector/rector/vendor/symfony/finder/composer.json index 1ed5e3a70..049d086ee 100644 --- a/vendor/rector/rector/vendor/symfony/finder/composer.json +++ b/vendor/rector/rector/vendor/symfony/finder/composer.json @@ -23,7 +23,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Finder\\": "" + "RectorPrefix202411\\Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php index 668ad7606..a05a85c53 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php @@ -1,5 +1,5 @@ 'i̇', 'µ' => 'μ', 'ſ' => 's', 'ͅ' => 'ι', 'ς' => 'σ', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϵ' => 'ε', 'ẛ' => 'ṡ', 'ι' => 'ι', 'ß' => 'ss', 'ʼn' => 'ʼn', 'ǰ' => 'ǰ', 'ΐ' => 'ΐ', 'ΰ' => 'ΰ', 'և' => 'եւ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẚ' => 'aʾ', 'ẞ' => 'ss', 'ὐ' => 'ὐ', 'ὒ' => 'ὒ', 'ὔ' => 'ὔ', 'ὖ' => 'ὖ', 'ᾀ' => 'ἀι', 'ᾁ' => 'ἁι', 'ᾂ' => 'ἂι', 'ᾃ' => 'ἃι', 'ᾄ' => 'ἄι', 'ᾅ' => 'ἅι', 'ᾆ' => 'ἆι', 'ᾇ' => 'ἇι', 'ᾈ' => 'ἀι', 'ᾉ' => 'ἁι', 'ᾊ' => 'ἂι', 'ᾋ' => 'ἃι', 'ᾌ' => 'ἄι', 'ᾍ' => 'ἅι', 'ᾎ' => 'ἆι', 'ᾏ' => 'ἇι', 'ᾐ' => 'ἠι', 'ᾑ' => 'ἡι', 'ᾒ' => 'ἢι', 'ᾓ' => 'ἣι', 'ᾔ' => 'ἤι', 'ᾕ' => 'ἥι', 'ᾖ' => 'ἦι', 'ᾗ' => 'ἧι', 'ᾘ' => 'ἠι', 'ᾙ' => 'ἡι', 'ᾚ' => 'ἢι', 'ᾛ' => 'ἣι', 'ᾜ' => 'ἤι', 'ᾝ' => 'ἥι', 'ᾞ' => 'ἦι', 'ᾟ' => 'ἧι', 'ᾠ' => 'ὠι', 'ᾡ' => 'ὡι', 'ᾢ' => 'ὢι', 'ᾣ' => 'ὣι', 'ᾤ' => 'ὤι', 'ᾥ' => 'ὥι', 'ᾦ' => 'ὦι', 'ᾧ' => 'ὧι', 'ᾨ' => 'ὠι', 'ᾩ' => 'ὡι', 'ᾪ' => 'ὢι', 'ᾫ' => 'ὣι', 'ᾬ' => 'ὤι', 'ᾭ' => 'ὥι', 'ᾮ' => 'ὦι', 'ᾯ' => 'ὧι', 'ᾲ' => 'ὰι', 'ᾳ' => 'αι', 'ᾴ' => 'άι', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾶι', 'ᾼ' => 'αι', 'ῂ' => 'ὴι', 'ῃ' => 'ηι', 'ῄ' => 'ήι', 'ῆ' => 'ῆ', 'ῇ' => 'ῆι', 'ῌ' => 'ηι', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'ῲ' => 'ὼι', 'ῳ' => 'ωι', 'ῴ' => 'ώι', 'ῶ' => 'ῶ', 'ῷ' => 'ῶι', 'ῼ' => 'ωι', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ']; diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php index c1daf7d47..82640f4e6 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -1,5 +1,5 @@ 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i̇', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃'); diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php index ac21c79ba..4d6d87faa 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -1,6 +1,6 @@ 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ἈΙ', 'ᾁ' => 'ἉΙ', 'ᾂ' => 'ἊΙ', 'ᾃ' => 'ἋΙ', 'ᾄ' => 'ἌΙ', 'ᾅ' => 'ἍΙ', 'ᾆ' => 'ἎΙ', 'ᾇ' => 'ἏΙ', 'ᾐ' => 'ἨΙ', 'ᾑ' => 'ἩΙ', 'ᾒ' => 'ἪΙ', 'ᾓ' => 'ἫΙ', 'ᾔ' => 'ἬΙ', 'ᾕ' => 'ἭΙ', 'ᾖ' => 'ἮΙ', 'ᾗ' => 'ἯΙ', 'ᾠ' => 'ὨΙ', 'ᾡ' => 'ὩΙ', 'ᾢ' => 'ὪΙ', 'ᾣ' => 'ὫΙ', 'ᾤ' => 'ὬΙ', 'ᾥ' => 'ὭΙ', 'ᾦ' => 'ὮΙ', 'ᾧ' => 'ὯΙ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ΑΙ', 'ι' => 'Ι', 'ῃ' => 'ΗΙ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ΩΙ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', 'ß' => 'SS', 'ff' => 'FF', 'fi' => 'FI', 'fl' => 'FL', 'ffi' => 'FFI', 'ffl' => 'FFL', 'ſt' => 'ST', 'st' => 'ST', 'և' => 'ԵՒ', 'ﬓ' => 'ՄՆ', 'ﬔ' => 'ՄԵ', 'ﬕ' => 'ՄԻ', 'ﬖ' => 'ՎՆ', 'ﬗ' => 'ՄԽ', 'ʼn' => 'ʼN', 'ΐ' => 'Ϊ́', 'ΰ' => 'Ϋ́', 'ǰ' => 'J̌', 'ẖ' => 'H̱', 'ẗ' => 'T̈', 'ẘ' => 'W̊', 'ẙ' => 'Y̊', 'ẚ' => 'Aʾ', 'ὐ' => 'Υ̓', 'ὒ' => 'Υ̓̀', 'ὔ' => 'Υ̓́', 'ὖ' => 'Υ̓͂', 'ᾶ' => 'Α͂', 'ῆ' => 'Η͂', 'ῒ' => 'Ϊ̀', 'ΐ' => 'Ϊ́', 'ῖ' => 'Ι͂', 'ῗ' => 'Ϊ͂', 'ῢ' => 'Ϋ̀', 'ΰ' => 'Ϋ́', 'ῤ' => 'Ρ̓', 'ῦ' => 'Υ͂', 'ῧ' => 'Ϋ͂', 'ῶ' => 'Ω͂', 'ᾈ' => 'ἈΙ', 'ᾉ' => 'ἉΙ', 'ᾊ' => 'ἊΙ', 'ᾋ' => 'ἋΙ', 'ᾌ' => 'ἌΙ', 'ᾍ' => 'ἍΙ', 'ᾎ' => 'ἎΙ', 'ᾏ' => 'ἏΙ', 'ᾘ' => 'ἨΙ', 'ᾙ' => 'ἩΙ', 'ᾚ' => 'ἪΙ', 'ᾛ' => 'ἫΙ', 'ᾜ' => 'ἬΙ', 'ᾝ' => 'ἭΙ', 'ᾞ' => 'ἮΙ', 'ᾟ' => 'ἯΙ', 'ᾨ' => 'ὨΙ', 'ᾩ' => 'ὩΙ', 'ᾪ' => 'ὪΙ', 'ᾫ' => 'ὫΙ', 'ᾬ' => 'ὬΙ', 'ᾭ' => 'ὭΙ', 'ᾮ' => 'ὮΙ', 'ᾯ' => 'ὯΙ', 'ᾼ' => 'ΑΙ', 'ῌ' => 'ΗΙ', 'ῼ' => 'ΩΙ', 'ᾲ' => 'ᾺΙ', 'ᾴ' => 'ΆΙ', 'ῂ' => 'ῊΙ', 'ῄ' => 'ΉΙ', 'ῲ' => 'ῺΙ', 'ῴ' => 'ΏΙ', 'ᾷ' => 'Α͂Ι', 'ῇ' => 'Η͂Ι', 'ῷ' => 'Ω͂Ι'); diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php b/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php index 44fac05e9..8c5aea51f 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; /** * Marker Interface for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php b/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php index 7790c527d..d8e07addc 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; /** * InvalidArgumentException for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php b/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php index 0820de6f4..0717c68c4 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; /** * LogicException for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php index d5f9b3d23..371d572d8 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * Exception for failed processes. * diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php index 01d32617e..7f68d1de1 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * Exception that is thrown when a process has been signaled. * diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php index 46c43b5fd..68cd6195a 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * Exception that is thrown when a process times out. * diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php b/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php index 625a2a290..8c82d1cb4 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; -use RectorPrefix202410\Symfony\Component\Process\Messenger\RunProcessContext; +use RectorPrefix202411\Symfony\Component\Process\Messenger\RunProcessContext; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php index 215092ca5..a0745836f 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Exception; +namespace RectorPrefix202411\Symfony\Component\Process\Exception; /** * RuntimeException for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php b/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php index 777769401..a074fa54e 100644 --- a/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php +++ b/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process; +namespace RectorPrefix202411\Symfony\Component\Process; /** * Generic executable finder. @@ -18,10 +18,11 @@ */ class ExecutableFinder { + private const CMD_BUILTINS = ['assoc', 'break', 'call', 'cd', 'chdir', 'cls', 'color', 'copy', 'date', 'del', 'dir', 'echo', 'endlocal', 'erase', 'exit', 'for', 'ftype', 'goto', 'help', 'if', 'label', 'md', 'mkdir', 'mklink', 'move', 'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'rem', 'ren', 'rename', 'rmdir', 'set', 'setlocal', 'shift', 'start', 'time', 'title', 'type', 'ver', 'vol']; /** * @var mixed[] */ - private $suffixes = ['.exe', '.bat', '.cmd', '.com']; + private $suffixes = []; /** * Replaces default suffixes of executable. * @@ -49,14 +50,23 @@ public function addSuffix(string $suffix) */ public function find(string $name, ?string $default = null, array $extraDirs = []) : ?string { + // windows built-in commands that are present in cmd.exe should not be resolved using PATH as they do not exist as exes + if ('\\' === \DIRECTORY_SEPARATOR && \in_array(\strtolower($name), self::CMD_BUILTINS, \true)) { + return $name; + } $dirs = \array_merge(\explode(\PATH_SEPARATOR, \getenv('PATH') ?: \getenv('Path')), $extraDirs); - $suffixes = ['']; + $suffixes = []; if ('\\' === \DIRECTORY_SEPARATOR) { $pathExt = \getenv('PATHEXT'); - $suffixes = \array_merge($pathExt ? \explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); + $suffixes = $this->suffixes; + $suffixes = \array_merge($suffixes, $pathExt ? \explode(\PATH_SEPARATOR, $pathExt) : ['.exe', '.bat', '.cmd', '.com']); } + $suffixes = '' !== \pathinfo($name, \PATHINFO_EXTENSION) ? \array_merge([''], $suffixes) : \array_merge($suffixes, ['']); foreach ($suffixes as $suffix) { foreach ($dirs as $dir) { + if ('' === $dir) { + $dir = '.'; + } if (@\is_file($file = $dir . \DIRECTORY_SEPARATOR . $name . $suffix) && ('\\' === \DIRECTORY_SEPARATOR || @\is_executable($file))) { return $file; } @@ -65,8 +75,11 @@ public function find(string $name, ?string $default = null, array $extraDirs = [ } } } - $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v --'; - if (\function_exists('exec') && ($executablePath = \strtok(@\exec($command . ' ' . \escapeshellarg($name)), \PHP_EOL)) && @\is_executable($executablePath)) { + if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('exec') || \strlen($name) !== \strcspn($name, '/' . \DIRECTORY_SEPARATOR)) { + return $default; + } + $execResult = \exec('command -v -- ' . \escapeshellarg($name)); + if (($executablePath = \substr($execResult, 0, \strpos($execResult, \PHP_EOL) ?: null)) && @\is_executable($executablePath)) { return $executablePath; } return $default; diff --git a/vendor/rector/rector/vendor/symfony/process/InputStream.php b/vendor/rector/rector/vendor/symfony/process/InputStream.php index 510ed1ffe..83951fbb3 100644 --- a/vendor/rector/rector/vendor/symfony/process/InputStream.php +++ b/vendor/rector/rector/vendor/symfony/process/InputStream.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process; +namespace RectorPrefix202411\Symfony\Component\Process; -use RectorPrefix202410\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; /** * Provides a way to continuously write to the input of a Process until the InputStream is closed. * diff --git a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php index cbbadec86..c54489e78 100644 --- a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php +++ b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Messenger; +namespace RectorPrefix202411\Symfony\Component\Process\Messenger; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php index 50ba9251d..aaa15957e 100644 --- a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php +++ b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Messenger; +namespace RectorPrefix202411\Symfony\Component\Process\Messenger; /** * @author Kevin Bond diff --git a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php index f1a5486c2..4e7380d5c 100644 --- a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php +++ b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Messenger; +namespace RectorPrefix202411\Symfony\Component\Process\Messenger; -use RectorPrefix202410\Symfony\Component\Process\Exception\ProcessFailedException; -use RectorPrefix202410\Symfony\Component\Process\Exception\RunProcessFailedException; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessFailedException; +use RectorPrefix202411\Symfony\Component\Process\Exception\RunProcessFailedException; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php b/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php index 3556159d3..0625c35a5 100644 --- a/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php +++ b/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process; +namespace RectorPrefix202411\Symfony\Component\Process; /** * An executable finder specifically designed for the PHP executable. @@ -33,15 +33,8 @@ public function __construct() public function find(bool $includeArgs = \true) { if ($php = \getenv('PHP_BINARY')) { - if (!\is_executable($php)) { - $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v --'; - if (\function_exists('exec') && ($php = \strtok(\exec($command . ' ' . \escapeshellarg($php)), \PHP_EOL))) { - if (!\is_executable($php)) { - return \false; - } - } else { - return \false; - } + if (!\is_executable($php) && !($php = $this->executableFinder->find($php))) { + return \false; } if (@\is_dir($php)) { return \false; diff --git a/vendor/rector/rector/vendor/symfony/process/PhpProcess.php b/vendor/rector/rector/vendor/symfony/process/PhpProcess.php index 44fdbe777..38a10b3fb 100644 --- a/vendor/rector/rector/vendor/symfony/process/PhpProcess.php +++ b/vendor/rector/rector/vendor/symfony/process/PhpProcess.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process; +namespace RectorPrefix202411\Symfony\Component\Process; -use RectorPrefix202410\Symfony\Component\Process\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Process\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; /** * PhpProcess runs a PHP script in an independent process. * diff --git a/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php b/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php index c795af560..9425c1c2b 100644 --- a/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php +++ b/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process; +namespace RectorPrefix202411\Symfony\Component\Process; -use RectorPrefix202410\Symfony\Component\Process\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Process\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; /** * PhpSubprocess runs a PHP command as a subprocess while keeping the original php.ini settings. * diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php b/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php index 82acc4568..d9fc28c38 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Pipes; +namespace RectorPrefix202411\Symfony\Component\Process\Pipes; -use RectorPrefix202410\Symfony\Component\Process\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Process\Exception\InvalidArgumentException; /** * @author Romain Neutron * diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php b/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php index d0dfda0a5..7ed0478f1 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Pipes; +namespace RectorPrefix202411\Symfony\Component\Process\Pipes; /** * PipesInterface manages descriptors and pipes for the use of proc_open. diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php b/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php index b9cdc37f9..9ff4c4f8d 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Pipes; +namespace RectorPrefix202411\Symfony\Component\Process\Pipes; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * UnixPipes implementation uses unix pipes as handles. * diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php b/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php index 043ac3118..3d0566fe4 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process\Pipes; +namespace RectorPrefix202411\Symfony\Component\Process\Pipes; -use RectorPrefix202410\Symfony\Component\Process\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Process\Process; +use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Process\Process; /** * WindowsPipes implementation uses temporary files as handles. * diff --git a/vendor/rector/rector/vendor/symfony/process/Process.php b/vendor/rector/rector/vendor/symfony/process/Process.php index 88bb22419..22a4eafcf 100644 --- a/vendor/rector/rector/vendor/symfony/process/Process.php +++ b/vendor/rector/rector/vendor/symfony/process/Process.php @@ -8,16 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process; +namespace RectorPrefix202411\Symfony\Component\Process; -use RectorPrefix202410\Symfony\Component\Process\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Process\Exception\LogicException; -use RectorPrefix202410\Symfony\Component\Process\Exception\ProcessFailedException; -use RectorPrefix202410\Symfony\Component\Process\Exception\ProcessSignaledException; -use RectorPrefix202410\Symfony\Component\Process\Exception\ProcessTimedOutException; -use RectorPrefix202410\Symfony\Component\Process\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Process\Pipes\UnixPipes; -use RectorPrefix202410\Symfony\Component\Process\Pipes\WindowsPipes; +use RectorPrefix202411\Symfony\Component\Process\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Process\Exception\LogicException; +use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessFailedException; +use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessSignaledException; +use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessTimedOutException; +use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Process\Pipes\UnixPipes; +use RectorPrefix202411\Symfony\Component\Process\Pipes\WindowsPipes; /** * Process is a thin wrapper around proc_* functions to easily * start independent PHP processes. @@ -1394,7 +1394,12 @@ private function prepareWindowsCommandLine(string $cmd, array &$env) : string $env[$var] = $value; return $varCache[$m[0]] = '!' . $var . '!'; }, $cmd); - $cmd = 'cmd /V:ON /E:ON /D /C (' . \str_replace("\n", ' ', $cmd) . ')'; + static $comSpec; + if (!$comSpec && ($comSpec = (new ExecutableFinder())->find('cmd.exe'))) { + // Escape according to CommandLineToArgvW rules + $comSpec = '"' . \preg_replace('{(\\\\*+)"}', '$1$1\\"', $comSpec) . '"'; + } + $cmd = ($comSpec ?? 'cmd') . ' /V:ON /E:ON /D /C (' . \str_replace("\n", ' ', $cmd) . ')'; foreach ($this->processPipes->getFiles() as $offset => $filename) { $cmd .= ' ' . $offset . '>"' . $filename . '"'; } @@ -1436,7 +1441,7 @@ private function escapeArgument(?string $argument) : string if (\strpos($argument, "\x00") !== \false) { $argument = \str_replace("\x00", '?', $argument); } - if (!\preg_match('/[\\/()%!^"<>&|\\s]/', $argument)) { + if (!\preg_match('/[()%!^"<>&|\\s]/', $argument)) { return $argument; } $argument = \preg_replace('/(\\\\+)$/', '$1$1', $argument); diff --git a/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php b/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php index a9576dcd2..f3e4e3983 100644 --- a/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php +++ b/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Process; +namespace RectorPrefix202411\Symfony\Component\Process; -use RectorPrefix202410\Symfony\Component\Process\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Process\Exception\InvalidArgumentException; /** * ProcessUtils is a bunch of utility methods. * diff --git a/vendor/rector/rector/vendor/symfony/process/composer.json b/vendor/rector/rector/vendor/symfony/process/composer.json index b8c6f7b6b..14e3dcd67 100644 --- a/vendor/rector/rector/vendor/symfony/process/composer.json +++ b/vendor/rector/rector/vendor/symfony/process/composer.json @@ -20,7 +20,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Process\\": "" + "RectorPrefix202411\\Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php index 7cb46f2a3..1abe6b124 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service\Attribute; +namespace RectorPrefix202411\Symfony\Contracts\Service\Attribute; /** * A required dependency. diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php index aa88b88a0..a5796b424 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service\Attribute; +namespace RectorPrefix202411\Symfony\Contracts\Service\Attribute; -use RectorPrefix202410\Symfony\Contracts\Service\ServiceMethodsSubscriberTrait; -use RectorPrefix202410\Symfony\Contracts\Service\ServiceSubscriberInterface; +use RectorPrefix202411\Symfony\Contracts\Service\ServiceMethodsSubscriberTrait; +use RectorPrefix202411\Symfony\Contracts\Service\ServiceSubscriberInterface; /** * For use as the return value for {@see ServiceSubscriberInterface}. * diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php index c0542820d..482411a46 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service; +namespace RectorPrefix202411\Symfony\Contracts\Service; /** * Provides a way to reset an object to its initial state. diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php index 612d029a0..2edb9708a 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service; +namespace RectorPrefix202411\Symfony\Contracts\Service; /** * A ServiceProviderInterface that is also countable and iterable. diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php index 3c0d9bb1c..e8a146566 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service; +namespace RectorPrefix202411\Symfony\Contracts\Service; -use RectorPrefix202410\Psr\Container\ContainerExceptionInterface; -use RectorPrefix202410\Psr\Container\NotFoundExceptionInterface; +use RectorPrefix202411\Psr\Container\ContainerExceptionInterface; +use RectorPrefix202411\Psr\Container\NotFoundExceptionInterface; // Help opcache.preload discover always-needed symbols \class_exists(ContainerExceptionInterface::class); \class_exists(NotFoundExceptionInterface::class); diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php index 5b233e1ad..e6c615a09 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service; +namespace RectorPrefix202411\Symfony\Contracts\Service; -use RectorPrefix202410\Psr\Container\ContainerInterface; -use RectorPrefix202410\Symfony\Contracts\Service\Attribute\Required; -use RectorPrefix202410\Symfony\Contracts\Service\Attribute\SubscribedService; +use RectorPrefix202411\Psr\Container\ContainerInterface; +use RectorPrefix202411\Symfony\Contracts\Service\Attribute\Required; +use RectorPrefix202411\Symfony\Contracts\Service\Attribute\SubscribedService; /** * Implementation of ServiceSubscriberInterface that determines subscribed services * from methods that have the #[SubscribedService] attribute. diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php index 9c543ff90..bfb9356ae 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service; +namespace RectorPrefix202411\Symfony\Contracts\Service; -use RectorPrefix202410\Psr\Container\ContainerInterface; +use RectorPrefix202411\Psr\Container\ContainerInterface; /** * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. * diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php index 9f504c3d4..bdc63d95b 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service; +namespace RectorPrefix202411\Symfony\Contracts\Service; -use RectorPrefix202410\Symfony\Contracts\Service\Attribute\SubscribedService; +use RectorPrefix202411\Symfony\Contracts\Service\Attribute\SubscribedService; /** * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. * diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php index 9d7293a37..78d6aff1a 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Contracts\Service; +namespace RectorPrefix202411\Symfony\Contracts\Service; -use RectorPrefix202410\Psr\Container\ContainerInterface; -use RectorPrefix202410\Symfony\Contracts\Service\Attribute\Required; -use RectorPrefix202410\Symfony\Contracts\Service\Attribute\SubscribedService; +use RectorPrefix202411\Psr\Container\ContainerInterface; +use RectorPrefix202411\Symfony\Contracts\Service\Attribute\Required; +use RectorPrefix202411\Symfony\Contracts\Service\Attribute\SubscribedService; trigger_deprecation('symfony/contracts', 'v3.5', '"%s" is deprecated, use "ServiceMethodsSubscriberTrait" instead.', ServiceSubscriberTrait::class); /** * Implementation of ServiceSubscriberInterface that determines subscribed services diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/composer.json b/vendor/rector/rector/vendor/symfony/service-contracts/composer.json index 77089faf8..5c5ea37f1 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/composer.json +++ b/vendor/rector/rector/vendor/symfony/service-contracts/composer.json @@ -32,7 +32,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Contracts\\Service\\": "" + "RectorPrefix202411\\Symfony\\Contracts\\Service\\": "" }, "exclude-from-classmap": [ "\/Test\/" diff --git a/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php b/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php index aeea111d7..da6745760 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php @@ -8,23 +8,23 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml\Command; +namespace RectorPrefix202411\Symfony\Component\Yaml\Command; -use RectorPrefix202410\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202410\Symfony\Component\Console\CI\GithubActionReporter; -use RectorPrefix202410\Symfony\Component\Console\Command\Command; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202410\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202410\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202410\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202410\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202410\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202410\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202410\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202410\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202410\Symfony\Component\Yaml\Exception\ParseException; -use RectorPrefix202410\Symfony\Component\Yaml\Parser; -use RectorPrefix202410\Symfony\Component\Yaml\Yaml; +use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202411\Symfony\Component\Console\CI\GithubActionReporter; +use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202411\Symfony\Component\Yaml\Parser; +use RectorPrefix202411\Symfony\Component\Yaml\Yaml; /** * Validates YAML files syntax and outputs encountered errors. * diff --git a/vendor/rector/rector/vendor/symfony/yaml/Dumper.php b/vendor/rector/rector/vendor/symfony/yaml/Dumper.php index 140ad1d3b..0218d2bd8 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Dumper.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Dumper.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml; +namespace RectorPrefix202411\Symfony\Component\Yaml; -use RectorPrefix202410\Symfony\Component\Yaml\Tag\TaggedValue; +use RectorPrefix202411\Symfony\Component\Yaml\Tag\TaggedValue; /** * Dumper dumps PHP variables to YAML strings. * diff --git a/vendor/rector/rector/vendor/symfony/yaml/Escaper.php b/vendor/rector/rector/vendor/symfony/yaml/Escaper.php index e8982a504..ecdbea38d 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Escaper.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Escaper.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml; +namespace RectorPrefix202411\Symfony\Component\Yaml; /** * Escaper encapsulates escaping rules for single and double-quoted diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php index bbc45c067..694f2943b 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; /** * Exception class thrown when an error occurs during dumping. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php index 927eb49ba..590115523 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; /** * Exception interface for all exceptions thrown by the component. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php index e20e1d7a1..0eee01968 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; /** * Exception class thrown when an error occurs during parsing. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php index 3fa116ccd..a08da65eb 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; /** * Exception class thrown when an error occurs during parsing. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Inline.php b/vendor/rector/rector/vendor/symfony/yaml/Inline.php index f100ad1c3..42bbe0236 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Inline.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Inline.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml; +namespace RectorPrefix202411\Symfony\Component\Yaml; -use RectorPrefix202410\Symfony\Component\Yaml\Exception\DumpException; -use RectorPrefix202410\Symfony\Component\Yaml\Exception\ParseException; -use RectorPrefix202410\Symfony\Component\Yaml\Tag\TaggedValue; +use RectorPrefix202411\Symfony\Component\Yaml\Exception\DumpException; +use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202411\Symfony\Component\Yaml\Tag\TaggedValue; /** * Inline implements a YAML parser/dumper for the YAML inline syntax. * diff --git a/vendor/rector/rector/vendor/symfony/yaml/Parser.php b/vendor/rector/rector/vendor/symfony/yaml/Parser.php index 7896c85fa..b66602a40 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Parser.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Parser.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml; +namespace RectorPrefix202411\Symfony\Component\Yaml; -use RectorPrefix202410\Symfony\Component\Yaml\Exception\ParseException; -use RectorPrefix202410\Symfony\Component\Yaml\Tag\TaggedValue; +use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202411\Symfony\Component\Yaml\Tag\TaggedValue; /** * Parser parses YAML strings to convert them to PHP arrays. * diff --git a/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint b/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint index 54c8121d7..7121a19fd 100755 --- a/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint +++ b/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint @@ -1,6 +1,6 @@ #!/usr/bin/env php */ -use RectorPrefix202410\Symfony\Component\Console\Application; -use RectorPrefix202410\Symfony\Component\Yaml\Command\LintCommand; +use RectorPrefix202411\Symfony\Component\Console\Application; +use RectorPrefix202411\Symfony\Component\Yaml\Command\LintCommand; function includeIfExists(string $file) : bool { return \file_exists($file) && (include $file); diff --git a/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php index f8f938430..5a7145396 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml\Tag; +namespace RectorPrefix202411\Symfony\Component\Yaml\Tag; /** * @author Nicolas Grekas diff --git a/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php b/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php index 4c584efe3..5bf1ac14c 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml; +namespace RectorPrefix202411\Symfony\Component\Yaml; -use RectorPrefix202410\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; /** * Unescaper encapsulates unescaping rules for single and double-quoted * YAML strings. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Yaml.php b/vendor/rector/rector/vendor/symfony/yaml/Yaml.php index 87b94377b..b6f9f1b0a 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Yaml.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Yaml.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202410\Symfony\Component\Yaml; +namespace RectorPrefix202411\Symfony\Component\Yaml; -use RectorPrefix202410\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; /** * Yaml offers convenience methods to load and dump YAML. * diff --git a/vendor/rector/rector/vendor/symfony/yaml/composer.json b/vendor/rector/rector/vendor/symfony/yaml/composer.json index e9ed9f298..2008af5d5 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/composer.json +++ b/vendor/rector/rector/vendor/symfony/yaml/composer.json @@ -27,7 +27,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Symfony\\Component\\Yaml\\": "" + "RectorPrefix202411\\Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json b/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json index 0f1fa8d1d..bfd76801d 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json @@ -20,12 +20,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202410\\Symplify\\EasyParallel\\": "src" + "RectorPrefix202411\\Symplify\\EasyParallel\\": "src" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202410\\Symplify\\EasyParallel\\Tests\\": "tests" + "RectorPrefix202411\\Symplify\\EasyParallel\\Tests\\": "tests" } }, "scripts": { diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php b/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php index 6f9a8c502..9a18a1eab 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php @@ -1,9 +1,9 @@ services(); $services->defaults()->public()->autowire(); diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php b/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php index 3ac3d5fdb..8efa442e1 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php @@ -1,12 +1,12 @@ configureIO($input, $output); - try { + $this->configureIO($input, $output); + $exitCode = $this->doRun($input, $output); } catch (\Exception $e) { if (!$this->catchExceptions) { @@ -858,7 +858,7 @@ protected function doRenderThrowable(\Throwable $e, OutputInterface $output): vo } if (str_contains($message, "@anonymous\0")) { - $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { + $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', function ($m) { return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; }, $message); } diff --git a/vendor/symfony/console/Terminal.php b/vendor/symfony/console/Terminal.php index 948ced4ad..ee178327a 100644 --- a/vendor/symfony/console/Terminal.php +++ b/vendor/symfony/console/Terminal.php @@ -158,7 +158,7 @@ private static function readFromProcess(string $command): ?string $cp = \function_exists('sapi_windows_cp_set') ? sapi_windows_cp_get() : 0; - if (!$process = proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true])) { + if (!$process = @proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true])) { return null; } diff --git a/vendor/symfony/deprecation-contracts/.gitignore b/vendor/symfony/deprecation-contracts/.gitignore deleted file mode 100644 index c49a5d8df..000000000 --- a/vendor/symfony/deprecation-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/event-dispatcher-contracts/.gitignore b/vendor/symfony/event-dispatcher-contracts/.gitignore deleted file mode 100644 index c49a5d8df..000000000 --- a/vendor/symfony/event-dispatcher-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/filesystem/Filesystem.php b/vendor/symfony/filesystem/Filesystem.php index 9f6ed46f0..358a74b37 100644 --- a/vendor/symfony/filesystem/Filesystem.php +++ b/vendor/symfony/filesystem/Filesystem.php @@ -44,7 +44,7 @@ public function copy(string $originFile, string $targetFile, bool $overwriteNewe $this->mkdir(\dirname($targetFile)); $doCopy = true; - if (!$overwriteNewerFiles && null === parse_url($originFile, \PHP_URL_HOST) && is_file($targetFile)) { + if (!$overwriteNewerFiles && !parse_url($originFile, \PHP_URL_HOST) && is_file($targetFile)) { $doCopy = filemtime($originFile) > filemtime($targetFile); } @@ -234,6 +234,7 @@ public function chmod($files, int $mode, int $umask = 0000, bool $recursive = fa * Change the owner of an array of files or directories. * * This method always throws on Windows, as the underlying PHP function is not supported. + * * @see https://www.php.net/chown * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change owner @@ -264,6 +265,7 @@ public function chown($files, $user, bool $recursive = false) * Change the group of an array of files or directories. * * This method always throws on Windows, as the underlying PHP function is not supported. + * * @see https://www.php.net/chgrp * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change group diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php index 3d45c9d9a..31e36a368 100644 --- a/vendor/symfony/polyfill-mbstring/Mbstring.php +++ b/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -983,7 +983,7 @@ public static function mb_ltrim(string $string, ?string $characters = null, ?str public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { - return self::mb_internal_trim('{[%s]+$}D', $string, $characters, $encoding, __FUNCTION__); + return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__); } private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string diff --git a/vendor/symfony/polyfill-mbstring/bootstrap80.php b/vendor/symfony/polyfill-mbstring/bootstrap80.php index 5be7d2018..5236e6dcc 100644 --- a/vendor/symfony/polyfill-mbstring/bootstrap80.php +++ b/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -133,11 +133,11 @@ function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $ } if (!function_exists('mb_ucfirst')) { - function mb_ucfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } + function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } } if (!function_exists('mb_lcfirst')) { - function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } + function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } } if (!function_exists('mb_trim')) { diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json index 4ed241a33..daa07f86b 100644 --- a/vendor/symfony/polyfill-mbstring/composer.json +++ b/vendor/symfony/polyfill-mbstring/composer.json @@ -16,7 +16,8 @@ } ], "require": { - "php": ">=7.2" + "php": ">=7.2", + "ext-iconv": "*" }, "provide": { "ext-mbstring": "*" diff --git a/vendor/symfony/polyfill-php80/PhpToken.php b/vendor/symfony/polyfill-php80/PhpToken.php index fe6e69105..cd78c4ccc 100644 --- a/vendor/symfony/polyfill-php80/PhpToken.php +++ b/vendor/symfony/polyfill-php80/PhpToken.php @@ -29,7 +29,7 @@ class PhpToken implements \Stringable public $text; /** - * @var int + * @var -1|positive-int */ public $line; @@ -38,6 +38,9 @@ class PhpToken implements \Stringable */ public $pos; + /** + * @param -1|positive-int $line + */ public function __construct(int $id, string $text, int $line = -1, int $position = -1) { $this->id = $id; @@ -80,7 +83,7 @@ public function __toString(): string } /** - * @return static[] + * @return list */ public static function tokenize(string $code, int $flags = 0): array { diff --git a/vendor/symfony/process/ExecutableFinder.php b/vendor/symfony/process/ExecutableFinder.php index 6dc00b7c2..89edd22fb 100644 --- a/vendor/symfony/process/ExecutableFinder.php +++ b/vendor/symfony/process/ExecutableFinder.php @@ -19,7 +19,15 @@ */ class ExecutableFinder { - private $suffixes = ['.exe', '.bat', '.cmd', '.com']; + private const CMD_BUILTINS = [ + 'assoc', 'break', 'call', 'cd', 'chdir', 'cls', 'color', 'copy', 'date', + 'del', 'dir', 'echo', 'endlocal', 'erase', 'exit', 'for', 'ftype', 'goto', + 'help', 'if', 'label', 'md', 'mkdir', 'mklink', 'move', 'path', 'pause', + 'popd', 'prompt', 'pushd', 'rd', 'rem', 'ren', 'rename', 'rmdir', 'set', + 'setlocal', 'shift', 'start', 'time', 'title', 'type', 'ver', 'vol', + ]; + + private $suffixes = []; /** * Replaces default suffixes of executable. @@ -48,18 +56,28 @@ public function addSuffix(string $suffix) */ public function find(string $name, ?string $default = null, array $extraDirs = []) { + // windows built-in commands that are present in cmd.exe should not be resolved using PATH as they do not exist as exes + if ('\\' === \DIRECTORY_SEPARATOR && \in_array(strtolower($name), self::CMD_BUILTINS, true)) { + return $name; + } + $dirs = array_merge( explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')), $extraDirs ); - $suffixes = ['']; + $suffixes = []; if ('\\' === \DIRECTORY_SEPARATOR) { $pathExt = getenv('PATHEXT'); - $suffixes = array_merge($pathExt ? explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); + $suffixes = $this->suffixes; + $suffixes = array_merge($suffixes, $pathExt ? explode(\PATH_SEPARATOR, $pathExt) : ['.exe', '.bat', '.cmd', '.com']); } + $suffixes = '' !== pathinfo($name, PATHINFO_EXTENSION) ? array_merge([''], $suffixes) : array_merge($suffixes, ['']); foreach ($suffixes as $suffix) { foreach ($dirs as $dir) { + if ('' === $dir) { + $dir = '.'; + } if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) { return $file; } @@ -70,8 +88,13 @@ public function find(string $name, ?string $default = null, array $extraDirs = [ } } - $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v --'; - if (\function_exists('exec') && ($executablePath = strtok(@exec($command.' '.escapeshellarg($name)), \PHP_EOL)) && @is_executable($executablePath)) { + if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('exec') || \strlen($name) !== strcspn($name, '/'.\DIRECTORY_SEPARATOR)) { + return $default; + } + + $execResult = exec('command -v -- '.escapeshellarg($name)); + + if (($executablePath = substr($execResult, 0, strpos($execResult, \PHP_EOL) ?: null)) && @is_executable($executablePath)) { return $executablePath; } diff --git a/vendor/symfony/process/PhpExecutableFinder.php b/vendor/symfony/process/PhpExecutableFinder.php index 54fe74434..c3a9680d7 100644 --- a/vendor/symfony/process/PhpExecutableFinder.php +++ b/vendor/symfony/process/PhpExecutableFinder.php @@ -34,15 +34,8 @@ public function __construct() public function find(bool $includeArgs = true) { if ($php = getenv('PHP_BINARY')) { - if (!is_executable($php)) { - $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v --'; - if (\function_exists('exec') && $php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) { - if (!is_executable($php)) { - return false; - } - } else { - return false; - } + if (!is_executable($php) && !$php = $this->executableFinder->find($php)) { + return false; } if (@is_dir($php)) { diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php index 62addf1e7..91f9e8fee 100644 --- a/vendor/symfony/process/Process.php +++ b/vendor/symfony/process/Process.php @@ -1592,7 +1592,14 @@ function ($m) use (&$env, &$varCache, &$varCount, $uid) { $cmd ); - $cmd = 'cmd /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')'; + static $comSpec; + + if (!$comSpec && $comSpec = (new ExecutableFinder())->find('cmd.exe')) { + // Escape according to CommandLineToArgvW rules + $comSpec = '"'.preg_replace('{(\\\\*+)"}', '$1$1\"', $comSpec) .'"'; + } + + $cmd = ($comSpec ?? 'cmd').' /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')'; foreach ($this->processPipes->getFiles() as $offset => $filename) { $cmd .= ' '.$offset.'>"'.$filename.'"'; } @@ -1638,7 +1645,7 @@ private function escapeArgument(?string $argument): string if (str_contains($argument, "\0")) { $argument = str_replace("\0", '?', $argument); } - if (!preg_match('/[\/()%!^"<>&|\s]/', $argument)) { + if (!preg_match('/[()%!^"<>&|\s]/', $argument)) { return $argument; } $argument = preg_replace('/(\\\\+)$/', '$1$1', $argument); diff --git a/vendor/symfony/service-contracts/.gitignore b/vendor/symfony/service-contracts/.gitignore deleted file mode 100644 index c49a5d8df..000000000 --- a/vendor/symfony/service-contracts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/string/Inflector/EnglishInflector.php b/vendor/symfony/string/Inflector/EnglishInflector.php index 9557e3507..ecd51d41f 100644 --- a/vendor/symfony/string/Inflector/EnglishInflector.php +++ b/vendor/symfony/string/Inflector/EnglishInflector.php @@ -348,14 +348,14 @@ final class EnglishInflector implements InflectorInterface // indices (index) ['xedni', 5, false, true, ['indicies', 'indexes']], + // fax (faxes, faxxes) + ['xaf', 3, true, true, ['faxes', 'faxxes']], + // boxes (box) ['xo', 2, false, true, 'oxes'], - // indexes (index), matrixes (matrix) - ['x', 1, true, false, ['cies', 'xes']], - - // appendices (appendix) - ['xi', 2, false, true, 'ices'], + // indexes (index), matrixes (matrix), appendices (appendix) + ['x', 1, true, false, ['ces', 'xes']], // babies (baby) ['y', 1, false, true, 'ies'], From b2b2760b7223cb3906bd9eeae32149e71d054f83 Mon Sep 17 00:00:00 2001 From: Thomas Skerbis Date: Wed, 11 Jun 2025 23:01:46 +0200 Subject: [PATCH 2/3] refactor 2.x --- composer.json | 4 +- composer.lock | 30 +- vendor/composer/installed.json | 32 +- vendor/composer/installed.php | 16 +- vendor/phpstan/phpstan/LICENSE | 1 + vendor/phpstan/phpstan/README.md | 6 +- vendor/phpstan/phpstan/UPGRADING.md | 338 +++ vendor/phpstan/phpstan/bootstrap.php | 21 - vendor/phpstan/phpstan/composer.json | 2 +- vendor/phpstan/phpstan/phpstan.phar | Bin 23789783 -> 24095085 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 26 +- vendor/rector/rector/README.md | 15 +- vendor/rector/rector/UPGRADING.md | 106 + vendor/rector/rector/bin/rector | 2 +- vendor/rector/rector/bin/rector.php | 16 +- vendor/rector/rector/composer.json | 4 +- vendor/rector/rector/config/config.php | 4 +- .../rector/rector/config/phpstan/parser.neon | 1 - .../config/phpstan/static-reflection.neon | 6 - .../set/behat-annotations-to-attributes.php | 11 + .../rector/rector/config/set/code-quality.php | 2 +- .../rector/rector/config/set/coding-style.php | 37 +- .../rector/config/set/datetime-to-carbon.php | 2 +- vendor/rector/rector/config/set/dead-code.php | 2 +- .../rector/rector/config/set/early-return.php | 2 +- .../rector/config/set/gmagick-to-imagick.php | 2 +- .../rector/rector/config/set/instanceof.php | 2 +- .../rector/config/set/level/up-to-php53.php | 2 +- .../rector/config/set/level/up-to-php54.php | 2 +- .../rector/config/set/level/up-to-php55.php | 2 +- .../rector/config/set/level/up-to-php56.php | 2 +- .../rector/config/set/level/up-to-php70.php | 2 +- .../rector/config/set/level/up-to-php71.php | 2 +- .../rector/config/set/level/up-to-php72.php | 2 +- .../rector/config/set/level/up-to-php73.php | 2 +- .../rector/config/set/level/up-to-php74.php | 2 +- .../rector/config/set/level/up-to-php80.php | 2 +- .../rector/config/set/level/up-to-php81.php | 2 +- .../rector/config/set/level/up-to-php82.php | 2 +- .../rector/config/set/level/up-to-php83.php | 2 +- .../rector/config/set/level/up-to-php84.php | 2 +- .../rector/config/set/level/up-to-php85.php | 11 + vendor/rector/rector/config/set/naming.php | 2 +- .../config/set/nette-utils/nette-utils4.php | 10 + .../rector/config/set/php-polyfills.php | 7 +- vendor/rector/rector/config/set/php52.php | 2 +- vendor/rector/rector/config/set/php53.php | 2 +- vendor/rector/rector/config/set/php54.php | 2 +- vendor/rector/rector/config/set/php55.php | 2 +- vendor/rector/rector/config/set/php56.php | 2 +- vendor/rector/rector/config/set/php70.php | 2 +- vendor/rector/rector/config/set/php71.php | 2 +- vendor/rector/rector/config/set/php72.php | 2 +- vendor/rector/rector/config/set/php73.php | 2 +- vendor/rector/rector/config/set/php74.php | 2 +- vendor/rector/rector/config/set/php80.php | 6 +- vendor/rector/rector/config/set/php81.php | 6 +- vendor/rector/rector/config/set/php82.php | 2 +- vendor/rector/rector/config/set/php83.php | 6 +- vendor/rector/rector/config/set/php84.php | 8 +- vendor/rector/rector/config/set/php85.php | 10 + .../rector/config/set/privatization.php | 2 +- .../rector/config/set/rector-preset.php | 2 +- .../rector/config/set/strict-booleans.php | 2 +- .../rector/config/set/type-declaration.php | 2 +- vendor/rector/rector/preload.php | 41 +- .../ArgumentDefaultValueReplacer.php | 13 +- .../NodeAnalyzer/ArgumentAddingScope.php | 3 +- .../NodeAnalyzer/ChangedArgumentsDetector.php | 12 +- .../ClassMethod/ArgumentAdderRector.php | 24 +- .../ReplaceArgumentDefaultValueRector.php | 7 +- ...tionArgumentDefaultValueReplacerRector.php | 9 +- .../RemoveMethodCallParamRector.php | 4 +- .../Arguments/ValueObject/ArgumentAdder.php | 15 +- .../ArgumentAdderWithoutDefaultValue.php | 15 +- .../ValueObject/RemoveMethodCallParam.php | 9 +- .../ReplaceArgumentDefaultValue.php | 8 +- .../ReplaceFuncCallArgumentDefaultValue.php | 6 +- .../Carbon/NodeFactory/CarbonCallFactory.php | 12 +- .../FuncCall/DateFuncCallToCarbonRector.php | 153 +- .../FuncCall/TimeFuncCallToCarbonRector.php | 14 +- .../DateTimeMethodCallToCarbonRector.php | 5 +- .../New_/DateTimeInstanceToCarbonRector.php | 5 +- .../rules/CodeQuality/CompactConverter.php | 5 +- .../NodeAnalyzer/ForeachAnalyzer.php | 3 +- .../NodeAnalyzer/LocalPropertyAnalyzer.php | 32 +- .../VariableDimFetchAssignResolver.php | 10 +- .../NodeFactory/MissingPropertiesFactory.php | 9 +- .../NodeFactory/PropertyTypeDecorator.php | 9 +- .../NodeFactory/TypedPropertyFactory.php | 10 +- .../NodeManipulator/ExprBoolCaster.php | 12 +- .../Rector/Assign/CombinedAssignRector.php | 3 +- .../SimplifyEmptyArrayCheckRector.php | 3 +- .../SimplifyDeMorganBinaryRector.php | 3 +- .../ThrowWithPreviousExceptionRector.php | 39 +- ...nvertStaticPrivateConstantToSelfRector.php | 6 +- .../ClassMethod/ExplicitReturnNullRector.php | 22 +- .../InlineArrayReturnAssignRector.php | 17 +- ...llyCalledStaticMethodToNonStaticRector.php | 57 +- .../OptionalParametersAfterRequiredRector.php | 22 +- .../CompleteDynamicPropertiesRector.php | 23 +- ...DocBlockPropertyToNativePropertyRector.php | 29 +- ...lineConstructorDefaultToPropertyRector.php | 7 +- .../Rector/Concat/JoinStringConcatRector.php | 2 +- .../SimplifyEmptyCheckOnEmptyArrayRector.php | 34 +- ...seIdenticalOverEqualWithSameTypeRector.php | 11 +- .../Expression/InlineIfToExplicitIfRector.php | 3 +- .../TernaryFalseExpressionToIfRector.php | 10 +- .../ForRepeatedCountToOwnVariableRector.php | 9 +- ...hItemsAssignToEmptyArrayToAssignRector.php | 27 +- .../Foreach_/ForeachToInArrayRector.php | 21 +- .../UnusedForeachValueToArrayKeysRector.php | 42 +- ...rayMergeOfNonArraysToSimpleArrayRector.php | 2 +- ...serFuncWithArrowFunctionToInlineRector.php | 5 +- .../FuncCall/CompactToVariablesRector.php | 9 +- .../FuncCall/InlineIsAInstanceOfRector.php | 9 +- .../FuncCall/RemoveSoleValueSprintfRector.php | 2 +- .../Rector/FuncCall/SetTypeToCastRector.php | 13 +- .../FuncCall/SimplifyRegexPatternRector.php | 5 +- .../FuncCall/SimplifyStrposLowerRector.php | 2 +- .../FuncCall/SingleInArrayToCompareRector.php | 2 +- .../UnwrapSprintfOneArgumentRector.php | 2 +- .../SimplifyUselessVariableRector.php | 23 +- ...lipTypeControlToUseExclusiveTypeRector.php | 9 +- .../Identical/SimplifyArraySearchRector.php | 12 +- .../SimplifyBoolIdenticalTrueRector.php | 3 +- .../Identical/SimplifyConditionsRector.php | 15 +- ...StrlenZeroToIdenticalEmptyStringRector.php | 3 +- .../Rector/If_/CombineIfRector.php | 16 +- .../CompleteMissingIfElseBracketRector.php | 2 +- ...ompareReturnsToNullCoalesceQueueRector.php | 16 +- .../Rector/If_/ExplicitBoolCompareRector.php | 35 +- .../Rector/If_/ShortenElseIfRector.php | 2 +- .../If_/SimplifyIfElseToTernaryRector.php | 14 +- .../If_/SimplifyIfNotNullReturnRector.php | 6 +- .../If_/SimplifyIfNullableReturnRector.php | 19 +- .../Rector/If_/SimplifyIfReturnBoolRector.php | 12 +- .../AbsolutizeRequireAndIncludePathRector.php | 16 +- ...OnPropertyObjectToPropertyExistsRector.php | 27 +- .../AndAssignsToSeparateLinesRector.php | 2 +- .../LogicalAnd/LogicalToBooleanRector.php | 8 +- .../Rector/New_/NewStaticToNewSelfRector.php | 2 +- .../Rector/NotEqual/CommonNotEqualRector.php | 5 +- .../CleanupUnneededNullsafeOperatorRector.php | 3 +- .../Switch_/SingularSwitchToIfRector.php | 9 +- .../Rector/Switch_/SwitchTrueToIfRector.php | 5 +- ...istsTernaryThenValueToCoalescingRector.php | 3 +- .../NumberCompareToMaxFuncCallRector.php | 2 +- .../SimplifyTautologyTernaryRector.php | 9 +- .../Ternary/SwitchNegatedTernaryRector.php | 11 +- .../UnnecessaryTernaryExpressionRector.php | 6 +- .../ArrayDimFetchTypeResolver.php | 3 +- .../AssignVariableTypeResolver.php | 3 +- .../CodeQuality/ValueObject/KeyAndExpr.php | 8 +- .../Application/UseImportsAdder.php | 25 +- .../Application/UseImportsRemover.php | 7 +- .../ClassNameImport/AliasUsesResolver.php | 13 +- .../AliasClassNameImportSkipVoter.php | 7 +- .../ClassLikeNameClassNameImportSkipVoter.php | 3 +- ...yQualifiedNameClassNameImportSkipVoter.php | 5 +- .../ReservedClassNameImportSkipVoter.php | 21 + .../UsesClassNameImportSkipVoter.php | 3 +- .../ClassNameImportSkipper.php | 20 +- .../ClassNameImport/ShortNameResolver.php | 21 +- .../ClassNameImport/UseImportsTraverser.php | 9 +- .../ClassNameImport/UsedImportsResolver.php | 17 +- .../ValueObject/UsedImports.php | 8 +- .../rules/CodingStyle/Guard/StaticGuard.php | 6 +- .../rules/CodingStyle/Naming/ClassNaming.php | 2 +- .../rules/CodingStyle/Node/NameImporter.php | 12 +- .../NodeAnalyzer/UseImportNameMatcher.php | 26 +- .../ArrayCallableToMethodCallFactory.php | 10 +- .../StaticArrowFunctionRector.php | 3 +- .../Rector/Assign/SplitDoubleAssignRector.php | 4 - .../CatchExceptionNameMatchingTypeRector.php | 13 +- .../ClassConst/RemoveFinalFromConstRector.php | 9 +- .../FuncGetArgsToVariadicParamRector.php | 5 +- ...itedMethodVisibilitySameAsParentRector.php | 6 +- .../NewlineBeforeNewAssignSetRector.php | 40 +- .../Rector/Closure/StaticClosureRector.php | 3 +- .../EncapsedStringsToSprintfRector.php | 47 +- ...rapEncapsedVariableInCurlyBracesRector.php | 6 +- .../Enum_/EnumCaseToPascalCaseRector.php | 162 + ...iDimensionalArrayToArrayDestructRector.php | 17 +- .../ArraySpreadInsteadOfArrayMergeRector.php | 20 +- .../CallUserFuncArrayToVariadicRector.php | 8 +- .../CallUserFuncToMethodCallRector.php | 5 +- .../FuncCall/ConsistentImplodeRector.php | 3 +- ...CountArrayToEmptyArrayComparisonRector.php | 4 +- .../FunctionFirstClassCallableRector.php | 7 +- ...VersionCompareFuncCallToConstantRector.php | 8 +- ...FunctionLikeToFirstClassCallableRector.php | 158 + .../Property/SplitGroupedPropertiesRector.php | 4 +- .../Stmt/NewlineAfterStatementRector.php | 7 +- ...RemoveUselessAliasInUseStatementRector.php | 2 +- .../String_/SymplifyQuoteEscapeRector.php | 5 +- ...assKeywordForClassNameResolutionRector.php | 13 +- .../Use_/SeparateMultiUseImportsRector.php | 2 +- .../Reflection/VendorLocationDetector.php | 3 +- .../rules/DeadCode/ConditionEvaluator.php | 3 +- .../rules/DeadCode/ConditionResolver.php | 9 +- .../NodeAnalyzer/CallCollectionAnalyzer.php | 13 +- .../NodeAnalyzer/ExprUsedInNodeAnalyzer.php | 6 +- .../IsClassMethodUsedAnalyzer.php | 36 +- .../PropertyWriteonlyAnalyzer.php | 30 +- .../SafeLeftTypeBooleanAndOrAnalyzer.php | 20 +- .../NodeAnalyzer/UsedVariableNameAnalyzer.php | 3 +- .../NodeCollector/UnusedParameterResolver.php | 5 +- .../ClassMethodParamRemover.php | 6 +- .../ControllerClassMethodManipulator.php | 9 +- .../NodeManipulator/CountManipulator.php | 13 +- .../NodeManipulator/LivingCodeManipulator.php | 3 +- .../VariadicFunctionLikeDetector.php | 10 +- .../PhpDoc/DeadParamTagValueNodeAnalyzer.php | 30 +- .../PhpDoc/DeadReturnTagValueNodeAnalyzer.php | 25 +- .../PhpDoc/DeadVarTagValueNodeAnalyzer.php | 18 +- .../PhpDoc/Guard/TemplateTypeRemovalGuard.php | 2 +- .../PhpDoc/TagRemover/ParamTagRemover.php | 6 +- .../PhpDoc/TagRemover/ReturnTagRemover.php | 3 +- .../PhpDoc/TagRemover/VarTagRemover.php | 24 +- .../Array_/RemoveDuplicatedArrayKeyRector.php | 5 +- .../Assign/RemoveDoubleAssignRector.php | 37 +- .../RemoveUnusedVariableAssignRector.php | 32 +- .../Block/ReplaceBlockToItsStmtsRector.php | 53 + .../Rector/BooleanAnd/RemoveAndTrueRector.php | 5 +- .../Rector/Cast/RecastingRemovalRector.php | 30 +- ...RemoveUnusedPrivateClassConstantRector.php | 23 +- .../ClassLike/RemoveAnnotationRector.php | 13 +- ...moveTypedPropertyNonMockDocblockRector.php | 17 +- ...oveArgumentFromDefaultParentCallRector.php | 179 ++ .../RemoveEmptyClassMethodRector.php | 54 +- .../RemoveNullTagValueNodeRector.php | 6 +- .../RemoveUnusedConstructorParamRector.php | 9 +- ...moveUnusedPrivateMethodParameterRector.php | 53 +- .../RemoveUnusedPrivateMethodRector.php | 94 +- .../RemoveUnusedPromotedPropertyRector.php | 33 +- ...emoveUnusedPublicMethodParameterRector.php | 12 +- ...elessAssignFromPropertyPromotionRector.php | 105 + .../RemoveUselessParamTagRector.php | 6 +- ...moveUselessReturnExprInConstructRector.php | 7 +- .../RemoveUselessReturnTagRector.php | 9 +- .../Concat/RemoveConcatAutocastRector.php | 4 +- .../RemovePhpVersionIdCheckRector.php | 31 +- .../Expression/RemoveDeadStmtRector.php | 18 +- .../Expression/SimplifyMirrorAssignRector.php | 6 +- .../Rector/For_/RemoveDeadContinueRector.php | 8 +- .../For_/RemoveDeadIfForeachForRector.php | 32 +- .../Rector/For_/RemoveDeadLoopRector.php | 29 +- .../Foreach_/RemoveUnusedForeachKeyRector.php | 16 +- .../RemoveFilterVarOnExactTypeRector.php | 68 + .../FunctionLike/RemoveDeadReturnRector.php | 4 +- .../If_/ReduceAlwaysFalseIfOrRector.php | 11 +- .../If_/RemoveAlwaysTrueIfConditionRector.php | 31 +- .../Rector/If_/RemoveDeadInstanceOfRector.php | 14 +- ...emoveTypedPropertyDeadInstanceOfRector.php | 23 +- ...UnusedNonEmptyArrayBeforeForeachRector.php | 29 +- .../SimplifyIfElseWithSameContentRector.php | 3 +- ...wrapFutureCompatibleIfPhpVersionRector.php | 10 +- .../RemoveNonExistingVarAnnotationRector.php | 18 +- .../RemoveDeadZeroAndOneOperationRector.php | 3 +- .../RemoveUnusedPrivatePropertyRector.php | 20 +- .../RemoveUselessReadOnlyTagRector.php | 13 +- .../Property/RemoveUselessVarTagRector.php | 13 +- .../RemoveDeadConditionAboveReturnRector.php | 9 +- .../RemoveParentCallWithoutParentRector.php | 12 +- .../Stmt/RemoveUnreachableStatementRector.php | 3 +- .../RemoveDuplicatedCaseInSwitchRector.php | 5 +- ...naryToBooleanOrFalseToBooleanAndRector.php | 5 +- .../Rector/TryCatch/RemoveDeadCatchRector.php | 151 + .../TryCatch/RemoveDeadTryCatchRector.php | 13 +- .../SideEffect/PureFunctionDetector.php | 13 +- .../SideEffect/SideEffectNodeDetector.php | 48 +- .../UselessIfCondBeforeForeachDetector.php | 3 +- .../BinaryToVersionCompareCondition.php | 6 +- .../ValueObject/VersionCompareCondition.php | 9 +- .../NodeTransformer/ConditionInverter.php | 3 +- ...eNestedForeachIfsToEarlyContinueRector.php | 9 +- ...geIfElseValueAssignToEarlyReturnRector.php | 10 +- .../ChangeNestedIfsToEarlyReturnRector.php | 6 +- ...hangeOrIfContinueToMultiContinueRector.php | 5 +- .../Rector/If_/RemoveAlwaysElseRector.php | 6 +- .../PreparedValueToEarlyReturnRector.php | 20 +- .../ReturnBinaryOrToEarlyReturnRector.php | 8 +- .../ReturnEarlyIfVariableRector.php | 6 +- .../ValueObject/BareSingleAssignIf.php | 6 +- .../FlipNegatedTernaryInstanceofRector.php | 2 +- .../NewAssignVariableNameResolver.php | 40 - ...ropertyFetchAssignVariableNameResolver.php | 47 - .../AssignVariableNameResolverInterface.php | 17 - .../InflectorSingularResolver.php | 7 +- .../MatchParamTypeExpectedNameResolver.php | 24 +- .../MatchPropertyTypeExpectedNameResolver.php | 18 +- .../Guard/BreakingVariableRenameGuard.php | 35 +- .../Guard/DateTimeAtNamingConventionGuard.php | 13 +- .../Naming/Guard/HasMagicGetSetGuard.php | 3 +- .../MatchPropertyTypeConflictingNameGuard.php | 11 +- .../rules/Naming/Matcher/ForeachMatcher.php | 6 +- .../Matcher/VariableAndCallAssignMatcher.php | 13 +- .../rules/Naming/Naming/AliasNameResolver.php | 3 +- .../Naming/Naming/ConflictingNameResolver.php | 21 +- .../Naming/Naming/ExpectedNameResolver.php | 34 +- ...hp => OverriddenExistingNamesResolver.php} | 28 +- .../rules/Naming/Naming/PropertyNaming.php | 30 +- .../Naming/Naming/UseImportsResolver.php | 15 +- .../rules/Naming/Naming/VariableNaming.php | 107 - .../NamingConventionAnalyzer.php | 3 +- .../Naming/ParamRenamer/ParamRenamer.php | 9 +- .../rules/Naming/PhpArray/ArrayFilter.php | 2 +- .../MatchTypePropertyRenamer.php | 13 +- .../PropertyRenamer/PropertyFetchRenamer.php | 6 +- .../PropertyPromotionRenamer.php | 68 +- ...iableToMatchMethodCallReturnTypeRector.php | 26 +- .../RenameParamToMatchTypeRector.php | 26 +- .../RenameVariableToMatchNewTypeRector.php | 16 +- .../RenamePropertyToMatchTypeRector.php | 58 +- ...ValueVariableToMatchExprVariableRector.php | 14 +- ...iableToMatchMethodCallReturnTypeRector.php | 19 +- .../rules/Naming/RectorNamingInflector.php | 7 +- .../RenameGuard/PropertyRenameGuard.php | 9 +- .../rules/Naming/ValueObject/ExpectedName.php | 6 +- .../rules/Naming/ValueObject/ParamRename.php | 12 +- .../Naming/ValueObject/PropertyRename.php | 28 +- .../ValueObject/VariableAndCallAssign.php | 9 +- .../ValueObject/VariableAndCallForeach.php | 6 +- .../ValueObjectFactory/ParamRenameFactory.php | 3 +- .../PropertyRenameFactory.php | 13 +- .../rector/rules/Naming/VariableRenamer.php | 16 +- .../UtilsJsonStaticCallNamedArgRector.php | 70 + .../Property/VarToPublicPropertyRector.php | 3 +- .../Switch_/ContinueToBreakInSwitchRector.php | 23 +- ...DirNameFileConstantToDirConstantRector.php | 2 +- .../Rector/Ternary/TernaryToElvisRector.php | 27 +- .../Array_/LongArrayToShortArrayRector.php | 24 +- .../Break_/RemoveZeroBreakContinueRector.php | 12 +- .../RemoveReferenceFromCallRector.php | 2 +- .../Class_/ClassConstantToSelfClassRector.php | 2 +- .../GetCalledClassToSelfClassRector.php | 5 +- .../GetCalledClassToStaticClassRector.php | 11 +- .../FuncCall/PregReplaceEModifierRector.php | 6 +- .../StringClassNameToClassConstantRector.php | 18 +- .../rector/rules/Php55/RegexMatcher.php | 2 +- .../Php56/Rector/FuncCall/PowToExpRector.php | 2 +- .../rules/Php70/EregToPcreTransformer.php | 11 +- .../BattleshipTernaryAnalyzer.php | 6 +- .../Assign/ListSwapArrayOrderRector.php | 5 +- .../BreakNotInLoopOrSwitchToReturnRector.php | 9 +- .../ClassMethod/Php4ConstructorRector.php | 31 +- .../Rector/FuncCall/EregToPregMatchRector.php | 13 +- .../Rector/FuncCall/MultiDirnameRector.php | 17 +- .../Rector/FuncCall/RandomFunctionRector.php | 7 +- .../Php70/Rector/If_/IfToSpaceshipRector.php | 8 +- .../Php70/Rector/List_/EmptyListRector.php | 2 +- ...isCallOnStaticMethodToStaticCallRector.php | 32 +- ...ticCallOnNonStaticToInstanceCallRector.php | 22 +- .../IfIssetToCoalescingRector.php | 2 +- .../Ternary/TernaryToNullCoalescingRector.php | 5 +- .../Ternary/TernaryToSpaceshipRector.php | 3 +- .../rules/Php70/ValueObject/ComparedExprs.php | 6 +- .../rules/Php71/IsArrayAndDualCheckToAble.php | 9 +- .../Assign/AssignArrayToStringRector.php | 11 +- .../BinaryOpBetweenNumberAndStringRector.php | 11 +- .../Rector/BooleanOr/IsIterableRector.php | 9 +- .../PublicConstantVisibilityRector.php | 64 - .../FuncCall/RemoveExtraParametersRector.php | 10 +- .../List_/ListToArrayDestructRector.php | 15 +- .../TryCatch/MultiExceptionCatchRector.php | 3 +- .../rules/Php71/ValueObject/TwoNodeMatch.php | 6 +- .../NodeFactory/AnonymousFunctionFactory.php | 39 +- .../Php72/Rector/Assign/ListEachRector.php | 5 +- ...laceEachAssignmentWithKeyCurrentRector.php | 8 +- ...reateFunctionToAnonymousFunctionRector.php | 13 +- .../Rector/FuncCall/GetClassOnNullRector.php | 16 +- .../ParseStrWithResultArgumentRector.php | 10 +- .../Rector/FuncCall/StringifyDefineRector.php | 3 +- .../FuncCall/StringsAssertNakedRector.php | 3 +- .../Php72/Rector/Unset_/UnsetCastRector.php | 6 +- .../While_/WhileEachToForeachRector.php | 7 +- .../rules/Php72/ValueObject/ListAndEach.php | 6 +- .../Rector/BooleanOr/IsCountableRector.php | 6 +- .../SensitiveConstantNameRector.php | 3 +- .../FuncCall/ArrayKeyFirstLastRector.php | 38 +- .../FuncCall/JsonThrowOnErrorRector.php | 21 +- .../Rector/FuncCall/RegexDashEscapeRector.php | 19 +- .../Php73/Rector/FuncCall/SetCookieRector.php | 13 +- .../FuncCall/StringifyStrNeedlesRector.php | 6 +- .../Php74/Guard/MakePropertyTypedGuard.php | 6 +- .../Php74/Guard/PropertyTypeChangeGuard.php | 14 +- .../ClosureArrowFunctionAnalyzer.php | 61 +- .../CurlyToSquareBracketArrayStringRector.php | 6 +- .../Assign/NullCoalescingOperatorRector.php | 2 +- .../Closure/ClosureToArrowFunctionRector.php | 3 +- .../Double/RealToFloatTypeCastRector.php | 2 +- ...bStrrposEncodingArgumentPositionRector.php | 4 +- .../MoneyFormatToNumberFormatRector.php | 12 +- .../AddLiteralSeparatorToNumberRector.php | 24 +- ...efaultNullToNullableTypePropertyRector.php | 20 +- .../ExportToReflectionFunctionRector.php | 3 +- .../ParenthesizeNestedTernaryRector.php | 5 +- .../ParenthesizedNestedTernaryAnalyzer.php | 4 +- .../PropertyPromotionDocBlockMerger.php | 25 +- .../Guard/MakePropertyPromotionGuard.php | 3 +- .../StrncmpMatchAndRefactor.php | 16 +- .../StrposMatchAndRefactor.php | 9 +- .../SubstrMatchAndRefactor.php | 16 +- .../NodeAnalyzer/MatchSwitchAnalyzer.php | 20 +- .../NodeAnalyzer/PhpAttributeAnalyzer.php | 8 +- .../PromotedPropertyCandidateResolver.php | 14 +- .../NodeAnalyzer/PromotedPropertyResolver.php | 2 +- .../Php80/NodeAnalyzer/SwitchAnalyzer.php | 14 +- .../Php80/NodeFactory/AttrGroupsFactory.php | 3 +- .../Php80/NodeFactory/MatchArmsFactory.php | 8 +- .../rules/Php80/NodeFactory/MatchFactory.php | 17 +- .../NodeFactory/NestedAttrGroupsFactory.php | 3 +- ...AttributeGroupNamedArgumentManipulator.php | 2 +- .../NodeResolver/SwitchExprsResolver.php | 18 +- .../RemoveUnusedVariableInCatchRector.php | 15 +- .../ClassOnThisVariableObjectRector.php | 7 +- ...AddParamBasedOnParentClassMethodRector.php | 27 +- .../FinalPrivateToPrivateVisibilityRector.php | 5 +- .../ClassMethod/SetStateToStaticRector.php | 5 +- .../Class_/AnnotationToAttributeRector.php | 104 +- .../Rector/Class_/AttributeValueResolver.php | 68 + ...ertyAssignToConstructorPromotionRector.php | 48 +- .../Class_/StringableForToStringRector.php | 34 +- .../Rector/FuncCall/ClassOnObjectRector.php | 2 +- .../Rector/FunctionLike/MixedTypeRector.php | 96 +- .../Rector/Identical/StrEndsWithRector.php | 14 +- .../Rector/Identical/StrStartsWithRector.php | 2 +- .../Rector/NotIdentical/StrContainsRector.php | 7 +- .../NestedAnnotationToAttributeRector.php | 24 +- .../Switch_/ChangeSwitchToMatchRector.php | 71 +- .../Rector/Ternary/GetDebugTypeRector.php | 6 +- .../AnnotationPropertyToAttributeClass.php | 6 +- .../ValueObject/AnnotationToAttribute.php | 21 +- .../AttributeValueAndDocComment.php | 21 + .../rules/Php80/ValueObject/CondAndExpr.php | 27 +- .../DoctrineTagAndAnnotationToAttribute.php | 6 +- .../rules/Php80/ValueObject/MatchResult.php | 6 +- .../NestedAnnotationToAttribute.php | 8 +- ...tedDoctrineTagAndAnnotationToAttribute.php | 6 +- .../PropertyPromotionCandidate.php | 9 +- .../rules/Php80/ValueObject/StrStartsWith.php | 12 +- ....php => CoalescePropertyAssignMatcher.php} | 8 +- .../Php81/NodeAnalyzer/ComplexNewAnalyzer.php | 5 +- .../rules/Php81/NodeFactory/EnumFactory.php | 29 +- .../AttributeGroupNewLiner.php | 49 + .../Array_/FirstClassCallableRector.php | 21 +- .../ClassMethod/NewInInitializerRector.php | 46 +- .../Class_/MyCLabsClassToEnumRector.php | 3 +- .../Class_/SpatieEnumClassToEnumRector.php | 8 +- .../NullToStrictStringFuncCallArgRector.php | 30 +- .../MyCLabsMethodCallToEnumConstRector.php | 19 +- ...MyCLabsConstructorCallToEnumFromRector.php | 88 + .../Property/ReadOnlyPropertyRector.php | 60 +- .../ReadonlyClassManipulator.php | 222 ++ .../Rector/Class_/ReadOnlyClassRector.php | 223 +- ...riableInStringInterpolationFixerRector.php | 13 +- ...8DecodeEncodeToMbConvertEncodingRector.php | 2 +- .../New_/FilesystemIteratorSkipDotsRector.php | 3 +- .../AddSensitiveParameterAttributeRector.php | 7 +- .../ClassConst/AddTypeToConstRector.php | 18 +- ...rideAttributeToOverriddenMethodsRector.php | 181 +- .../Class_/ReadOnlyAnonymousClassRector.php | 70 + .../FuncCall/CombineHostPortLdapUriRector.php | 19 +- .../FuncCall/DynamicClassConstFetchRector.php | 73 + ...dAnnotationToDeprecatedAttributeRector.php | 149 + .../FuncCall/AddEscapeArgumentRector.php | 99 + .../FuncCall/RoundingModeEnumRector.php | 88 + .../NewMethodCallWithoutParenthesesRector.php | 75 + .../Param/ExplicitNullableParamTypeRector.php | 6 +- .../ArrayDimFetch/ArrayFirstLastRector.php | 74 + .../Guard/OverrideByParentClassGuard.php | 3 +- .../Guard/ParentPropertyLookupGuard.php | 18 +- .../NodeManipulator/VisibilityManipulator.php | 42 +- .../PrivatizeFinalClassMethodRector.php | 24 +- .../Class_/FinalizeTestCaseClassRector.php | 21 +- .../PrivatizeLocalGetterToPropertyRector.php | 2 +- .../PrivatizeFinalClassPropertyRector.php | 11 +- .../ClassMethodVisibilityGuard.php | 3 +- .../NodeManipulator/ComplexNodeRemover.php | 12 +- .../ClassMethod/ArgumentRemoverRector.php | 12 +- .../Rector/Class_/RemoveInterfacesRector.php | 55 +- .../Rector/Class_/RemoveTraitUseRector.php | 4 +- .../FuncCall/RemoveFuncCallArgRector.php | 4 +- .../Rector/FuncCall/RemoveFuncCallRector.php | 8 +- .../Removing/ValueObject/ArgumentRemover.php | 9 +- .../ValueObject/RemoveFuncCallArg.php | 6 +- .../Collector/RenamedNameCollector.php | 2 +- .../Renaming/NodeManipulator/ClassRenamer.php | 33 +- .../NodeManipulator/SwitchManipulator.php | 6 +- .../RenameClassConstFetchRector.php | 4 +- .../ClassMethod/RenameAnnotationRector.php | 13 +- .../Rector/Class_/RenameAttributeRector.php | 4 +- .../ConstFetch/RenameConstantRector.php | 4 +- .../Rector/FuncCall/RenameFunctionRector.php | 6 +- ...nctionLikeParamWithinCallLikeArgRector.php | 22 +- .../Rector/MethodCall/RenameMethodRector.php | 44 +- .../Rector/Name/RenameClassRector.php | 80 +- .../PropertyFetch/RenamePropertyRector.php | 13 +- .../StaticCall/RenameStaticMethodRector.php | 6 +- .../Rector/String_/RenameStringRector.php | 7 +- .../Renaming/ValueObject/MethodCallRename.php | 9 +- .../MethodCallRenameWithArrayKey.php | 9 +- .../Renaming/ValueObject/RenameAnnotation.php | 6 +- .../ValueObject/RenameAnnotationByType.php | 9 +- .../Renaming/ValueObject/RenameAttribute.php | 6 +- .../ValueObject/RenameClassAndConstFetch.php | 12 +- .../ValueObject/RenameClassConstFetch.php | 9 +- ...nameFunctionLikeParamWithinCallLikeArg.php | 11 +- .../Renaming/ValueObject/RenameProperty.php | 9 +- .../ValueObject/RenameStaticMethod.php | 12 +- ....php => UninitializedPropertyAnalyzer.php} | 22 +- .../NodeFactory/ExactCompareFactory.php | 36 +- .../AbstractFalsyScalarRuleFixerRector.php | 11 +- .../BooleanInBooleanNotRuleFixerRector.php | 8 +- .../Empty_/DisallowedEmptyRuleFixerRector.php | 23 +- .../BooleanInIfConditionRuleFixerRector.php | 8 +- ...ooleanInTernaryOperatorRuleFixerRector.php | 8 +- .../DisallowedShortTernaryRuleFixerRector.php | 12 +- ...FuncCallStaticCallToMethodCallAnalyzer.php | 18 +- .../NodeFactory/PropertyFetchFactory.php | 3 +- .../TypeProvidingExprFromClassResolver.php | 14 +- .../ArrayDimFetchToMethodCallRector.php | 4 +- .../PropertyAssignToMethodCallRector.php | 6 +- .../PropertyFetchToMethodCallRector.php | 6 +- .../AttributeKeyToClassConstFetchRector.php | 7 +- .../ReturnTypeWillChangeRector.php | 15 +- .../Rector/ClassMethod/WrapReturnRector.php | 28 +- ...dAllowDynamicPropertiesAttributeRector.php | 24 +- .../Class_/AddInterfaceByTraitRector.php | 13 +- .../Rector/Class_/MergeInterfacesRector.php | 10 +- .../Class_/ParentClassToTraitsRector.php | 9 +- .../ConstFetchToClassConstFetchRector.php | 4 +- .../RectorConfigBuilderRector.php | 4 +- .../FuncCall/FuncCallToConstFetchRector.php | 4 +- .../FuncCall/FuncCallToMethodCallRector.php | 9 +- .../Rector/FuncCall/FuncCallToNewRector.php | 4 +- .../FuncCall/FuncCallToStaticCallRector.php | 6 +- .../MethodCall/MethodCallToFuncCallRector.php | 4 +- .../MethodCall/MethodCallToNewRector.php | 4 +- .../MethodCallToPropertyFetchRector.php | 6 +- .../MethodCallToStaticCallRector.php | 4 +- .../ReplaceParentCallByPropertyCallRector.php | 4 +- .../Rector/New_/NewToStaticCallRector.php | 4 +- .../Scalar/ScalarValueToConstFetchRector.php | 14 +- .../StaticCall/StaticCallToFuncCallRector.php | 6 +- .../StaticCallToMethodCallRector.php | 38 +- .../StaticCall/StaticCallToNewRector.php | 4 +- .../String_/StringToClassConstantRector.php | 11 +- .../ValueObject/ArrayDimFetchToMethodCall.php | 6 +- .../AttributeKeyToClassConstFetch.php | 11 +- .../ValueObject/ClassMethodReference.php | 6 +- .../ConstFetchToClassConstFetch.php | 9 +- .../ValueObject/FuncCallToMethodCall.php | 9 +- .../ValueObject/FuncCallToStaticCall.php | 9 +- .../ValueObject/MethodCallToFuncCall.php | 9 +- .../Transform/ValueObject/MethodCallToNew.php | 8 +- .../ValueObject/MethodCallToPropertyFetch.php | 9 +- .../ValueObject/MethodCallToStaticCall.php | 12 +- .../Transform/ValueObject/NewToStaticCall.php | 9 +- .../ValueObject/ParentClassToTraits.php | 7 +- .../PropertyAssignToMethodCall.php | 9 +- .../ValueObject/PropertyFetchToMethodCall.php | 14 +- .../ReplaceParentCallByPropertyCall.php | 9 +- .../ValueObject/ScalarValueToConstFetch.php | 10 +- .../ValueObject/StaticCallToFuncCall.php | 9 +- .../ValueObject/StaticCallToMethodCall.php | 12 +- .../Transform/ValueObject/StaticCallToNew.php | 6 +- .../ValueObject/StringToClassConstant.php | 9 +- .../Transform/ValueObject/WrapReturn.php | 9 +- .../ConstructorAssignDetector.php | 63 +- .../NullTypeAssignDetector.php | 16 +- .../FunctionLikeReturnTypeResolver.php | 3 +- .../Guard/ParamTypeAddGuard.php | 25 +- .../Guard/PropertyTypeOverrideGuard.php | 8 +- .../Matcher/PropertyAssignMatcher.php | 3 +- ...AutowiredClassMethodOrPropertyAnalyzer.php | 23 +- .../NodeAnalyzer/CallTypesResolver.php | 24 +- .../NodeAnalyzer/CallerParamMatcher.php | 19 +- .../ClassMethodAndPropertyAnalyzer.php | 3 +- .../ClassMethodParamTypeCompleter.php | 11 +- .../NodeAnalyzer/NeverFuncCallAnalyzer.php | 3 +- .../NodeAnalyzer/ParamAnalyzer.php | 3 +- .../NodeAnalyzer/ReturnAnalyzer.php | 3 +- .../ExclusiveNativeCallLikeReturnMatcher.php | 3 +- ...StrictNativeFunctionReturnTypeAnalyzer.php | 9 +- .../StrictReturnNewAnalyzer.php | 12 +- .../NodeAnalyzer/TypeNodeUnwrapper.php | 3 +- .../NodeManipulator/AddNeverReturnType.php | 20 +- .../NodeManipulator/AddReturnTypeFromCast.php | 16 +- .../AddReturnTypeFromParam.php | 24 +- .../AddReturnTypeFromStrictNativeCall.php | 15 +- .../NodeManipulator/AddUnionReturnType.php | 9 +- .../PropertyTypeDecorator.php | 12 +- .../PHPStan/ObjectTypeSpecifier.php | 71 +- .../PhpDocParser/ParamPhpDocNodeFactory.php | 5 +- .../TypeExpressionFromVarTagResolver.php | 6 +- .../AddArrowFunctionReturnTypeRector.php | 9 +- .../BinaryOpNullableToInstanceofRector.php | 13 +- ...ddMethodCallBasedStrictParamTypeRector.php | 9 +- ...ockBasedOnCallableNativeFuncCallRector.php | 16 +- ...amTypeBasedOnPHPUnitDataProviderRector.php | 33 +- .../AddParamTypeDeclarationRector.php | 20 +- .../AddParamTypeFromPropertyTypeRector.php | 24 +- ...turnArrayDocblockBasedOnArrayMapRector.php | 22 +- ...larationBasedOnParentClassMethodRector.php | 13 +- .../AddReturnTypeDeclarationRector.php | 38 +- .../AddTypeFromResourceDocblockRector.php | 22 +- .../AddVoidReturnTypeWhereNoReturnRector.php | 14 +- ...eturnTypeFromBooleanConstReturnsRector.php | 20 +- ...turnTypeFromBooleanStrictReturnsRector.php | 95 +- ...mericReturnTypeFromStrictReturnsRector.php | 25 +- ...eturnTypeFromStrictScalarReturnsRector.php | 25 +- .../ParamTypeByMethodCallTypeRector.php | 43 +- .../ParamTypeByParentCallTypeRector.php | 20 +- .../ClassMethod/ReturnNeverTypeRector.php | 39 +- .../ClassMethod/ReturnNullableTypeRector.php | 18 +- .../ReturnTypeFromMockObjectRector.php | 29 +- .../ReturnTypeFromReturnCastRector.php | 12 +- .../ReturnTypeFromReturnDirectArrayRector.php | 15 +- .../ReturnTypeFromReturnNewRector.php | 42 +- ...turnTypeFromStrictConstantReturnRector.php | 24 +- ...ReturnTypeFromStrictFluentReturnRector.php | 21 +- .../ReturnTypeFromStrictNativeCallRector.php | 12 +- .../ReturnTypeFromStrictNewArrayRector.php | 46 +- .../ReturnTypeFromStrictParamRector.php | 12 +- .../ReturnTypeFromStrictTypedCallRector.php | 35 +- ...eturnTypeFromStrictTypedPropertyRector.php | 27 +- .../ReturnTypeFromSymfonySerializerRector.php | 20 +- .../ClassMethod/ReturnUnionTypeRector.php | 12 +- .../StrictArrayParamDimFetchRector.php | 11 +- .../StrictStringParamConcatRector.php | 12 +- ...eturnTypeFromStrictScalarReturnsRector.php | 21 +- ...eturnTypeFromStrictStringReturnsRector.php | 21 +- ...TestsVoidReturnTypeWhereNoReturnRector.php | 6 +- ...ChildDoctrineRepositoryClassTypeRector.php | 14 +- ...eDateTimePropertyTypeDeclarationRector.php | 6 +- ...opertyTypeFromStrictSetterGetterRector.php | 24 +- .../ReturnTypeFromStrictTernaryRector.php | 23 +- ...ypedPropertyFromCreateMockAssignRector.php | 40 +- ...tyFromJMSSerializerAttributeTypeRector.php | 35 +- .../AddClosureNeverReturnTypeRector.php | 12 +- ...osureVoidReturnTypeWhereNoReturnRector.php | 3 +- .../Closure/ClosureReturnTypeRector.php | 6 +- ...mptyOnNullableObjectToInstanceOfRector.php | 14 +- .../InlineVarDocTagToAssertRector.php | 11 +- ...wFunctionParamArrayWhereDimFetchRector.php | 80 + .../AddClosureParamTypeForArrayMapRector.php | 176 ++ ...ddClosureParamTypeForArrayReduceRector.php | 159 + .../AddClosureParamTypeFromArgRector.php | 13 +- ...eParamTypeFromIterableMethodCallRector.php | 12 +- .../AddClosureParamTypeFromObjectRector.php | 10 +- ...LikeWithinCallLikeArgDeclarationRector.php | 26 +- .../AddParamTypeSplFixedArrayRector.php | 6 +- ...dReturnTypeDeclarationFromYieldsRector.php | 33 +- ...ctionVoidReturnTypeWhereNoReturnRector.php | 3 +- .../AddPropertyTypeDeclarationRector.php | 18 +- .../TypedPropertyFromAssignsRector.php | 30 +- ...pedPropertyFromStrictConstructorRector.php | 32 +- .../TypedPropertyFromStrictSetUpRector.php | 17 +- .../DeclareStrictTypesRector.php | 32 +- .../IncreaseDeclareStrictTypesRector.php | 27 +- .../WhileNullableToInstanceofRector.php | 10 +- .../TypeAnalyzer/NullableTypeAnalyzer.php | 3 +- .../PropertyTypeDefaultValueAnalyzer.php | 14 +- .../TypeAnalyzer/ReturnStrictTypeAnalyzer.php | 19 +- .../AssignToPropertyTypeInferer.php | 57 +- .../AllAssignNodePropertyTypeInferer.php | 16 +- ...tterTypeDeclarationPropertyTypeInferer.php | 9 +- ...tterTypeDeclarationPropertyTypeInferer.php | 9 +- .../TrustedClassMethodPropertyTypeInferer.php | 42 +- .../TypeInferer/ReturnTypeInferer.php | 14 +- ...urnedNodesReturnTypeInfererTypeInferer.php | 18 +- .../TypeInferer/SilentVoidResolver.php | 27 +- .../TypeInferer/SplArrayFixedTypeNarrower.php | 11 +- .../rules/TypeDeclaration/TypeNormalizer.php | 117 - .../AddClosureParamTypeFromArg.php | 10 +- .../AddClosureParamTypeFromObject.php | 10 +- .../ValueObject/AddParamTypeDeclaration.php | 11 +- ...nctionLikeWithinCallLikeArgDeclaration.php | 11 +- .../AddPropertyTypeDeclaration.php | 9 +- .../ValueObject/AddReturnTypeDeclaration.php | 9 +- .../ValueObject/AssignToVariable.php | 6 +- .../ValueObject/DataProviderNodes.php | 4 +- .../ValueObject/NestedArrayType.php | 46 - .../ChangeConstantVisibilityRector.php | 7 +- .../ChangeMethodVisibilityRector.php | 19 +- .../ExplicitPublicClassMethodRector.php | 3 +- .../ValueObject/ChangeConstantVisibility.php | 9 +- .../ValueObject/ChangeMethodVisibility.php | 9 +- .../Application/ApplicationFileProcessor.php | 48 +- .../Application/ChangedNodeScopeRefresher.php | 121 +- .../rector/src/Application/FileProcessor.php | 103 +- .../Application/NodeAttributeReIndexer.php | 74 + .../Provider/CurrentFileProvider.php | 5 +- .../src/Application/VersionResolver.php | 4 +- .../src/Autoloading/AdditionalAutoloader.php | 11 +- .../Autoloading/BootstrapFilesIncluder.php | 5 +- .../CurrentTokenIteratorProvider.php | 5 +- .../PhpDoc/DoctrineAnnotationTagValueNode.php | 5 +- .../BetterPhpDocParser/PhpDoc/StringNode.php | 5 +- .../PhpDocInfo/PhpDocInfo.php | 32 +- .../PhpDocInfo/PhpDocInfoFactory.php | 20 +- .../PhpDocInfo/TokenIteratorFactory.php | 3 +- .../PhpDocManipulator/PhpDocClassRenamer.php | 8 +- .../PhpDocManipulator/PhpDocTypeChanger.php | 28 +- .../BetterPhpDocParser/PhpDocNodeMapper.php | 10 +- .../ArrayTypePhpDocNodeVisitor.php | 3 +- .../CallableTypePhpDocNodeVisitor.php | 5 +- .../ChangedPhpDocNodeVisitor.php | 5 +- .../IntersectionTypeNodePhpDocNodeVisitor.php | 3 +- .../TemplatePhpDocNodeVisitor.php | 20 +- .../UnionTypeNodePhpDocNodeVisitor.php | 14 +- .../ArrayItemClassNameDecorator.php | 6 +- .../PhpDocParser/BetterPhpDocParser.php | 44 +- .../PhpDocParser/BetterTypeParser.php | 35 - .../PhpDocParser/ClassAnnotationMatcher.php | 18 +- .../ConstExprClassNameDecorator.php | 6 +- .../DoctrineAnnotationDecorator.php | 83 +- .../StaticDoctrineAnnotationParser.php | 6 +- .../ArrayParser.php | 19 +- .../PlainValueParser.php | 13 +- .../Printer/DocBlockInliner.php | 2 +- .../Printer/PhpDocInfoPrinter.php | 38 +- .../RemoveNodesStartAndEndResolver.php | 2 +- .../Parser/BetterTokenIterator.php | 2 +- .../AbstractValuesAwareNode.php | 25 +- .../DoctrineAnnotation/CurlyListNode.php | 8 +- .../SpacingAwareTemplateTagValueNode.php | 3 +- .../ValueObject/StartAndEnd.php | 6 +- .../Type/BracketsAwareUnionTypeNode.php | 3 +- .../Type/SpacingAwareCallableTypeNode.php | 6 +- .../src/Bootstrap/RectorConfigsResolver.php | 4 +- .../src/Bridge/SetProviderCollector.php | 20 +- .../rector/src/Bridge/SetRectorsResolver.php | 3 +- vendor/rector/rector/src/Caching/Cache.php | 3 +- .../rector/src/Caching/CacheFactory.php | 5 +- .../Caching/Detector/ChangedFilesDetector.php | 20 +- .../src/Caching/UnchangedFilesFilter.php | 3 +- .../Caching/ValueObject/CacheFilePaths.php | 9 +- .../src/Caching/ValueObject/CacheItem.php | 3 +- .../ValueObject/Storage/FileCacheStorage.php | 12 +- .../Storage/MemoryCacheStorage.php | 2 +- .../Output/ConsoleOutputFormatter.php | 11 +- .../Output/GitHubOutputFormatter.php | 104 + .../Output/GitlabOutputFormatter.php | 96 + .../Output/JUnitOutputFormatter.php | 89 + .../Output/JsonOutputFormatter.php | 2 +- .../ValueObject/RectorWithLineChange.php | 12 +- .../ValueObjectFactory/ErrorFactory.php | 3 +- .../ValueObjectFactory/FileDiffFactory.php | 17 +- .../rector/src/Comments/CommentRemover.php | 3 +- .../Comments/NodeDocBlock/DocBlockUpdater.php | 17 +- .../CommentRemovingNodeTraverser.php | 3 +- .../src/Composer/InstalledPackageResolver.php | 65 +- .../Composer/ValueObject/InstalledPackage.php | 6 +- .../src/Config/Level/CodeQualityLevel.php | 7 +- .../src/Config/Level/CodingStyleLevel.php | 57 + .../rector/src/Config/Level/DeadCodeLevel.php | 10 + .../src/Config/Level/TypeDeclarationLevel.php | 2 + .../rector/rector/src/Config/RectorConfig.php | 53 +- .../rector/src/Config/RegisteredService.php | 9 +- .../src/Configuration/ConfigInitializer.php | 16 +- .../Configuration/ConfigurationFactory.php | 45 +- .../Configuration/ConfigurationRuleFilter.php | 47 + .../Levels/LevelRulesResolver.php | 2 +- .../src/Configuration/OnlyRuleResolver.php | 63 + .../rector/src/Configuration/Option.php | 38 +- .../Parameter/SimpleParameterProvider.php | 6 +- .../src/Configuration/PhpLevelSetResolver.php | 2 +- .../src/Configuration/RectorConfigBuilder.php | 445 ++- .../RenamedClassesDataCollector.php | 2 +- .../src/Console/Command/CustomRuleCommand.php | 19 +- .../src/Console/Command/ListRulesCommand.php | 54 +- .../src/Console/Command/ProcessCommand.php | 95 +- .../src/Console/Command/SetupCICommand.php | 17 +- .../src/Console/Command/WorkerCommand.php | 52 +- .../rector/src/Console/ConsoleApplication.php | 26 +- vendor/rector/rector/src/Console/ExitCode.php | 2 +- .../Formatter/ColorConsoleDiffFormatter.php | 11 +- .../src/Console/Formatter/ConsoleDiffer.php | 10 +- vendor/rector/rector/src/Console/Notifier.php | 14 +- .../Output/OutputFormatterCollector.php | 2 +- .../src/Console/ProcessConfigureDecorator.php | 9 +- .../rector/src/Console/Style/RectorStyle.php | 17 +- .../src/Console/Style/SymfonyStyleFactory.php | 13 +- .../Rector/HTMLAverseRectorInterface.php | 12 + .../src/Contract/Rector/RectorInterface.php | 4 +- .../Rector/ScopeAwareRectorInterface.php | 16 - .../src/CustomRules/SimpleNodeDumper.php | 24 +- .../Laravel/ContainerMemento.php | 2 +- .../LazyContainerFactory.php | 64 +- .../RectorContainerFactory.php | 2 +- .../rector/src/Differ/DefaultDiffer.php | 10 +- vendor/rector/rector/src/Enum/ClassName.php | 8 + .../rector/src/Enum/Config/Defaults.php | 12 + .../RectorRuleNameAmbiguousException.php | 9 + .../RectorRuleNotFoundException.php | 9 + .../NodeAnalyzer/ClassChildAnalyzer.php | 4 - .../Reflection/FamilyRelationsAnalyzer.php | 10 +- .../src/FileSystem/FileAndDirectoryFilter.php | 8 +- .../rector/src/FileSystem/FilePathHelper.php | 9 +- .../rector/src/FileSystem/FilesFinder.php | 68 +- .../src/FileSystem/FilesystemTweaker.php | 24 +- .../src/FileSystem/InitFilePathsResolver.php | 9 +- .../rector/src/FileSystem/JsonFileSystem.php | 4 +- .../rector/src/Git/RepositoryHelper.php | 4 +- .../src/NodeAnalyzer/BinaryOpAnalyzer.php | 3 +- .../rector/src/NodeAnalyzer/CallAnalyzer.php | 3 +- .../NodeAnalyzer/CompactFuncCallAnalyzer.php | 7 +- .../NodeAnalyzer/DoctrineEntityAnalyzer.php | 3 +- .../rector/src/NodeAnalyzer/ExprAnalyzer.php | 78 +- .../NodeAnalyzer/MagicClassMethodAnalyzer.php | 3 +- .../rector/src/NodeAnalyzer/ParamAnalyzer.php | 25 +- .../src/NodeAnalyzer/PropertyAnalyzer.php | 15 +- .../NodeAnalyzer/PropertyFetchAnalyzer.php | 41 +- .../NodeAnalyzer/PropertyPresenceChecker.php | 22 +- .../rector/src/NodeAnalyzer/ScopeAnalyzer.php | 6 +- .../NodeAnalyzer/TerminatedNodeAnalyzer.php | 20 +- .../src/NodeAnalyzer/VariadicAnalyzer.php | 7 +- .../ArrayCallableMethodMatcher.php | 18 +- .../ValueObject/ArrayCallable.php | 9 +- .../NodeDecorator/CreatedByRuleDecorator.php | 4 +- .../NodeDecorator/PropertyTypeDecorator.php | 12 +- .../StatementDepthAttributeDecorator.php | 25 + .../src/NodeManipulator/AssignManipulator.php | 30 +- .../NodeManipulator/BinaryOpManipulator.php | 7 +- .../NodeManipulator/ClassConstManipulator.php | 37 +- .../ClassDependencyManipulator.php | 137 +- .../ClassInsertManipulator.php | 3 +- .../src/NodeManipulator/ClassManipulator.php | 6 +- .../ClassMethodAssignManipulator.php | 8 +- .../ClassMethodManipulator.php | 6 +- .../ClassMethodPropertyFetchManipulator.php | 17 +- .../NodeManipulator/FuncCallManipulator.php | 3 +- .../FunctionLikeManipulator.php | 3 +- .../src/NodeManipulator/IfManipulator.php | 19 +- .../PropertyFetchAssignManipulator.php | 15 +- .../NodeManipulator/PropertyManipulator.php | 87 +- .../src/NodeManipulator/StmtsManipulator.php | 54 +- .../src/NodeNameResolver/NodeNameResolver.php | 14 +- .../NodeNameResolver/FuncCallNameResolver.php | 3 +- .../NodeNameResolver/FunctionNameResolver.php | 2 +- .../NodeNameResolver/NameNameResolver.php | 2 +- .../src/NodeNestingScope/ContextAnalyzer.php | 29 + .../PHPStanServicesFactory.php | 11 +- .../NodeTypeResolver/Node/AttributeKey.php | 16 +- .../NodeScopeAndMetadataDecorator.php | 12 +- .../AccessoryNonEmptyStringTypeCorrector.php | 5 +- .../GenericClassStringTypeCorrector.php | 3 +- .../src/NodeTypeResolver/NodeTypeResolver.php | 107 +- .../ClassAndInterfaceTypeResolver.php | 3 +- .../NodeTypeResolver/NewTypeResolver.php | 6 +- .../NodeTypeResolver/ParamTypeResolver.php | 5 +- .../PropertyFetchTypeResolver.php | 11 +- .../NodeTypeResolver/PropertyTypeResolver.php | 3 +- .../NodeTypeResolver/ScalarTypeResolver.php | 22 +- .../StaticCallMethodCallTypeResolver.php | 13 +- .../NodeTypeResolver/TraitTypeResolver.php | 3 +- .../ObjectWithoutClassTypeWithParentTypes.php | 2 +- .../NodeVisitor/AssignedToNodeVisitor.php | 9 + .../NodeVisitor/ByRefReturnNodeVisitor.php | 7 +- .../NodeVisitor/ByRefVariableNodeVisitor.php | 11 +- .../Scope/NodeVisitor/ContextNodeVisitor.php | 13 +- .../NodeVisitor/GlobalVariableNodeVisitor.php | 11 +- .../NodeVisitor/StaticVariableNodeVisitor.php | 15 +- .../Scope/NodeVisitor/StmtKeyNodeVisitor.php | 18 +- .../Scope/PHPStanNodeScopeResolver.php | 209 +- .../PHPStan/Scope/RectorNodeScopeResolver.php | 28 + .../PHPStan/Scope/ScopeFactory.php | 3 +- .../PHPStan/Type/StaticTypeAnalyzer.php | 8 +- .../PHPStan/Type/TypeFactory.php | 24 +- .../NodeTypeResolver/PHPStan/TypeHasher.php | 5 +- .../NodeAnalyzer/DocBlockClassRenamer.php | 3 +- .../NodeAnalyzer/DocBlockNameImporter.php | 3 +- .../NodeAnalyzer/DocBlockTagReplacer.php | 3 +- .../ClassRenamePhpDocNodeVisitor.php | 117 +- .../NameImportingPhpDocNodeVisitor.php | 56 +- ...orBetterReflectionSourceLocatorFactory.php | 6 +- .../IntermediateSourceLocator.php | 3 +- .../DynamicSourceLocatorProvider.php | 21 +- .../TypeAnalyzer/ArrayTypeAnalyzer.php | 3 +- .../TypeAnalyzer/StringTypeAnalyzer.php | 3 +- .../TypeComparator/ArrayTypeComparator.php | 14 +- .../TypeComparator/ScalarTypeComparator.php | 3 +- .../TypeComparator/TypeComparator.php | 33 +- .../ValueObject/OldToNewType.php | 6 +- .../UnreachableStatementNodeVisitor.php | 68 - .../WrappedNodeRestoringNodeVisitor.php | 26 - .../rector/src/PHPStan/ScopeFetcher.php | 23 + .../DoctrineTypeAnalyzer.php | 9 +- .../PHPStanStaticTypeMapper.php | 4 +- .../AccessoryLiteralStringTypeMapper.php | 3 +- .../AccessoryNonEmptyStringTypeMapper.php | 3 +- .../AccessoryNonFalsyStringTypeMapper.php | 3 +- .../AccessoryNumericStringTypeMapper.php | 3 +- .../TypeMapper/ArrayTypeMapper.php | 26 +- .../TypeMapper/BooleanTypeMapper.php | 16 +- .../TypeMapper/ClassStringTypeMapper.php | 3 +- .../TypeMapper/ClosureTypeMapper.php | 16 +- .../ConditionalTypeForParameterMapper.php | 5 +- .../TypeMapper/ConditionalTypeMapper.php | 7 +- .../TypeMapper/ConstantArrayTypeMapper.php | 45 + .../TypeMapper/FloatTypeMapper.php | 3 +- .../GenericClassStringTypeMapper.php | 3 +- .../TypeMapper/HasMethodTypeMapper.php | 3 +- .../TypeMapper/HasOffsetTypeMapper.php | 3 +- .../HasOffsetValueTypeTypeMapper.php | 3 +- .../TypeMapper/HasPropertyTypeMapper.php | 3 +- .../TypeMapper/IntegerTypeMapper.php | 3 +- .../TypeMapper/IntersectionTypeMapper.php | 12 +- .../TypeMapper/IterableTypeMapper.php | 3 +- .../TypeMapper/MixedTypeMapper.php | 3 +- .../TypeMapper/NonEmptyArrayTypeMapper.php | 3 +- .../TypeMapper/NullTypeMapper.php | 3 +- .../TypeMapper/ObjectTypeMapper.php | 7 +- .../ObjectWithoutClassTypeMapper.php | 7 +- .../TypeMapper/OversizedArrayTypeMapper.php | 3 +- .../TypeMapper/ParentStaticTypeMapper.php | 3 +- .../TypeMapper/SelfObjectTypeMapper.php | 3 +- .../TypeMapper/StaticTypeMapper.php | 6 +- .../TypeMapper/StrictMixedTypeMapper.php | 3 +- .../TypeMapper/StringTypeMapper.php | 3 +- .../TypeMapper/ThisTypeMapper.php | 2 +- .../TypeWithClassNameTypeMapper.php | 3 +- .../TypeMapper/UnionTypeMapper.php | 19 +- .../TypeMapper/VoidTypeMapper.php | 3 +- .../Utils/TypeUnwrapper.php | 24 +- .../Application/ParallelFileProcessor.php | 33 +- .../Command/WorkerCommandLineFactory.php | 22 +- .../ComposerJsonPhpVersionResolver.php | 8 +- .../src/Php/PolyfillPackagesProvider.php | 8 +- .../AnnotationToAttributeMapper.php | 4 +- .../ArrayAnnotationToAttributeMapper.php | 12 +- ...rayItemNodeAnnotationToAttributeMapper.php | 11 +- ...sConstFetchAnnotationToAttributeMapper.php | 14 +- ...rlyListNodeAnnotationToAttributeMapper.php | 15 +- ...eAnnotationAnnotationToAttributeMapper.php | 13 +- .../StringAnnotationToAttributeMapper.php | 16 - .../AttributeArrayNameInliner.php | 40 +- .../AnnotationToAttributeMapperInterface.php | 4 +- ...nnotationToAttributeIntegerValueCaster.php | 28 +- .../NodeFactory/AttributeNameFactory.php | 3 +- .../NodeFactory/NamedArgsFactory.php | 48 +- .../NodeFactory/PhpAttributeGroupFactory.php | 34 +- .../PhpNestedAttributeGroupFactory.php | 26 +- .../src/PhpAttribute/UseAliasNameMatcher.php | 4 +- .../ValueObject/UseAliasMetadata.php | 19 +- .../SimpleCallableNodeTraverser.php | 3 +- .../NodeVisitor/CallableNodeVisitor.php | 13 +- .../PhpDocParser/PhpDocNodeTraverser.php | 6 +- .../CallablePhpDocNodeVisitor.php | 3 +- .../ParentConnectingPhpDocNodeVisitor.php | 2 +- .../PhpDocParser/PhpParser/SmartPhpParser.php | 38 - .../PhpParser/SmartPhpParserFactory.php | 41 - .../PhpDocParser/ValueObject/AttributeKey.php | 2 +- .../rector/src/PhpParser/AstResolver.php | 53 +- .../PhpParser/Comparing/NodeComparator.php | 6 +- .../src/PhpParser/Node/AssignAndBinaryMap.php | 5 +- .../src/PhpParser/Node/BetterNodeFinder.php | 81 +- .../Node/CustomNode/FileWithoutNamespace.php | 2 +- .../rector/src/PhpParser/Node/NodeFactory.php | 39 +- .../PhpParser/Node/Value/ValueResolver.php | 87 +- .../NodeFinder/LocalMethodCallFinder.php | 16 +- .../NodeFinder/PropertyFetchFinder.php | 41 +- .../rector/src/PhpParser/NodeTransformer.php | 7 +- .../NodeTraverser/RectorNodeTraverser.php | 18 +- .../src/PhpParser/Parser/InlineCodeParser.php | 35 +- .../src/PhpParser/Parser/ParserErrors.php | 6 +- .../src/PhpParser/Parser/RectorParser.php | 34 +- .../src/PhpParser/Parser/SimplePhpParser.php | 13 +- .../Printer/BetterStandardPrinter.php | 274 +- .../PhpParser/ValueObject/StmtsAndTokens.php | 11 +- .../Application/PostFileProcessor.php | 26 +- .../Collector/UseNodesToAddCollector.php | 12 +- .../PostRector/Guard/AddUseStatementGuard.php | 5 +- .../PostRector/Rector/AbstractPostRector.php | 2 +- .../Rector/ClassRenamingPostRector.php | 80 +- .../DocblockNameImportingPostRector.php | 17 +- .../Rector/NameImportingPostRector.php | 21 +- .../Rector/UnusedImportRemovingPostRector.php | 37 +- .../PostRector/Rector/UseAddingPostRector.php | 13 +- .../ValueObject/PropertyMetadata.php | 13 +- .../rector/src/Rector/AbstractRector.php | 90 +- .../src/Rector/AbstractScopeAwareRector.php | 29 - .../src/Reflection/ClassModifierChecker.php | 3 +- .../Reflection/MethodReflectionResolver.php | 3 +- .../src/Reflection/ReflectionResolver.php | 53 +- .../src/Reporting/DeprecatedRulesReporter.php | 5 +- .../Reporting/MissConfigurationReporter.php | 20 +- .../src/Set/Contract/SetListInterface.php | 12 - .../rector/rector/src/Set/Enum/SetGroup.php | 14 + vendor/rector/rector/src/Set/SetManager.php | 29 +- .../src/Set/SetProvider/CoreSetProvider.php | 3 +- .../src/Set/SetProvider/PHPSetProvider.php | 2 +- .../Set/ValueObject/ComposerTriggeredSet.php | 17 +- .../src/Set/ValueObject/LevelSetList.php | 7 +- .../rector/rector/src/Set/ValueObject/Set.php | 11 +- .../rector/src/Set/ValueObject/SetList.php | 11 +- .../FileSystem/FnMatchPathNormalizer.php | 1 - .../src/Skipper/Matcher/FileInfoMatcher.php | 9 +- .../rector/src/Skipper/RealpathMatcher.php | 14 +- .../SkippedPathsResolver.php | 3 +- .../src/Skipper/SkipVoter/ClassSkipVoter.php | 9 +- .../src/Skipper/Skipper/PathSkipper.php | 6 +- .../src/Skipper/Skipper/SkipSkipper.php | 3 +- .../rector/src/Skipper/Skipper/Skipper.php | 9 +- .../DynamicSourceLocatorDecorator.php | 19 +- .../Mapper/PhpParserNodeMapper.php | 2 +- .../Mapper/ScalarStringToTypeMapper.php | 7 +- .../Naming/NameScopeFactory.php | 7 +- .../PhpDoc/PhpDocTypeMapper.php | 7 +- .../IdentifierPhpDocTypeMapper.php | 19 +- .../IntersectionPhpDocTypeMapper.php | 3 +- .../PhpDocParser/NullablePhpDocTypeMapper.php | 6 +- .../PhpDocParser/UnionPhpDocTypeMapper.php | 12 +- .../PhpParser/IdentifierNodeMapper.php | 3 +- .../PhpParser/IntersectionTypeNodeMapper.php | 9 +- .../PhpParser/NameNodeMapper.php | 6 +- .../PhpParser/NullableTypeNodeMapper.php | 12 +- .../PhpParser/UnionTypeNodeMapper.php | 15 +- .../ClassNameFromObjectTypeResolver.php | 17 + .../src/StaticTypeMapper/StaticTypeMapper.php | 12 +- .../ValueObject/Type/AliasedObjectType.php | 16 +- .../Type/FullyQualifiedObjectType.php | 8 +- .../Type/ShortenedGenericObjectType.php | 6 +- .../ValueObject/Type/ShortenedObjectType.php | 6 +- .../ValueObject/Type/SimpleStaticType.php | 3 +- .../src/Testing/Fixture/FixtureFileFinder.php | 2 +- .../Testing/Fixture/FixtureFileUpdater.php | 2 +- .../src/Testing/Fixture/FixtureSplitter.php | 2 +- .../Testing/Fixture/FixtureTempFileDumper.php | 2 +- .../Testing/PHPUnit/AbstractLazyTestCase.php | 29 +- .../PHPUnit/AbstractRectorTestCase.php | 84 +- .../src/Testing/PHPUnit/AbstractTestCase.php | 34 - .../PHPUnit/ValueObject/RectorTestResult.php | 8 +- .../Testing/TestingParser/TestingParser.php | 14 +- .../rector/src/Util/ArrayParametersMerger.php | 6 +- vendor/rector/rector/src/Util/FileHasher.php | 4 +- .../rector/rector/src/Util/MemoryLimiter.php | 2 +- .../rector/src/Util/NewLineSplitter.php | 2 +- vendor/rector/rector/src/Util/NodePrinter.php | 15 +- vendor/rector/rector/src/Util/StringUtils.php | 2 +- .../rector/src/Validation/RectorAssert.php | 2 +- .../src/Validation/RectorConfigValidator.php | 2 +- .../src/ValueObject/Application/File.php | 51 +- .../Bootstrap/BootstrapConfigs.php | 5 +- .../rector/src/ValueObject/Configuration.php | 77 +- .../Configuration/LevelOverflow.php | 56 + .../src/ValueObject/Error/SystemError.php | 21 +- .../src/ValueObject/FileProcessResult.php | 7 +- .../src/ValueObject/FuncCallAndExpr.php | 6 +- .../rector/src/ValueObject/PhpVersion.php | 4 + .../src/ValueObject/PhpVersionFeature.php | 35 + .../rector/src/ValueObject/ProcessResult.php | 11 +- .../src/ValueObject/Reporting/FileDiff.php | 45 +- .../src/ValueObject/SprintfStringAndArgs.php | 5 +- .../rector/src/ValueObject/Visibility.php | 16 +- .../ClassMethodParamVendorLockResolver.php | 9 +- .../ClassMethodReturnTypeOverrideGuard.php | 16 +- .../ClassMethodReturnVendorLockResolver.php | 13 +- .../ParentClassMethodTypeOverrideGuard.php | 24 +- .../src/VersionBonding/PhpVersionedFilter.php | 10 +- .../rector/src/functions/node_helper.php | 14 +- .../stubs-rector/Internal/NativeClasses.php | 49 + .../utils/rector/src/Rector/__Name__.php | 17 - .../rector/rector/templates/rector.php.dist | 4 +- vendor/rector/rector/vendor/autoload.php | 7 +- vendor/rector/rector/vendor/bin/php-parse | 6 +- vendor/rector/rector/vendor/bin/yaml-lint | 6 +- .../vendor/clue/ndjson-react/composer.json | 4 +- .../vendor/clue/ndjson-react/src/Decoder.php | 10 +- .../vendor/clue/ndjson-react/src/Encoder.php | 6 +- .../vendor/composer/InstalledVersions.php | 50 +- .../vendor/composer/autoload_classmap.php | 1510 +++++----- .../rector/vendor/composer/autoload_psr4.php | 56 +- .../rector/vendor/composer/autoload_real.php | 10 +- .../vendor/composer/autoload_static.php | 1630 +++++----- .../rector/vendor/composer/installed.json | 452 ++- .../rector/vendor/composer/installed.php | 4 +- .../rector/vendor/composer/pcre/composer.json | 8 +- .../composer/pcre/src/MatchAllResult.php | 2 +- .../pcre/src/MatchAllStrictGroupsResult.php | 2 +- .../pcre/src/MatchAllWithOffsetsResult.php | 2 +- .../vendor/composer/pcre/src/MatchResult.php | 2 +- .../pcre/src/MatchStrictGroupsResult.php | 2 +- .../pcre/src/MatchWithOffsetsResult.php | 2 +- .../src/PHPStan/InvalidRegexPatternRule.php | 12 +- .../pcre/src/PHPStan/PregMatchFlags.php | 2 +- .../PregMatchParameterOutTypeExtension.php | 4 +- .../PregMatchTypeSpecifyingExtension.php | 20 +- ...regReplaceCallbackClosureTypeExtension.php | 6 +- .../PHPStan/UnsafeStrictGroupsCallRule.php | 6 +- .../composer/pcre/src/PcreException.php | 8 +- .../rector/vendor/composer/pcre/src/Preg.php | 2 +- .../rector/vendor/composer/pcre/src/Regex.php | 2 +- .../composer/pcre/src/ReplaceResult.php | 2 +- .../pcre/src/UnexpectedNullMatchException.php | 2 +- .../vendor/composer/semver/composer.json | 4 +- .../vendor/composer/semver/src/Comparator.php | 4 +- .../composer/semver/src/CompilingMatcher.php | 6 +- .../composer/semver/src/Constraint/Bound.php | 2 +- .../semver/src/Constraint/Constraint.php | 2 +- .../src/Constraint/ConstraintInterface.php | 2 +- .../src/Constraint/MatchAllConstraint.php | 2 +- .../src/Constraint/MatchNoneConstraint.php | 2 +- .../semver/src/Constraint/MultiConstraint.php | 2 +- .../vendor/composer/semver/src/Interval.php | 4 +- .../vendor/composer/semver/src/Intervals.php | 12 +- .../vendor/composer/semver/src/Semver.php | 4 +- .../composer/semver/src/VersionParser.php | 10 +- .../composer/xdebug-handler/composer.json | 4 +- .../composer/xdebug-handler/src/PhpConfig.php | 2 +- .../composer/xdebug-handler/src/Process.php | 4 +- .../composer/xdebug-handler/src/Status.php | 6 +- .../xdebug-handler/src/XdebugHandler.php | 8 +- .../vendor/doctrine/inflector/composer.json | 4 +- .../Inflector/CachedWordInflector.php | 2 +- .../GenericLanguageInflectorFactory.php | 4 +- .../lib/Doctrine/Inflector/Inflector.php | 4 +- .../Doctrine/Inflector/InflectorFactory.php | 14 +- .../lib/Doctrine/Inflector/Language.php | 2 +- .../Inflector/LanguageInflectorFactory.php | 4 +- .../Doctrine/Inflector/NoopWordInflector.php | 2 +- .../Inflector/Rules/English/Inflectible.php | 38 +- .../Rules/English/InflectorFactory.php | 6 +- .../Inflector/Rules/English/Rules.php | 10 +- .../Inflector/Rules/English/Uninflected.php | 4 +- .../Inflector/Rules/French/Inflectible.php | 10 +- .../Rules/French/InflectorFactory.php | 6 +- .../Doctrine/Inflector/Rules/French/Rules.php | 10 +- .../Inflector/Rules/French/Uninflected.php | 4 +- .../Rules/NorwegianBokmal/Inflectible.php | 10 +- .../NorwegianBokmal/InflectorFactory.php | 6 +- .../Inflector/Rules/NorwegianBokmal/Rules.php | 10 +- .../Rules/NorwegianBokmal/Uninflected.php | 4 +- .../lib/Doctrine/Inflector/Rules/Pattern.php | 2 +- .../lib/Doctrine/Inflector/Rules/Patterns.php | 2 +- .../Rules/Portuguese/Inflectible.php | 10 +- .../Rules/Portuguese/InflectorFactory.php | 6 +- .../Inflector/Rules/Portuguese/Rules.php | 10 +- .../Rules/Portuguese/Uninflected.php | 4 +- .../lib/Doctrine/Inflector/Rules/Ruleset.php | 2 +- .../Inflector/Rules/Spanish/Inflectible.php | 20 +- .../Rules/Spanish/InflectorFactory.php | 6 +- .../Inflector/Rules/Spanish/Rules.php | 10 +- .../Inflector/Rules/Spanish/Uninflected.php | 4 +- .../Doctrine/Inflector/Rules/Substitution.php | 2 +- .../Inflector/Rules/Substitutions.php | 4 +- .../Inflector/Rules/Transformation.php | 4 +- .../Inflector/Rules/Transformations.php | 4 +- .../Inflector/Rules/Turkish/Inflectible.php | 10 +- .../Rules/Turkish/InflectorFactory.php | 6 +- .../Inflector/Rules/Turkish/Rules.php | 10 +- .../Inflector/Rules/Turkish/Uninflected.php | 4 +- .../lib/Doctrine/Inflector/Rules/Word.php | 2 +- .../Doctrine/Inflector/RulesetInflector.php | 4 +- .../lib/Doctrine/Inflector/WordInflector.php | 2 +- .../vendor/evenement/evenement/composer.json | 4 +- .../evenement/evenement/src/EventEmitter.php | 2 +- .../evenement/src/EventEmitterInterface.php | 2 +- .../evenement/src/EventEmitterTrait.php | 2 +- .../fidry/cpu-core-counter/bin/diagnose.php | 6 +- .../fidry/cpu-core-counter/bin/execute.php | 6 +- .../fidry/cpu-core-counter/bin/trace.php | 6 +- .../fidry/cpu-core-counter/composer.json | 4 +- .../cpu-core-counter/src/CpuCoreCounter.php | 8 +- .../fidry/cpu-core-counter/src/Diagnoser.php | 4 +- .../src/Executor/ProcOpenExecutor.php | 2 +- .../src/Executor/ProcessExecutor.php | 2 +- .../src/Finder/CmiCmdletLogicalFinder.php | 2 +- .../src/Finder/CmiCmdletPhysicalFinder.php | 2 +- .../src/Finder/CpuCoreFinder.php | 2 +- .../src/Finder/CpuInfoFinder.php | 2 +- .../src/Finder/DummyCpuCoreFinder.php | 2 +- .../src/Finder/EnvVariableFinder.php | 2 +- .../src/Finder/FinderRegistry.php | 2 +- .../src/Finder/HwLogicalFinder.php | 2 +- .../src/Finder/HwPhysicalFinder.php | 2 +- .../src/Finder/LscpuLogicalFinder.php | 2 +- .../src/Finder/LscpuPhysicalFinder.php | 2 +- .../src/Finder/NProcFinder.php | 4 +- .../src/Finder/NProcessorFinder.php | 2 +- .../src/Finder/NullCpuCoreFinder.php | 2 +- .../src/Finder/OnlyInPowerShellFinder.php | 2 +- .../src/Finder/OnlyOnOSFamilyFinder.php | 2 +- .../src/Finder/ProcOpenBasedFinder.php | 6 +- .../src/Finder/SkipOnOSFamilyFinder.php | 2 +- .../Finder/WindowsRegistryLogicalFinder.php | 2 +- .../src/Finder/WmicLogicalFinder.php | 2 +- .../src/Finder/WmicPhysicalFinder.php | 2 +- .../src/Finder/_NProcessorFinder.php | 2 +- .../src/NumberOfCpuCoreNotFound.php | 2 +- .../src/ParallelisationResult.php | 2 +- .../illuminate/container/Attributes/Auth.php | 11 +- .../container/Attributes/Authenticated.php | 13 +- .../illuminate/container/Attributes/Cache.php | 11 +- .../container/Attributes/Config.php | 11 +- .../container/Attributes/CurrentUser.php | 2 +- .../illuminate/container/Attributes/DB.php | 2 +- .../container/Attributes/Database.php | 11 +- .../illuminate/container/Attributes/Log.php | 11 +- .../container/Attributes/RouteParameter.php | 11 +- .../container/Attributes/Storage.php | 11 +- .../illuminate/container/Attributes/Tag.php | 11 +- .../illuminate/container/BoundMethod.php | 4 +- .../vendor/illuminate/container/Container.php | 82 +- .../container/ContextualBindingBuilder.php | 10 +- .../container/EntryNotFoundException.php | 4 +- .../container/RewindableGenerator.php | 2 +- .../vendor/illuminate/container/Util.php | 4 +- .../vendor/illuminate/container/composer.json | 2 +- .../contracts/Auth/Access/Authorizable.php | 2 +- .../illuminate/contracts/Auth/Access/Gate.php | 2 +- .../contracts/Auth/Authenticatable.php | 2 +- .../contracts/Auth/CanResetPassword.php | 2 +- .../illuminate/contracts/Auth/Factory.php | 2 +- .../illuminate/contracts/Auth/Guard.php | 2 +- .../Auth/Middleware/AuthenticatesRequests.php | 2 +- .../contracts/Auth/MustVerifyEmail.php | 2 +- .../contracts/Auth/PasswordBroker.php | 2 +- .../contracts/Auth/PasswordBrokerFactory.php | 2 +- .../contracts/Auth/StatefulGuard.php | 2 +- .../contracts/Auth/SupportsBasicAuth.php | 2 +- .../contracts/Auth/UserProvider.php | 2 +- .../contracts/Broadcasting/Broadcaster.php | 2 +- .../contracts/Broadcasting/Factory.php | 2 +- .../Broadcasting/HasBroadcastChannel.php | 2 +- .../contracts/Broadcasting/ShouldBeUnique.php | 2 +- .../Broadcasting/ShouldBroadcast.php | 2 +- .../Broadcasting/ShouldBroadcastNow.php | 2 +- .../illuminate/contracts/Bus/Dispatcher.php | 2 +- .../contracts/Bus/QueueingDispatcher.php | 2 +- .../illuminate/contracts/Cache/Factory.php | 2 +- .../illuminate/contracts/Cache/Lock.php | 2 +- .../contracts/Cache/LockProvider.php | 2 +- .../contracts/Cache/LockTimeoutException.php | 2 +- .../illuminate/contracts/Cache/Repository.php | 4 +- .../illuminate/contracts/Cache/Store.php | 2 +- .../contracts/Concurrency/Driver.php | 4 +- .../contracts/Config/Repository.php | 2 +- .../contracts/Console/Application.php | 2 +- .../contracts/Console/Isolatable.php | 2 +- .../illuminate/contracts/Console/Kernel.php | 2 +- .../Console/PromptsForMissingInput.php | 2 +- .../Container/BindingResolutionException.php | 4 +- .../Container/CircularDependencyException.php | 4 +- .../contracts/Container/Container.php | 31 +- .../Container/ContextualAttribute.php | 2 +- .../Container/ContextualBindingBuilder.php | 2 +- .../illuminate/contracts/Cookie/Factory.php | 2 +- .../contracts/Cookie/QueueingFactory.php | 2 +- .../contracts/Database/Eloquent/Builder.php | 4 +- .../contracts/Database/Eloquent/Castable.php | 2 +- .../Database/Eloquent/CastsAttributes.php | 4 +- .../Eloquent/CastsInboundAttributes.php | 4 +- .../Eloquent/DeviatesCastableAttributes.php | 2 +- .../Eloquent/SerializesCastableAttributes.php | 4 +- .../Eloquent/SupportsPartialRelations.php | 2 +- .../Database/Events/MigrationEvent.php | 2 +- .../contracts/Database/ModelIdentifier.php | 10 +- .../contracts/Database/Query/Builder.php | 2 +- .../Database/Query/ConditionExpression.php | 2 +- .../contracts/Database/Query/Expression.php | 4 +- .../contracts/Debug/ExceptionHandler.php | 2 +- .../contracts/Debug/ShouldntReport.php | 2 +- .../contracts/Encryption/DecryptException.php | 2 +- .../contracts/Encryption/EncryptException.php | 2 +- .../contracts/Encryption/Encrypter.php | 2 +- .../contracts/Encryption/StringEncrypter.php | 2 +- .../contracts/Events/Dispatcher.php | 2 +- .../Events/ShouldDispatchAfterCommit.php | 2 +- .../Events/ShouldHandleEventsAfterCommit.php | 2 +- .../illuminate/contracts/Filesystem/Cloud.php | 2 +- .../contracts/Filesystem/Factory.php | 2 +- .../Filesystem/FileNotFoundException.php | 2 +- .../contracts/Filesystem/Filesystem.php | 2 +- .../Filesystem/LockTimeoutException.php | 2 +- .../contracts/Foundation/Application.php | 4 +- .../Foundation/CachesConfiguration.php | 2 +- .../contracts/Foundation/CachesRoutes.php | 2 +- .../Foundation/ExceptionRenderer.php | 2 +- .../contracts/Foundation/MaintenanceMode.php | 2 +- .../illuminate/contracts/Hashing/Hasher.php | 2 +- .../illuminate/contracts/Http/Kernel.php | 2 +- .../illuminate/contracts/Mail/Attachable.php | 2 +- .../illuminate/contracts/Mail/Factory.php | 2 +- .../illuminate/contracts/Mail/MailQueue.php | 2 +- .../illuminate/contracts/Mail/Mailable.php | 4 +- .../illuminate/contracts/Mail/Mailer.php | 2 +- .../contracts/Notifications/Dispatcher.php | 2 +- .../contracts/Notifications/Factory.php | 2 +- .../contracts/Pagination/CursorPaginator.php | 9 +- .../Pagination/LengthAwarePaginator.php | 9 +- .../contracts/Pagination/Paginator.php | 9 +- .../illuminate/contracts/Pipeline/Hub.php | 2 +- .../contracts/Pipeline/Pipeline.php | 16 +- .../contracts/Process/InvokedProcess.php | 2 +- .../contracts/Process/ProcessResult.php | 2 +- .../contracts/Queue/ClearableQueue.php | 2 +- .../Queue/EntityNotFoundException.php | 2 +- .../contracts/Queue/EntityResolver.php | 2 +- .../illuminate/contracts/Queue/Factory.php | 2 +- .../vendor/illuminate/contracts/Queue/Job.php | 2 +- .../illuminate/contracts/Queue/Monitor.php | 2 +- .../illuminate/contracts/Queue/Queue.php | 2 +- .../contracts/Queue/QueueableCollection.php | 2 +- .../contracts/Queue/QueueableEntity.php | 2 +- .../contracts/Queue/ShouldBeEncrypted.php | 2 +- .../contracts/Queue/ShouldBeUnique.php | 2 +- .../Queue/ShouldBeUniqueUntilProcessing.php | 2 +- .../contracts/Queue/ShouldQueue.php | 2 +- .../Queue/ShouldQueueAfterCommit.php | 2 +- .../illuminate/contracts/Redis/Connection.php | 2 +- .../illuminate/contracts/Redis/Connector.php | 2 +- .../illuminate/contracts/Redis/Factory.php | 2 +- .../Redis/LimiterTimeoutException.php | 2 +- .../contracts/Routing/BindingRegistrar.php | 2 +- .../contracts/Routing/Registrar.php | 2 +- .../contracts/Routing/ResponseFactory.php | 4 +- .../contracts/Routing/UrlGenerator.php | 2 +- .../contracts/Routing/UrlRoutable.php | 2 +- .../Middleware/AuthenticatesSessions.php | 2 +- .../illuminate/contracts/Session/Session.php | 2 +- .../contracts/Support/Arrayable.php | 2 +- .../Support/CanBeEscapedWhenCastToString.php | 2 +- .../contracts/Support/DeferrableProvider.php | 2 +- .../Support/DeferringDisplayableValue.php | 2 +- .../illuminate/contracts/Support/Htmlable.php | 2 +- .../illuminate/contracts/Support/Jsonable.php | 2 +- .../contracts/Support/MessageBag.php | 2 +- .../contracts/Support/MessageProvider.php | 2 +- .../contracts/Support/Renderable.php | 2 +- .../contracts/Support/Responsable.php | 2 +- .../contracts/Support/ValidatedData.php | 2 +- .../Translation/HasLocalePreference.php | 2 +- .../contracts/Translation/Loader.php | 2 +- .../contracts/Translation/Translator.php | 2 +- .../contracts/Validation/DataAwareRule.php | 2 +- .../contracts/Validation/Factory.php | 2 +- .../contracts/Validation/ImplicitRule.php | 2 +- .../contracts/Validation/InvokableRule.php | 2 +- .../illuminate/contracts/Validation/Rule.php | 2 +- .../Validation/UncompromisedVerifier.php | 2 +- .../Validation/ValidatesWhenResolved.php | 2 +- .../contracts/Validation/ValidationRule.php | 2 +- .../contracts/Validation/Validator.php | 4 +- .../Validation/ValidatorAwareRule.php | 4 +- .../illuminate/contracts/View/Engine.php | 2 +- .../illuminate/contracts/View/Factory.php | 2 +- .../vendor/illuminate/contracts/View/View.php | 4 +- .../View/ViewCompilationException.php | 2 +- .../vendor/illuminate/contracts/composer.json | 2 +- .../vendor/nette/utils/src/HtmlStringable.php | 2 +- .../utils/src/Iterators/CachingIterator.php | 9 +- .../nette/utils/src/Iterators/Mapper.php | 2 +- .../vendor/nette/utils/src/SmartObject.php | 4 +- .../vendor/nette/utils/src/StaticClass.php | 2 +- .../vendor/nette/utils/src/Translator.php | 2 +- .../nette/utils/src/Utils/ArrayHash.php | 4 +- .../nette/utils/src/Utils/ArrayList.php | 9 +- .../vendor/nette/utils/src/Utils/Arrays.php | 12 +- .../vendor/nette/utils/src/Utils/Callback.php | 4 +- .../vendor/nette/utils/src/Utils/DateTime.php | 77 +- .../vendor/nette/utils/src/Utils/FileInfo.php | 9 +- .../nette/utils/src/Utils/FileSystem.php | 18 +- .../vendor/nette/utils/src/Utils/Finder.php | 53 +- .../vendor/nette/utils/src/Utils/Floats.php | 4 +- .../vendor/nette/utils/src/Utils/Helpers.php | 5 +- .../vendor/nette/utils/src/Utils/Html.php | 16 +- .../vendor/nette/utils/src/Utils/Image.php | 44 +- .../nette/utils/src/Utils/ImageColor.php | 24 +- .../nette/utils/src/Utils/ImageType.php | 2 +- .../nette/utils/src/Utils/Iterables.php | 16 +- .../vendor/nette/utils/src/Utils/Json.php | 4 +- .../nette/utils/src/Utils/ObjectHelpers.php | 18 +- .../nette/utils/src/Utils/Paginator.php | 18 +- .../vendor/nette/utils/src/Utils/Random.php | 8 +- .../nette/utils/src/Utils/Reflection.php | 8 +- .../utils/src/Utils/ReflectionMethod.php | 7 +- .../vendor/nette/utils/src/Utils/Strings.php | 20 +- .../vendor/nette/utils/src/Utils/Type.php | 42 +- .../nette/utils/src/Utils/Validators.php | 4 +- .../nette/utils/src/Utils/exceptions.php | 12 +- .../vendor/nette/utils/src/compatibility.php | 6 +- .../vendor/nette/utils/src/exceptions.php | 35 +- .../rector/vendor/nikic/php-parser/README.md | 32 +- .../vendor/nikic/php-parser/bin/php-parse | 39 +- .../vendor/nikic/php-parser/composer.json | 10 +- .../lib/PhpParser/Builder/ClassConst.php | 29 +- .../lib/PhpParser/Builder/Class_.php | 50 +- .../lib/PhpParser/Builder/Declaration.php | 12 +- .../lib/PhpParser/Builder/EnumCase.php | 12 +- .../lib/PhpParser/Builder/Enum_.php | 38 +- .../lib/PhpParser/Builder/FunctionLike.php | 11 +- .../lib/PhpParser/Builder/Function_.php | 9 +- .../lib/PhpParser/Builder/Interface_.php | 15 +- .../lib/PhpParser/Builder/Method.php | 25 +- .../lib/PhpParser/Builder/Namespace_.php | 5 +- .../lib/PhpParser/Builder/Param.php | 60 +- .../lib/PhpParser/Builder/Property.php | 85 +- .../lib/PhpParser/Builder/TraitUse.php | 6 +- .../PhpParser/Builder/TraitUseAdaptation.php | 43 +- .../lib/PhpParser/Builder/Trait_.php | 21 +- .../php-parser/lib/PhpParser/Builder/Use_.php | 11 +- .../lib/PhpParser/BuilderFactory.php | 55 +- .../lib/PhpParser/BuilderHelpers.php | 14 +- .../php-parser/lib/PhpParser/Comment.php | 81 +- .../ConstExprEvaluationException.php | 1 + .../lib/PhpParser/ConstExprEvaluator.php | 12 +- .../nikic/php-parser/lib/PhpParser/Error.php | 38 +- .../php-parser/lib/PhpParser/ErrorHandler.php | 2 +- .../lib/PhpParser/ErrorHandler/Collecting.php | 8 +- .../lib/PhpParser/ErrorHandler/Throwing.php | 2 +- .../lib/PhpParser/Internal/DiffElem.php | 15 +- .../lib/PhpParser/Internal/Differ.php | 47 +- .../Internal/PrintableNewAnonClassNode.php | 24 +- .../lib/PhpParser/Internal/TokenPolyfill.php | 208 ++ .../lib/PhpParser/Internal/TokenStream.php | 123 +- .../php-parser/lib/PhpParser/JsonDecoder.php | 12 +- .../nikic/php-parser/lib/PhpParser/Lexer.php | 476 +-- .../lib/PhpParser/Lexer/Emulative.php | 152 +- .../AsymmetricVisibilityTokenEmulator.php | 66 + .../Lexer/TokenEmulator/AttributeEmulator.php | 16 +- .../CoaleseEqualTokenEmulator.php | 41 - .../Lexer/TokenEmulator/EnumTokenEmulator.php | 8 +- .../TokenEmulator/ExplicitOctalEmulator.php | 14 +- .../FlexibleDocStringEmulator.php | 66 - .../Lexer/TokenEmulator/FnTokenEmulator.php | 21 - .../Lexer/TokenEmulator/KeywordEmulator.php | 32 +- .../TokenEmulator/MatchTokenEmulator.php | 6 +- .../TokenEmulator/NullsafeTokenEmulator.php | 25 +- .../NumericLiteralSeparatorEmulator.php | 88 - .../TokenEmulator/PropertyTokenEmulator.php | 21 + .../ReadonlyFunctionTokenEmulator.php | 6 +- .../TokenEmulator/ReadonlyTokenEmulator.php | 8 +- .../Lexer/TokenEmulator/ReverseEmulator.php | 5 +- .../Lexer/TokenEmulator/TokenEmulator.php | 11 +- .../php-parser/lib/PhpParser/Modifiers.php | 66 + .../php-parser/lib/PhpParser/NameContext.php | 38 +- .../nikic/php-parser/lib/PhpParser/Node.php | 30 +- .../php-parser/lib/PhpParser/Node/Arg.php | 17 +- .../lib/PhpParser/Node/ArrayItem.php | 43 + .../lib/PhpParser/Node/Attribute.php | 12 +- .../lib/PhpParser/Node/AttributeGroup.php | 5 +- .../lib/PhpParser/Node/ClosureUse.php | 36 + .../php-parser/lib/PhpParser/Node/Const_.php | 12 +- .../lib/PhpParser/Node/DeclareItem.php | 37 + .../lib/PhpParser/Node/Expr/ArrayDimFetch.php | 10 +- .../lib/PhpParser/Node/Expr/ArrayItem.php | 37 +- .../lib/PhpParser/Node/Expr/Array_.php | 13 +- .../lib/PhpParser/Node/Expr/ArrowFunction.php | 46 +- .../lib/PhpParser/Node/Expr/Assign.php | 10 +- .../lib/PhpParser/Node/Expr/AssignOp.php | 10 +- .../lib/PhpParser/Node/Expr/AssignRef.php | 10 +- .../lib/PhpParser/Node/Expr/BinaryOp.php | 12 +- .../lib/PhpParser/Node/Expr/BitwiseNot.php | 6 +- .../lib/PhpParser/Node/Expr/BooleanNot.php | 6 +- .../lib/PhpParser/Node/Expr/CallLike.php | 8 +- .../lib/PhpParser/Node/Expr/Cast.php | 6 +- .../lib/PhpParser/Node/Expr/Cast/Double.php | 6 +- .../PhpParser/Node/Expr/ClassConstFetch.php | 13 +- .../lib/PhpParser/Node/Expr/Clone_.php | 6 +- .../lib/PhpParser/Node/Expr/Closure.php | 44 +- .../lib/PhpParser/Node/Expr/ClosureUse.php | 30 +- .../lib/PhpParser/Node/Expr/ConstFetch.php | 6 +- .../lib/PhpParser/Node/Expr/Empty_.php | 6 +- .../lib/PhpParser/Node/Expr/Error.php | 2 +- .../lib/PhpParser/Node/Expr/ErrorSuppress.php | 6 +- .../lib/PhpParser/Node/Expr/Eval_.php | 6 +- .../lib/PhpParser/Node/Expr/Exit_.php | 10 +- .../lib/PhpParser/Node/Expr/FuncCall.php | 12 +- .../lib/PhpParser/Node/Expr/Include_.php | 18 +- .../lib/PhpParser/Node/Expr/Instanceof_.php | 13 +- .../lib/PhpParser/Node/Expr/Isset_.php | 6 +- .../lib/PhpParser/Node/Expr/List_.php | 12 +- .../lib/PhpParser/Node/Expr/Match_.php | 8 +- .../lib/PhpParser/Node/Expr/MethodCall.php | 15 +- .../lib/PhpParser/Node/Expr/New_.php | 12 +- .../Node/Expr/NullsafeMethodCall.php | 15 +- .../Node/Expr/NullsafePropertyFetch.php | 11 +- .../lib/PhpParser/Node/Expr/PostDec.php | 6 +- .../lib/PhpParser/Node/Expr/PostInc.php | 6 +- .../lib/PhpParser/Node/Expr/PreDec.php | 6 +- .../lib/PhpParser/Node/Expr/PreInc.php | 6 +- .../lib/PhpParser/Node/Expr/Print_.php | 6 +- .../lib/PhpParser/Node/Expr/PropertyFetch.php | 11 +- .../lib/PhpParser/Node/Expr/ShellExec.php | 9 +- .../lib/PhpParser/Node/Expr/StaticCall.php | 16 +- .../Node/Expr/StaticPropertyFetch.php | 13 +- .../lib/PhpParser/Node/Expr/Ternary.php | 16 +- .../lib/PhpParser/Node/Expr/Throw_.php | 6 +- .../lib/PhpParser/Node/Expr/UnaryMinus.php | 6 +- .../lib/PhpParser/Node/Expr/UnaryPlus.php | 6 +- .../lib/PhpParser/Node/Expr/Variable.php | 4 +- .../lib/PhpParser/Node/Expr/YieldFrom.php | 6 +- .../lib/PhpParser/Node/Expr/Yield_.php | 10 +- .../lib/PhpParser/Node/FunctionLike.php | 4 +- .../lib/PhpParser/Node/Identifier.php | 20 +- .../PhpParser/Node/InterpolatedStringPart.php | 32 + .../lib/PhpParser/Node/IntersectionType.php | 7 +- .../lib/PhpParser/Node/MatchArm.php | 11 +- .../php-parser/lib/PhpParser/Node/Name.php | 99 +- .../lib/PhpParser/Node/NullableType.php | 11 +- .../php-parser/lib/PhpParser/Node/Param.php | 95 +- .../lib/PhpParser/Node/PropertyHook.php | 104 + .../lib/PhpParser/Node/PropertyItem.php | 37 + .../lib/PhpParser/Node/Scalar/DNumber.php | 67 +- .../lib/PhpParser/Node/Scalar/Encapsed.php | 27 +- .../Node/Scalar/EncapsedStringPart.php | 27 +- .../lib/PhpParser/Node/Scalar/Float_.php | 73 + .../lib/PhpParser/Node/Scalar/Int_.php | 74 + .../Node/Scalar/InterpolatedString.php | 34 + .../lib/PhpParser/Node/Scalar/LNumber.php | 68 +- .../lib/PhpParser/Node/Scalar/MagicConst.php | 2 +- .../Node/Scalar/MagicConst/Property.php | 17 + .../lib/PhpParser/Node/Scalar/String_.php | 32 +- .../lib/PhpParser/Node/StaticVar.php | 37 + .../lib/PhpParser/Node/Stmt/Block.php | 30 + .../lib/PhpParser/Node/Stmt/Break_.php | 6 +- .../lib/PhpParser/Node/Stmt/Case_.php | 15 +- .../lib/PhpParser/Node/Stmt/Catch_.php | 14 +- .../lib/PhpParser/Node/Stmt/ClassConst.php | 39 +- .../lib/PhpParser/Node/Stmt/ClassLike.php | 23 +- .../lib/PhpParser/Node/Stmt/ClassMethod.php | 72 +- .../lib/PhpParser/Node/Stmt/Class_.php | 108 +- .../lib/PhpParser/Node/Stmt/Const_.php | 14 +- .../lib/PhpParser/Node/Stmt/Continue_.php | 6 +- .../PhpParser/Node/Stmt/DeclareDeclare.php | 31 +- .../lib/PhpParser/Node/Stmt/Declare_.php | 13 +- .../lib/PhpParser/Node/Stmt/Do_.php | 13 +- .../lib/PhpParser/Node/Stmt/Echo_.php | 6 +- .../lib/PhpParser/Node/Stmt/ElseIf_.php | 13 +- .../lib/PhpParser/Node/Stmt/Else_.php | 9 +- .../lib/PhpParser/Node/Stmt/EnumCase.php | 14 +- .../lib/PhpParser/Node/Stmt/Enum_.php | 23 +- .../lib/PhpParser/Node/Stmt/Expression.php | 6 +- .../lib/PhpParser/Node/Stmt/Finally_.php | 9 +- .../lib/PhpParser/Node/Stmt/For_.php | 28 +- .../lib/PhpParser/Node/Stmt/Foreach_.php | 31 +- .../lib/PhpParser/Node/Stmt/Function_.php | 37 +- .../lib/PhpParser/Node/Stmt/Global_.php | 6 +- .../lib/PhpParser/Node/Stmt/Goto_.php | 6 +- .../lib/PhpParser/Node/Stmt/GroupUse.php | 21 +- .../lib/PhpParser/Node/Stmt/HaltCompiler.php | 6 +- .../lib/PhpParser/Node/Stmt/If_.php | 27 +- .../lib/PhpParser/Node/Stmt/InlineHTML.php | 6 +- .../lib/PhpParser/Node/Stmt/Interface_.php | 16 +- .../lib/PhpParser/Node/Stmt/Label.php | 6 +- .../lib/PhpParser/Node/Stmt/Namespace_.php | 14 +- .../lib/PhpParser/Node/Stmt/Property.php | 87 +- .../PhpParser/Node/Stmt/PropertyProperty.php | 31 +- .../lib/PhpParser/Node/Stmt/Return_.php | 6 +- .../lib/PhpParser/Node/Stmt/StaticVar.php | 31 +- .../lib/PhpParser/Node/Stmt/Static_.php | 7 +- .../lib/PhpParser/Node/Stmt/Switch_.php | 10 +- .../lib/PhpParser/Node/Stmt/Throw_.php | 30 - .../lib/PhpParser/Node/Stmt/TraitUse.php | 8 +- .../Node/Stmt/TraitUseAdaptation.php | 4 +- .../Node/Stmt/TraitUseAdaptation/Alias.php | 16 +- .../Stmt/TraitUseAdaptation/Precedence.php | 10 +- .../lib/PhpParser/Node/Stmt/Trait_.php | 11 +- .../lib/PhpParser/Node/Stmt/TryCatch.php | 14 +- .../lib/PhpParser/Node/Stmt/Unset_.php | 6 +- .../lib/PhpParser/Node/Stmt/UseUse.php | 48 +- .../lib/PhpParser/Node/Stmt/Use_.php | 23 +- .../lib/PhpParser/Node/Stmt/While_.php | 13 +- .../lib/PhpParser/Node/UnionType.php | 6 +- .../php-parser/lib/PhpParser/Node/UseItem.php | 54 + .../PhpParser/Node/VariadicPlaceholder.php | 2 +- .../php-parser/lib/PhpParser/NodeAbstract.php | 18 +- .../php-parser/lib/PhpParser/NodeDumper.php | 218 +- .../php-parser/lib/PhpParser/NodeFinder.php | 37 +- .../lib/PhpParser/NodeTraverser.php | 275 +- .../lib/PhpParser/NodeTraverserInterface.php | 6 +- .../php-parser/lib/PhpParser/NodeVisitor.php | 58 +- .../NodeVisitor/CommentAnnotatingVisitor.php | 74 + .../PhpParser/NodeVisitor/FindingVisitor.php | 8 +- .../NodeVisitor/FirstFindingVisitor.php | 10 +- .../PhpParser/NodeVisitor/NameResolver.php | 113 +- .../NodeVisitor/NodeConnectingVisitor.php | 31 +- .../NodeVisitor/ParentConnectingVisitor.php | 22 +- .../lib/PhpParser/NodeVisitorAbstract.php | 2 +- .../nikic/php-parser/lib/PhpParser/Parser.php | 8 +- .../lib/PhpParser/Parser/Multiple.php | 53 - .../php-parser/lib/PhpParser/Parser/Php5.php | 1320 --------- .../php-parser/lib/PhpParser/Parser/Php7.php | 2629 ++++++++--------- .../php-parser/lib/PhpParser/Parser/Php8.php | 1288 ++++++++ .../lib/PhpParser/Parser/Tokens.php | 148 - .../lib/PhpParser/ParserAbstract.php | 655 ++-- .../lib/PhpParser/ParserFactory.php | 52 +- .../php-parser/lib/PhpParser/PhpVersion.php | 157 + .../lib/PhpParser/PrettyPrinter.php | 49 + .../lib/PhpParser/PrettyPrinter/Standard.php | 699 +++-- .../lib/PhpParser/PrettyPrinterAbstract.php | 818 ++--- .../nikic/php-parser/lib/PhpParser/Token.php | 21 + .../lib/PhpParser/compatibility_tokens.php | 59 + .../vendor/ondram/ci-detector/composer.json | 4 +- .../rector/vendor/ondram/ci-detector/ecs.php | 14 +- .../ondram/ci-detector/src/Ci/AbstractCi.php | 9 +- .../ondram/ci-detector/src/Ci/AppVeyor.php | 8 +- .../ci-detector/src/Ci/AwsCodeBuild.php | 8 +- .../ci-detector/src/Ci/AzurePipelines.php | 8 +- .../ondram/ci-detector/src/Ci/Bamboo.php | 8 +- .../ci-detector/src/Ci/BitbucketPipelines.php | 8 +- .../ondram/ci-detector/src/Ci/Buddy.php | 8 +- .../ondram/ci-detector/src/Ci/CiInterface.php | 6 +- .../ondram/ci-detector/src/Ci/Circle.php | 8 +- .../ondram/ci-detector/src/Ci/Codeship.php | 8 +- .../ci-detector/src/Ci/Continuousphp.php | 8 +- .../ondram/ci-detector/src/Ci/Drone.php | 8 +- .../ci-detector/src/Ci/GitHubActions.php | 8 +- .../ondram/ci-detector/src/Ci/GitLab.php | 8 +- .../ondram/ci-detector/src/Ci/Jenkins.php | 8 +- .../ondram/ci-detector/src/Ci/SourceHut.php | 8 +- .../ondram/ci-detector/src/Ci/TeamCity.php | 8 +- .../ondram/ci-detector/src/Ci/Travis.php | 8 +- .../ondram/ci-detector/src/Ci/Wercker.php | 8 +- .../ondram/ci-detector/src/CiDetector.php | 11 +- .../ci-detector/src/CiDetectorInterface.php | 6 +- .../vendor/ondram/ci-detector/src/Env.php | 2 +- .../src/Exception/CiNotDetectedException.php | 2 +- .../ondram/ci-detector/src/TrinaryLogic.php | 11 +- .../vendor/phpstan/phpdoc-parser/LICENSE | 3 +- .../vendor/phpstan/phpdoc-parser/README.md | 26 +- .../vendor/phpstan/phpdoc-parser/UPGRADING.md | 129 + .../phpstan/phpdoc-parser/composer.json | 12 +- .../phpdoc-parser/src/Ast/Attribute.php | 1 + .../phpstan/phpdoc-parser/src/Ast/Comment.php | 22 + .../Ast/ConstExpr/ConstExprArrayItemNode.php | 6 +- .../src/Ast/ConstExpr/ConstExprArrayNode.php | 2 +- .../src/Ast/ConstExpr/ConstExprFloatNode.php | 3 +- .../Ast/ConstExpr/ConstExprIntegerNode.php | 3 +- .../src/Ast/ConstExpr/ConstExprStringNode.php | 56 +- .../src/Ast/ConstExpr/ConstFetchNode.php | 5 +- .../ConstExpr/DoctrineConstExprStringNode.php | 5 +- .../QuoteAwareConstExprStringNode.php | 67 - .../phpdoc-parser/src/Ast/NodeAttributes.php | 6 +- .../phpdoc-parser/src/Ast/NodeTraverser.php | 4 +- .../src/Ast/NodeVisitor/CloningVisitor.php | 2 +- .../Ast/PhpDoc/AssertTagMethodValueNode.php | 19 +- .../Ast/PhpDoc/AssertTagPropertyValueNode.php | 19 +- .../src/Ast/PhpDoc/AssertTagValueNode.php | 16 +- .../src/Ast/PhpDoc/DeprecatedTagValueNode.php | 2 +- .../PhpDoc/Doctrine/DoctrineAnnotation.php | 5 +- .../Ast/PhpDoc/Doctrine/DoctrineArgument.php | 3 +- .../src/Ast/PhpDoc/Doctrine/DoctrineArray.php | 2 +- .../PhpDoc/Doctrine/DoctrineTagValueNode.php | 5 +- .../src/Ast/PhpDoc/ExtendsTagValueNode.php | 5 +- .../src/Ast/PhpDoc/GenericTagValueNode.php | 2 +- .../src/Ast/PhpDoc/ImplementsTagValueNode.php | 5 +- .../src/Ast/PhpDoc/InvalidTagValueNode.php | 4 +- .../src/Ast/PhpDoc/MethodTagValueNode.php | 17 +- .../PhpDoc/MethodTagValueParameterNode.php | 15 +- .../src/Ast/PhpDoc/MixinTagValueNode.php | 5 +- .../PhpDoc/ParamClosureThisTagValueNode.php | 8 +- ...ImmediatelyInvokedCallableTagValueNode.php | 5 +- .../ParamLaterInvokedCallableTagValueNode.php | 5 +- .../src/Ast/PhpDoc/ParamOutTagValueNode.php | 8 +- .../src/Ast/PhpDoc/ParamTagValueNode.php | 16 +- .../src/Ast/PhpDoc/PhpDocNode.php | 122 +- .../src/Ast/PhpDoc/PhpDocTagNode.php | 6 +- .../src/Ast/PhpDoc/PhpDocTextNode.php | 3 +- .../src/Ast/PhpDoc/PropertyTagValueNode.php | 8 +- ...PureUnlessCallableIsImpureTagValueNode.php | 5 +- .../Ast/PhpDoc/RequireExtendsTagValueNode.php | 5 +- .../PhpDoc/RequireImplementsTagValueNode.php | 5 +- .../src/Ast/PhpDoc/ReturnTagValueNode.php | 5 +- .../src/Ast/PhpDoc/SelfOutTagValueNode.php | 5 +- .../src/Ast/PhpDoc/TemplateTagValueNode.php | 13 +- .../src/Ast/PhpDoc/ThrowsTagValueNode.php | 5 +- .../PhpDoc/TypeAliasImportTagValueNode.php | 9 +- .../src/Ast/PhpDoc/TypeAliasTagValueNode.php | 6 +- .../Ast/PhpDoc/TypelessParamTagValueNode.php | 13 +- .../src/Ast/PhpDoc/UsesTagValueNode.php | 5 +- .../src/Ast/PhpDoc/VarTagValueNode.php | 7 +- .../src/Ast/Type/ArrayShapeItemNode.php | 9 +- .../src/Ast/Type/ArrayShapeNode.php | 28 +- .../Ast/Type/ArrayShapeUnsealedTypeNode.php | 6 +- .../src/Ast/Type/ArrayTypeNode.php | 3 +- .../src/Ast/Type/CallableTypeNode.php | 12 +- .../Ast/Type/CallableTypeParameterNode.php | 14 +- .../Type/ConditionalTypeForParameterNode.php | 15 +- .../src/Ast/Type/ConditionalTypeNode.php | 15 +- .../src/Ast/Type/ConstTypeNode.php | 3 +- .../src/Ast/Type/GenericTypeNode.php | 7 +- .../src/Ast/Type/IdentifierTypeNode.php | 3 +- .../src/Ast/Type/IntersectionTypeNode.php | 2 +- .../src/Ast/Type/InvalidTypeNode.php | 2 +- .../src/Ast/Type/NullableTypeNode.php | 3 +- .../src/Ast/Type/ObjectShapeItemNode.php | 9 +- .../src/Ast/Type/ObjectShapeNode.php | 2 +- .../src/Ast/Type/OffsetAccessTypeNode.php | 6 +- .../src/Ast/Type/UnionTypeNode.php | 2 +- .../phpstan/phpdoc-parser/src/Lexer/Lexer.php | 26 +- .../src/Parser/ConstExprParser.php | 46 +- .../src/Parser/ParserException.php | 20 +- .../phpdoc-parser/src/Parser/PhpDocParser.php | 213 +- .../src/Parser/TokenIterator.php | 76 +- .../phpdoc-parser/src/Parser/TypeParser.php | 200 +- .../phpdoc-parser/src/ParserConfig.php | 20 + .../phpdoc-parser/src/Printer/Printer.php | 138 +- .../rector/vendor/psr/container/composer.json | 2 +- .../src/ContainerExceptionInterface.php | 2 +- .../psr/container/src/ContainerInterface.php | 2 +- .../src/NotFoundExceptionInterface.php | 2 +- .../rector/vendor/psr/log/composer.json | 2 +- .../vendor/psr/log/src/AbstractLogger.php | 2 +- .../psr/log/src/InvalidArgumentException.php | 2 +- .../rector/vendor/psr/log/src/LogLevel.php | 2 +- .../psr/log/src/LoggerAwareInterface.php | 2 +- .../vendor/psr/log/src/LoggerAwareTrait.php | 5 +- .../vendor/psr/log/src/LoggerInterface.php | 2 +- .../rector/vendor/psr/log/src/LoggerTrait.php | 2 +- .../rector/vendor/psr/log/src/NullLogger.php | 2 +- .../vendor/psr/simple-cache/composer.json | 2 +- .../psr/simple-cache/src/CacheException.php | 2 +- .../psr/simple-cache/src/CacheInterface.php | 2 +- .../src/InvalidArgumentException.php | 2 +- .../rector/vendor/react/cache/composer.json | 4 +- .../vendor/react/cache/src/ArrayCache.php | 6 +- .../vendor/react/cache/src/CacheInterface.php | 4 +- .../vendor/react/child-process/README.md | 2 +- .../vendor/react/child-process/composer.json | 10 +- .../react/child-process/src/Process.php | 36 +- .../rector/vendor/react/dns/composer.json | 4 +- .../react/dns/src/BadServerException.php | 2 +- .../vendor/react/dns/src/Config/Config.php | 2 +- .../vendor/react/dns/src/Config/HostsFile.php | 2 +- .../vendor/react/dns/src/Model/Message.php | 4 +- .../vendor/react/dns/src/Model/Record.php | 2 +- .../react/dns/src/Protocol/BinaryDumper.php | 8 +- .../vendor/react/dns/src/Protocol/Parser.php | 8 +- .../react/dns/src/Query/CachingExecutor.php | 8 +- .../dns/src/Query/CancellationException.php | 2 +- .../react/dns/src/Query/CoopExecutor.php | 4 +- .../react/dns/src/Query/ExecutorInterface.php | 2 +- .../react/dns/src/Query/FallbackExecutor.php | 4 +- .../react/dns/src/Query/HostsFileExecutor.php | 10 +- .../vendor/react/dns/src/Query/Query.php | 6 +- .../react/dns/src/Query/RetryExecutor.php | 6 +- .../src/Query/SelectiveTransportExecutor.php | 4 +- .../dns/src/Query/TcpTransportExecutor.php | 18 +- .../react/dns/src/Query/TimeoutException.php | 2 +- .../react/dns/src/Query/TimeoutExecutor.php | 8 +- .../dns/src/Query/UdpTransportExecutor.php | 20 +- .../react/dns/src/RecordNotFoundException.php | 2 +- .../vendor/react/dns/src/Resolver/Factory.php | 34 +- .../react/dns/src/Resolver/Resolver.php | 10 +- .../dns/src/Resolver/ResolverInterface.php | 2 +- .../vendor/react/event-loop/composer.json | 4 +- .../vendor/react/event-loop/src/ExtEvLoop.php | 6 +- .../react/event-loop/src/ExtEventLoop.php | 6 +- .../react/event-loop/src/ExtLibevLoop.php | 16 +- .../react/event-loop/src/ExtLibeventLoop.php | 6 +- .../vendor/react/event-loop/src/ExtUvLoop.php | 8 +- .../vendor/react/event-loop/src/Factory.php | 4 +- .../vendor/react/event-loop/src/Loop.php | 2 +- .../react/event-loop/src/LoopInterface.php | 2 +- .../react/event-loop/src/SignalsHandler.php | 2 +- .../react/event-loop/src/StreamSelectLoop.php | 8 +- .../event-loop/src/Tick/FutureTickQueue.php | 2 +- .../react/event-loop/src/Timer/Timer.php | 4 +- .../react/event-loop/src/Timer/Timers.php | 4 +- .../react/event-loop/src/TimerInterface.php | 2 +- .../rector/vendor/react/promise/composer.json | 4 +- .../vendor/react/promise/src/Deferred.php | 2 +- .../src/Exception/CompositeException.php | 2 +- .../promise/src/Exception/LengthException.php | 2 +- .../src/Internal/CancellationQueue.php | 2 +- .../promise/src/Internal/FulfilledPromise.php | 6 +- .../promise/src/Internal/RejectedPromise.php | 10 +- .../vendor/react/promise/src/Promise.php | 4 +- .../react/promise/src/PromiseInterface.php | 2 +- .../vendor/react/promise/src/functions.php | 8 +- .../react/promise/src/functions_include.php | 4 +- .../rector/vendor/react/socket/composer.json | 4 +- .../vendor/react/socket/src/Connection.php | 14 +- .../react/socket/src/ConnectionInterface.php | 4 +- .../vendor/react/socket/src/Connector.php | 12 +- .../react/socket/src/ConnectorInterface.php | 2 +- .../vendor/react/socket/src/DnsConnector.php | 8 +- .../vendor/react/socket/src/FdServer.php | 8 +- .../react/socket/src/FixedUriConnector.php | 2 +- .../src/HappyEyeBallsConnectionBuilder.php | 14 +- .../socket/src/HappyEyeBallsConnector.php | 10 +- .../react/socket/src/LimitingServer.php | 4 +- .../react/socket/src/SecureConnector.php | 10 +- .../vendor/react/socket/src/SecureServer.php | 8 +- .../rector/vendor/react/socket/src/Server.php | 8 +- .../react/socket/src/ServerInterface.php | 4 +- .../vendor/react/socket/src/SocketServer.php | 6 +- .../react/socket/src/StreamEncryption.php | 6 +- .../vendor/react/socket/src/TcpConnector.php | 8 +- .../vendor/react/socket/src/TcpServer.php | 8 +- .../react/socket/src/TimeoutConnector.php | 8 +- .../vendor/react/socket/src/UnixConnector.php | 8 +- .../vendor/react/socket/src/UnixServer.php | 8 +- .../rector/vendor/react/stream/composer.json | 4 +- .../react/stream/src/CompositeStream.php | 4 +- .../react/stream/src/DuplexResourceStream.php | 8 +- .../stream/src/DuplexStreamInterface.php | 2 +- .../stream/src/ReadableResourceStream.php | 8 +- .../stream/src/ReadableStreamInterface.php | 4 +- .../vendor/react/stream/src/ThroughStream.php | 4 +- .../rector/vendor/react/stream/src/Util.php | 2 +- .../stream/src/WritableResourceStream.php | 8 +- .../stream/src/WritableStreamInterface.php | 4 +- .../rector/extension-installer/rector.php | 4 +- .../src/GeneratedConfig.php | 2 +- .../src/PluginInstaller.php | 45 +- .../vendor/rector/rector-doctrine/README.md | 6 +- .../rector/rector-doctrine/composer.json | 26 +- .../config/sets/attributes/doctrine.php | 2 +- .../config/sets/attributes/gedmo.php | 2 +- .../config/sets/attributes/mongodb.php | 2 +- .../config/sets/data-fixtures-16.php | 10 + .../config/sets/doctrine-bundle-210.php | 5 +- .../config/sets/doctrine-bundle-23.php | 10 + .../config/sets/doctrine-bundle-28.php | 11 + .../config/sets/doctrine-code-quality.php | 13 +- .../config/sets/doctrine-collection-22.php | 5 +- .../config/sets/doctrine-common-20.php | 2 +- .../config/sets/doctrine-dbal-211.php | 2 +- .../config/sets/doctrine-dbal-30.php | 2 +- .../config/sets/doctrine-dbal-40.php | 18 +- .../config/sets/doctrine-dbal-42.php | 13 + .../config/sets/doctrine-orm-213.php | 4 +- .../config/sets/doctrine-orm-214.php | 2 +- ...ctrine-orm-29.php => doctrine-orm-219.php} | 2 +- .../config/sets/doctrine-orm-25.php | 2 +- .../config/sets/doctrine-orm-28.php | 11 + .../config/sets/doctrine-orm-300.php | 13 + .../config/sets/typed-collections.php | 85 +- .../config/yaml-to-annotations.php | 2 +- ...ntSubscriberInterfaceToAttributeRector.php | 39 +- .../AddAnnotationToRepositoryRector.php | 142 + .../EmbeddableClassAttributeTransformer.php | 5 +- .../EntityClassAttributeTransformer.php | 5 +- .../InheritanceClassAttributeTransformer.php | 10 +- ...SoftDeletableClassAttributeTransformer.php | 8 +- .../TableClassAttributeTransformer.php | 8 +- .../ColumnAttributeTransformer.php | 8 +- .../EmbeddedPropertyAttributeTransformer.php | 8 +- ...GedmoTimestampableAttributeTransformer.php | 8 +- .../IdAttributeTransformer.php | 5 +- .../IdColumnAttributeTransformer.php | 5 +- .../IdGeneratorAttributeTransformer.php | 10 +- .../InverseJoinColumnAttributeTransformer.php | 10 +- .../JoinColumnAttributeTransformer.php | 19 +- .../JoinTableAttributeTransformer.php | 8 +- .../ManyToManyAttributeTransformer.php | 8 +- .../ManyToOneAttributeTransformer.php | 8 +- .../OneToManyAttributeTransformer.php | 8 +- .../OrderByAttributeTransformer.php | 10 +- .../YamlToAttributeTransformer.php | 36 +- .../ClassAttributeTransformerInterface.php | 2 +- .../PropertyAttributeTransformerInterface.php | 2 +- .../CodeQuality/EntityMappingResolver.php | 13 +- .../CodeQuality/Enum/CollectionMapping.php | 2 +- .../rules/CodeQuality/Enum/DoctrineClass.php | 8 +- ...nPropertyGetterByToManyAttributeRector.php | 64 - ...atorToRepositoryServiceInjectionRector.php | 185 ++ ...nitializeDefaultEntityCollectionRector.php | 80 - ...TimeDefaultInEntityToConstructorRector.php | 23 +- .../RemoveEmptyTableAttributeRector.php | 10 +- .../YamlToAttributeDoctrineMappingRector.php | 15 +- ...rectDefaultTypesOnEntityPropertyRector.php | 28 +- ...octrineCollectionDocTypeInEntityRector.php | 242 -- ...ateTimePropertyDateTimeInterfaceRector.php | 144 - .../TypedPropertyFromColumnTypeRector.php | 15 +- ...edPropertyFromDoctrineCollectionRector.php | 83 - ...edPropertyFromToManyRelationTypeRector.php | 135 - ...pedPropertyFromToOneRelationTypeRector.php | 25 +- .../CodeQuality/SetterCollectionResolver.php | 30 +- .../CodeQuality/Utils/CaseStringHelper.php | 2 +- .../CodeQuality/ValueObject/EntityMapping.php | 7 +- ...eriaOrderingConstantsDeprecationRector.php | 5 +- ...ractArrayArgOnQueryBuilderSelectRector.php | 4 +- ...iteExpressionAddMultipleWithWithRector.php | 3 +- .../ExecuteQueryParamsToBindValueRector.php | 108 + .../New_/AddArrayResultColumnNamesRector.php | 86 + .../MethodCall/AddGetReferenceTypeRector.php | 109 + .../Reflection/ParameterTypeResolver.php | 59 + .../MethodCall/IterateToToIterableRector.php | 3 - .../CastDoctrineExprToStringRector.php | 75 + .../SetParametersArrayToCollectionRector.php | 181 ++ .../CollectionTagValueNodeAnalyzer.php | 26 + .../UnionCollectionTagValueNodeNarrower.php | 131 + .../CollectionParamCallDetector.php | 84 + .../NodeAnalyzer/EntityLikeClassDetector.php | 29 + ...imFetchAssignToAddCollectionCallRector.php | 87 + ...rrayOffsetSetToSetCollectionCallRector.php | 88 + .../CollectionGetterNativeTypeRector.php | 97 + ...amTypeSetterToCollectionPropertyRector.php | 122 + .../CollectionSetterParamNativeTypeRector.php | 136 + .../DefaultCollectionKeyRector.php | 117 + ...arrowArrayCollectionToCollectionRector.php | 231 ++ .../NarrowParamUnionToCollectionRector.php | 114 + .../NarrowReturnUnionToCollectionRector.php | 98 + ...rrayCollectionOutsideConstructorRector.php | 120 + ...veNullFromNullableCollectionTypeRector.php | 145 + .../ReturnArrayToNewArrayCollectionRector.php | 93 + .../ReturnCollectionDocblockRector.php | 141 + ...amDocblockFromSetterToCollectionRector.php | 133 + ...mpletePropertyDocblockFromToManyRector.php | 194 ++ ...ompleteReturnDocblockFromToManyRector.php} | 47 +- ...itializeCollectionInConstructorRector.php} | 60 +- .../EmptyOnCollectionToIsEmptyCallRector.php | 74 + .../RemoveAssertNotNullOnCollectionRector.php | 79 + ...RemoveCoalesceAssignOnCollectionRector.php | 81 + .../ArrayMapOnCollectionToArrayRector.php | 88 + .../ArrayMergeOnCollectionToArrayRector.php | 87 + ...nArrayOnCollectionToContainsCallRector.php | 84 + .../RemoveIfInstanceofCollectionRector.php | 188 ++ .../If_/RemoveIsArrayOnCollectionRector.php | 122 + ...ertNullOnCollectionToAssertEmptyRector.php | 88 + ...meCountOnCollectionToAssertCountRector.php | 91 + .../SetArrayToNewCollectionRector.php | 102 + .../RemoveNewArrayCollectionWrapRector.php | 82 + .../RemoveNullsafeOnCollectionRector.php | 70 + .../NarrowPropertyUnionToCollectionRector.php | 104 + ...edPropertyFromToManyRelationTypeRector.php | 109 + .../TypeAnalyzer/CollectionTypeDetector.php | 52 + .../src/Enum/DoctrineClass.php | 49 + .../src/Enum/OdmMappingClass.php | 1 + .../rector-doctrine/src/Enum/TestClass.php | 12 + .../src/NodeAnalyzer/AttributeFinder.php | 40 +- .../src/NodeAnalyzer/AttrinationFinder.php | 37 +- .../ConstructorAssignPropertyAnalyzer.php | 9 +- .../NodeAnalyzer/DoctrineEntityDetector.php | 9 +- .../MethodUniqueReturnedPropertyResolver.php | 6 +- .../NodeAnalyzer/RepositoryClassResolver.php | 59 + .../src/NodeAnalyzer/TargetEntityResolver.php | 6 +- .../ArrayCollectionAssignFactory.php | 3 +- .../ColumnPropertyTypeResolver.php | 15 +- .../ConstructorManipulator.php | 8 +- .../NullabilityColumnPropertyTypeResolver.php | 9 +- .../ToManyRelationPropertyTypeResolver.php | 31 +- .../ToOneRelationPropertyTypeResolver.php | 17 +- .../src/PhpDoc/ShortClassExpander.php | 8 +- .../PhpDocParser/DoctrineDocBlockResolver.php | 10 +- .../src/Set/DoctrineSetList.php | 27 +- .../Set/SetProvider/DoctrineSetProvider.php | 22 +- .../TypeAnalyzer/CollectionTypeFactory.php | 149 +- .../TypeAnalyzer/CollectionTypeResolver.php | 49 +- .../CollectionVarTagValueNodeResolver.php | 6 +- .../rector/rector-downgrade-php/composer.json | 13 +- .../config/set/downgrade-php72.php | 2 +- .../config/set/downgrade-php73.php | 2 +- .../config/set/downgrade-php74.php | 2 +- .../config/set/downgrade-php80.php | 5 +- .../config/set/downgrade-php81.php | 2 +- .../config/set/downgrade-php82.php | 5 +- .../config/set/downgrade-php83.php | 6 +- .../config/set/downgrade-php84.php | 13 + .../config/set/downgrade-php85.php | 12 + .../config/set/level/down-to-php71.php | 2 +- .../config/set/level/down-to-php72.php | 2 +- .../config/set/level/down-to-php73.php | 2 +- .../config/set/level/down-to-php74.php | 2 +- .../config/set/level/down-to-php80.php | 2 +- .../config/set/level/down-to-php81.php | 2 +- .../config/set/level/down-to-php82.php | 5 +- .../config/set/level/down-to-php83.php | 11 + .../config/set/level/down-to-php84.php | 10 + .../NodeAnalyzer/BuiltInMethodAnalyzer.php | 3 +- ...errideFromAnonymousClassMethodAnalyzer.php | 9 +- .../NodeAnalyzer/RegexFuncAnalyzer.php | 3 +- .../NodeManipulator/BitwiseFlagCleaner.php | 5 +- .../NodeManipulator/JsonConstCleaner.php | 13 +- .../PhpDoc/NativeParamToPhpDocDecorator.php | 18 +- .../DowngradeParameterTypeWideningRector.php | 24 +- .../DowngradePhp72JsonConstRector.php | 17 +- ...radeJsonDecodeNullAssociativeArgRector.php | 6 +- ...gradePregUnmatchedAsNullConstantRector.php | 13 +- .../FuncCall/DowngradeStreamIsattyRector.php | 22 +- .../DowngradeObjectTypeDeclarationRector.php | 3 +- .../DowngradePhp73JsonConstRector.php | 28 +- .../DowngradeArrayKeyFirstLastRector.php | 12 +- ...adeTrailingCommasInFunctionCallsRector.php | 26 +- ...SetCookieOptionsArrayToArgumentsRector.php | 7 +- ...DowngradeListReferenceAssignmentRector.php | 8 +- .../DowngradeFlexibleHeredocSyntaxRector.php | 15 +- .../DowngradeTrailingCommasInUnsetRector.php | 20 +- .../Tokenizer/FollowedByCommaAnalyzer.php | 4 +- ...yNewlineOnlyMaybeWithSemicolonAnalyzer.php | 4 +- .../Tokenizer/TrailingCommaRemover.php | 46 + .../Array_/DowngradeArraySpreadRector.php | 31 +- ...ArrowFunctionToAnonymousFunctionRector.php | 27 +- ...wngradeContravariantArgumentTypeRector.php | 24 +- .../DowngradeCovariantReturnTypeRector.php | 24 +- .../DowngradeStripTagsCallWithArrayRector.php | 3 +- ...ngradeFreadFwriteFalsyToNegationRector.php | 3 +- ...dePreviouslyImplementedInterfaceRector.php | 3 +- ...DowngradeNumericLiteralSeparatorRector.php | 14 +- .../DowngradeReflectionGetTypeRector.php | 25 +- .../Property/DowngradeTypedPropertyRector.php | 6 +- .../NodeAnalyzer/EnumAnalyzer.php | 6 +- .../NodeAnalyzer/NamedToUnnamedArgs.php | 8 +- .../NodeAnalyzer/UnnamedArgumentResolver.php | 12 +- ...owngradeDereferenceableOperationRector.php | 6 +- .../DowngradeNonCapturingCatchesRector.php | 12 +- ...radeAbstractPrivateMethodInTraitRector.php | 7 +- ...siveDirectoryIteratorHasChildrenRector.php | 5 +- .../DowngradeStaticTypeDeclarationRector.php | 6 +- ...ngradeStringReturnTypeOnToStringRector.php | 8 +- ...owngradeTrailingCommasInParamUseRector.php | 21 +- .../DowngradeAttributeToAnnotationRector.php | 28 +- .../DowngradePropertyPromotionRector.php | 27 +- ...DowngradeEnumToConstantListClassRector.php | 17 +- .../DowngradeMatchToSwitchRector.php | 50 +- .../Expression/DowngradeThrowExprRector.php | 66 +- ...gradeArrayFilterNullableCallbackRector.php | 13 +- ...DowngradeNumberFormatNoFourthArgRector.php | 5 +- .../FuncCall/DowngradeStrEndsWithRector.php | 6 +- .../FuncCall/DowngradeStrStartsWithRector.php | 6 +- .../DowngradeMixedTypeDeclarationRector.php | 3 +- .../DowngradeUnionTypeDeclarationRector.php | 3 +- .../DowngradeInstanceofStringableRector.php | 57 + ...gradePhp80ResourceReturnToObjectRector.php | 3 +- .../DowngradeNamedArgumentRector.php | 9 +- ...eflectionClassGetConstantsFilterRector.php | 12 +- ...DowngradeReflectionGetAttributesRector.php | 3 +- ...eflectionPropertyGetDefaultValueRector.php | 2 +- ...gradeArbitraryExpressionsSupportRector.php | 22 +- ...wngradeNullsafeToTernaryOperatorRector.php | 32 +- .../DowngradeMixedTypeTypedPropertyRector.php | 3 +- .../DowngradeUnionTypeTypedPropertyRector.php | 5 +- .../StaticCall/DowngradePhpTokenRector.php | 27 +- .../DefaultParameterValueResolver.php | 11 +- .../SimplePhpParameterReflection.php | 3 +- .../DowngradeAttributeToAnnotation.php | 4 +- .../NodeAnalyzer/ArraySpreadAnalyzer.php | 2 +- .../ArrayMergeFromArraySpreadFactory.php | 23 +- .../ObjectToResourceReturn.php | 15 +- .../DowngradeArraySpreadStringKeyRector.php | 20 +- ...gradeFinalizePublicClassConstantRector.php | 3 +- .../FuncCall/DowngradeArrayIsListRector.php | 13 +- ...owngradeFirstClassCallableSyntaxRector.php | 2 +- .../DowngradeHashAlgorithmXxHashRector.php | 13 +- .../DowngradeNeverTypeDeclarationRector.php | 3 +- .../DowngradeNewInInitializerRector.php | 34 +- .../DowngradePureIntersectionTypeRector.php | 3 +- ...gradePhp81ResourceReturnToObjectRector.php | 3 +- .../LNumber/DowngradeOctalNumberRector.php | 8 +- .../DowngradeReadonlyPropertyRector.php | 10 +- .../DowngradeReadonlyClassManipulator.php | 78 + .../Class_/DowngradeReadonlyClassRector.php | 66 +- .../DowngradeIteratorCountToArrayRector.php | 108 + ...tandaloneNullTrueFalseReturnTypeRector.php | 9 +- .../DowngradeTypedClassConstRector.php | 3 +- .../DowngradeDynamicClassConstFetchRector.php | 48 + .../DowngradeReadonlyAnonymousClassRector.php | 69 + .../DowngradeRoundingModeEnumRector.php | 89 + ...eNewMethodCallWithoutParenthesesRector.php | 57 + .../DowngradeArrayFirstLastRector.php | 52 + .../src/NodeAnalyzer/CoalesceAnalyzer.php | 3 + .../NodeAnalyzer/DefineFuncCallAnalyzer.php | 3 +- .../src/NodeAnalyzer/ExprInTopStmtMatcher.php | 3 +- .../src/NodeFactory/ClassFromEnumFactory.php | 3 +- .../NodeFactory/DoctrineAnnotationFactory.php | 3 +- .../src/NodeFactory/NamedVariableFactory.php | 3 +- .../src/NodeManipulator/PropertyDecorator.php | 9 +- .../PhpDocFromTypeDeclarationDecorator.php | 63 +- .../Set/ValueObject/DowngradeLevelSetList.php | 12 +- .../src/Set/ValueObject/DowngradeSetList.php | 12 +- .../ClassMethodWillChangeReturnType.php | 6 +- .../Symfony/Component/Annotation/Route.php | 2 +- .../rector/rector-phpunit/composer.json | 34 +- .../config/sets/annotations-to-attributes.php | 6 +- .../config/sets/phpunit-code-quality.php | 13 +- .../rector-phpunit/config/sets/phpunit100.php | 7 +- .../rector-phpunit/config/sets/phpunit110.php | 4 +- .../rector-phpunit/config/sets/phpunit120.php | 10 + .../rector-phpunit/config/sets/phpunit40.php | 2 +- .../rector-phpunit/config/sets/phpunit50.php | 2 +- .../rector-phpunit/config/sets/phpunit60.php | 2 +- .../rector-phpunit/config/sets/phpunit70.php | 2 +- .../rector-phpunit/config/sets/phpunit80.php | 2 +- .../rector-phpunit/config/sets/phpunit90.php | 2 +- ...ataProviderAnnotationToAttributeRector.php | 35 +- ...dsAnnotationWithValueToAttributeRector.php | 32 +- .../TestWithAnnotationToAttributeRector.php | 37 +- .../AnnotationWithValueToAttributeRector.php | 30 +- ...rsAnnotationWithValueToAttributeRector.php | 112 +- ...esAnnotationWithValueToAttributeRector.php | 242 ++ .../TicketAnnotationToAttributeRector.php | 30 +- .../Enum/NonAssertNonStaticMethods.php | 12 + .../NodeAnalyser/AssertMethodAnalyzer.php | 80 + .../NullableObjectAssignCollector.php | 76 + .../SetUpAssignedMockTypesResolver.php | 75 + .../NestedClosureAssertFactory.php | 8 +- ...tanceofAssertForNullableInstanceRector.php | 170 ++ .../CreateMockToAnonymousClassRector.php | 6 +- .../DataProviderArrayItemsNewLinedRector.php | 8 +- ...ityDocumentCreateMockToDirectNewRector.php | 9 +- .../RemoveEmptyTestMethodRector.php | 7 +- ...stAnnotationWithPrefixedFunctionRector.php | 12 +- ...eTestFunctionPrefixWithAttributeRector.php | 9 +- .../Class_/AddCoversClassAttributeRector.php | 16 +- .../AddParentSetupCallOnSetupRector.php | 6 +- .../Class_/AddSeeTestAnnotationRector.php | 12 +- ...structClassMethodToSetUpTestCaseRector.php | 40 +- ...NarrowUnusedSetUpDefinedPropertyRector.php | 12 +- .../Class_/PreferPHPUnitSelfCallRector.php | 42 +- .../Class_/PreferPHPUnitThisCallRector.php | 32 +- .../RemoveDataProviderParamKeysRector.php | 148 + .../Class_/SetUpBeforeClassToSetUpRector.php | 12 +- .../Class_/SingleMockPropertyTypeRector.php | 5 +- .../Class_/TestWithToDataProviderRector.php | 31 +- ...eWillReturnCallableArrowFunctionRector.php | 241 ++ .../Rector/Class_/YieldDataProviderRector.php | 52 +- .../AssertFuncCallToPHPUnitAssertRector.php | 149 + ...CountableWithMethodToAssertCountRector.php | 24 +- .../AssertCompareToSpecificMethodRector.php | 118 - ...AssertComparisonToSpecificMethodRector.php | 8 +- ...NullableObjectToAssertInstanceofRector.php | 13 +- ...atParameterToSpecificMethodsTypeRector.php | 18 +- .../MethodCall/AssertEqualsToSameRector.php | 55 +- .../AssertFalseStrposToContainsRector.php | 6 +- .../AssertInstanceOfComparisonRector.php | 41 +- .../AssertIssetToSpecificMethodRector.php | 6 +- .../MethodCall/AssertNotOperatorRector.php | 6 +- .../MethodCall/AssertPropertyExistsRector.php | 6 +- .../Rector/MethodCall/AssertRegExpRector.php | 13 +- ...sertSameBoolNullToSpecificMethodRector.php | 11 +- ...rtSameTrueFalseToAssertTrueFalseRector.php | 9 +- .../AssertTrueFalseToSpecificMethodRector.php | 14 +- .../Rector/MethodCall/FlipAssertRector.php | 17 +- .../NarrowIdenticalWithConsecutiveRector.php | 3 +- .../NarrowSingleWillReturnCallbackRector.php | 7 +- .../RemoveExpectAnyFromMockRector.php | 3 +- .../SingleWithConsecutiveToWithRector.php | 6 +- .../UseSpecificWillMethodRector.php | 3 +- .../UseSpecificWithMethodRector.php | 3 +- ...MethodParametersAndReturnTypesResolver.php | 56 + .../ValueObject/MatchAndReturnMatch.php | 6 +- .../ValueObject/ParamTypesAndReturnType.php | 37 + .../ValueObject/VariableNameToType.php | 29 + .../VariableNameToTypeCollection.php | 39 + .../NodeFactory/WillReturnCallbackFactory.php | 18 +- .../Rector/Class_/AddProphecyTraitRector.php | 13 +- .../ParentTestClassConstructorRector.php | 109 + .../PublicDataProviderClassMethodRector.php | 9 +- .../RemoveNamedArgsInDataProviderRector.php | 132 + .../StaticDataProviderClassMethodRector.php | 16 +- ...rtIssetToAssertObjectHasPropertyRector.php | 142 - .../PropertyExistsWithoutAssertRector.php | 87 + .../RemoveSetMethodsMethodCallRector.php | 9 +- .../ExpectsMethodCallDecorator.php | 10 +- .../WithConsecutiveRector.php | 32 +- .../NamedArgumentForDataProviderRector.php | 14 +- ...veOverrideFinalConstructTestCaseRector.php | 76 + .../Rector/StaticCall/GetMockRector.php | 6 +- ...rformAssertionToNonAssertingTestRector.php | 18 +- .../ClassMethod/ExceptionAnnotationRector.php | 15 +- .../DelegateExceptionArgumentsRector.php | 6 +- .../RemoveDataProviderTestPrefixRector.php | 11 +- ...lsParameterToSpecificMethodsTypeRector.php | 9 +- .../SpecificAssertContainsRector.php | 3 +- .../SpecificAssertInternalTypeRector.php | 3 +- .../MethodCall/ExplicitPhpErrorApiRector.php | 6 +- ...eplaceAtMethodWithDesiredMatcherRector.php | 103 + ...ficAssertContainsWithoutIdentityRector.php | 9 +- .../ProjectPackageVersionResolver.php | 9 +- .../rector-phpunit/src/Enum/AssertMethod.php | 8 + .../src/Enum/PHPUnitClassName.php | 16 + .../rector-phpunit/src/MethodCallRemover.php | 6 +- .../src/NodeAnalyzer/AssertCallAnalyzer.php | 20 +- .../NodeAnalyzer/IdentifierManipulator.php | 3 +- .../NodeAnalyzer/MockedVariableAnalyzer.php | 9 +- .../src/NodeAnalyzer/SetUpMethodDecorator.php | 3 +- .../src/NodeAnalyzer/TestsNodeAnalyzer.php | 39 +- .../src/NodeFactory/ConsecutiveIfsFactory.php | 22 +- .../ExpectExceptionMethodCallFactory.php | 6 +- ...erInvocationCountMethodCallNodeFactory.php | 3 +- .../src/NodeFactory/UsedVariablesResolver.php | 6 +- .../DataProviderClassMethodFinder.php | 12 +- .../src/NodeFinder/MethodCallNodeFinder.php | 6 +- .../src/PhpDoc/DataProviderMethodRenamer.php | 8 +- .../src/PhpDoc/PhpDocValueToNodeMapper.php | 6 +- .../rector-phpunit/src/Set/PHPUnitSetList.php | 7 +- .../AnnotationWithValueToAttribute.php | 19 +- .../ValueObject/BinaryOpWithAssertMethod.php | 9 +- .../ValueObject/ConstantWithAssertMethods.php | 9 +- .../FunctionNameWithAssertMethods.php | 9 +- .../rector/rector-symfony/composer.json | 22 +- .../fosrest/annotations-to-attributes.php | 2 +- .../sets/jms/annotations-to-attributes.php | 2 +- .../sensiolabs/annotations-to-attributes.php | 2 +- .../swiftmailer-to-symfony-mailer.php | 2 +- .../symfony/annotations-to-attributes.php | 2 +- .../config/sets/symfony/configs.php | 2 +- .../sets/symfony/symfony-code-quality.php | 13 +- .../symfony/symfony-constructor-injection.php | 18 +- .../config/sets/symfony/symfony25.php | 2 +- .../config/sets/symfony/symfony26.php | 2 +- .../config/sets/symfony/symfony27.php | 2 +- .../config/sets/symfony/symfony28.php | 2 +- .../sets/symfony/symfony3/symfony30.php | 24 + .../symfony30/symfony30-bridge-monolog.php | 13 + .../symfony30-bridge-swift-mailer.php | 13 + .../symfony30/symfony30-class-loader.php | 13 + .../symfony3/symfony30/symfony30-console.php | 13 + .../symfony3/symfony30/symfony30-form.php | 24 + .../symfony30/symfony30-http-foundation.php | 10 + .../symfony30/symfony30-http-kernel.php | 13 + .../symfony3/symfony30/symfony30-process.php | 11 + .../symfony30/symfony30-property-access.php | 11 + .../symfony3/symfony30/symfony30-security.php | 10 + .../symfony30/symfony30-translation.php | 11 + .../symfony30/symfony30-twig-bundle.php | 10 + .../symfony30/symfony30-validator.php | 13 + .../sets/symfony/symfony3/symfony31.php} | 4 +- .../symfony31/symfony31-yaml.php} | 2 +- .../sets/symfony/symfony3/symfony32.php | 9 + .../symfony32-dependency-injection.php} | 2 +- .../sets/symfony/symfony3/symfony33.php | 12 + .../symfony3/symfony33/symfony33-console.php | 15 + .../symfony3/symfony33/symfony33-debug.php | 13 + .../symfony33-dependency-injection.php | 16 + .../symfony33/symfony33-framework-bundle.php | 19 + .../sets/symfony/symfony3/symfony34.php | 11 + .../symfony34-dependency-injection.php | 10 + ...mfony34-sensio-framework-extra-bundle.php} | 8 +- .../symfony3/symfony34/symfony34-yaml.php | 11 + .../config/sets/symfony/symfony30.php | 132 - .../config/sets/symfony/symfony33.php | 33 - .../sets/symfony/symfony4/symfony40.php | 13 + .../symfony40-dependency-injection.php | 10 + .../symfony4/symfony40/symfony40-form.php | 10 + .../symfony4/symfony40/symfony40-process.php | 10 + .../symfony40/symfony40-validator.php | 12 + .../symfony40/symfony40-var-dumper.php | 10 + .../sets/symfony/symfony4/symfony41.php | 13 + .../symfony41/symfony41-console.php} | 13 +- .../symfony41/symfony41-framework-bundle.php | 13 + .../symfony41/symfony41-http-foundation.php | 11 + .../symfony4/symfony41/symfony41-workflow.php | 13 + .../sets/symfony/symfony4/symfony42.php | 21 + .../symfony4/symfony42/symfony42-cache.php | 11 + .../symfony4/symfony42/symfony42-config.php | 13 + .../symfony42/symfony42-dom-crawler.php | 12 + .../symfony4/symfony42/symfony42-finder.php | 12 + .../symfony4/symfony42/symfony42-form.php | 24 + .../symfony42/symfony42-framework-bundle.php | 13 + .../symfony42/symfony42-http-foundation.php | 16 + .../symfony42/symfony42-http-kernel.php | 13 + .../symfony42/symfony42-monolog-bridge.php | 12 + .../symfony4/symfony42/symfony42-process.php | 13 + .../symfony42/symfony42-serializer.php | 12 + .../symfony42/symfony42-translation.php | 10 + .../sets/symfony/symfony4/symfony43.php | 20 + .../symfony43/symfony43-browser-kit.php | 13 + .../symfony4/symfony43/symfony43-cache.php | 26 + .../symfony43/symfony43-event-dispatcher.php | 13 + .../symfony43/symfony43-framework-bundle.php | 25 + .../symfony43/symfony43-http-foundation.php | 17 + .../symfony43/symfony43-http-kernel.php | 21 + .../symfony4/symfony43/symfony43-intl.php | 10 + .../symfony43/symfony43-security-core.php | 14 + .../symfony43/symfony43-security-http.php | 11 + .../symfony43/symfony43-twig-bundle.php | 10 + .../symfony4/symfony43/symfony43-workflow.php | 12 + .../sets/symfony/symfony4/symfony44.php | 14 + .../symfony4/symfony44/symfony44-console.php | 13 + .../symfony44-dependency-injection.php | 10 + .../symfony44/symfony44-http-kernel.php | 16 + .../symfony44/symfony44-security-core.php | 10 + .../symfony44/symfony44-templating.php | 10 + .../config/sets/symfony/symfony40.php | 15 - .../config/sets/symfony/symfony42.php | 57 - .../config/sets/symfony/symfony43.php | 73 - .../config/sets/symfony/symfony44.php | 29 - .../sets/symfony/symfony5/symfony50.php | 12 + .../symfony50/symfony50-console.php} | 6 +- .../symfony5/symfony50/symfony50-debug.php | 10 + .../symfony50}/symfony50-types.php | 6 +- .../sets/symfony/symfony5/symfony51.php | 19 + .../symfony5/symfony51/symfony51-config.php | 11 + .../symfony5/symfony51/symfony51-console.php | 13 + .../symfony51-dependency-injection.php | 13 + .../symfony51/symfony51-event-dispatcher.php | 10 + .../symfony5/symfony51/symfony51-form.php | 13 + .../symfony51/symfony51-framework-bundle.php | 15 + .../symfony51/symfony51-http-foundation.php | 11 + .../symfony51/symfony51-inflector.php | 13 + .../symfony5/symfony51/symfony51-notifier.php | 14 + .../symfony51/symfony51-security-core.php | 13 + .../symfony51/symfony51-security-http.php | 15 + .../symfony52-validator-attributes.php | 2 +- .../sets/symfony/symfony5/symfony52.php | 20 + .../symfony52-dependency-injection.php | 13 + .../symfony5/symfony52/symfony52-form.php | 12 + .../symfony52/symfony52-http-foundation.php | 13 + .../symfony5/symfony52/symfony52-mime.php | 15 + .../symfony5/symfony52/symfony52-notifier.php | 13 + .../symfony52/symfony52-property-access.php | 13 + .../symfony52/symfony52-property-info.php | 13 + .../symfony52/symfony52-security-core.php | 11 + .../symfony52/symfony52-security-http.php | 19 + .../symfony52/symfony52-validator.php | 13 + .../sets/symfony/symfony5/symfony53.php | 17 + .../symfony5/symfony53/symfony53-console.php | 11 + .../symfony5/symfony53/symfony53-form.php | 17 + .../symfony53/symfony53-framework-bundle.php | 10 + .../symfony53/symfony53-http-foundation.php | 14 + .../symfony53/symfony53-http-kernel.php | 18 + .../symfony5/symfony53/symfony53-mailer.php | 12 + .../symfony53/symfony53-security-core.php | 27 + .../sets/symfony/symfony5/symfony54.php | 17 + .../symfony5/symfony54/symfony54-cache.php | 13 + .../symfony54/symfony54-http-kernel.php | 14 + .../symfony5/symfony54/symfony54-notifier.php | 14 + .../symfony54/symfony54-security-bundle.php | 16 + .../symfony54/symfony54-security-core.php | 18 + .../symfony54/symfony54-security-http.php | 13 + .../symfony54/symfony54-validator.php | 13 + .../config/sets/symfony/symfony51.php | 55 - .../config/sets/symfony/symfony52.php | 63 - .../config/sets/symfony/symfony53.php | 62 - .../config/sets/symfony/symfony54.php | 47 - .../symfony/symfony6/symfony-return-types.php | 171 -- .../sets/symfony/symfony6/symfony60.php | 31 + .../symfony60/symfony60-browser-kit.php | 16 + .../symfony6/symfony60/symfony60-config.php | 21 + .../symfony6/symfony60/symfony60-console.php | 39 + .../symfony60/symfony60-contracts.php | 13 + .../symfony60-dependency-injection.php | 29 + .../symfony60/symfony60-doctrine-bridge.php | 15 + .../symfony60/symfony60-event-dispatcher.php | 16 + .../symfony60-expression-language.php | 16 + .../symfony6/symfony60/symfony60-form.php | 25 + .../symfony60/symfony60-framework-bundle.php | 14 + .../symfony60/symfony60-http-kernel.php | 23 + .../symfony60/symfony60-options-resolver.php | 14 + .../symfony60/symfony60-property-access.php | 22 + .../symfony60/symfony60-property-info.php | 21 + .../symfony6/symfony60/symfony60-routing.php | 16 + .../symfony60/symfony60-security-core.php | 32 + .../symfony60/symfony60-security-http.php | 18 + .../symfony60/symfony60-serializer.php | 33 + .../symfony60/symfony60-templating.php | 14 + .../symfony60/symfony60-translation.php | 17 + .../symfony60/symfony60-validator.php | 20 + .../sets/symfony/symfony6/symfony61.php | 13 + .../symfony6/symfony61/symfony61-console.php | 11 + .../symfony61/symfony61-serializer.php | 14 + .../symfony61/symfony61-twig-bridge.php | 10 + .../symfony61/symfony61-validator.php | 16 + .../sets/symfony/symfony6/symfony62.php | 32 + .../symfony62/symfony62-doctrine-bridge.php | 10 + .../symfony62/symfony62-framework-bundle.php | 16 + .../symfony62/symfony62-http-foundation.php | 21 + .../symfony62/symfony62-http-kernel.php | 21 + .../symfony62/symfony62-mail-pace-mailer.php | 16 + .../symfony62/symfony62-messenger.php | 15 + .../symfony6/symfony62/symfony62-mime.php | 14 + .../symfony62/symfony62-security-core.php | 19 + .../symfony62/symfony62-security-http.php | 16 + .../symfony62/symfony62-translation.php | 14 + .../symfony62/symfony62-twig-bridge.php | 14 + .../sets/symfony/symfony6/symfony63.php | 14 + .../symfony6/symfony63/symfony63-console.php | 13 + .../symfony63-dependency-injection.php | 18 + .../symfony63/symfony63-http-client.php | 13 + .../symfony63/symfony63-messenger.php | 16 + .../sets/symfony/symfony6/symfony64.php | 13 + .../symfony64/symfony64-error-handler.php | 11 + .../symfony64/symfony64-form.php} | 7 +- .../symfony64/symfony64-http-foundation.php | 11 + .../symfony6/symfony64/symfony64-routing.php | 11 + .../config/sets/symfony/symfony60.php | 37 - .../config/sets/symfony/symfony61.php | 23 - .../config/sets/symfony/symfony62.php | 75 - .../config/sets/symfony/symfony63.php | 30 - .../sets/symfony/symfony7/symfony70.php | 13 + .../symfony70/symfony70-contracts.php | 12 + .../symfony70-dependency-injection.php | 12 + .../symfony70/symfony70-http-foundation.php | 18 + .../symfony70/symfony70-serializer.php | 14 + .../sets/symfony/symfony7/symfony71.php | 11 + .../symfony71-dependency-injection.php | 12 + .../symfony71/symfony71-serializer.php | 15 + .../sets/symfony/symfony7/symfony72.php | 11 + .../symfony72/symfony72-http-foundation.php | 10 + .../symfony72/symfony72-serializer.php | 13 + .../sets/symfony/symfony7/symfony73.php | 11 + .../symfony7/symfony73/symfony73-console.php | 11 + .../symfony73/symfony73-twig-bundle.php | 11 + .../config/sets/symfony/symfony70.php | 30 - .../config/sets/symfony/symfony71.php | 15 - .../twig/twig-underscore-to-namespace.php | 2 +- .../config/sets/twig/twig112.php | 2 +- .../config/sets/twig/twig127.php | 2 +- .../config/sets/twig/twig134.php | 2 +- .../config/sets/twig/twig140.php | 2 +- .../config/sets/twig/twig20.php | 2 +- .../sets/twig/{twig240.php => twig24.php} | 2 +- .../AttributePresenceDetector.php | 27 + .../NodeFactory/SymfonyClosureFactory.php | 3 +- ...tionSecurityAttributeToIsGrantedRector.php | 83 + .../Rector/BinaryOp/RequestIsMainRector.php | 101 + .../BinaryOp/ResponseStatusCodeRector.php | 27 +- .../ClassMethod/ActionSuffixRemoverRector.php | 16 +- .../ParamTypeFromRouteRequiredRegexRector.php | 11 +- .../RemoveUnusedRequestParamRector.php | 24 +- ...sponseReturnTypeControllerActionRector.php | 18 +- .../TemplateAnnotationToThisRenderRector.php | 205 +- .../EventListenerToEventSubscriberRector.php | 90 +- .../Class_/InlineClassRoutePrefixRector.php | 258 ++ ...oadValidatorMetadataToAnnotationRector.php | 15 +- .../Rector/Class_/MakeCommandLazyRector.php | 68 - ...tAndSecurityAttributeToIsGrantedRector.php | 95 + .../StringExtensionToConfigBuilderRector.php | 41 +- ...ameResponseCodeWithDebugContentsRector.php | 3 +- ...LiteralGetToRequestClassConstantRector.php | 6 +- ...rReturnTypeBasedOnSetterRequiredRector.php | 6 +- .../NestedConfigCallsFactory.php | 5 +- ...ccessDecisionManagerConfigArrayHandler.php | 2 +- .../ConfigServiceArgumentsResolver.php | 11 +- .../CollectServiceArgumentsNodeVisitor.php | 14 +- .../ClassMethod/AddRouteAnnotationRector.php | 19 +- .../Rector/Class_/AutowireAttributeRector.php | 14 +- .../ParameterBagToAutowireAttributeRector.php | 3 +- .../Closure/MergeServiceNameTypeRector.php | 14 +- .../ServiceArgsToServiceNamedArgRector.php | 15 +- .../ServiceSetStringNameToClassNameRector.php | 6 +- ...iceSettersToSettersAutodiscoveryRector.php | 21 +- ...rviceTagsToDefaultsAutoconfigureRector.php | 6 +- .../ServicesSetNameToSetTypeRector.php | 53 - .../Configs/ValueObject/ServiceArguments.php | 11 +- .../CommandConstructorDecorator.php | 40 + .../AutowireClassMethodFactory.php | 59 + ...dGetByTypeToConstructorInjectionRector.php | 130 + ...rGetByTypeToConstructorInjectionRector.php | 123 + ...fonyStringToConstructorInjectionRector.php | 129 + .../Trait_/TraitGetByTypeToInjectRector.php | 131 + .../ThisGetTypeMatcher.php | 70 + ...DowngradeSymfonyCommandAttributeRector.php | 5 +- .../ClassMethod/SwiftMessageToEmailRector.php | 19 +- ...wiftSetBodyToHtmlPlainMethodCallRector.php | 3 +- .../AddViolationToBuildViolationRector.php | 4 +- ...MaxLengthSymfonyFormOptionToAttrRector.php | 5 +- .../MethodCall/RedirectToRouteRector.php | 22 +- ...ypeOptionNameFromTypeToEntryTypeRector.php | 24 +- .../GetToConstructorInjectionRector.php | 9 +- .../Rector/StaticCall/ParseFileRector.php | 5 +- .../ClassMethod/FormTypeGetParentRector.php | 3 +- .../Rector/ClassMethod/GetRequestRector.php | 20 +- .../RemoveDefaultGetBlockPrefixRector.php | 19 +- ...StringCollectionOptionToConstantRector.php | 17 +- .../FormTypeInstanceToClassConstRector.php | 20 +- .../Rector/MethodCall/OptionNameRector.php | 20 +- .../ReadOnlyOptionToAttributeRector.php | 11 +- .../StringFormTypeToClassRector.php | 6 +- ...oleExceptionToErrorEventConstantRector.php | 3 +- ...ethodAnnotationToRouteAnnotationRector.php | 9 +- .../RemoveServiceFromSensioRouteRector.php | 6 +- ...SensioRouteAnnotationWithSymfonyRector.php | 15 +- .../ContainerGetNameToTypeInTestsRector.php | 8 +- .../ConstFetch/ConstraintUrlOptionRector.php | 5 +- .../ProcessBuilderGetProcessRector.php | 58 - .../ProcessBuilderInstanceRector.php | 48 - ...ntainerGetToConstructorInjectionRector.php | 93 +- .../Rector/New_/RootNodeTreeBuilderRector.php | 3 +- .../StringToArrayArgumentProcessRector.php | 20 +- .../EventDispatcherParentConstructRector.php | 14 +- ...plateShortNotationToBundleSyntaxRector.php | 21 +- ...tCurrencyBundleMethodCallsToIntlRector.php | 2 +- .../MakeDispatchFirstArgumentEventRector.php | 6 +- .../WebTestCaseAssertIsSuccessfulRector.php | 12 +- .../WebTestCaseAssertResponseCodeRector.php | 14 +- ...stCaseAssertSelectorTextContainsRector.php | 72 - .../ConsoleExecuteReturnIntRector.php | 36 +- ...izationCheckerIsGrantedExtractorRector.php | 51 +- .../CommandConstantReturnCodeRector.php | 20 +- ...utHandlerToLogoutEventSubscriberRector.php | 12 +- ...ssHandlerToLogoutEventSubscriberRector.php | 12 +- ...nitionAliasSetPrivateToSetPublicRector.php | 5 +- .../FormBuilderSetDataMapperRector.php | 6 +- ...xtractorEnableMagicCallExtractorRector.php | 5 +- ...orBuilderEnableAnnotationMappingRector.php | 3 +- ...tyAccessorCreationBooleanToFlagsRector.php | 7 +- .../CommandDescriptionToPropertyRector.php | 71 - ...CaseContainerPropertyDeprecationRector.php | 5 +- .../FuncCall/ReplaceServiceArgumentRector.php | 7 +- .../GetHelperControllerToServiceRector.php | 9 +- .../CommandConfigureToAttributeRector.php | 21 +- .../CommandPropertyToAttributeRector.php | 19 +- ...sureTwigExtensionToNativeMethodsRector.php | 11 +- .../ErrorNamesPropertyToConstantRector.php | 7 +- ...mentValueResolverToValueResolverRector.php | 4 +- ...terAttributeToMapEntityAttributeRector.php | 2 +- ...ssageHandlerInterfaceToAttributeRector.php | 30 +- ...geSubscriberInterfaceToAttributeRector.php | 25 +- ...ityAttributeToIsGrantedAttributeRector.php | 40 +- .../SimplifyFormRenderingRector.php | 12 +- .../Class_/ParamAndEnvAttributeRector.php | 2 +- ...alableCommandInterfaceReturnTypeRector.php | 9 +- ...ributeFromAnnotationSubnamespaceRector.php | 57 - ...RequestToRequestStackConstructorRector.php | 124 + .../GetMethodToAsTwigAttributeTransformer.php | 111 + .../CommandArgumentsAndOptionsResolver.php | 105 + .../LocalArrayMethodCallableMatcher.php | 46 + .../CommandInvokeParamsFactory.php | 79 + .../ReturnEmptyArrayMethodRemover.php | 26 + .../Class_/CommandHelpToAttributeRector.php | 175 ++ ...etFiltersToAsTwigFilterAttributeRector.php | 86 + ...nctionsToAsTwigFunctionAttributeRector.php | 86 + .../InvokableCommandInputAttributeRector.php | 266 ++ .../Symfony73/ValueObject/CommandArgument.php | 39 + .../Symfony73/ValueObject/CommandOption.php | 20 + .../Return_/SimpleFunctionAndFilterRector.php | 14 +- .../src/Annotation/AnnotationAnalyzer.php | 29 +- .../ListenerServiceDefinitionProvider.php | 16 +- .../NodeAnalyzer/ControllerMethodAnalyzer.php | 3 +- .../Symfony/ContainerServiceProvider.php | 9 +- .../Symfony/Routing/SymfonyRoutesProvider.php | 9 +- .../src/BundleClassResolver.php | 12 +- .../src/DataProvider/ServiceMapProvider.php | 8 +- .../ServiceNameToTypeUniqueProvider.php | 3 +- .../src/Enum/CommandMethodName.php | 12 + .../rector-symfony/src/Enum/FosAnnotation.php | 20 + .../src/Enum/SensioAttribute.php | 8 + .../src/Enum/SymfonyAnnotation.php | 4 - .../src/Enum/SymfonyAttribute.php | 24 + .../rector-symfony/src/Enum/SymfonyClass.php | 73 + .../rector-symfony/src/Enum/TwigClass.php | 20 + .../FormTypeStringToTypeProvider.php | 7 +- .../src/Helper/MessengerHelper.php | 20 +- .../src/Helper/TemplateGuesser.php | 8 +- .../ClassAnnotationAssertResolver.php | 6 +- .../MethodCallAnnotationAssertResolver.php | 9 +- .../PropertyAnnotationAssertResolver.php | 9 +- .../Annotations/StmtMethodCallMatcher.php | 3 +- .../src/NodeAnalyzer/ClassAnalyzer.php | 3 +- .../DependencyInjectionMethodCallAnalyzer.php | 15 +- .../FormAddMethodCallAnalyzer.php | 8 +- .../NodeAnalyzer/FormCollectionAnalyzer.php | 6 +- ...InstanceToFormClassConstFetchConverter.php | 12 +- .../CreateFormTypeOptionsArgMover.php | 8 +- .../FormType/FormTypeClassResolver.php | 6 +- .../LiteralCallLikeConstFetchReplacer.php | 7 +- .../RouteRequiredParamNameToTypesResolver.php | 8 +- .../ServiceTypeMethodCallResolver.php | 9 +- .../SymfonyClosureExtensionMatcher.php | 9 +- .../SymfonyPhpClosureDetector.php | 13 +- .../NodeAnalyzer/SymfonyTestCaseAnalyzer.php | 7 +- .../AnnotationOrAttributeValueResolver.php | 62 + .../DoctrineAnnotationFromNewFactory.php | 3 +- .../DoctrineAnnotationKeyToValuesResolver.php | 8 +- .../Annotations/StringValueQuoteWrapper.php | 3 +- .../NodeFactory/ArrayFromCompactFactory.php | 5 +- .../BareLogoutClassMethodFactory.php | 6 +- .../src/NodeFactory/EventReferenceFactory.php | 6 +- .../GetSubscribedEventsClassMethodFactory.php | 26 +- .../OnLogoutClassMethodFactory.php | 9 +- .../OnSuccessLogoutClassMethodFactory.php | 16 +- .../src/NodeFactory/ThisRenderFactory.php | 105 +- .../src/NodeFinder/EmptyReturnNodeFinder.php | 3 +- .../src/NodeManipulator/ArrayManipulator.php | 2 +- .../src/NodeManipulator/ClassManipulator.php | 3 +- .../src/PhpParser/NamedSimplePhpParser.php | 5 +- .../rector-symfony/src/Set/FOSRestSetList.php | 5 +- .../rector-symfony/src/Set/JMSSetList.php | 5 +- .../src/Set/SensiolabsSetList.php | 5 +- .../Set/SetProvider/Symfony3SetProvider.php | 19 + .../Set/SetProvider/Symfony4SetProvider.php | 19 + .../Set/SetProvider/Symfony5SetProvider.php | 64 + .../Set/SetProvider/Symfony6SetProvider.php | 19 + .../Set/SetProvider/Symfony7SetProvider.php | 19 + .../Set/SetProvider/SymfonySetProvider.php | 28 +- .../src/Set/SetProvider/TwigSetProvider.php | 2 +- .../src/Set/SwiftMailerSetList.php | 3 +- .../rector-symfony/src/Set/SymfonySetList.php | 63 +- .../rector-symfony/src/Set/TwigSetList.php | 5 +- .../TypeAnalyzer/ContainerAwareAnalyzer.php | 8 +- .../src/TypeAnalyzer/ControllerAnalyzer.php | 8 +- .../ReturnTypeDeclarationUpdater.php | 34 +- .../src/ValueObject/ClassNameAndFilePath.php | 6 +- .../EventNameToClassAndConstant.php | 9 +- .../EventReferenceToMethodName.php | 6 +- ...EventReferenceToMethodNameWithPriority.php | 9 +- .../ExtensionKeyAndConfiguration.php | 6 +- .../ValueObject/IntlBundleClassToNewClass.php | 10 +- .../ValueObject/ReplaceServiceArgument.php | 3 +- .../src/ValueObject/ServiceDefinition.php | 17 +- .../src/ValueObject/ServiceMap/ServiceMap.php | 2 +- .../src/ValueObject/SymfonyRouteMetadata.php | 25 +- .../rector-symfony/src/ValueObject/Tag.php | 5 +- .../src/ValueObject/Tag/EventListenerTag.php | 16 +- .../ClassMethodAndAnnotation.php | 5 +- .../ValidatorAssert/PropertyAndAnnotation.php | 6 +- .../ValueObjectFactory/ServiceMapFactory.php | 9 +- .../rector/rector/vendor/scoper-autoload.php | 112 +- .../rector/vendor/sebastian/diff/ChangeLog.md | 24 + .../rector/vendor/sebastian/diff/README.md | 1 - .../vendor/sebastian/diff/composer.json | 10 +- .../vendor/sebastian/diff/src/Chunk.php | 66 +- .../rector/vendor/sebastian/diff/src/Diff.php | 58 +- .../vendor/sebastian/diff/src/Differ.php | 17 +- .../src/Exception/ConfigurationException.php | 5 +- .../diff/src/Exception/Exception.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../rector/vendor/sebastian/diff/src/Line.php | 26 +- .../LongestCommonSubsequenceCalculator.php | 2 +- ...ientLongestCommonSubsequenceCalculator.php | 2 +- .../src/Output/AbstractChunkOutputBuilder.php | 2 +- .../diff/src/Output/DiffOnlyOutputBuilder.php | 9 +- .../src/Output/DiffOutputBuilderInterface.php | 2 +- .../Output/StrictUnifiedDiffOutputBuilder.php | 36 +- .../src/Output/UnifiedDiffOutputBuilder.php | 29 +- .../vendor/sebastian/diff/src/Parser.php | 2 +- ...ientLongestCommonSubsequenceCalculator.php | 2 +- .../vendor/symfony/console/Application.php | 202 +- .../symfony/console/Attribute/AsCommand.php | 12 +- .../console/CI/GithubActionReporter.php | 9 +- .../rector/vendor/symfony/console/Color.php | 19 +- .../symfony/console/Command/Command.php | 102 +- .../console/Command/CompleteCommand.php | 40 +- .../console/Command/DumpCompletionCommand.php | 21 +- .../symfony/console/Command/HelpCommand.php | 27 +- .../symfony/console/Command/LazyCommand.php | 25 +- .../symfony/console/Command/ListCommand.php | 22 +- .../symfony/console/Command/LockableTrait.php | 17 +- .../Command/SignalableCommandInterface.php | 2 +- .../console/Command/TraceableCommand.php | 79 +- .../CommandLoader/CommandLoaderInterface.php | 6 +- .../CommandLoader/ContainerCommandLoader.php | 18 +- .../CommandLoader/FactoryCommandLoader.php | 11 +- .../console/Completion/CompletionInput.php | 39 +- .../Completion/CompletionSuggestions.php | 14 +- .../Output/BashCompletionOutput.php | 6 +- .../Output/CompletionOutputInterface.php | 6 +- .../Output/FishCompletionOutput.php | 6 +- .../Completion/Output/ZshCompletionOutput.php | 6 +- .../symfony/console/Completion/Suggestion.php | 8 +- .../vendor/symfony/console/ConsoleEvents.php | 10 +- .../rector/vendor/symfony/console/Cursor.php | 11 +- .../DataCollector/CommandDataCollector.php | 26 +- .../symfony/console/Debug/CliRequest.php | 14 +- .../AddConsoleCommandPass.php | 24 +- .../Descriptor/ApplicationDescription.php | 32 +- .../symfony/console/Descriptor/Descriptor.php | 21 +- .../Descriptor/DescriptorInterface.php | 4 +- .../console/Descriptor/JsonDescriptor.php | 12 +- .../console/Descriptor/MarkdownDescriptor.php | 28 +- .../Descriptor/ReStructuredTextDescriptor.php | 65 +- .../console/Descriptor/TextDescriptor.php | 24 +- .../console/Descriptor/XmlDescriptor.php | 12 +- .../Exception/CommandNotFoundException.php | 7 +- .../console/Exception/ExceptionInterface.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../Exception/InvalidOptionException.php | 2 +- .../console/Exception/LogicException.php | 2 +- .../Exception/MissingInputException.php | 2 +- .../Exception/NamespaceNotFoundException.php | 2 +- .../Exception/RunCommandFailedException.php | 7 +- .../console/Exception/RuntimeException.php | 2 +- .../console/Formatter/NullOutputFormatter.php | 9 +- .../Formatter/NullOutputFormatterStyle.php | 2 +- .../console/Formatter/OutputFormatter.php | 21 +- .../Formatter/OutputFormatterInterface.php | 2 +- .../Formatter/OutputFormatterStyle.php | 36 +- .../OutputFormatterStyleInterface.php | 2 +- .../Formatter/OutputFormatterStyleStack.php | 13 +- .../WrappableOutputFormatterInterface.php | 2 +- .../console/Helper/DebugFormatterHelper.php | 12 +- .../console/Helper/DescriptorHelper.php | 20 +- .../vendor/symfony/console/Helper/Dumper.php | 34 +- .../console/Helper/FormatterHelper.php | 4 +- .../vendor/symfony/console/Helper/Helper.php | 12 +- .../console/Helper/HelperInterface.php | 2 +- .../symfony/console/Helper/HelperSet.php | 6 +- .../console/Helper/InputAwareHelper.php | 6 +- .../symfony/console/Helper/OutputWrapper.php | 7 +- .../symfony/console/Helper/ProcessHelper.php | 10 +- .../symfony/console/Helper/ProgressBar.php | 179 +- .../console/Helper/ProgressIndicator.php | 73 +- .../symfony/console/Helper/QuestionHelper.php | 48 +- .../console/Helper/SymfonyQuestionHelper.php | 14 +- .../vendor/symfony/console/Helper/Table.php | 100 +- .../symfony/console/Helper/TableCell.php | 14 +- .../symfony/console/Helper/TableCellStyle.php | 13 +- .../symfony/console/Helper/TableRows.php | 7 +- .../symfony/console/Helper/TableSeparator.php | 2 +- .../symfony/console/Helper/TableStyle.php | 126 +- .../symfony/console/Input/ArgvInput.php | 19 +- .../symfony/console/Input/ArrayInput.php | 11 +- .../vendor/symfony/console/Input/Input.php | 10 +- .../symfony/console/Input/InputArgument.php | 29 +- .../console/Input/InputAwareInterface.php | 2 +- .../symfony/console/Input/InputDefinition.php | 41 +- .../symfony/console/Input/InputInterface.php | 6 +- .../symfony/console/Input/InputOption.php | 29 +- .../Input/StreamableInputInterface.php | 2 +- .../symfony/console/Input/StringInput.php | 4 +- .../symfony/console/Logger/ConsoleLogger.php | 34 +- .../console/Messenger/RunCommandContext.php | 11 +- .../console/Messenger/RunCommandMessage.php | 11 +- .../Messenger/RunCommandMessageHandler.php | 15 +- .../symfony/console/Output/AnsiColorMode.php | 4 +- .../symfony/console/Output/BufferedOutput.php | 7 +- .../symfony/console/Output/ConsoleOutput.php | 14 +- .../console/Output/ConsoleOutputInterface.php | 2 +- .../console/Output/ConsoleSectionOutput.php | 33 +- .../symfony/console/Output/NullOutput.php | 13 +- .../vendor/symfony/console/Output/Output.php | 16 +- .../console/Output/OutputInterface.php | 4 +- .../symfony/console/Output/StreamOutput.php | 8 +- .../console/Output/TrimmedBufferOutput.php | 16 +- .../console/Question/ChoiceQuestion.php | 24 +- .../console/Question/ConfirmationQuestion.php | 7 +- .../symfony/console/Question/Question.php | 57 +- .../console/SignalRegistry/SignalMap.php | 11 +- .../console/SignalRegistry/SignalRegistry.php | 7 +- .../console/SingleCommandApplication.php | 23 +- .../symfony/console/Style/OutputStyle.php | 15 +- .../symfony/console/Style/StyleInterface.php | 2 +- .../symfony/console/Style/SymfonyStyle.php | 76 +- .../vendor/symfony/console/Terminal.php | 26 +- .../vendor/symfony/console/composer.json | 2 +- .../deprecation-contracts/composer.json | 2 +- .../deprecation-contracts/function.php | 4 +- .../Exception/ExceptionInterface.php | 2 +- .../Exception/FileNotFoundException.php | 2 +- .../filesystem/Exception/IOException.php | 7 +- .../Exception/IOExceptionInterface.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../filesystem/Exception/RuntimeException.php | 2 +- .../vendor/symfony/filesystem/Filesystem.php | 17 +- .../rector/vendor/symfony/filesystem/Path.php | 13 +- .../vendor/symfony/filesystem/composer.json | 2 +- .../symfony/finder/Comparator/Comparator.php | 12 +- .../finder/Comparator/DateComparator.php | 4 +- .../finder/Comparator/NumberComparator.php | 2 +- .../Exception/AccessDeniedException.php | 2 +- .../Exception/DirectoryNotFoundException.php | 2 +- .../rector/vendor/symfony/finder/Finder.php | 130 +- .../vendor/symfony/finder/Gitignore.php | 6 +- .../rector/vendor/symfony/finder/Glob.php | 2 +- .../finder/Iterator/CustomFilterIterator.php | 7 +- .../Iterator/DateRangeFilterIterator.php | 9 +- .../Iterator/DepthRangeFilterIterator.php | 7 +- .../ExcludeDirectoryFilterIterator.php | 20 +- .../Iterator/FileTypeFilterIterator.php | 7 +- .../Iterator/FilecontentFilterIterator.php | 4 +- .../Iterator/FilenameFilterIterator.php | 4 +- .../symfony/finder/Iterator/LazyIterator.php | 7 +- .../Iterator/MultiplePcreFilterIterator.php | 2 +- .../finder/Iterator/PathFilterIterator.php | 4 +- .../Iterator/RecursiveDirectoryIterator.php | 31 +- .../Iterator/SizeRangeFilterIterator.php | 9 +- .../finder/Iterator/SortableIterator.php | 44 +- .../Iterator/VcsIgnoredFilterIterator.php | 17 +- .../vendor/symfony/finder/SplFileInfo.php | 12 +- .../vendor/symfony/finder/composer.json | 2 +- .../symfony/polyfill-mbstring/Mbstring.php | 2 +- .../Resources/unidata/caseFolding.php | 2 +- .../Resources/unidata/lowerCase.php | 2 +- .../Resources/unidata/titleCaseRegexp.php | 2 +- .../Resources/unidata/upperCase.php | 2 +- .../symfony/polyfill-mbstring/bootstrap80.php | 6 +- .../symfony/polyfill-mbstring/composer.json | 3 +- .../process/Exception/ExceptionInterface.php | 2 +- .../Exception/InvalidArgumentException.php | 2 +- .../process/Exception/LogicException.php | 2 +- .../Exception/ProcessFailedException.php | 9 +- .../Exception/ProcessSignaledException.php | 9 +- .../Exception/ProcessTimedOutException.php | 14 +- .../Exception/RunProcessFailedException.php | 7 +- .../process/Exception/RuntimeException.php | 2 +- .../symfony/process/ExecutableFinder.php | 7 +- .../vendor/symfony/process/InputStream.php | 19 +- .../process/Messenger/RunProcessContext.php | 16 +- .../process/Messenger/RunProcessMessage.php | 14 +- .../Messenger/RunProcessMessageHandler.php | 8 +- .../symfony/process/PhpExecutableFinder.php | 7 +- .../vendor/symfony/process/PhpProcess.php | 6 +- .../vendor/symfony/process/PhpSubprocess.php | 6 +- .../symfony/process/Pipes/AbstractPipes.php | 24 +- .../symfony/process/Pipes/PipesInterface.php | 2 +- .../symfony/process/Pipes/UnixPipes.php | 21 +- .../symfony/process/Pipes/WindowsPipes.php | 31 +- .../rector/vendor/symfony/process/Process.php | 138 +- .../vendor/symfony/process/ProcessUtils.php | 4 +- .../vendor/symfony/process/composer.json | 2 +- .../service-contracts/Attribute/Required.php | 2 +- .../Attribute/SubscribedService.php | 14 +- .../service-contracts/ResetInterface.php | 2 +- .../ServiceCollectionInterface.php | 2 +- .../service-contracts/ServiceLocatorTrait.php | 20 +- .../ServiceMethodsSubscriberTrait.php | 19 +- .../ServiceProviderInterface.php | 4 +- .../ServiceSubscriberInterface.php | 4 +- .../ServiceSubscriberTrait.php | 14 +- .../symfony/service-contracts/composer.json | 4 +- .../symfony/yaml/Command/LintCommand.php | 67 +- .../rector/vendor/symfony/yaml/Dumper.php | 47 +- .../rector/vendor/symfony/yaml/Escaper.php | 2 +- .../symfony/yaml/Exception/DumpException.php | 2 +- .../yaml/Exception/ExceptionInterface.php | 2 +- .../symfony/yaml/Exception/ParseException.php | 10 +- .../yaml/Exception/RuntimeException.php | 2 +- .../rector/vendor/symfony/yaml/Inline.php | 55 +- .../rector/vendor/symfony/yaml/Parser.php | 111 +- .../symfony/yaml/Resources/bin/yaml-lint | 6 +- .../vendor/symfony/yaml/Tag/TaggedValue.php | 7 +- .../rector/vendor/symfony/yaml/Unescaper.php | 8 +- .../rector/vendor/symfony/yaml/Yaml.php | 23 +- .../rector/vendor/symfony/yaml/composer.json | 3 +- .../symplify/easy-parallel/composer.json | 4 +- .../symplify/easy-parallel/config/config.php | 4 +- .../CommandLine/WorkerCommandLineFactory.php | 13 +- .../src/Contract/SerializableInterface.php | 2 +- .../src/CpuCoreCountProvider.php | 6 +- .../easy-parallel/src/Enum/Action.php | 2 +- .../easy-parallel/src/Enum/Content.php | 2 +- .../easy-parallel/src/Enum/ReactCommand.php | 2 +- .../easy-parallel/src/Enum/ReactEvent.php | 2 +- .../ParallelShouldNotHappenException.php | 2 +- .../CommandFromReflectionFactory.php | 6 +- .../easy-parallel/src/ScheduleFactory.php | 4 +- .../src/ValueObject/EasyParallelConfig.php | 2 +- .../src/ValueObject/ParallelProcess.php | 46 +- .../src/ValueObject/ProcessPool.php | 11 +- .../src/ValueObject/Schedule.php | 7 +- .../src/ValueObject/AbstractCodeSample.php | 4 +- .../ComposerJsonAwareCodeSample.php | 3 +- .../CodeSample/ConfiguredCodeSample.php | 2 +- .../CodeSample/ExtraFileCodeSample.php | 3 +- .../src/ValueObject/RuleDefinition.php | 15 +- .../vendor/webmozart/assert/composer.json | 6 +- .../vendor/webmozart/assert/src/Assert.php | 2 +- .../assert/src/InvalidArgumentException.php | 2 +- .../vendor/webmozart/assert/src/Mixin.php | 2 +- 2838 files changed, 39997 insertions(+), 27336 deletions(-) create mode 100644 vendor/phpstan/phpstan/UPGRADING.md create mode 100644 vendor/rector/rector/UPGRADING.md create mode 100644 vendor/rector/rector/config/set/behat-annotations-to-attributes.php create mode 100644 vendor/rector/rector/config/set/level/up-to-php85.php create mode 100644 vendor/rector/rector/config/set/nette-utils/nette-utils4.php create mode 100644 vendor/rector/rector/config/set/php85.php create mode 100644 vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ReservedClassNameImportSkipVoter.php create mode 100644 vendor/rector/rector/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php create mode 100644 vendor/rector/rector/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php create mode 100644 vendor/rector/rector/rules/DeadCode/Rector/Block/ReplaceBlockToItsStmtsRector.php create mode 100644 vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveArgumentFromDefaultParentCallRector.php create mode 100644 vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php create mode 100644 vendor/rector/rector/rules/DeadCode/Rector/FuncCall/RemoveFilterVarOnExactTypeRector.php create mode 100644 vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadCatchRector.php delete mode 100644 vendor/rector/rector/rules/Naming/AssignVariableNameResolver/NewAssignVariableNameResolver.php delete mode 100644 vendor/rector/rector/rules/Naming/AssignVariableNameResolver/PropertyFetchAssignVariableNameResolver.php delete mode 100644 vendor/rector/rector/rules/Naming/Contract/AssignVariableNameResolverInterface.php rename vendor/rector/rector/rules/Naming/Naming/{OverridenExistingNamesResolver.php => OverriddenExistingNamesResolver.php} (74%) create mode 100644 vendor/rector/rector/rules/NetteUtils/Rector/StaticCall/UtilsJsonStaticCallNamedArgRector.php delete mode 100644 vendor/rector/rector/rules/Php71/Rector/ClassConst/PublicConstantVisibilityRector.php create mode 100644 vendor/rector/rector/rules/Php80/Rector/Class_/AttributeValueResolver.php create mode 100644 vendor/rector/rector/rules/Php80/ValueObject/AttributeValueAndDocComment.php rename vendor/rector/rector/rules/Php81/NodeAnalyzer/{CoalesePropertyAssignMatcher.php => CoalescePropertyAssignMatcher.php} (89%) create mode 100644 vendor/rector/rector/rules/Php81/NodeManipulator/AttributeGroupNewLiner.php create mode 100644 vendor/rector/rector/rules/Php81/Rector/New_/MyCLabsConstructorCallToEnumFromRector.php create mode 100644 vendor/rector/rector/rules/Php82/NodeManipulator/ReadonlyClassManipulator.php create mode 100644 vendor/rector/rector/rules/Php83/Rector/Class_/ReadOnlyAnonymousClassRector.php create mode 100644 vendor/rector/rector/rules/Php83/Rector/FuncCall/DynamicClassConstFetchRector.php create mode 100644 vendor/rector/rector/rules/Php84/Rector/Class_/DeprecatedAnnotationToDeprecatedAttributeRector.php create mode 100644 vendor/rector/rector/rules/Php84/Rector/FuncCall/AddEscapeArgumentRector.php create mode 100644 vendor/rector/rector/rules/Php84/Rector/FuncCall/RoundingModeEnumRector.php create mode 100644 vendor/rector/rector/rules/Php84/Rector/MethodCall/NewMethodCallWithoutParenthesesRector.php create mode 100644 vendor/rector/rector/rules/Php85/Rector/ArrayDimFetch/ArrayFirstLastRector.php rename vendor/rector/rector/rules/Strict/NodeAnalyzer/{UnitializedPropertyAnalyzer.php => UninitializedPropertyAnalyzer.php} (78%) create mode 100644 vendor/rector/rector/rules/TypeDeclaration/Rector/FuncCall/AddArrowFunctionParamArrayWhereDimFetchRector.php create mode 100644 vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayMapRector.php create mode 100644 vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayReduceRector.php delete mode 100644 vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php delete mode 100644 vendor/rector/rector/rules/TypeDeclaration/ValueObject/NestedArrayType.php create mode 100644 vendor/rector/rector/src/Application/NodeAttributeReIndexer.php delete mode 100644 vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php create mode 100644 vendor/rector/rector/src/ChangesReporting/Output/GitHubOutputFormatter.php create mode 100644 vendor/rector/rector/src/ChangesReporting/Output/GitlabOutputFormatter.php create mode 100644 vendor/rector/rector/src/ChangesReporting/Output/JUnitOutputFormatter.php create mode 100644 vendor/rector/rector/src/Config/Level/CodingStyleLevel.php create mode 100644 vendor/rector/rector/src/Configuration/ConfigurationRuleFilter.php create mode 100644 vendor/rector/rector/src/Configuration/OnlyRuleResolver.php create mode 100644 vendor/rector/rector/src/Contract/Rector/HTMLAverseRectorInterface.php delete mode 100644 vendor/rector/rector/src/Contract/Rector/ScopeAwareRectorInterface.php create mode 100644 vendor/rector/rector/src/Enum/Config/Defaults.php create mode 100644 vendor/rector/rector/src/Exception/Configuration/RectorRuleNameAmbiguousException.php create mode 100644 vendor/rector/rector/src/Exception/Configuration/RectorRuleNotFoundException.php create mode 100644 vendor/rector/rector/src/NodeDecorator/StatementDepthAttributeDecorator.php create mode 100644 vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/RectorNodeScopeResolver.php delete mode 100644 vendor/rector/rector/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php delete mode 100644 vendor/rector/rector/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php create mode 100644 vendor/rector/rector/src/PHPStan/ScopeFetcher.php create mode 100644 vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConstantArrayTypeMapper.php delete mode 100644 vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParser.php delete mode 100644 vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParserFactory.php delete mode 100644 vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php delete mode 100644 vendor/rector/rector/src/Set/Contract/SetListInterface.php create mode 100644 vendor/rector/rector/src/StaticTypeMapper/Resolver/ClassNameFromObjectTypeResolver.php delete mode 100644 vendor/rector/rector/src/Testing/PHPUnit/AbstractTestCase.php create mode 100644 vendor/rector/rector/src/ValueObject/Configuration/LevelOverflow.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php delete mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Token.php create mode 100644 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php create mode 100644 vendor/rector/rector/vendor/phpstan/phpdoc-parser/UPGRADING.md create mode 100644 vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Comment.php delete mode 100644 vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php create mode 100644 vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/ParserConfig.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/data-fixtures-16.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-23.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-28.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-dbal-42.php rename vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/{doctrine-orm-29.php => doctrine-orm-219.php} (99%) create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-28.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-300.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle230/Rector/Class_/AddAnnotationToRepositoryRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/StmtsAwareInterface/ExecuteQueryParamsToBindValueRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal42/Rector/New_/AddArrayResultColumnNamesRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Rector/MethodCall/AddGetReferenceTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Reflection/ParameterTypeResolver.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/CastDoctrineExprToStringRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/SetParametersArrayToCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayOffsetSetToSetCollectionCallRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowReturnUnionToCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNewArrayCollectionOutsideConstructorRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnArrayToNewArrayCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnCollectionDocblockRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteParamDocblockFromSetterToCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompletePropertyDocblockFromToManyRector.php rename vendor/rector/rector/vendor/rector/rector-doctrine/rules/{CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector.php => TypedCollections/Rector/Class_/CompleteReturnDocblockFromToManyRector.php} (66%) rename vendor/rector/rector/vendor/rector/rector-doctrine/rules/{CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php => TypedCollections/Rector/Class_/InitializeCollectionInConstructorRector.php} (55%) create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Empty_/EmptyOnCollectionToIsEmptyCallRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveCoalesceAssignOnCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMapOnCollectionToArrayRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMergeOnCollectionToArrayRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/InArrayOnCollectionToContainsCallRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIfInstanceofCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIsArrayOnCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertNullOnCollectionToAssertEmptyRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/SetArrayToNewCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/New_/RemoveNewArrayCollectionWrapRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/NullsafeMethodCall/RemoveNullsafeOnCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/NarrowPropertyUnionToCollectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/TypeAnalyzer/CollectionTypeDetector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/src/Enum/DoctrineClass.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/src/Enum/TestClass.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/RepositoryClassResolver.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php84.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php85.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php83.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php84.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/TrailingCommaRemover.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradeInstanceofStringableRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/NodeManipulator/DowngradeReadonlyClassManipulator.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FuncCall/DowngradeIteratorCountToArrayRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/Class_/DowngradeReadonlyAnonymousClassRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp85/Rector/FuncCall/DowngradeArrayFirstLastRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit120.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Enum/NonAssertNonStaticMethods.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/NullableObjectAssignCollector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/SetUpAssignedMockTypesResolver.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/AddInstanceofAssertForNullableInstanceRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/RemoveDataProviderParamKeysRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/ParamTypesAndReturnType.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToType.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToTypeCollection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/ParentTestClassConstructorRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/PropertyExistsWithoutAssertRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ReplaceAtMethodWithDesiredMatcherRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/PHPUnitClassName.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-monolog.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-swift-mailer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-class-loader.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-form.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-process.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-property-access.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-security.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-translation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-twig-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-validator.php rename vendor/rector/rector/vendor/rector/{rector-doctrine/config/sets/doctrine-dbal-210.php => rector-symfony/config/sets/symfony/symfony3/symfony31.php} (56%) rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{symfony31.php => symfony3/symfony31/symfony31-yaml.php} (97%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony32.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{symfony32.php => symfony3/symfony32/symfony32-dependency-injection.php} (93%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-debug.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-dependency-injection.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{symfony34.php => symfony3/symfony34/symfony34-sensio-framework-extra-bundle.php} (50%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-yaml.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony30.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony33.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-form.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-process.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-validator.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-var-dumper.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{symfony41.php => symfony4/symfony41/symfony41-console.php} (59%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-workflow.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-cache.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-config.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-dom-crawler.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-finder.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-form.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-monolog-bridge.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-process.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-serializer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-translation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-browser-kit.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-cache.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-event-dispatcher.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-intl.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-http.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-twig-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-workflow.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-templating.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony40.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony42.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony43.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony44.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{symfony50.php => symfony5/symfony50/symfony50-console.php} (59%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-debug.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{ => symfony5/symfony50}/symfony50-types.php (95%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-config.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-event-dispatcher.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-form.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-inflector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-notifier.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-http.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{ => symfony5}/symfony52-validator-attributes.php (99%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-form.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-mime.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-notifier.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-access.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-info.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-http.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-validator.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-form.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-mailer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-cache.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-notifier.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-http.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-validator.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony51.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony52.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony53.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony54.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony-return-types.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-browser-kit.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-config.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-contracts.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-doctrine-bridge.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-event-dispatcher.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-expression-language.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-form.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-options-resolver.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-access.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-info.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-routing.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-http.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-serializer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-templating.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-translation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-validator.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-serializer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-twig-bridge.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-validator.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-doctrine-bridge.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-framework-bundle.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-kernel.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mail-pace-mailer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-messenger.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mime.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-core.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-http.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-translation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-twig-bridge.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-http-client.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-messenger.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-error-handler.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/{symfony64.php => symfony6/symfony64/symfony64-form.php} (50%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-routing.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony60.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony61.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony62.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony63.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-contracts.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-serializer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-dependency-injection.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-serializer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-http-foundation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-serializer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-console.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-twig-bundle.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony70.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony71.php rename vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/{twig240.php => twig24.php} (84%) create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeAnalyzer/AttributePresenceDetector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/AttributeGroup/SingleConditionSecurityAttributeToIsGrantedRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/RequestIsMainRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/SplitAndSecurityAttributeToIsGrantedRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeDecorator/CommandConstructorDecorator.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeFactory/AutowireClassMethodFactory.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/CommandGetByTypeToConstructorInjectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/ControllerGetByTypeToConstructorInjectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/GetBySymfonyStringToConstructorInjectionRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Trait_/TraitGetByTypeToInjectRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/ThisGetTypeMatcher.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ProcessBuilderGetProcessRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/StaticCall/ProcessBuilderInstanceRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/Class_/CommandDescriptionToPropertyRector.php delete mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony64/Rector/Class_/ChangeRouteAttributeFromAnnotationSubnamespaceRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony72/Rector/StmtsAwareInterface/PushRequestToRequestStackConstructorRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/GetMethodToAsTwigAttributeTransformer.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/CommandArgumentsAndOptionsResolver.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/LocalArrayMethodCallableMatcher.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeRemover/ReturnEmptyArrayMethodRemover.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/CommandHelpToAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFiltersToAsTwigFilterAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFunctionsToAsTwigFunctionAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandArgument.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandOption.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Enum/CommandMethodName.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Enum/FosAnnotation.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Enum/TwigClass.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/AnnotationOrAttributeValueResolver.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony3SetProvider.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony4SetProvider.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony5SetProvider.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony6SetProvider.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony7SetProvider.php diff --git a/composer.json b/composer.json index 8db465812..840da459b 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,8 @@ { "require": { "php": ">=7.4", - "rector/rector": "^1.2.10", - "friendsofphp/php-cs-fixer": "^3.38.2", + "rector/rector": ">1.2.10", + "friendsofphp/php-cs-fixer": ">3.38.2", "redaxo/php-cs-fixer-config": "^1.0" }, "config": { diff --git a/composer.lock b/composer.lock index 34fa5c06c..e327718ba 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": "fc91af47631b4b06b3cedbd2da3e13d3", + "content-hash": "a85007fc94627aa61857cbc8ab2e9b7e", "packages": [ { "name": "clue/ndjson-react", @@ -510,20 +510,20 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.27", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162" + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a6e423c076ab39dfedc307e2ac627ef579db162", - "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -564,7 +564,7 @@ "type": "github" } ], - "time": "2025-05-21T20:51:45+00:00" + "time": "2025-05-21T20:55:28+00:00" }, { "name": "psr/container", @@ -1242,21 +1242,21 @@ }, { "name": "rector/rector", - "version": "1.2.10", + "version": "2.0.18", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "40f9cf38c05296bd32f444121336a521a293fa61" + "reference": "be3a452085b524a04056e3dfe72d861948711062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", - "reference": "40f9cf38c05296bd32f444121336a521a293fa61", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/be3a452085b524a04056e3dfe72d861948711062", + "reference": "be3a452085b524a04056e3dfe72d861948711062", "shasum": "" }, "require": { - "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.12.5" + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.1.17" }, "conflict": { "rector/rector-doctrine": "*", @@ -1289,7 +1289,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.2.10" + "source": "https://github.com/rectorphp/rector/tree/2.0.18" }, "funding": [ { @@ -1297,7 +1297,7 @@ "type": "github" } ], - "time": "2024-11-08T13:59:10+00:00" + "time": "2025-06-11T11:19:37+00:00" }, { "name": "redaxo/php-cs-fixer-config", diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index a203a584d..9177c1213 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -525,26 +525,26 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.27", - "version_normalized": "1.12.27.0", + "version": "2.1.17", + "version_normalized": "2.1.17.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162" + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a6e423c076ab39dfedc307e2ac627ef579db162", - "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2025-05-21T20:51:45+00:00", + "time": "2025-05-21T20:55:28+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -1290,22 +1290,22 @@ }, { "name": "rector/rector", - "version": "1.2.10", - "version_normalized": "1.2.10.0", + "version": "2.0.18", + "version_normalized": "2.0.18.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "40f9cf38c05296bd32f444121336a521a293fa61" + "reference": "be3a452085b524a04056e3dfe72d861948711062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", - "reference": "40f9cf38c05296bd32f444121336a521a293fa61", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/be3a452085b524a04056e3dfe72d861948711062", + "reference": "be3a452085b524a04056e3dfe72d861948711062", "shasum": "" }, "require": { - "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.12.5" + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.1.17" }, "conflict": { "rector/rector-doctrine": "*", @@ -1316,7 +1316,7 @@ "suggest": { "ext-dom": "To manipulate phpunit.xml via the custom-rule command" }, - "time": "2024-11-08T13:59:10+00:00", + "time": "2025-06-11T11:19:37+00:00", "bin": [ "bin/rector" ], @@ -1340,7 +1340,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.2.10" + "source": "https://github.com/rectorphp/rector/tree/2.0.18" }, "funding": [ { diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 96e1945d3..6064873c5 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' => '1efba25b1b4c497bb52860aeeef4b2c56f306a20', + 'reference' => 'c3ba7d6a6be276da4afa5e96f61f66b865aacc43', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '1efba25b1b4c497bb52860aeeef4b2c56f306a20', + 'reference' => 'c3ba7d6a6be276da4afa5e96f61f66b865aacc43', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -83,9 +83,9 @@ 'dev_requirement' => false, ), 'phpstan/phpstan' => array( - 'pretty_version' => '1.12.27', - 'version' => '1.12.27.0', - 'reference' => '3a6e423c076ab39dfedc307e2ac627ef579db162', + 'pretty_version' => '2.1.17', + 'version' => '2.1.17.0', + 'reference' => '89b5ef665716fa2a52ecd2633f21007a6a349053', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), @@ -194,9 +194,9 @@ 'dev_requirement' => false, ), 'rector/rector' => array( - 'pretty_version' => '1.2.10', - 'version' => '1.2.10.0', - 'reference' => '40f9cf38c05296bd32f444121336a521a293fa61', + 'pretty_version' => '2.0.18', + 'version' => '2.0.18.0', + 'reference' => 'be3a452085b524a04056e3dfe72d861948711062', 'type' => 'library', 'install_path' => __DIR__ . '/../rector/rector', 'aliases' => array(), diff --git a/vendor/phpstan/phpstan/LICENSE b/vendor/phpstan/phpstan/LICENSE index 7c0f2b7b6..e5f34e607 100644 --- a/vendor/phpstan/phpstan/LICENSE +++ b/vendor/phpstan/phpstan/LICENSE @@ -1,6 +1,7 @@ MIT License Copyright (c) 2016 Ondřej Mirtes +Copyright (c) 2025 PHPStan s.r.o. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/phpstan/phpstan/README.md b/vendor/phpstan/phpstan/README.md index e3bb94063..abae67ecf 100644 --- a/vendor/phpstan/phpstan/README.md +++ b/vendor/phpstan/phpstan/README.md @@ -60,11 +60,11 @@ can be checked before you run the actual line.     Inviqa
-GetResponse -    Shoptet -
+    Route4Me: Route Optimizer and Route Planner Software +
+Belsimpel     TicketSwap diff --git a/vendor/phpstan/phpstan/UPGRADING.md b/vendor/phpstan/phpstan/UPGRADING.md new file mode 100644 index 000000000..522949096 --- /dev/null +++ b/vendor/phpstan/phpstan/UPGRADING.md @@ -0,0 +1,338 @@ +Upgrading from PHPStan 1.x to 2.0 +================================= + +## PHP version requirements + +PHPStan now requires PHP 7.4 or newer to run. + +## Upgrading guide for end users + +The best way to get ready for upgrade to PHPStan 2.0 is to update to the **latest PHPStan 1.12 release** +and enable [**Bleeding Edge**](https://phpstan.org/blog/what-is-bleeding-edge). This will enable the new rules and behaviours that 2.0 turns on for all users. + +Also make sure to install and enable [`phpstan/phpstan-deprecation-rules`](https://github.com/phpstan/phpstan-deprecation-rules). + +Once you get to a green build with no deprecations showed on latest PHPStan 1.12.x with Bleeding Edge enabled, you can update all your related PHPStan dependencies to 2.0 in `composer.json`: + +```json +"require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-doctrine": "^2.0", + "phpstan/phpstan-nette": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-symfony": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", + ... +} +``` + +Don't forget to update [3rd party PHPStan extensions](https://phpstan.org/user-guide/extension-library) as well. + +After changing your `composer.json`, run `composer update 'phpstan/*' -W`. + +It's up to you whether you go through the new reported errors or if you just put them all to the [baseline](https://phpstan.org/user-guide/baseline) ;) Everyone who's on PHPStan 1.12 should be able to upgrade to PHPStan 2.0. + +### Noteworthy changes to code analysis + +* [**Enhancements in handling parameters passed by reference**](https://phpstan.org/blog/enhancements-in-handling-parameters-passed-by-reference) +* [**Validate inline PHPDoc `@var` tag type**](https://phpstan.org/blog/phpstan-1-10-comes-with-lie-detector#validate-inline-phpdoc-%40var-tag-type) +* [**List type enforced**](https://phpstan.org/blog/phpstan-1-9-0-with-phpdoc-asserts-list-type#list-type) +* **Always `true` conditions always reported**: previously reported only with phpstan-strict-rules, this is now always reported. + +### Removed option `checkMissingIterableValueType` + +It's strongly recommended to add the missing array typehints. + +If you want to continue ignoring missing typehints from arrays, add `missingType.iterableValue` error identifier to your `ignoreErrors`: + +```neon +parameters: + ignoreErrors: + - + identifier: missingType.iterableValue +``` + +### Removed option `checkGenericClassInNonGenericObjectType` + +It's strongly recommended to add the missing generic typehints. + +If you want to continue ignoring missing typehints from generics, add `missingType.generics` error identifier to your `ignoreErrors`: + +```neon +parameters: + ignoreErrors: + - + identifier: missingType.generics +``` + +### Removed `checkAlwaysTrue*` options + +These options have been removed because PHPStan now always behaves as if these were set to `true`: + +* `checkAlwaysTrueCheckTypeFunctionCall` +* `checkAlwaysTrueInstanceof` +* `checkAlwaysTrueStrictComparison` +* `checkAlwaysTrueLooseComparison` + +### Removed option `excludes_analyse` + +It has been replaced with [`excludePaths`](https://phpstan.org/user-guide/ignoring-errors#excluding-whole-files). + +### Paths in `excludePaths` and `ignoreErrors` have to be a valid file path or a fnmatch pattern + +If you are excluding a file path that might not exist but you still want to have it in `excludePaths`, append `(?)`: + +```neon +parameters: + excludePaths: + - tests/*/data/* + - src/broken + - node_modules (?) # optional path, might not exist +``` + +If you have the same situation in `ignoreErrors` (ignoring an error in a path that might not exist), use `reportUnmatchedIgnoredErrors: false`. + +```neon +parameters: + reportUnmatchedIgnoredErrors: false +``` + +Appending `(?)` in `ignoreErrors` is not supported. + +### Changes in 1st party PHPStan extensions + +* [phpstan-doctrine](https://github.com/phpstan/phpstan-doctrine) + * Removed config parameter `searchOtherMethodsForQueryBuilderBeginning` (extension now behaves as when this was set to `true`) + * Removed config parameter `queryBuilderFastAlgorithm` (extension now behaves as when this was set to `false`) +* [phpstan-symfony](https://github.com/phpstan/phpstan-symfony) + * Removed legacy options with `_` in the name + * `container_xml_path` -> use `containerXmlPath` + * `constant_hassers` -> use `constantHassers` + * `console_application_loader` -> use `consoleApplicationLoader` + +### Minor backward compatibility breaks + +* Removed unused config parameter `cache.nodesByFileCountMax` +* Removed unused config parameter `memoryLimitFile` +* Removed unused feature toggle `disableRuntimeReflectionProvider` +* Removed unused config parameter `staticReflectionClassNamePatterns` +* Remove `fixerTmpDir` config parameter, use `pro.tmpDir` instead +* Remove `tempResultCachePath` config parameter, use `resultCachePath` instead +* `additionalConfigFiles` config parameter must be a list + +## Upgrading guide for extension developers + +> [!NOTE] +> Please switch to PHPStan 2.0 in a new major version of your extension. It's not feasible to try to support both PHPStan 1.x and PHPStan 2.x with the same extension code. +> +> You can definitely get closer to supporting PHPStan 2.0 without increasing major version by solving reported deprecations and other issues by analysing your extension code with PHPStan & phpstan-deprecation-rules & Bleeding Edge, but the final leap and solving backward incompatibilities should be done by requiring `"phpstan/phpstan": "^2.0"` in your `composer.json`, and releasing a new major version. + +### PHPStan now uses nikic/php-parser v5 + +See [UPGRADING](https://github.com/nikic/PHP-Parser/blob/master/UPGRADE-5.0.md) guide for PHP-Parser. + +The most notable change is how `throw` statement is represented. Previously, `throw` statements like `throw $e;` were represented using the `Stmt\Throw_` class, while uses inside other expressions (such as `$x ?? throw $e`) used the `Expr\Throw_` class. + +Now, `throw $e;` is represented as a `Stmt\Expression` that contains an `Expr\Throw_`. The +`Stmt\Throw_` class has been removed. + +### PHPStan now uses phpstan/phpdoc-parser v2 + +See [UPGRADING](https://github.com/phpstan/phpdoc-parser/blob/2.0.x/UPGRADING.md) guide for phpstan/phpdoc-parser. + +### Returning plain strings as errors no longer supported, use RuleErrorBuilder + +Identifiers are also required in custom rules. + +Learn more: [Using RuleErrorBuilder to enrich reported errors in custom rules](https://phpstan.org/blog/using-rule-error-builder) + +**Before**: + +```php +return ['My error']; +``` + +**After**: + +```php +return [ + RuleErrorBuilder::message('My error') + ->identifier('my.error') + ->build(), +]; +``` + +### Deprecate various `instanceof *Type` in favour of new methods on `Type` interface + +Learn more: [Why Is instanceof *Type Wrong and Getting Deprecated?](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated) + +### Removed deprecated `ParametersAcceptorSelector::selectSingle()` + +Use [`ParametersAcceptorSelector::selectFromArgs()`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ParametersAcceptorSelector.html#_selectFromArgs) instead. It should be used in most places where `selectSingle()` was previously used, like dynamic return type extensions. + +**Before**: + +```php +$defaultReturnType = ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType(); +``` + +**After**: + +```php +$defaultReturnType = ParametersAcceptorSelector::selectFromArgs( + $scope, + $functionCall->getArgs(), + $functionReflection->getVariants() +)->getReturnType(); +``` + +If you're analysing function or method body itself and you're using one of the following methods, ask for `getParameters()` and `getReturnType()` directly on the reflection object: + +* [InClassMethodNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InClassMethodNode.html) +* [InFunctionNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InFunctionNode.html) +* [FunctionReturnStatementsNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.FunctionReturnStatementsNode.html) +* [MethodReturnStatementsNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.MethodReturnStatementsNode.html) +* [Scope::getFunction()](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.Scope.html#_getFunction) + +**Before**: + +```php +$function = $node->getFunctionReflection(); +$returnType = ParametersAcceptorSelector::selectSingle($function->getVariants())->getReturnType(); +``` + +**After**: + +```php +$returnType = $node->getFunctionReflection()->getReturnType(); +``` + +### Changed `TypeSpecifier::create()` and `SpecifiedTypes` constructor parameters + +[`PHPStan\Analyser\TypeSpecifier::create()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.TypeSpecifier.html#_create) now accepts (all parameters are required): + +* `Expr $expr` +* `Type $type` +* `TypeSpecifierContext $context` +* `Scope $scope` + +If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by this method), call `setAlwaysOverwriteTypes()` and `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::create()`). These methods return a new object (SpecifiedTypes is immutable). + +[`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) constructor now accepts: + +* `array $sureTypes` +* `array $sureNotTypes` + +If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by the constructor), call `setAlwaysOverwriteTypes()` and `setRootExpr()`. These methods return a new object (SpecifiedTypes is immutable). + +### `ConstantArrayType` no longer extends `ArrayType` + +`Type::getArrays()` now returns `list`. + +Using `$type instanceof ArrayType` is [being deprecated anyway](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated) so the impact of this change should be minimal. + +### Changed `TypeSpecifier::specifyTypesInCondition()` + +This method no longer accepts `Expr $rootExpr`. If you want to change it, call `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::specifyTypesInCondition()`). `setRootExpr()` method returns a new object (SpecifiedTypes is immutable). + +### Node attributes `parent`, `previous`, `next` are no longer available + +Learn more: https://phpstan.org/blog/preprocessing-ast-for-custom-rules + +### Removed config parameter `scopeClass` + +As a replacement you can implement [`PHPStan\Type\ExpressionTypeResolverExtension`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.ExpressionTypeResolverExtension.html) interface instead and register it as a service. + +### Removed `PHPStan\Broker\Broker` + +Use [`PHPStan\Reflection\ReflectionProvider`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ReflectionProvider.html) instead. + +`BrokerAwareExtension` was also removed. Ask for `ReflectionProvider` in the extension constructor instead. + +Instead of `PHPStanTestCase::createBroker()`, call `PHPStanTestCase::createReflectionProvider()`. + +### List type is enabled for everyone + +Removed static methods from `AccessoryArrayListType` class: + +* `isListTypeEnabled()` +* `setListTypeEnabled()` +* `intersectWith()` + +Instead of `AccessoryArrayListType::intersectWith($type)`, do `TypeCombinator::intersect($type, new AccessoryArrayListType())`. + +### Minor backward compatibility breaks + +* Classes that were previously `@final` were made `final` +* Parameter `$callableParameters` of [`MutatingScope::enterAnonymousFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterAnonymousFunction) and [`enterArrowFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterArrowFunction) made required +* Parameter `StatementContext $context` of [`NodeScopeResolver::processStmtNodes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.NodeScopeResolver.html#_processStmtNodes) made required +* ClassPropertiesNode - remove `$extensions` parameter from [`getUninitializedProperties()`](https://apiref.phpstan.org/2.0.x/PHPStan.Node.ClassPropertiesNode.html#_getUninitializedProperties) +* `Type::getSmallerType()`, `Type::getSmallerOrEqualType()`, `Type::getGreaterType()`, `Type::getGreaterOrEqualType()`, `Type::isSmallerThan()`, `Type::isSmallerThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument. +* `CompoundType::isGreaterThan()`, `CompoundType::isGreaterThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument. +* Removed `ReflectionProvider::supportsAnonymousClasses()` (all reflection providers support anonymous classes) +* Remove `ArrayType::generalizeKeys()` +* Remove `ArrayType::count()`, use `Type::getArraySize()` instead +* Remove `ArrayType::castToArrayKeyType()`, `Type::toArrayKey()` instead +* Remove `UnionType::pickTypes()`, use `pickFromTypes()` instead +* Remove `RegexArrayShapeMatcher::matchType()`, use `matchExpr()` instead +* Remove unused `PHPStanTestCase::$useStaticReflectionProvider` +* Remove `PHPStanTestCase::getReflectors()`, use `getReflector()` instead +* Remove `ClassReflection::getFileNameWithPhpDocs()`, use `getFileName()` instead +* Remove `AnalysisResult::getInternalErrors()`, use `getInternalErrorObjects()` instead +* Remove `ConstantReflection::getValue()`, use `getValueExpr()` instead. To get `Type` from `Expr`, use `Scope::getType()` or `InitializerExprTypeResolver::getType()` +* Remove `PropertyTag::getType()`, use `getReadableType()` / `getWritableType()` instead +* Remove `GenericTypeVariableResolver`, use [`Type::getTemplateType()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getTemplateType) instead +* Rename `Type::isClassStringType()` to `Type::isClassString()` +* Remove `Scope::isSpecified()`, use `hasExpressionType()` instead +* Remove `ConstantArrayType::isEmpty()`, use `isIterableAtLeastOnce()->no()` instead +* Remove `ConstantArrayType::getNextAutoIndex()` +* Removed methods from `ConstantArrayType` - `getFirst*Type` and `getLast*Type` + * Use `getFirstIterable*Type` and `getLastIterable*Type` instead +* Remove `ConstantArrayType::generalizeToArray()` +* Remove `ConstantArrayType::findTypeAndMethodName()`, use `findTypeAndMethodNames()` instead +* Remove `ConstantArrayType::removeLast()`, use [`Type::popArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_popArray) instead +* Remove `ConstantArrayType::removeFirst()`, use [`Type::shiftArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_shiftArray) instead +* Remove `ConstantArrayType::reverse()`, use [`Type::reverseArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_reverseArray) instead +* Remove `ConstantArrayType::chunk()`, use [`Type::chunkArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_chunkArray) instead +* Remove `ConstantArrayType::slice()`, use [`Type::sliceArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_sliceArray) instead +* Made `TypeUtils` thinner by removing methods: + * Remove `TypeUtils::getArrays()` and `getAnyArrays()`, use [`Type::getArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getArrays) instead + * Remove `TypeUtils::getConstantArrays()` and `getOldConstantArrays()`, use [`Type::getConstantArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantArrays) instead + * Remove `TypeUtils::getConstantStrings()`, use [`Type::getConstantStrings()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantStrings) instead + * Remove `TypeUtils::getConstantTypes()` and `getAnyConstantTypes()`, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) or [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize) + * Remove `TypeUtils::generalizeType()`, use [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize) instead + * Remove `TypeUtils::getDirectClassNames()`, use [`Type::getObjectClassNames()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getObjectClassNames) instead + * Remove `TypeUtils::getConstantScalars()`, use [`Type::isConstantScalarValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantScalarValue) or [`Type::getConstantScalarTypes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantScalarTypes) instead + * Remove `TypeUtils::getEnumCaseObjects()`, use [`Type::getEnumCases()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getEnumCases) instead + * Remove `TypeUtils::containsCallable()`, use [`Type::isCallable()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isCallable) instead +* Removed `Scope::doNotTreatPhpDocTypesAsCertain()`, use `getNativeType()` instead +* Parameter `$isList` in `ConstantArrayType` constructor can only be `TrinaryLogic`, no longer `bool` +* Parameter `$nextAutoIndexes` in `ConstantArrayType` constructor can only be `non-empty-list`, no longer `int` +* Remove `ConstantType` interface, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) instead +* `acceptsNamedArguments()` in `FunctionReflection`, `ExtendedMethodReflection` and `CallableParametersAcceptor` interfaces returns `TrinaryLogic` instead of `bool` +* Remove `FunctionReflection::isFinal()` +* [`Type::getProperty()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getProperty) now returns [`ExtendedPropertyReflection`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ExtendedPropertyReflection.html) +* Remove `__set_state()` on objects that should not be serialized in cache +* Parameter `$selfClass` of [`TypehintHelper::decideTypeFromReflection()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.TypehintHelper.html#_decideTypeFromReflection) no longer accepts `string` +* `LevelsTestCase::dataTopics()` data provider made static +* `PHPStan\Node\Printer\Printer` no longer autowired as `PhpParser\PrettyPrinter\Standard`, use `PHPStan\Node\Printer\Printer` in the typehint +* Remove `Type::acceptsWithReason()`, `Type:accepts()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html) +* Remove `CompoundType::isAcceptedWithReasonBy()`, `CompoundType::isAcceptedBy()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html) +Remove `Type::isSuperTypeOfWithReason()`, `Type:isSuperTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html) +* Remove `CompoundType::isSubTypeOfWithReasonBy()`, `CompoundType::isSubTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html) +* Remove `TemplateType::isValidVarianceWithReason()`, changed `TemplateType::isValidVariance()` return type to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html) +* `RuleLevelHelper::accepts()` return type changed from `bool` to [`RuleLevelHelperAcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html) +* Changes around `ClassConstantReflection` + * Class `ClassConstantReflection` removed from BC promise, renamed to `RealClassConstantReflection` + * Interface `ConstantReflection` renamed to `ClassConstantReflection` + * Added more methods around PHPDoc types and native types to the (new) `ClassConstantReflection` + * Interface `GlobalConstantReflection` renamed to `ConstantReflection` +* Renamed interfaces and classes from `*WithPhpDocs` to `Extended*` + * `ParametersAcceptorWithPhpDocs` -> `ExtendedParametersAcceptor` + * `ParameterReflectionWithPhpDocs` -> `ExtendedParameterReflection` + * `FunctionVariantWithPhpDocs` -> `ExtendedFunctionVariant` +* `ClassPropertyNode::getNativeType()` return type changed from AST node to `Type|null` +* Class `PHPStan\Node\ClassMethod` (accessible from `ClassMethodsNode`) is no longer an AST node + * Call `PHPStan\Node\ClassMethod::getNode()` to access the original AST node diff --git a/vendor/phpstan/phpstan/bootstrap.php b/vendor/phpstan/phpstan/bootstrap.php index 2d950b095..a5d341bfd 100644 --- a/vendor/phpstan/phpstan/bootstrap.php +++ b/vendor/phpstan/phpstan/bootstrap.php @@ -73,27 +73,6 @@ final public static function loadClass(string $class): void { require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/bootstrap.php'; } - if ( - PHP_VERSION_ID < 70300 - && empty($GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d']) - && !class_exists(\Symfony\Polyfill\Php73\Php73::class, false) - ) { - $GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d'] = true; - // already loaded by bootstrap inside the hrtime condition - // require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/Php73.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/bootstrap.php'; - } - - if ( - PHP_VERSION_ID < 70400 - && empty($GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634']) - && !class_exists(\Symfony\Polyfill\Php74\Php74::class, false) - ) { - $GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634'] = true; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/Php74.php'; - require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/bootstrap.php'; - } - if ( !extension_loaded('intl') && empty($GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8']) diff --git a/vendor/phpstan/phpstan/composer.json b/vendor/phpstan/phpstan/composer.json index 07faa85b0..dc62c19ce 100644 --- a/vendor/phpstan/phpstan/composer.json +++ b/vendor/phpstan/phpstan/composer.json @@ -4,7 +4,7 @@ "license": ["MIT"], "keywords": ["dev", "static analysis"], "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar index e8532568cb2b21469ee2200aafde21415ef15c86..04f59f1d771540a0ab9ee3cf32c4a46c4a98c5bc 100755 GIT binary patch delta 1026968 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�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

uKZq zc`)(@#x9Gp@Ygv`9#B(!Y3mLw4Udde1-iu>0b!#5c|!>KuI5LwOU?W#51T+*GJ?m! za0)mlp9_PM-`Dn+Atkj&1Z!>O3ok!JIkSLgknt~PL6MD#6vjcRY&DeEZ@wHS;CBXR!XMyJuo#?$72d|5u!+xq?W?nP;GfJtVg7GuujWf^3$|+$ zUn`B~KU=VI@J4VP2^dz)B^yQkEngwW%n z8E#?rKw1~UvxL0WB~VSNmXCy;=PS)_)RhB&ht8J?KIxh8Q8mt82ra{#TkcR%@rn&L zG?7>dl+H`|Zsc5`~r%ZX1Kh9li8o8h55YA#^KOp{A+NvD2)6hu^2YaVb7 zRPz&9_g;RZ!aiKBkMr}T^RsX!cA+eoee*cKZ7|LKV-@0$ewOJb+@@QIqx;(R3uW$X z-}`*0GdFTuQ2`O;@P`M4hL zG9fQR>Eiiv5^+cLfJE7*A5RH)>m!)v9{sZlTd5}=*DKhB-THqaJnqISPZFQSjFEKg zLWK`q)akt`rc?iwSZPnGFj4Y)c_>4v&~i(Sld`FGFS*mxmY0<5&{6$aSIWOoW-su* z7hh6Q+-v#_rg}wxw+rihOK46;^!R2J2fZZKQ*QCZR?DvmD)bavJ|-t294`Jd9* zc#%1-+=I?;ecO{}ZK?BMo(bi{Wq@9Ux6kw;NG=O8!n}D%`8VQ7I;Xz0xlYbDCYJx; zM%Sd3BLe4r??4eQQbBiBxevXQT0WnOcVJpp4=-2H_7~n!+nU#rRqjbspLhpG6e;D9 zc(YLbx0~OIpbyi^;a?->@Jug3x_Yv;1LKio0DOLF1oz$CG_Ky!m$=eBigyEOi`TosZ0NZ1xJG)5l@Ed~!58kV z_L1_Gd1M|@;me+tSGWNr6F=$X&4bO1+rXTTD);rRtTySP=Coa$ zSjc?*-(grL6*=OtE4-^}^h*tu^<`zIW;VgE;(l5C3kD#Mxnl)+`&aA>?31eA&|FVQ z70kYfuh{3x9!{!Q4eWF8v*O>rY*SXn0mK61v0^eORd}%KQ5A#0 zJ%?fh%{nx7FJJL3e5vfDo|(!9~PaL zmG*UR24$+NoFdsDQS6g1 zmp$uG$ETY;5%{-C&Yu5mSu~_+k(gS4u9DNU+=Xiki^HuC)e)&Qjwf(#-n6$2cL@*57NmnVM(B zgrWBFbe+XRcB2%p^8-b>5(KrVX3I7CSPkGE`$P;F4cZF9qq&jBc1ZU}AnGFG(n zHD2sGFXJUQw#Cng6QsnVJ^hV|;&cQEHIFJ~psf3h@S*iL?vW@(n0Jk@%)~kZj5oN5 z%YiKnHsXvbatpQ~%s9T6Cx!}tZ1$Cnp_B;YT=sB;F-g{b8YL?S8Eq_u%^75rLy{N) zrnGgHQ6aDABy$UPO_Xt!D+`V_=DOQDTy&q&PcYW{0Pk@95aSu(lG=$SRLI@#E6Wk9 z$cMv?8GdsqMt5QUYYKF=%hl*ZmlA*?6rh@hE^@H{A$7A8DpRx*o!xZ}`f5sHN2GOM{Dyv9zSf_^?PBo-AROQ3FPS z?U?PHXGHK(@H8JwH$=P^y##1u7=T&2XV7|de7DA7_TRwzTr?K_srYfSPF=F$!8R371y~T^|+-X!m zOu5&1%%xptR0=}L=haFXkgN6> zV}xIKdC4YG^=y-}Jp>|yDgzU>BO06QM|&{W;(`=z&+(MO5}^ep(tXzvFct z!an9L!~U@W1cS--WXRqin$G>`F67TomdU-OAeo$ar6QaQiI;_YHtOr7M+>VzY7ABg zUZZ?vTK4lXV<%WT_Bz3u>W3Nm^iAV0y~NHU-Zm~7BM}YT?N|MxtBr-<7F6veJgrj6 zeA(f^YN6cr7BufJ{1zW33uUW9TTkR{$yDsOj_R?lVsmWeljhOtWwz?XGKD>PVInv3 zuLvfoj`5FGpI6(ss`Nc_T$n7Jncl9pEN*Ybs&&b#xy~j}vj?Zti~;Y&T7G<5O$j_E z%r$UHeXK4-$ow{1mdy^$s#yiiqO?~x)yQeXx*9~hJhMX1YMX0*20F!^H7en@_`&Gz z?hOX0yH0@wpI=+^po>j5^Db2QFuJBD+J*L9SEHiY>uTKT<9#)Ltoz!U1cY@)em1VX z23BBg^G%R)RwMt;%{4jz$>Nh#A4}a&mOG-+OSxyAb1Q0`0|vKH3kIo5ZUEyb*=jiCoa^m6Blap=TMu$ zq@>kalal2YnNHXSL|D8jS>`2tvp88cLR={qC|_q%3ePqc0&zL2Em^jdZd(CHI;g~? zU@>z{Q_&s-@jw|1)`f+820#?X$1rWYh(UHIyBvTPcV;=sesEHYWq zIpkz$z=JrJ=uAFB^y)&)`$E0xE!#ICWp1)8OgKJ13Q$^$x6A;siG+G*eM9m$N-hNUeks z#V*q#n7mbl(&6_ptDW~N!ddkR)4fwEJlL$JJt5{CI+=LNoh=VB2Zq^}Q|2(U4|_P> z9PMG7Qat0FnT?dvLKHvKhvn|rhewzJTrUY3jx=)i(J1qgKuUcVLg;HHW+lBk!+e*t z5z;j?5f#2OyWGRo&|F38X*jXS z{IRQzD^+tr*wymqn2j}%y&rhEPS;*NH&^oE(arReY+Yq>u5FGx7hqEjBiB_^Fq0~)Wvof z$f-2LELY@E)^D!$7o2$$LwDTHsppeD~0j(D;SJHQD z%mFNIwHf=dBpryu#n!Adm*f2Sy9t7BNsaGd3|0M=hG@ks;}FtbXP(G%t~0L;yK2##cTJ)}L z`xJ}GmF9@WK6UW}KwmxOrlj^=bt&y{xOvg{1r|BWEVR7u;e;+3ILC5O*85B+N-WEr z9^2|IgP3lvCDA!e-h4|ayT8=3(di|_%P(D=a!QG&EV88fI=w`3@of82%h$@@mkclW zI6-C7lord8-p}N>((+v2$1wKeN=vT7rx#7L*it8$r;f!IGXGl3eE|b}31!h_$?_WT zi)E)JJ#wHgggn9Q{bwwu#DPAun$ImOvIhDhW{hF6A@wg0+!mkY`WpkCI<)i36nRS1hTw zCnWZkfM{g(03d#`KFsOeffwu3dmovmr2bM!?=$7~X*Rp9s{SXZHn5wj>jftYqO98b zaHrh;dWrh4AL{hEZ)z5|x!y1JvY-3+?aG~@Q+purU3jtHxkD?~j}2j&FV$~$ZfDm-TeLKqhWkH~5$lmD~KR!u{^Q1y8}&agj?ZumUt zpXDyrG&nB}X*f)?8g6x75LeNIe#M|oSx)U3h!zH#hjeX2kn=oTu41p=xuH|{HUzW1 zYa8yq!kDww*EV!JEopH<{$=j&Yj4PPVhw-4q{I^9sAx|^zp=W)G8b3IXs5vm*xTUT z=ka?R;+?+s8zxXnL;z<;F6MfMfxWP|;WY1*Evqjt0P6^6ANn@Vavp%bY1lk<<7j8% z>HE1q$@Xm*b05*T?eYW1UN3Bn^>b?8xt2!fPTrc^l*nc*ZoJuvy-~k3ec739_GTYy zbS||YJH1WYxFqWGmG&)=ja%9Hh10G&Q1#Aa7oFM!o!5VNG}t&KaJ#EE{jvY>k#y`1^Yska&jv%>otA8_rhr(YgvqEdP&LnAUTgJyEU zSkae5{a4Z%a3nFi;iME+D%inYjjqlU+piOS2XTNsFPQ#zk|^`KCTB|MJA_m_Ga-ce z9B#~Y-bKVgpp)-5y3?w+8fW$n1jC01`j3_^;jVWY|L9FfjuPtnzRP4Q-)nsM3PbCZ z1?#_m_t*m;HGZjZO7r*QweD0xAieZ^A1dWYpUq4!+9pk}F?pHN!bsp=&fF`wb zjj;#TM~%E3&1q&LQW1>8FGG=H%l-icGmpTg0%y@?U4E0(BLjE&*14&DKlfv7>~wz9 zFV50*;qy%q?AxhL^PPE9*Ng-Ngu1rLY2WWxPJhDQ&h?>lk+5mUbxleZRM>RNneAR> z(avMNF{>epuIHMZdEsU2`;Ke+#d$$rWqnQ*iK0W<>c%Fm^U37DD#m%`OG_Oi(&kK~ zv!85o;^2(i)O5nlsU`hBYwv3M*m>>s{oH?oBpz3ubUQBFI>?XGQ&)~)zwKJm1#7s!HG_M1(+^Mvi6=EH&_e^KMUnAn8;XL+zKTBh;>Nf@&TBmLfrp{^2L+E;WLnJ#tt$CZL9~@O+ z^|?f?(bQ{)Cg-vBbDCAo>qjivc`?RL-vy;p^lM%rm*H;0Tg`Fo`^x6&&JuFJ_Ep@~ zZ1FH#s;U8O^U+<+wQk~XTJaqG(274+s;HVC8CWHTj908`k)8<>F(xp zGDp^Lwlt^Pvc|qR2C)u@5B6sHTbs+B`CGr5Pwi};q*Uj_h_PAMn#=s}X};T)GX1d~t6Q4obiv%L+@2i?UF@s(H=BT~@B9TC z^kEZxX!0U1hh~JcR)Qvp$!PjiZy9m3|`C#*`zB#<;_{>Hej*jBGyW?7$>10Guf+&uHN6`%`k z0dm&%aI>c;sl5x_*nJ0^lY@lF&)j96bZef%+Z9jXtTCADm_`Uxkse#kO(II#F;4YO|TQ|&LqtS<}`m~k_X^S~c^Qg)+O>cWl2sRiW-yS*ECO7=o~qaR`XlLgDLU{8#sTVL4f8C+|s zO+%!ndTW{;5MCW`)(d(zTb9UfQ(7&uXmvi?udh+7|1N2aul0Fnp5Av2GF76LbKYk9 zekSqY0NXulF&Tr0d-tQX4Z-u_YF42aqx$CLR9Pn4=$%yO5VuCPHPR`4TSVWaQv5?i zA{662(}B)~h?KeLfRfhKfU<+Lt+2(}eCA1i%3RmvLGzz#h@^*~NP+@+*RKc$c7CNN zTQI^3WZQw#w5@~#4_t>lnQ63DfB7`5JICr37Tvd5_8ydiY?9)uO-*#>o4X>|@VQnO z*Y=7~Pa(W?vP>z-Py3U(prOEp}J?<#nuKdTD08s1R{DY)h5&zO6wdZ?tAp z#6A0?9PhaZnx!g7xU%Piium)Z2m?o%*MyY0}i~m$aTqSL4qngQ5L{n z+hm1b{nk6Io`QKCKy`%gp9GpYd-zT(Fu0#Od0t7gK736<*CeL}+H%kcvTl+xI2DLC z#!=Til{+n*$RVoLDh+Pz?y_#6u`}&$vh}66VqyRJ99+FWdzbaI0Sb$yKVBCQ?(B_x z1fpqmQz_{CyR1R%_q(l`mlv-3iKeV!i*?rGejK#-k)8Y5dY`jY-golZ^Z&7CIiD2z zekKSUVU*+9GEbP>Ia!wAQfiYj%;Ua;8ygpCu;jv1L?uwACYoL+1OYOL;VX%di1EqYP7Js@-8qZ;`@Gk-oDrqOocE zEs-v!N;*@O80uwDT(8cfd&67e+{BHS-VAR^rsu}445UwP$;VB5rCKV)i_#)mnq(%5 z^$!gec04&7MhN`-A#Ndkn*`8lsXerFSVou_iW9*nLIDQo6WOv~tk?gEW_S-Rvnqrg zHBo(ewb)Z9se`)Ds}Sn;rIr-puW43LYE(-C@kIa?7&2*PWc%<~RrnH( z1^0CIb*Nk#)2w93VIytW+Sm~u*sfH0(hpBG`%zwWi#wgV&Wbo#4^4Dm ziyK-E%&4lt=aLeKKw<)rM^#M{w&gnXCNU{FF*(_0g5Lv%*dW4v+hB<__UKY#YFkW` zEHSQ>_=tE?2!R5`Dv1nw3LKK?RNQJW$_s++ed|Zt6_K`L9ife9ZCi2mQ4FY1a$;W@u4LTth5Er?)%!W z6x3CuZc&l?a6|~H5)1u^uLQbkcX~FaPlRGA9t4xq{Ey+%ULM;L9}{m9$6Y!Ia6quE zD_@o*O&Z2uoJW#z2>+&fzRewd@z+x%SZWIb&R$punfN47<3d7XEz;pbtf0!m+2kx6byzSb$?73PXk=W=U9s^sV$dcrnSBy%P)g!h zNfE-bXu@@Ogt($GI<-G3T%KghKo{d$qG{o4Kx=Nh1grZs$&Ik+8?1uq;J2$_Y22&~ z54M$@r;bZnDUs#s9eA!WmOcq=@T8={ExxikI>!eAms6CH(&AgP>F&WTVPp== z_NM&S3J*_6@(5P9bct5lcm!2#I@t8bgIf?H`}0N^*TuK^QS3L#5fX6()JyTDXJHjv zl9E9n5MKQgTE>edKhm4bzuuX4fC8l@|HzWy_B^23r6jauyP>LQ5_FWhWC_ZkG9p z=Q!!ikglGK)*vcIOS+r*Qs}-WS{6xN9wu+Mx#A#A=$M{Fe%>pA$~AXZ02NOULO7Dt z1~)mPZ;LZRCp}h1(&0o96;hu|Y?&nfJ2I)IDnP0P6yM7X=s;47-b;EfiWYidZEU(M zT<9v4i}C8WXyOUsdja8z>Qn|ysXDfA-ch|`?KG*4)O8Cs#pslljDc$7Qd-`01tTGS zcLC7e9)o*`c4$k!^lIDCmT)(GgEQiz;UPoCUm%gR+$zgFaeZR6^VAbW*gD9|qMe5o zh_1FYbTYjqNF4kaFC45)O_pJxLutCkV7eqi!*qzV;LH%+N;h|8lo8t5-adxksOGqYcNung^G zTK=|aVgXW1rOw!MNlld7nm8Qyo~0r3J`KcCSLH6QvQ*MD3hixIOnjN`w1Gw0JDt6! z5Zd|J9I%%LgdY-*%PAI94MciJLtz!$P%9l1MND1W3?!?eL=ijrXL?J%baL$NnT^wC zVg^J$q3_8<9baHYw`H`P?iCAIb!N-@%gZQ)BVGzUvBes|Dn_(`LWQj(RRxQS10GNdR!L~ur)@d!@Q_kGUUX)t^=tQ|Z&zIIuZz-marnf{ViQ9k;!3)1M zOAYm$^n`eZWy@_HuzjZP&yq1T7sn~czW|$fQy4h4_{dBJEvn0lYHV*|%WRdC(EP{Z zmMEvk@Fgwvwj{eH_1n5%x8y~y_kG_jW4*2Seec#tGqQSm z#u~}UaZowNMs`?CSiHo6CJ83*qmkZ>WlX+v{@=%E z)UWE+ty@*M?!9%Z>Q=wNn*KTi-rR;*W;O7?0Qe|+>S*h_{c~mN5V}JIdkF4S_K56} zQO-h#193tULge)pCKn$W*bMgd#PK5oOEZA8sj_W)#&G+EJFyjH0a@%gw~<%+EnX{ zi_r$2-F1;^9vawm)9u&SlR_l{+&|k|_|coPy-0sYdTiCdP|_Q|edv`z@M7-Fwd|LP zf(^db1qm()LHH+dp;yCT8Ny_`5gGEWJ0v&`q0YHauR)jct#g-CFCK~dV0GBH@BXpS zGRy%F6~W;17F!!o!&=#ej%~UC>TZ1XMs&-2#voW;-Vc;td}2KXhoHZCH@q-*YzgSp z$N#Ic5`F2NtyObazW>hFZuALTWwY#hxBxRd^ytZ_w{1el4~=d>`|Op&==~R3qsuO5 z4XCY{;;ALw!^Kv20L{Go;Jo!2TJz;c1}`s< z4whS%i*Z=HZM(d7J6~>Dw=9Q6=Ln8rw|4*eTk|@Z zb@%9pTAyAtyudwuScYExyVgzJ$YZS;$x^%f(~q@OaAw_D|C_7g4td@_w)^U5SM!P1 z@Zqc93$hn1_t3F#J9nU`KXm_K_tXE`dR}^1W&zqyZ#({&bQ@xRcHd9c{rJA)nbP5gZ`l5_@&YLFdMrcN*sScDl`{RwqWb?>hYV8 zrjGxZoR3V>j|)4hw}aG$UGkAPFVbbdcKmLsyS>+}?uu_8|FP8N^ry+|pUGjrdmNXp zbLSW7e*U%NACv00-mWpaeQ<2vzWKakZ@ptEV1NI6ZP_~?y-&Jx*iYa7%F_OBc}w;+2Xf)QES{lS{CgVMuS^9wE<{r<3=+&K0rsjK!HMI^rFi^GS# zz57EyB;STe`vKV2xX!+;`_jl*`W8te=Huv|c>CDfrM;`hqXC$zA^^2y`P6~o8-{>~G7 z4~`taUM!XJCG={#_u9C*1-BtSI;NMjs_XjL*i%xv;2Y~6{`;{#(!}$xj!93(-SU|+ zMfcO69Ft2qWC6^4xzdFqkANR2-GrOYA3L!My$H9V5dZN5@Z9^?-4NXRUk`%=D)rm3 zmAf$Y(W4DadjS68#yd{-m(hK@yvAm#J+l-2>leqI=#J47n>Owp-9IwAxA*t5?cRq$ zt3F)ccJcN0t(Q@b&PNH+Yjd~57Uswu@}ql?lP7vrpu)>zJ1$j8iLNB zJh|zj46v<3TR%RwddcWfI9A8nk8j#Fi|F78Jc-+XSGNq$=g$4^=b>F6sy=s>3DNxV zxbT&+Et1Us2ztLVh9nHXpalBEyKmUFut?==V_*3bMfzyp^R2Oem5S&2gdl*~eKGr+ z@W9&ck6#_zE@87S%!z{%-t5nt?j5gz@My%esH~ z-Pi*Xy1Nf=J#oXr$=LnD?i2HN;rp}kp*<(=mym;??j?V9pZCzl7V-88;pHW};S>a>^p1J?s zAgnyzzj|F)pE{|0t7d;Ef3hRBRP*Og?v+$~@%%|RLwx+?h_q_}W=r?d)XAE3BE7NT zs8qjW?=%i>-*wB6A_a{F-F!EN=X!;K) zKk?R3+#gR)y*1Q|*H3=)v==^(b0U_UxkZs-z$L*WQz=iJcxHTims~Oaf>hL<`t|$HSf488> zW_0I~aWfh^y|uR=v-MF_xM|By^u!<6!;QE{Rv$nY&#l;k)@&W$iSGEp*-hx#hquG- zF1zIh^l)p>8noy2&HKBBed8JFq?}Jk7YI2ZosW>cxeJwUm-6lWGUy5OxK!GF&pa-d zu;!3u-X|=Nv}j~fKaB1i+qMo}diVB?-DfQ0?~^bp>h)!}9U1?KJI*B6Z6X!k>382={;&@B3oJU@Oyy71}O8F+F0Q_E2K zpTN6T2p)J^#d)rZ=MR@0!=kU;X6t=3aLh*GnicfU~lH_H32}#c`l~ep8X_OnU^a z-aQZhy_Iw8QD*nVZ4$D+a;CirJ->TGElFcP1a!b?Z-HGO7{&D0m#$uj9?L?N?dvCg z(cQXdqAuh7RdK{9awCLt1fveŸvAu#wdIsCHSyW#&4BSe@OsTSbi4VVz%Je)m2 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

#yKk(eCxb=%H{gM6nNV$;= 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≧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ℑ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

#HE($HvM$fv@cgLl=bgm|$x7 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�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

    QM^f)L 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 ## Hire us to get Job Done :muscle: @@ -124,7 +125,7 @@ See [the contribution guide](/CONTRIBUTING.md) or go to development repository [ You can use `--debug` option, that will print nested exceptions output: ```bash -vendor/bin/rector process src/Controller --dry-run --debug +vendor/bin/rector src/Controller --dry-run --debug ``` Or with Xdebug: @@ -133,7 +134,7 @@ Or with Xdebug: 2. Add `--xdebug` option when running Rector ```bash -vendor/bin/rector process src/Controller --dry-run --xdebug +vendor/bin/rector src/Controller --dry-run --xdebug ``` To assist with simple debugging Rector provides 2 helpers to pretty-print AST-nodes: @@ -162,4 +163,4 @@ We're using [ECS](https://github.com/symplify/easy-coding-standard) with [this s ### May cause unexpected output on File with mixed PHP+HTML content -When you apply changes to File(s) thas has mixed PHP+HTML content, you may need to manually verify the changed file after apply the changes. +When you apply changes to files with PHP + HTML content, you may need to manually verify the changed file after apply the changes. diff --git a/vendor/rector/rector/UPGRADING.md b/vendor/rector/rector/UPGRADING.md new file mode 100644 index 000000000..70ed3fd5e --- /dev/null +++ b/vendor/rector/rector/UPGRADING.md @@ -0,0 +1,106 @@ +# Upgrading from Rector 1.x to 2.0 + +## PHP version requirements + +Rector now uses PHP 7.4 or newer to run. + +
    + +## Rector now uses PHP-Parser 5 + +See [upgrading guide](https://github.com/nikic/PHP-Parser/blob/master/UPGRADE-5.0.md) for PHP-Parser. + +
    + +## Rector now uses PHPStan 2 + +See [upgrading guide](https://github.com/phpstan/phpstan-src/blob/2.0.x/UPGRADING.md) for PHPStan. + +
    + +## Upgrade for custom Rules writers + +### 1. `AbstractScopeAwareRector` is removed, use `AbstractRector` instead + +The `Rector\Rector\AbstractScopeAwareRector` was too granular to fetch single helper object. It made creating new custom rules ambiguous, one layer more complex and confusing. This class has been removed in favor of standard `AbstractRector`. The `Scope` object can be fetched via `ScopeFetcher`. + +**Before** + +```php +use Rector\Rector\AbstractScopeAwareRector; + +final class SimpleRector extends AbstractScopeAwareRector +{ + public function refactorWithScope(Node $node, Scope $scope): ?Node + { + // ... + } +} +``` + +**After** + +```php +use Rector\Rector\AbstractRector; +use Rector\PHPStan\ScopeFetcher; + +final class SimpleRector extends AbstractRector +{ + public function refactor(Node $node): ?Node + { + if (...) { + // this allow to fetch scope only when needed + $scope = ScopeFetcher::fetch($node); + } + + // ... + } +} +``` + + +### 2. `AbstractRector` get focused on code, the `getRuleDefinition()` is no longer required + +Core rules need documentation, so people can read their feature and [search through](https://getrector.com/find-rule) them. Yet for writing custom rules and local rules, its not necessary. People often filled it empty, just to make Rector happy. + +This is no longer needed. Now The `getRuleDefinition()` method has been removed: + +```diff + use Rector\Rector\AbstractRector; +-use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +-use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; + + final class SimpleRector extends AbstractRector + { +- public function getRuleDefinition(): RuleDefinition +- { +- return new RuleDefinition('// @todo fill the description', [ +- new CodeSample( +- <<<'CODE_SAMPLE' +-// @todo fill code before +-CODE_SAMPLE +- , +- <<<'CODE_SAMPLE' +-// @todo fill code after +-CODE_SAMPLE +- ), +- ]); +- } + + // valuable code here + } +``` + +If you need description yourself to understand rule after many months, use the common place for documentation - docblock above class. + + +### 3. `SetListInterface` was removed + +The deprecated `SetListInterface` was removed, if you created your own list just remove the Interface from it: + +```diff +-use Rector\Set\Contract\SetListInterface; + +-final class YourSetList implements SetListInterface ++final class YourSetList +``` diff --git a/vendor/rector/rector/bin/rector b/vendor/rector/rector/bin/rector index dd6feebe1..e7555b2bb 100755 --- a/vendor/rector/rector/bin/rector +++ b/vendor/rector/rector/bin/rector @@ -1,5 +1,5 @@ #!/usr/bin/env php alreadyLoadedAutoloadFiles, \true)) { return; } - /** @var string $realPath always string after file_exists() check */ + /** @var non-empty-string $realPath always string after file_exists() check */ $realPath = \realpath($filePath); $this->alreadyLoadedAutoloadFiles[] = $realPath; require_once $filePath; } } -\class_alias('RectorPrefix202411\\AutoloadIncluder', 'AutoloadIncluder', \false); +\class_alias('RectorPrefix202506\\AutoloadIncluder', 'AutoloadIncluder', \false); if (\file_exists(__DIR__ . '/../preload.php') && \is_dir(__DIR__ . '/../vendor')) { require_once __DIR__ . '/../preload.php'; } diff --git a/vendor/rector/rector/composer.json b/vendor/rector/rector/composer.json index e34e112c8..0f7584f1c 100644 --- a/vendor/rector/rector/composer.json +++ b/vendor/rector/rector/composer.json @@ -7,8 +7,8 @@ "bin/rector" ], "require": { - "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.12.5" + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.1.17" }, "autoload": { "files": [ diff --git a/vendor/rector/rector/config/config.php b/vendor/rector/rector/config/config.php index 97a731346..aa6b507eb 100644 --- a/vendor/rector/rector/config/config.php +++ b/vendor/rector/rector/config/config.php @@ -1,9 +1,9 @@ ruleWithConfiguration(AnnotationToAttributeRector::class, [new AnnotationToAttribute('Given', 'Behat\\Step\\Given', [], \true), new AnnotationToAttribute('When', 'Behat\\Step\\When', [], \true), new AnnotationToAttribute('Then', 'Behat\\Step\\Then', [], \true), new AnnotationToAttribute('BeforeSuite', 'Behat\\Hook\\BeforeSuite', [], \true), new AnnotationToAttribute('AfterSuite', 'Behat\\Hook\\AfterSuite', [], \true), new AnnotationToAttribute('BeforeFeature', 'Behat\\Hook\\BeforeFeature', [], \true), new AnnotationToAttribute('AfterFeature', 'Behat\\Hook\\AfterFeature', [], \true), new AnnotationToAttribute('BeforeScenario', 'Behat\\Hook\\BeforeScenario', [], \true), new AnnotationToAttribute('AfterScenario', 'Behat\\Hook\\AfterScenario', [], \true), new AnnotationToAttribute('BeforeStep', 'Behat\\Hook\\BeforeStep', [], \true), new AnnotationToAttribute('AfterStep', 'Behat\\Hook\\AfterStep', [], \true)]); +}; diff --git a/vendor/rector/rector/config/set/code-quality.php b/vendor/rector/rector/config/set/code-quality.php index bb05fafd2..1f060b9fa 100644 --- a/vendor/rector/rector/config/set/code-quality.php +++ b/vendor/rector/rector/config/set/code-quality.php @@ -1,7 +1,7 @@ ruleWithConfiguration(FuncCallToConstFetchRector::class, ['php_sapi_name' => 'PHP_SAPI', 'pi' => 'M_PI']); - $rectorConfig->rules([SeparateMultiUseImportsRector::class, NewlineAfterStatementRector::class, RemoveFinalFromConstRector::class, NullableCompareToNullRector::class, ConsistentImplodeRector::class, TernaryConditionVariableAssignmentRector::class, SymplifyQuoteEscapeRector::class, StringClassNameToClassConstantRector::class, CatchExceptionNameMatchingTypeRector::class, SplitDoubleAssignRector::class, EncapsedStringsToSprintfRector::class, WrapEncapsedVariableInCurlyBracesRector::class, NewlineBeforeNewAssignSetRector::class, MakeInheritedMethodVisibilitySameAsParentRector::class, CallUserFuncArrayToVariadicRector::class, VersionCompareFuncCallToConstantRector::class, CountArrayToEmptyArrayComparisonRector::class, CallUserFuncToMethodCallRector::class, FuncGetArgsToVariadicParamRector::class, StrictArraySearchRector::class, UseClassKeywordForClassNameResolutionRector::class, SplitGroupedPropertiesRector::class, SplitGroupedClassConstantsRector::class, ExplicitPublicClassMethodRector::class, RemoveUselessAliasInUseStatementRector::class]); + foreach (CodingStyleLevel::RULES_WITH_CONFIGURATION as $rectorClass => $configuration) { + $rectorConfig->ruleWithConfiguration($rectorClass, $configuration); + } + // the rule order matters, as its used in withCodingStyleLevel() method + // place the safest rules first, follow by more complex ones + $rectorConfig->rules(CodingStyleLevel::RULES); }; diff --git a/vendor/rector/rector/config/set/datetime-to-carbon.php b/vendor/rector/rector/config/set/datetime-to-carbon.php index 38072b09b..daa948fc1 100644 --- a/vendor/rector/rector/config/set/datetime-to-carbon.php +++ b/vendor/rector/rector/config/set/datetime-to-carbon.php @@ -1,7 +1,7 @@ sets([SetList::PHP_85, LevelSetList::UP_TO_PHP_84]); +}; diff --git a/vendor/rector/rector/config/set/naming.php b/vendor/rector/rector/config/set/naming.php index 20ea88184..81c33d8f6 100644 --- a/vendor/rector/rector/config/set/naming.php +++ b/vendor/rector/rector/config/set/naming.php @@ -1,7 +1,7 @@ rules([UtilsJsonStaticCallNamedArgRector::class]); +}; diff --git a/vendor/rector/rector/config/set/php-polyfills.php b/vendor/rector/rector/config/set/php-polyfills.php index 6f567167d..cd8cff5ee 100644 --- a/vendor/rector/rector/config/set/php-polyfills.php +++ b/vendor/rector/rector/config/set/php-polyfills.php @@ -1,7 +1,7 @@ withRules([ArrayKeyFirstLastRector::class, IsCountableRector::class, GetDebugTypeRector::class, StrStartsWithRector::class, StrEndsWithRector::class, StrContainsRector::class]); +return static function (RectorConfig $rectorConfig) : void { + $rectorConfig->rules([ArrayKeyFirstLastRector::class, IsCountableRector::class, GetDebugTypeRector::class, StrStartsWithRector::class, StrEndsWithRector::class, StrContainsRector::class]); +}; diff --git a/vendor/rector/rector/config/set/php52.php b/vendor/rector/rector/config/set/php52.php index e6b602f3b..55b253f9a 100644 --- a/vendor/rector/rector/config/set/php52.php +++ b/vendor/rector/rector/config/set/php52.php @@ -1,7 +1,7 @@ rules([StrContainsRector::class, StrStartsWithRector::class, StrEndsWithRector::class, StringableForToStringRector::class, ClassOnObjectRector::class, GetDebugTypeRector::class, RemoveUnusedVariableInCatchRector::class, ClassPropertyAssignToConstructorPromotionRector::class, ChangeSwitchToMatchRector::class, RemoveParentCallWithoutParentRector::class, SetStateToStaticRector::class, FinalPrivateToPrivateVisibilityRector::class, AddParamBasedOnParentClassMethodRector::class, MixedTypeRector::class, ClassOnThisVariableObjectRector::class, ConsistentImplodeRector::class]); + $rectorConfig->rules([StrContainsRector::class, StrStartsWithRector::class, StrEndsWithRector::class, StringableForToStringRector::class, ClassOnObjectRector::class, GetDebugTypeRector::class, RemoveUnusedVariableInCatchRector::class, ClassPropertyAssignToConstructorPromotionRector::class, ChangeSwitchToMatchRector::class, RemoveParentCallWithoutParentRector::class, SetStateToStaticRector::class, FinalPrivateToPrivateVisibilityRector::class, AddParamBasedOnParentClassMethodRector::class, ClassOnThisVariableObjectRector::class, ConsistentImplodeRector::class, OptionalParametersAfterRequiredRector::class]); $rectorConfig->ruleWithConfiguration(StaticCallToFuncCallRector::class, [new StaticCallToFuncCall('Nette\\Utils\\Strings', 'startsWith', 'str_starts_with'), new StaticCallToFuncCall('Nette\\Utils\\Strings', 'endsWith', 'str_ends_with'), new StaticCallToFuncCall('Nette\\Utils\\Strings', 'contains', 'str_contains')]); // nette\utils and Strings::replace() $rectorConfig->ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Nette\\Utils\\Strings', 'replace', 2, 'replacement', '')]); // @see https://php.watch/versions/8.0/pgsql-aliases-deprecated $rectorConfig->ruleWithConfiguration(RenameFunctionRector::class, ['pg_clientencoding' => 'pg_client_encoding', 'pg_cmdtuples' => 'pg_affected_rows', 'pg_errormessage' => 'pg_last_error', 'pg_fieldisnull' => 'pg_field_is_null', 'pg_fieldname' => 'pg_field_name', 'pg_fieldnum' => 'pg_field_num', 'pg_fieldprtlen' => 'pg_field_prtlen', 'pg_fieldsize' => 'pg_field_size', 'pg_fieldtype' => 'pg_field_type', 'pg_freeresult' => 'pg_free_result', 'pg_getlastoid' => 'pg_last_oid', 'pg_loclose' => 'pg_lo_close', 'pg_locreate' => 'pg_lo_create', 'pg_loexport' => 'pg_lo_export', 'pg_loimport' => 'pg_lo_import', 'pg_loopen' => 'pg_lo_open', 'pg_loread' => 'pg_lo_read', 'pg_loreadall' => 'pg_lo_read_all', 'pg_lounlink' => 'pg_lo_unlink', 'pg_lowrite' => 'pg_lo_write', 'pg_numfields' => 'pg_num_fields', 'pg_numrows' => 'pg_num_rows', 'pg_result' => 'pg_fetch_result', 'pg_setclientencoding' => 'pg_set_client_encoding']); - $rectorConfig->rule(OptionalParametersAfterRequiredRector::class); $rectorConfig->ruleWithConfiguration(FunctionArgumentDefaultValueReplacerRector::class, [new ReplaceFuncCallArgumentDefaultValue('version_compare', 2, 'gte', 'ge'), new ReplaceFuncCallArgumentDefaultValue('version_compare', 2, 'lte', 'le'), new ReplaceFuncCallArgumentDefaultValue('version_compare', 2, '', '!='), new ReplaceFuncCallArgumentDefaultValue('version_compare', 2, '!', '!='), new ReplaceFuncCallArgumentDefaultValue('version_compare', 2, 'g', 'gt'), new ReplaceFuncCallArgumentDefaultValue('version_compare', 2, 'l', 'lt'), new ReplaceFuncCallArgumentDefaultValue('version_compare', 2, 'n', 'ne'), new ReplaceFuncCallArgumentDefaultValue('get_headers', 1, 0, \false), new ReplaceFuncCallArgumentDefaultValue('get_headers', 1, 1, \true)]); }; diff --git a/vendor/rector/rector/config/set/php81.php b/vendor/rector/rector/config/set/php81.php index e7ad83c3f..359c02a30 100644 --- a/vendor/rector/rector/config/set/php81.php +++ b/vendor/rector/rector/config/set/php81.php @@ -1,18 +1,18 @@ rules([ReturnNeverTypeRector::class, MyCLabsClassToEnumRector::class, MyCLabsMethodCallToEnumConstRector::class, ReadOnlyPropertyRector::class, SpatieEnumClassToEnumRector::class, SpatieEnumMethodCallToEnumConstRector::class, NewInInitializerRector::class, NullToStrictStringFuncCallArgRector::class, FirstClassCallableRector::class]); + $rectorConfig->rules([ReturnNeverTypeRector::class, MyCLabsClassToEnumRector::class, MyCLabsMethodCallToEnumConstRector::class, MyCLabsConstructorCallToEnumFromRector::class, ReadOnlyPropertyRector::class, SpatieEnumClassToEnumRector::class, SpatieEnumMethodCallToEnumConstRector::class, NullToStrictStringFuncCallArgRector::class, FirstClassCallableRector::class]); }; diff --git a/vendor/rector/rector/config/set/php82.php b/vendor/rector/rector/config/set/php82.php index d9f0af5e8..ed8c1d075 100644 --- a/vendor/rector/rector/config/set/php82.php +++ b/vendor/rector/rector/config/set/php82.php @@ -1,7 +1,7 @@ rules([AddOverrideAttributeToOverriddenMethodsRector::class, AddTypeToConstRector::class, CombineHostPortLdapUriRector::class, RemoveGetClassGetParentClassNoArgsRector::class]); + $rectorConfig->rules([AddOverrideAttributeToOverriddenMethodsRector::class, AddTypeToConstRector::class, CombineHostPortLdapUriRector::class, RemoveGetClassGetParentClassNoArgsRector::class, ReadOnlyAnonymousClassRector::class, DynamicClassConstFetchRector::class]); }; diff --git a/vendor/rector/rector/config/set/php84.php b/vendor/rector/rector/config/set/php84.php index 91ef55118..56073eafd 100644 --- a/vendor/rector/rector/config/set/php84.php +++ b/vendor/rector/rector/config/set/php84.php @@ -1,10 +1,14 @@ rules([ExplicitNullableParamTypeRector::class]); + $rectorConfig->rules([ExplicitNullableParamTypeRector::class, RoundingModeEnumRector::class, AddEscapeArgumentRector::class, NewMethodCallWithoutParenthesesRector::class, DeprecatedAnnotationToDeprecatedAttributeRector::class]); }; diff --git a/vendor/rector/rector/config/set/php85.php b/vendor/rector/rector/config/set/php85.php new file mode 100644 index 000000000..59af583e4 --- /dev/null +++ b/vendor/rector/rector/config/set/php85.php @@ -0,0 +1,10 @@ +rules([ArrayFirstLastRector::class]); +}; diff --git a/vendor/rector/rector/config/set/privatization.php b/vendor/rector/rector/config/set/privatization.php index 9057ddccb..c33313ec9 100644 --- a/vendor/rector/rector/config/set/privatization.php +++ b/vendor/rector/rector/config/set/privatization.php @@ -1,7 +1,7 @@ nodeFactory = $nodeFactory; @@ -98,13 +96,16 @@ private function processArgs($expr, ReplaceArgumentDefaultValueInterface $replac $argValue = $this->valueResolver->getValue($particularArg->value); if (\is_scalar($replaceArgumentDefaultValue->getValueBefore()) && $argValue === $replaceArgumentDefaultValue->getValueBefore()) { $expr->args[$position] = $this->normalizeValueToArgument($replaceArgumentDefaultValue->getValueAfter()); - } elseif (\is_array($replaceArgumentDefaultValue->getValueBefore())) { + return $expr; + } + if (\is_array($replaceArgumentDefaultValue->getValueBefore())) { $newArgs = $this->processArrayReplacement($expr->getArgs(), $replaceArgumentDefaultValue); if (\is_array($newArgs)) { $expr->args = $newArgs; + return $expr; } } - return $expr; + return null; } /** * @param mixed $value diff --git a/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ArgumentAddingScope.php b/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ArgumentAddingScope.php index 3976fbb67..16f835288 100644 --- a/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ArgumentAddingScope.php +++ b/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ArgumentAddingScope.php @@ -14,9 +14,8 @@ final class ArgumentAddingScope { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @api * @var string diff --git a/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ChangedArgumentsDetector.php b/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ChangedArgumentsDetector.php index 5bcb031cf..e6a4072b2 100644 --- a/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ChangedArgumentsDetector.php +++ b/vendor/rector/rector/rules/Arguments/NodeAnalyzer/ChangedArgumentsDetector.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\Arguments\NodeAnalyzer; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Param; use PHPStan\Type\Type; @@ -13,19 +14,16 @@ final class ChangedArgumentsDetector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; public function __construct(ValueResolver $valueResolver, StaticTypeMapper $staticTypeMapper, TypeComparator $typeComparator) { $this->valueResolver = $valueResolver; @@ -44,7 +42,7 @@ public function isDefaultValueChanged(Param $param, $value) : bool } public function isTypeChanged(Param $param, ?Type $newType) : bool { - if ($param->type === null) { + if (!$param->type instanceof Node) { return \false; } if (!$newType instanceof Type) { diff --git a/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php b/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php index 6ed6418c2..269f69de1 100644 --- a/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php +++ b/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php @@ -29,7 +29,7 @@ use Rector\StaticTypeMapper\StaticTypeMapper; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Arguments\Rector\ClassMethod\ArgumentAdderRector\ArgumentAdderRectorTest */ @@ -37,32 +37,25 @@ final class ArgumentAdderRector extends AbstractRector implements ConfigurableRe { /** * @readonly - * @var \Rector\Arguments\NodeAnalyzer\ArgumentAddingScope */ - private $argumentAddingScope; + private ArgumentAddingScope $argumentAddingScope; /** * @readonly - * @var \Rector\Arguments\NodeAnalyzer\ChangedArgumentsDetector */ - private $changedArgumentsDetector; + private ChangedArgumentsDetector $changedArgumentsDetector; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var ArgumentAdder[]|ArgumentAdderWithoutDefaultValue[] */ - private $addedArguments = []; - /** - * @var bool - */ - private $hasChanged = \false; + private array $addedArguments = []; + private bool $hasChanged = \false; public function __construct(ArgumentAddingScope $argumentAddingScope, ChangedArgumentsDetector $changedArgumentsDetector, AstResolver $astResolver, StaticTypeMapper $staticTypeMapper) { $this->argumentAddingScope = $argumentAddingScope; @@ -303,6 +296,9 @@ private function processStaticCall(StaticCall $staticCall, int $position, $argum */ private function refactorCall($call) : void { + if ($call->isFirstClassCallable()) { + return; + } $callName = $this->getName($call->name); if ($callName === null) { return; diff --git a/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector.php b/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector.php index 27c961621..0276afabc 100644 --- a/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector.php +++ b/vendor/rector/rector/rules/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector.php @@ -15,7 +15,7 @@ use Rector\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api used in rector-symfony * @see \Rector\Tests\Arguments\Rector\ClassMethod\ReplaceArgumentDefaultValueRector\ReplaceArgumentDefaultValueRectorTest @@ -24,13 +24,12 @@ final class ReplaceArgumentDefaultValueRector extends AbstractRector implements { /** * @readonly - * @var \Rector\Arguments\ArgumentDefaultValueReplacer */ - private $argumentDefaultValueReplacer; + private ArgumentDefaultValueReplacer $argumentDefaultValueReplacer; /** * @var ReplaceArgumentDefaultValue[] */ - private $replaceArgumentDefaultValues = []; + private array $replaceArgumentDefaultValues = []; public function __construct(ArgumentDefaultValueReplacer $argumentDefaultValueReplacer) { $this->argumentDefaultValueReplacer = $argumentDefaultValueReplacer; diff --git a/vendor/rector/rector/rules/Arguments/Rector/FuncCall/FunctionArgumentDefaultValueReplacerRector.php b/vendor/rector/rector/rules/Arguments/Rector/FuncCall/FunctionArgumentDefaultValueReplacerRector.php index fe4bd0084..4b44fb2ab 100644 --- a/vendor/rector/rector/rules/Arguments/Rector/FuncCall/FunctionArgumentDefaultValueReplacerRector.php +++ b/vendor/rector/rector/rules/Arguments/Rector/FuncCall/FunctionArgumentDefaultValueReplacerRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Arguments\Rector\FuncCall\FunctionArgumentDefaultValueReplacerRector\FunctionArgumentDefaultValueReplacerRectorTest */ @@ -19,20 +19,19 @@ final class FunctionArgumentDefaultValueReplacerRector extends AbstractRector im { /** * @readonly - * @var \Rector\Arguments\ArgumentDefaultValueReplacer */ - private $argumentDefaultValueReplacer; + private ArgumentDefaultValueReplacer $argumentDefaultValueReplacer; /** * @var ReplaceFuncCallArgumentDefaultValue[] */ - private $replacedArguments = []; + private array $replacedArguments = []; public function __construct(ArgumentDefaultValueReplacer $argumentDefaultValueReplacer) { $this->argumentDefaultValueReplacer = $argumentDefaultValueReplacer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Streamline the operator arguments of version_compare function', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Streamline the operator arguments of `version_compare` function', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' version_compare(PHP_VERSION, '5.6', 'gte'); CODE_SAMPLE , <<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Arguments/Rector/MethodCall/RemoveMethodCallParamRector.php b/vendor/rector/rector/rules/Arguments/Rector/MethodCall/RemoveMethodCallParamRector.php index d0adeb2ae..e3ef3d5fb 100644 --- a/vendor/rector/rector/rules/Arguments/Rector/MethodCall/RemoveMethodCallParamRector.php +++ b/vendor/rector/rector/rules/Arguments/Rector/MethodCall/RemoveMethodCallParamRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Arguments\Rector\MethodCall\RemoveMethodCallParamRector\RemoveMethodCallParamRectorTest */ @@ -20,7 +20,7 @@ final class RemoveMethodCallParamRector extends AbstractRector implements Config /** * @var RemoveMethodCallParam[] */ - private $removeMethodCallParams = []; + private array $removeMethodCallParams = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove parameter of method call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdder.php b/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdder.php index 38bad6602..14d1beeff 100644 --- a/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdder.php +++ b/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdder.php @@ -10,24 +10,20 @@ final class ArgumentAdder { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var int */ - private $position; + private int $position; /** * @readonly - * @var string|null */ - private $argumentName; + private ?string $argumentName = null; /** * @var mixed|null */ @@ -39,9 +35,8 @@ final class ArgumentAdder private $argumentType = null; /** * @readonly - * @var string|null */ - private $scope; + private ?string $scope = null; /** * @param mixed|null $argumentDefaultValue */ diff --git a/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdderWithoutDefaultValue.php b/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdderWithoutDefaultValue.php index 4a075b3d6..d89ffd14a 100644 --- a/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdderWithoutDefaultValue.php +++ b/vendor/rector/rector/rules/Arguments/ValueObject/ArgumentAdderWithoutDefaultValue.php @@ -10,24 +10,20 @@ final class ArgumentAdderWithoutDefaultValue { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var int */ - private $position; + private int $position; /** * @readonly - * @var string|null */ - private $argumentName; + private ?string $argumentName = null; /** * @readonly * @var \PHPStan\Type\Type|null @@ -35,9 +31,8 @@ final class ArgumentAdderWithoutDefaultValue private $argumentType = null; /** * @readonly - * @var string|null */ - private $scope; + private ?string $scope = null; public function __construct(string $class, string $method, int $position, ?string $argumentName = null, ?\PHPStan\Type\Type $argumentType = null, ?string $scope = null) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Arguments/ValueObject/RemoveMethodCallParam.php b/vendor/rector/rector/rules/Arguments/ValueObject/RemoveMethodCallParam.php index 6626362ef..6c1830842 100644 --- a/vendor/rector/rector/rules/Arguments/ValueObject/RemoveMethodCallParam.php +++ b/vendor/rector/rector/rules/Arguments/ValueObject/RemoveMethodCallParam.php @@ -9,19 +9,16 @@ final class RemoveMethodCallParam { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @readonly - * @var int */ - private $paramPosition; + private int $paramPosition; public function __construct(string $class, string $methodName, int $paramPosition) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceArgumentDefaultValue.php b/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceArgumentDefaultValue.php index da9d97613..8d0abf602 100644 --- a/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceArgumentDefaultValue.php +++ b/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceArgumentDefaultValue.php @@ -10,19 +10,17 @@ final class ReplaceArgumentDefaultValue implements ReplaceArgumentDefaultValueIn { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @var int<0, max> * @readonly */ - private $position; + private int $position; /** * @readonly * @var mixed diff --git a/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceFuncCallArgumentDefaultValue.php b/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceFuncCallArgumentDefaultValue.php index 08908e617..e02bff7f8 100644 --- a/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceFuncCallArgumentDefaultValue.php +++ b/vendor/rector/rector/rules/Arguments/ValueObject/ReplaceFuncCallArgumentDefaultValue.php @@ -8,14 +8,12 @@ final class ReplaceFuncCallArgumentDefaultValue implements ReplaceArgumentDefaul { /** * @readonly - * @var string */ - private $function; + private string $function; /** * @readonly - * @var int */ - private $position; + private int $position; /** * @readonly * @var mixed diff --git a/vendor/rector/rector/rules/Carbon/NodeFactory/CarbonCallFactory.php b/vendor/rector/rector/rules/Carbon/NodeFactory/CarbonCallFactory.php index 552f8ca7b..9dfeacdc8 100644 --- a/vendor/rector/rector/rules/Carbon/NodeFactory/CarbonCallFactory.php +++ b/vendor/rector/rector/rules/Carbon/NodeFactory/CarbonCallFactory.php @@ -3,13 +3,13 @@ declare (strict_types=1); namespace Rector\Carbon\NodeFactory; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; final class CarbonCallFactory { @@ -32,7 +32,7 @@ public function createFromDateTimeString(FullyQualified $carbonFullyQualified, S $string->value = Strings::replace($string->value, self::STATIC_DATE_REGEX); // Handle add/sub multiple times while ($match = Strings::match($string->value, self::PLUS_MINUS_COUNT_REGEX)) { - $methodCall = $this->createModifyMethodCall($carbonCall, new LNumber((int) $match['count']), $match['unit'], $match['operator']); + $methodCall = $this->createModifyMethodCall($carbonCall, new Int_((int) $match['count']), $match['unit'], $match['operator']); if ($methodCall instanceof MethodCall) { $carbonCall = $methodCall; $string->value = Strings::replace($string->value, self::PLUS_MINUS_COUNT_REGEX, '', 1); @@ -50,7 +50,7 @@ public function createFromDateTimeString(FullyQualified $carbonFullyQualified, S return $carbonCall; } // If we fallback to a parse we want to include tomorrow/today/yesterday etc - if ($currentCall->name instanceof Identifier && $currentCall->name->name != 'now') { + if ($currentCall->name instanceof Identifier && $currentCall->name->name !== 'now') { $rest .= ' ' . $currentCall->name->name; } $currentCall->name = new Identifier('parse'); @@ -68,7 +68,7 @@ private function createStaticCall(FullyQualified $carbonFullyQualified, String_ /** * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $carbonCall */ - private function createModifyMethodCall($carbonCall, LNumber $countLNumber, string $unit, string $operator) : ?MethodCall + private function createModifyMethodCall($carbonCall, Int_ $int, string $unit, string $operator) : ?MethodCall { switch ($unit) { case 'sec': @@ -120,7 +120,7 @@ private function createModifyMethodCall($carbonCall, LNumber $countLNumber, stri return null; } $methodName = $operator . \ucfirst($unit); - return new MethodCall($carbonCall, new Identifier($methodName), [new Arg($countLNumber)]); + return new MethodCall($carbonCall, new Identifier($methodName), [new Arg($int)]); } /** * @param MethodCall[] $callStack diff --git a/vendor/rector/rector/rules/Carbon/Rector/FuncCall/DateFuncCallToCarbonRector.php b/vendor/rector/rector/rules/Carbon/Rector/FuncCall/DateFuncCallToCarbonRector.php index 73eb979cb..23e234775 100644 --- a/vendor/rector/rector/rules/Carbon/Rector/FuncCall/DateFuncCallToCarbonRector.php +++ b/vendor/rector/rector/rules/Carbon/Rector/FuncCall/DateFuncCallToCarbonRector.php @@ -5,10 +5,14 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\Expr; +use PhpParser\Node\Expr\BinaryOp\Minus; +use PhpParser\Node\Expr\BinaryOp\Mul; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name\FullyQualified; +use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -18,9 +22,10 @@ */ final class DateFuncCallToCarbonRector extends AbstractRector { + private const TIME_UNITS = [['weeks', 604800], ['days', 86400], ['hours', 3600], ['minutes', 60], ['seconds', 1]]; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Convert date() function call to Carbon::now()->format(*)', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Convert `date()` function call to `Carbon::now()->format(*)`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() @@ -45,28 +50,158 @@ public function run() */ public function getNodeTypes() : array { - return [FuncCall::class]; + return [Minus::class, FuncCall::class]; } /** * @param FuncCall $node */ public function refactor(Node $node) : ?Node { - if (!$this->isName($node->name, 'date')) { + if ($node instanceof Minus) { + $left = $node->left; + if ($left instanceof FuncCall && !$left->isFirstClassCallable() && $this->isName($left->name, 'time')) { + $timeUnit = $this->detectTimeUnit($node->right); + if ($timeUnit !== null) { + return $this->createCarbonSubtract($timeUnit); + } + } + return null; + } + if (!$node instanceof FuncCall) { return null; } if ($node->isFirstClassCallable()) { return null; } - if (\count($node->getArgs()) !== 1) { + if ($this->isName($node->name, 'date') && isset($node->args[1]) && $node->args[1] instanceof Arg) { + $format = $this->getArgValue($node, 0); + if (!$format instanceof Expr) { + return null; + } + $timestamp = $node->args[1]->value; + if ($timestamp instanceof FuncCall && $this->isName($timestamp->name, 'strtotime') && isset($timestamp->args[0]) && $timestamp->args[0] instanceof Arg) { + $dateExpr = $timestamp->args[0]->value; + return $this->createCarbonParseFormat($dateExpr, $format); + } + // @phpstan-ignore if.alwaysTrue + if ($this->getType($timestamp)->isInteger()) { + return $this->createCarbonFromTimestamp($timestamp, $format); + } + } + if ($this->isName($node->name, 'date') && isset($node->args[0])) { + $format = $this->getArgValue($node, 0); + if ($format instanceof String_) { + return $this->createCarbonNowFormat($format); + } + } + if ($this->isName($node->name, 'strtotime') && isset($node->args[0])) { + $dateExpr = $this->getArgValue($node, 0); + $baseTimestamp = $this->getArgValue($node, 1); + if ($dateExpr instanceof Expr && !$baseTimestamp instanceof Expr) { + return $this->createCarbonParseTimestamp($dateExpr); + } + if ($dateExpr instanceof Expr && $baseTimestamp instanceof String_) { + $isRelative = \strncmp($baseTimestamp->value, '+', \strlen('+')) === 0 || \strncmp($baseTimestamp->value, '-', \strlen('-')) === 0; + if ($isRelative) { + return null; + // @todo implement relative changes based on second arg + } + } + } + return null; + } + private function getArgValue(FuncCall $funcCall, int $index) : ?Expr + { + if (!isset($funcCall->args[$index]) || !$funcCall->args[$index] instanceof Arg) { + return null; + } + return $funcCall->args[$index]->value; + } + private function createCarbonNowFormat(String_ $string) : MethodCall + { + return new MethodCall($this->createCarbonNow(), 'format', [new Arg($string)]); + } + private function createCarbonNow() : StaticCall + { + return new StaticCall(new FullyQualified('Carbon\\Carbon'), 'now'); + } + private function createCarbonParseTimestamp(Expr $dateExpr) : MethodCall + { + $staticCall = new StaticCall(new FullyQualified('Carbon\\Carbon'), 'parse', [new Arg($dateExpr)]); + return new MethodCall($staticCall, 'getTimestamp'); + } + private function createCarbonParseFormat(Expr $dateExpr, Expr $format) : MethodCall + { + $staticCall = new StaticCall(new FullyQualified('Carbon\\Carbon'), 'parse', [new Arg($dateExpr)]); + return new MethodCall($staticCall, 'format', [new Arg($format)]); + } + private function createCarbonFromTimestamp(Expr $timestampExpr, Expr $format) : MethodCall + { + $staticCall = new StaticCall(new FullyQualified('Carbon\\Carbon'), 'createFromTimestamp', [new Arg($timestampExpr)]); + return new MethodCall($staticCall, 'format', [new Arg($format)]); + } + /** + * @param array{unit: string, value: int} $timeUnit + */ + private function createCarbonSubtract(array $timeUnit) : MethodCall + { + $staticCall = new StaticCall(new FullyQualified('Carbon\\Carbon'), 'now'); + $methodName = 'sub' . \ucfirst($timeUnit['unit']); + $methodCall = new MethodCall($staticCall, $methodName, [new Arg(new LNumber($timeUnit['value']))]); + return new MethodCall($methodCall, 'getTimestamp'); + } + /** + * @return array{unit: string, value: int}|null + */ + private function detectTimeUnit(Expr $expr) : ?array + { + $product = $this->calculateProduct($expr); + if ($product === null) { + return null; + } + foreach (self::TIME_UNITS as [$unit, $seconds]) { + if ($product % $seconds === 0) { + return ['unit' => (string) $unit, 'value' => (int) ($product / $seconds)]; + } + } + return null; + } + /** + * @return float|int|null + */ + private function calculateProduct(Expr $expr) + { + if ($expr instanceof LNumber) { + return $expr->value; + } + if (!$expr instanceof Mul) { return null; } - $firstArg = $node->getArgs()[0]; - if (!$firstArg->value instanceof String_) { + $multipliers = $this->extractMultipliers($expr); + if ($multipliers === []) { return null; } - // create now and format() - $nowStaticCall = new StaticCall(new FullyQualified('Carbon\\Carbon'), 'now'); - return new MethodCall($nowStaticCall, 'format', [new Arg($firstArg->value)]); + return \array_product($multipliers); + } + /** + * @return int[] + */ + private function extractMultipliers(Node $node) : array + { + $multipliers = []; + if (!$node instanceof Mul) { + return $multipliers; + } + if ($node->left instanceof LNumber) { + $multipliers[] = $node->left->value; + } elseif ($node->left instanceof Mul) { + $multipliers = \array_merge($multipliers, $this->extractMultipliers($node->left)); + } + if ($node->right instanceof LNumber) { + $multipliers[] = $node->right->value; + } elseif ($node->right instanceof Mul) { + $multipliers = \array_merge($multipliers, $this->extractMultipliers($node->right)); + } + return $multipliers; } } diff --git a/vendor/rector/rector/rules/Carbon/Rector/FuncCall/TimeFuncCallToCarbonRector.php b/vendor/rector/rector/rules/Carbon/Rector/FuncCall/TimeFuncCallToCarbonRector.php index 894588727..82c16a2a8 100644 --- a/vendor/rector/rector/rules/Carbon/Rector/FuncCall/TimeFuncCallToCarbonRector.php +++ b/vendor/rector/rector/rules/Carbon/Rector/FuncCall/TimeFuncCallToCarbonRector.php @@ -6,20 +6,20 @@ use PhpParser\Node; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Expr\PropertyFetch; +use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name\FullyQualified; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\Carbon\Rector\FuncCall\DateFuncCallToCarbonRector\DateFuncCallToCarbonRectorTest + * @see \Rector\Tests\Carbon\Rector\FuncCall\TimeFuncCallToCarbonRector\TimeFuncCallToCarbonRectorTest */ final class TimeFuncCallToCarbonRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Convert time() function call to Carbon::now()->timestamp', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Convert `time()` function call to `Carbon::now()->getTimestamp()`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() @@ -33,7 +33,7 @@ class SomeClass { public function run() { - $time = \Carbon\Carbon::now()->timestamp; + $time = \Carbon\Carbon::now()->getTimestamp(); } } CODE_SAMPLE @@ -60,10 +60,10 @@ public function refactor(Node $node) : ?Node } // create now and format() $nowStaticCall = new StaticCall(new FullyQualified('Carbon\\Carbon'), 'now'); - $propertyFetch = new PropertyFetch($nowStaticCall, 'timestamp'); + $methodCall = new MethodCall($nowStaticCall, 'getTimestamp'); if ($firstClassCallable) { - return new ArrowFunction(['static' => \true, 'expr' => $propertyFetch]); + return new ArrowFunction(['static' => \true, 'expr' => $methodCall]); } - return $propertyFetch; + return $methodCall; } } diff --git a/vendor/rector/rector/rules/Carbon/Rector/MethodCall/DateTimeMethodCallToCarbonRector.php b/vendor/rector/rector/rules/Carbon/Rector/MethodCall/DateTimeMethodCallToCarbonRector.php index 863031a72..f1d6bd38a 100644 --- a/vendor/rector/rector/rules/Carbon/Rector/MethodCall/DateTimeMethodCallToCarbonRector.php +++ b/vendor/rector/rector/rules/Carbon/Rector/MethodCall/DateTimeMethodCallToCarbonRector.php @@ -20,16 +20,15 @@ final class DateTimeMethodCallToCarbonRector extends AbstractRector { /** * @readonly - * @var \Rector\Carbon\NodeFactory\CarbonCallFactory */ - private $carbonCallFactory; + private CarbonCallFactory $carbonCallFactory; public function __construct(CarbonCallFactory $carbonCallFactory) { $this->carbonCallFactory = $carbonCallFactory; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Convert new DateTime() with a method call to Carbon::*()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Convert `new DateTime()` with a method call to `Carbon::*()`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/Carbon/Rector/New_/DateTimeInstanceToCarbonRector.php b/vendor/rector/rector/rules/Carbon/Rector/New_/DateTimeInstanceToCarbonRector.php index 91374248c..db0459cd3 100644 --- a/vendor/rector/rector/rules/Carbon/Rector/New_/DateTimeInstanceToCarbonRector.php +++ b/vendor/rector/rector/rules/Carbon/Rector/New_/DateTimeInstanceToCarbonRector.php @@ -21,16 +21,15 @@ final class DateTimeInstanceToCarbonRector extends AbstractRector { /** * @readonly - * @var \Rector\Carbon\NodeFactory\CarbonCallFactory */ - private $carbonCallFactory; + private CarbonCallFactory $carbonCallFactory; public function __construct(CarbonCallFactory $carbonCallFactory) { $this->carbonCallFactory = $carbonCallFactory; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Convert new DateTime() to Carbon::*()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Convert `new DateTime()` to `Carbon::*()`', [new CodeSample(<<<'CODE_SAMPLE' $date = new \DateTime('today'); CODE_SAMPLE , <<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodeQuality/CompactConverter.php b/vendor/rector/rector/rules/CodeQuality/CompactConverter.php index 681947104..7a4c8e615 100644 --- a/vendor/rector/rector/rules/CodeQuality/CompactConverter.php +++ b/vendor/rector/rector/rules/CodeQuality/CompactConverter.php @@ -4,8 +4,8 @@ namespace Rector\CodeQuality; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; @@ -15,9 +15,8 @@ final class CompactConverter { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/ForeachAnalyzer.php b/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/ForeachAnalyzer.php index c89f51923..76c28555e 100644 --- a/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/ForeachAnalyzer.php +++ b/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/ForeachAnalyzer.php @@ -13,9 +13,8 @@ final class ForeachAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; public function __construct(NodeComparator $nodeComparator) { $this->nodeComparator = $nodeComparator; diff --git a/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/LocalPropertyAnalyzer.php b/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/LocalPropertyAnalyzer.php index f17c9c070..50d8c283f 100644 --- a/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/LocalPropertyAnalyzer.php +++ b/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/LocalPropertyAnalyzer.php @@ -10,10 +10,10 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\Scope; use PHPStan\Type\MixedType; use PHPStan\Type\Type; @@ -28,34 +28,28 @@ final class LocalPropertyAnalyzer { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\CodeQuality\TypeResolver\ArrayDimFetchTypeResolver */ - private $arrayDimFetchTypeResolver; + private ArrayDimFetchTypeResolver $arrayDimFetchTypeResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @var string */ @@ -77,20 +71,20 @@ public function resolveFetchedPropertiesToTypesFromClass(Class_ $class) : array $fetchedLocalPropertyNameToTypes = []; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($class->getMethods(), function (Node $node) use(&$fetchedLocalPropertyNameToTypes) : ?int { if ($this->shouldSkip($node)) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($node instanceof Assign && ($node->var instanceof PropertyFetch || $node->var instanceof ArrayDimFetch)) { $propertyFetch = $node->var; $propertyName = $this->resolvePropertyName($propertyFetch instanceof ArrayDimFetch ? $propertyFetch->var : $propertyFetch); if ($propertyName === null) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($propertyFetch instanceof ArrayDimFetch) { $fetchedLocalPropertyNameToTypes[$propertyName][] = $this->arrayDimFetchTypeResolver->resolve($propertyFetch, $node); - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } $fetchedLocalPropertyNameToTypes[$propertyName][] = $this->nodeTypeResolver->getType($node->expr); - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } $propertyName = $this->resolvePropertyName($node); if ($propertyName === null) { @@ -134,7 +128,7 @@ private function shouldSkipPropertyFetch(PropertyFetch $propertyFetch) : bool if ($this->isPartOfClosureBind($propertyFetch)) { return \true; } - return $propertyFetch->name instanceof Variable; + return !$propertyFetch->name instanceof Identifier; } /** * @param array $propertyNameToTypes diff --git a/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/VariableDimFetchAssignResolver.php b/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/VariableDimFetchAssignResolver.php index 9042e13cb..e1406fffe 100644 --- a/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/VariableDimFetchAssignResolver.php +++ b/vendor/rector/rector/rules/CodeQuality/NodeAnalyzer/VariableDimFetchAssignResolver.php @@ -17,14 +17,12 @@ final class VariableDimFetchAssignResolver { /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(NodeComparator $nodeComparator, BetterNodeFinder $betterNodeFinder) { $this->nodeComparator = $nodeComparator; @@ -68,9 +66,7 @@ private function matchKeyOnArrayDimFetchOfVariable(Assign $assign, Variable $var if (!$this->nodeComparator->areNodesEqual($arrayDimFetch->var, $variable)) { return null; } - $isFoundInExpr = (bool) $this->betterNodeFinder->findFirst($assign->expr, function (Node $subNode) use($variable) : bool { - return $this->nodeComparator->areNodesEqual($subNode, $variable); - }); + $isFoundInExpr = (bool) $this->betterNodeFinder->findFirst($assign->expr, fn(Node $subNode): bool => $this->nodeComparator->areNodesEqual($subNode, $variable)); if ($isFoundInExpr) { return null; } diff --git a/vendor/rector/rector/rules/CodeQuality/NodeFactory/MissingPropertiesFactory.php b/vendor/rector/rector/rules/CodeQuality/NodeFactory/MissingPropertiesFactory.php index 8846e9526..3ef126e59 100644 --- a/vendor/rector/rector/rules/CodeQuality/NodeFactory/MissingPropertiesFactory.php +++ b/vendor/rector/rector/rules/CodeQuality/NodeFactory/MissingPropertiesFactory.php @@ -3,17 +3,16 @@ declare (strict_types=1); namespace Rector\CodeQuality\NodeFactory; -use PhpParser\Node\Stmt\Class_; +use PhpParser\Modifiers; +use PhpParser\Node\PropertyItem; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; use PHPStan\Type\Type; final class MissingPropertiesFactory { /** * @readonly - * @var \Rector\CodeQuality\NodeFactory\PropertyTypeDecorator */ - private $propertyTypeDecorator; + private \Rector\CodeQuality\NodeFactory\PropertyTypeDecorator $propertyTypeDecorator; public function __construct(\Rector\CodeQuality\NodeFactory\PropertyTypeDecorator $propertyTypeDecorator) { $this->propertyTypeDecorator = $propertyTypeDecorator; @@ -30,7 +29,7 @@ public function create(array $fetchedLocalPropertyNameToTypes, array $propertyNa if (!\in_array($propertyName, $propertyNamesToComplete, \true)) { continue; } - $property = new Property(Class_::MODIFIER_PUBLIC, [new PropertyProperty($propertyName)]); + $property = new Property(Modifiers::PUBLIC, [new PropertyItem($propertyName)]); $this->propertyTypeDecorator->decorateProperty($property, $propertyType); $newProperties[] = $property; } diff --git a/vendor/rector/rector/rules/CodeQuality/NodeFactory/PropertyTypeDecorator.php b/vendor/rector/rector/rules/CodeQuality/NodeFactory/PropertyTypeDecorator.php index e6185ec26..4273838fc 100644 --- a/vendor/rector/rector/rules/CodeQuality/NodeFactory/PropertyTypeDecorator.php +++ b/vendor/rector/rector/rules/CodeQuality/NodeFactory/PropertyTypeDecorator.php @@ -12,19 +12,16 @@ final class PropertyTypeDecorator { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Privatization\TypeManipulator\TypeNormalizer */ - private $typeNormalizer; + private TypeNormalizer $typeNormalizer; public function __construct(PhpDocTypeChanger $phpDocTypeChanger, PhpDocInfoFactory $phpDocInfoFactory, TypeNormalizer $typeNormalizer) { $this->phpDocTypeChanger = $phpDocTypeChanger; diff --git a/vendor/rector/rector/rules/CodeQuality/NodeFactory/TypedPropertyFactory.php b/vendor/rector/rector/rules/CodeQuality/NodeFactory/TypedPropertyFactory.php index f6b95cd63..0f81cea95 100644 --- a/vendor/rector/rector/rules/CodeQuality/NodeFactory/TypedPropertyFactory.php +++ b/vendor/rector/rector/rules/CodeQuality/NodeFactory/TypedPropertyFactory.php @@ -3,14 +3,15 @@ declare (strict_types=1); namespace Rector\CodeQuality\NodeFactory; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\ComplexType; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\NullableType; +use PhpParser\Node\PropertyItem; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; use PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -18,18 +19,17 @@ final class TypedPropertyFactory { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(StaticTypeMapper $staticTypeMapper) { $this->staticTypeMapper = $staticTypeMapper; } public function createFromPropertyTagValueNode(PropertyTagValueNode $propertyTagValueNode, Class_ $class, string $propertyName) : Property { - $propertyProperty = new PropertyProperty($propertyName); + $propertyItem = new PropertyItem($propertyName); $propertyTypeNode = $this->createPropertyTypeNode($propertyTagValueNode, $class); - return new Property(Class_::MODIFIER_PRIVATE, [$propertyProperty], [], $propertyTypeNode); + return new Property(Modifiers::PRIVATE, [$propertyItem], [], $propertyTypeNode); } /** * @return \PhpParser\Node\Name|\PhpParser\Node\ComplexType|\PhpParser\Node\Identifier|null diff --git a/vendor/rector/rector/rules/CodeQuality/NodeManipulator/ExprBoolCaster.php b/vendor/rector/rector/rules/CodeQuality/NodeManipulator/ExprBoolCaster.php index 5b311663a..0690762cf 100644 --- a/vendor/rector/rector/rules/CodeQuality/NodeManipulator/ExprBoolCaster.php +++ b/vendor/rector/rector/rules/CodeQuality/NodeManipulator/ExprBoolCaster.php @@ -19,24 +19,20 @@ final class ExprBoolCaster { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\Utils\TypeUnwrapper */ - private $typeUnwrapper; + private TypeUnwrapper $typeUnwrapper; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\StaticTypeAnalyzer */ - private $staticTypeAnalyzer; + private StaticTypeAnalyzer $staticTypeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeTypeResolver $nodeTypeResolver, TypeUnwrapper $typeUnwrapper, StaticTypeAnalyzer $staticTypeAnalyzer, NodeFactory $nodeFactory) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Assign/CombinedAssignRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Assign/CombinedAssignRector.php index f2e2e47be..425c2da78 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Assign/CombinedAssignRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Assign/CombinedAssignRector.php @@ -17,9 +17,8 @@ final class CombinedAssignRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\AssignAndBinaryMap */ - private $assignAndBinaryMap; + private AssignAndBinaryMap $assignAndBinaryMap; public function __construct(AssignAndBinaryMap $assignAndBinaryMap) { $this->assignAndBinaryMap = $assignAndBinaryMap; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/BooleanAnd/SimplifyEmptyArrayCheckRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/BooleanAnd/SimplifyEmptyArrayCheckRector.php index 21c232f32..f3951e680 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/BooleanAnd/SimplifyEmptyArrayCheckRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/BooleanAnd/SimplifyEmptyArrayCheckRector.php @@ -21,9 +21,8 @@ final class SimplifyEmptyArrayCheckRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; public function __construct(BinaryOpManipulator $binaryOpManipulator) { $this->binaryOpManipulator = $binaryOpManipulator; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/BooleanNot/SimplifyDeMorganBinaryRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/BooleanNot/SimplifyDeMorganBinaryRector.php index 831449d03..68ab499e5 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/BooleanNot/SimplifyDeMorganBinaryRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/BooleanNot/SimplifyDeMorganBinaryRector.php @@ -18,9 +18,8 @@ final class SimplifyDeMorganBinaryRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; public function __construct(BinaryOpManipulator $binaryOpManipulator) { $this->binaryOpManipulator = $binaryOpManipulator; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Catch_/ThrowWithPreviousExceptionRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Catch_/ThrowWithPreviousExceptionRector.php index 3c9c586ce..c05b81ca7 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Catch_/ThrowWithPreviousExceptionRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Catch_/ThrowWithPreviousExceptionRector.php @@ -7,18 +7,18 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\Catch_; -use PhpParser\Node\Stmt\Throw_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ParametersAcceptorSelector; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ObjectType; -use PHPStan\Type\TypeWithClassName; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -29,9 +29,8 @@ final class ThrowWithPreviousExceptionRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var int */ @@ -99,7 +98,7 @@ public function refactor(Node $node) : ?Node } return $node; } - private function refactorThrow(Throw_ $throw, Variable $catchedThrowableVariable) : ?int + private function refactorThrow(Throw_ $throw, Variable $caughtThrowableVariable) : ?int { if (!$throw->expr instanceof New_) { return null; @@ -119,30 +118,33 @@ private function refactorThrow(Throw_ $throw, Variable $catchedThrowableVariable if (isset($new->getArgs()[$exceptionArgumentPosition])) { return null; } - if (!isset($new->getArgs()[0])) { + /** @var Arg|null $messageArgument */ + $messageArgument = $new->args[0] ?? null; + $shouldUseNamedArguments = $messageArgument instanceof Arg && $messageArgument->name instanceof Identifier; + if (!isset($new->args[0])) { // get previous message - $getMessageMethodCall = new MethodCall($catchedThrowableVariable, 'getMessage'); + $getMessageMethodCall = new MethodCall($caughtThrowableVariable, 'getMessage'); $new->args[0] = new Arg($getMessageMethodCall); + } elseif ($new->args[0] instanceof Arg && $new->args[0]->name instanceof Identifier && $new->args[0]->name->toString() === 'previous' && $this->nodeComparator->areNodesEqual($new->args[0]->value, $caughtThrowableVariable)) { + $new->args[0]->name->name = 'message'; + $new->args[0]->value = new MethodCall($caughtThrowableVariable, 'getMessage'); } - /** @var Arg $messageArgument */ - $messageArgument = $new->getArgs()[0]; - $shouldUseNamedArguments = $messageArgument->name !== null; if (!isset($new->getArgs()[1])) { // get previous code - $new->args[1] = new Arg(new MethodCall($catchedThrowableVariable, 'getCode'), \false, \false, [], $shouldUseNamedArguments ? new Identifier('code') : null); + $new->args[1] = new Arg(new MethodCall($caughtThrowableVariable, 'getCode'), \false, \false, [], $shouldUseNamedArguments ? new Identifier('code') : null); } /** @var Arg $arg1 */ $arg1 = $new->args[1]; if ($arg1->name instanceof Identifier && $arg1->name->toString() === 'previous') { - $new->args[1] = new Arg(new MethodCall($catchedThrowableVariable, 'getCode'), \false, \false, [], $shouldUseNamedArguments ? new Identifier('code') : null); + $new->args[1] = new Arg(new MethodCall($caughtThrowableVariable, 'getCode'), \false, \false, [], $shouldUseNamedArguments ? new Identifier('code') : null); $new->args[$exceptionArgumentPosition] = $arg1; } else { - $new->args[$exceptionArgumentPosition] = new Arg($catchedThrowableVariable, \false, \false, [], $shouldUseNamedArguments ? new Identifier('previous') : null); + $new->args[$exceptionArgumentPosition] = new Arg($caughtThrowableVariable, \false, \false, [], $shouldUseNamedArguments ? new Identifier('previous') : null); } // null the node, to fix broken format preserving printers, see https://github.com/rectorphp/rector/issues/5576 $new->setAttribute(AttributeKey::ORIGINAL_NODE, null); // nothing more to add - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } private function resolveExceptionArgumentPosition(Name $exceptionName) : ?int { @@ -160,10 +162,11 @@ private function resolveExceptionArgumentPosition(Name $exceptionName) : ?int return self::DEFAULT_EXCEPTION_ARGUMENT_POSITION; } $extendedMethodReflection = $classReflection->getConstructor(); - $parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); - foreach ($parametersAcceptorWithPhpDocs->getParameters() as $position => $parameterReflectionWithPhpDoc) { + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + foreach ($extendedParametersAcceptor->getParameters() as $position => $parameterReflectionWithPhpDoc) { $parameterType = $parameterReflectionWithPhpDoc->getType(); - if (!$parameterType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($parameterReflectionWithPhpDoc->getType()); + if ($className === null) { continue; } $objectType = new ObjectType('Throwable'); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/ClassConstFetch/ConvertStaticPrivateConstantToSelfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/ClassConstFetch/ConvertStaticPrivateConstantToSelfRector.php index 984158265..e12ba6ef7 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/ClassConstFetch/ConvertStaticPrivateConstantToSelfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/ClassConstFetch/ConvertStaticPrivateConstantToSelfRector.php @@ -91,11 +91,11 @@ private function isPrivateConstant(ClassConstFetch $classConstFetch, Class_ $cla if ($constantName === null) { return \false; } - foreach ($class->getConstants() as $classConst) { - if (!$this->nodeNameResolver->isName($classConst, $constantName)) { + foreach ($class->getConstants() as $constant) { + if (!$this->isName($constant, $constantName)) { continue; } - return $classConst->isPrivate(); + return $constant->isPrivate(); } return \false; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/ExplicitReturnNullRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/ExplicitReturnNullRector.php index 6cf5d3d16..229c07ba0 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/ExplicitReturnNullRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/ExplicitReturnNullRector.php @@ -12,10 +12,9 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\NullType; use PHPStan\Type\UnionType; -use PHPStan\Type\VoidType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; @@ -32,29 +31,24 @@ final class ExplicitReturnNullRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SilentVoidResolver */ - private $silentVoidResolver; + private SilentVoidResolver $silentVoidResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; public function __construct(SilentVoidResolver $silentVoidResolver, PhpDocInfoFactory $phpDocInfoFactory, TypeFactory $typeFactory, PhpDocTypeChanger $phpDocTypeChanger, ReturnTypeInferer $returnTypeInferer) { $this->silentVoidResolver = $silentVoidResolver; @@ -123,7 +117,7 @@ public function refactor(Node $node) : ?Node $hasChanged = \false; $this->traverseNodesWithCallable((array) $node->stmts, static function (Node $node) use(&$hasChanged) { if ($node instanceof Class_ || $node instanceof Function_ || $node instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($node instanceof Return_ && !$node->expr instanceof Expr) { $hasChanged = \true; @@ -156,7 +150,7 @@ private function transformDocUnionVoidToUnionNull($node) : void $newTypes = []; $hasChanged = \false; foreach ($returnType->getTypes() as $type) { - if ($type instanceof VoidType) { + if ($type->isVoid()->yes()) { $type = new NullType(); $hasChanged = \true; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php index 8eb831519..942fa787b 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php @@ -4,10 +4,11 @@ namespace Rector\CodeQuality\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; @@ -27,14 +28,12 @@ final class InlineArrayReturnAssignRector extends AbstractRector { /** * @readonly - * @var \Rector\CodeQuality\NodeAnalyzer\VariableDimFetchAssignResolver */ - private $variableDimFetchAssignResolver; + private VariableDimFetchAssignResolver $variableDimFetchAssignResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(VariableDimFetchAssignResolver $variableDimFetchAssignResolver, ValueResolver $valueResolver) { $this->variableDimFetchAssignResolver = $variableDimFetchAssignResolver; @@ -150,9 +149,7 @@ private function createArray(array $keysAndExprs) : Array_ */ private function areAssignExclusiveToDimFetch(array $stmts) : bool { - \end($stmts); - $lastKey = \key($stmts); - \reset($stmts); + $lastKey = \array_key_last($stmts); foreach ($stmts as $key => $stmt) { if ($key === $lastKey) { // skip last item @@ -165,6 +162,10 @@ private function areAssignExclusiveToDimFetch(array $stmts) : bool return \false; } $assign = $stmt->expr; + // skip new X instance with args to keep complex assign readable + if ($assign->expr instanceof New_ && !$assign->expr->isFirstClassCallable() && $assign->expr->getArgs() !== []) { + return \false; + } if (!$assign->var instanceof ArrayDimFetch) { return \false; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php index 00a1045ce..cab4d96d3 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php @@ -4,6 +4,7 @@ namespace Rector\CodeQuality\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; @@ -11,8 +12,12 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\NodeTraverser; +use PhpParser\NodeFinder; +use PhpParser\NodeVisitor; +use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; +use Rector\NodeCollector\NodeAnalyzer\ArrayCallableMethodMatcher; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Privatization\NodeManipulator\VisibilityManipulator; use Rector\Privatization\VisibilityGuard\ClassMethodVisibilityGuard; use Rector\Rector\AbstractRector; @@ -26,24 +31,26 @@ final class LocallyCalledStaticMethodToNonStaticRector extends AbstractRector { /** * @readonly - * @var \Rector\Privatization\VisibilityGuard\ClassMethodVisibilityGuard */ - private $classMethodVisibilityGuard; + private ClassMethodVisibilityGuard $classMethodVisibilityGuard; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; - public function __construct(ClassMethodVisibilityGuard $classMethodVisibilityGuard, VisibilityManipulator $visibilityManipulator, ReflectionResolver $reflectionResolver) + private ReflectionResolver $reflectionResolver; + /** + * @readonly + */ + private ArrayCallableMethodMatcher $arrayCallableMethodMatcher; + public function __construct(ClassMethodVisibilityGuard $classMethodVisibilityGuard, VisibilityManipulator $visibilityManipulator, ReflectionResolver $reflectionResolver, ArrayCallableMethodMatcher $arrayCallableMethodMatcher) { $this->classMethodVisibilityGuard = $classMethodVisibilityGuard; $this->visibilityManipulator = $visibilityManipulator; $this->reflectionResolver = $reflectionResolver; + $this->arrayCallableMethodMatcher = $arrayCallableMethodMatcher; } public function getRuleDefinition() : RuleDefinition { @@ -117,6 +124,9 @@ private function refactorClassMethod(Class_ $class, ClassMethod $classMethod) : if ($this->isClassMethodCalledInAnotherStaticClassMethod($class, $classMethod)) { return null; } + if ($this->isNeverCalled($class, $classMethod)) { + return null; + } // replace all the calls $classMethodName = $this->getName($classMethod); $className = $this->getName($class) ?? ''; @@ -134,10 +144,10 @@ private function refactorClassMethod(Class_ $class, ClassMethod $classMethod) : return null; } $shouldSkip = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); if ($shouldSkip) { - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; } @@ -171,13 +181,20 @@ private function isClassMethodCalledInAnotherStaticClassMethod(Class_ $class, Cl $currentClassNamespacedName = (string) $this->getName($class); $currentClassMethodName = $this->getName($classMethod); $isInsideStaticClassMethod = \false; - // check if called stati call somewhere in class, but only in static methods + // check if called static call somewhere in class, but only in static methods foreach ($class->getMethods() as $checkedClassMethod) { // not a problem if (!$checkedClassMethod->isStatic()) { continue; } $this->traverseNodesWithCallable($checkedClassMethod, function (Node $node) use($currentClassNamespacedName, $currentClassMethodName, &$isInsideStaticClassMethod) : ?int { + if ($node instanceof Array_) { + $scope = $node->getAttribute(AttributeKey::SCOPE); + if ($scope instanceof Scope && $this->arrayCallableMethodMatcher->match($node, $scope, $currentClassMethodName)) { + $isInsideStaticClassMethod = \true; + return NodeVisitor::STOP_TRAVERSAL; + } + } if (!$node instanceof StaticCall) { return null; } @@ -188,7 +205,7 @@ private function isClassMethodCalledInAnotherStaticClassMethod(Class_ $class, Cl return null; } $isInsideStaticClassMethod = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); if ($isInsideStaticClassMethod) { return $isInsideStaticClassMethod; @@ -196,4 +213,20 @@ private function isClassMethodCalledInAnotherStaticClassMethod(Class_ $class, Cl } return \false; } + /** + * In case of never called method call, + * it should be skipped and handled by another dead-code rule + */ + private function isNeverCalled(Class_ $class, ClassMethod $classMethod) : bool + { + $currentMethodName = $this->getName($classMethod); + $nodeFinder = new NodeFinder(); + $methodCall = $nodeFinder->findFirst($class, function (Node $node) use($currentMethodName) : bool { + if ($node instanceof MethodCall && $node->var instanceof Variable && $this->isName($node->var, 'this') && $this->isName($node->name, $currentMethodName)) { + return \true; + } + return $node instanceof StaticCall && $this->isNames($node->class, ['self', 'static']) && $this->isName($node->name, $currentMethodName); + }); + return !$methodCall instanceof Node; + } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php index 5230ed5ef..cfbe1deb5 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php @@ -18,35 +18,32 @@ use Rector\NodeTypeResolver\PHPStan\ParametersAcceptorSelectorVariantsWrapper; use Rector\Php80\NodeResolver\ArgumentSorter; use Rector\Php80\NodeResolver\RequireOptionalParamResolver; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\CodeQuality\Rector\ClassMethod\OptionalParametersAfterRequiredRector\OptionalParametersAfterRequiredRectorTest */ -final class OptionalParametersAfterRequiredRector extends AbstractScopeAwareRector +final class OptionalParametersAfterRequiredRector extends AbstractRector { /** * @readonly - * @var \Rector\Php80\NodeResolver\RequireOptionalParamResolver */ - private $requireOptionalParamResolver; + private RequireOptionalParamResolver $requireOptionalParamResolver; /** * @readonly - * @var \Rector\Php80\NodeResolver\ArgumentSorter */ - private $argumentSorter; + private ArgumentSorter $argumentSorter; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\CodingStyle\Reflection\VendorLocationDetector */ - private $vendorLocationDetector; + private VendorLocationDetector $vendorLocationDetector; /** * @var string */ @@ -89,8 +86,9 @@ public function getNodeTypes() : array * @param ClassMethod|Function_|New_|MethodCall|StaticCall|FuncCall $node * @return \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|null|\PhpParser\Node\Expr\New_|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\FuncCall */ - public function refactorWithScope(Node $node, Scope $scope) + public function refactor(Node $node) { + $scope = ScopeFetcher::fetch($node); if ($node instanceof ClassMethod || $node instanceof Function_) { return $this->refactorClassMethodOrFunction($node, $scope); } @@ -114,7 +112,7 @@ private function refactorClassMethodOrFunction($node, Scope $scope) if ($node instanceof ClassMethod) { $reflection = $this->reflectionResolver->resolveMethodReflectionFromClassMethod($node, $scope); } else { - $reflection = $this->reflectionResolver->resolveFunctionReflectionFromFunction($node, $scope); + $reflection = $this->reflectionResolver->resolveFunctionReflectionFromFunction($node); } if (!$reflection instanceof MethodReflection && !$reflection instanceof FunctionReflection) { return null; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Class_/CompleteDynamicPropertiesRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/CompleteDynamicPropertiesRector.php index a08968657..0bee79719 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Class_/CompleteDynamicPropertiesRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/CompleteDynamicPropertiesRector.php @@ -27,39 +27,32 @@ final class CompleteDynamicPropertiesRector extends AbstractRector { /** * @readonly - * @var \Rector\CodeQuality\NodeFactory\MissingPropertiesFactory */ - private $missingPropertiesFactory; + private MissingPropertiesFactory $missingPropertiesFactory; /** * @readonly - * @var \Rector\CodeQuality\NodeAnalyzer\LocalPropertyAnalyzer */ - private $localPropertyAnalyzer; + private LocalPropertyAnalyzer $localPropertyAnalyzer; /** * @readonly - * @var \Rector\CodeQuality\NodeAnalyzer\ClassLikeAnalyzer */ - private $classLikeAnalyzer; + private ClassLikeAnalyzer $classLikeAnalyzer; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyPresenceChecker */ - private $propertyPresenceChecker; + private PropertyPresenceChecker $propertyPresenceChecker; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; public function __construct(MissingPropertiesFactory $missingPropertiesFactory, LocalPropertyAnalyzer $localPropertyAnalyzer, ClassLikeAnalyzer $classLikeAnalyzer, ReflectionProvider $reflectionProvider, ClassAnalyzer $classAnalyzer, PropertyPresenceChecker $propertyPresenceChecker, PhpAttributeAnalyzer $phpAttributeAnalyzer) { $this->missingPropertiesFactory = $missingPropertiesFactory; @@ -139,7 +132,7 @@ private function shouldSkipClass(Class_ $class) : bool if ($this->classAnalyzer->isAnonymousClass($class)) { return \true; } - $className = (string) $this->nodeNameResolver->getName($class); + $className = (string) $this->getName($class); if (!$this->reflectionProvider->hasClass($className)) { return \true; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php index 8829edb50..daf67aa05 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/DynamicDocBlockPropertyToNativePropertyRector.php @@ -31,39 +31,32 @@ final class DynamicDocBlockPropertyToNativePropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\CodeQuality\NodeFactory\TypedPropertyFactory */ - private $typedPropertyFactory; + private TypedPropertyFactory $typedPropertyFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(PhpAttributeAnalyzer $phpAttributeAnalyzer, PhpDocInfoFactory $phpDocInfoFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, TypedPropertyFactory $typedPropertyFactory, TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver) { $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; @@ -173,10 +166,10 @@ private function createNewPropertyFromPropertyTagValueNodes(array $propertyPhpDo continue; } // is property already defined? - if ($class->getProperty($propertyName)) { - // improve exising one type if needed + if ($class->getProperty($propertyName) instanceof Property) { + // improve existing one type if needed $existingProperty = $class->getProperty($propertyName); - if ($existingProperty->type !== null) { + if ($existingProperty->type instanceof Node) { continue; } $defaultValue = $existingProperty->props[0]->default; @@ -209,7 +202,7 @@ private function isPromotedProperty(Class_ $class, string $propertyName) : bool $constructClassMethod = $class->getMethod(MethodName::CONSTRUCT); if ($constructClassMethod instanceof ClassMethod) { foreach ($constructClassMethod->params as $param) { - if (!$param->flags) { + if (!$param->isPromoted()) { continue; } $paramName = $this->getName($param->var); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Class_/InlineConstructorDefaultToPropertyRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/InlineConstructorDefaultToPropertyRector.php index e04871bc0..35454da3f 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Class_/InlineConstructorDefaultToPropertyRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Class_/InlineConstructorDefaultToPropertyRector.php @@ -24,9 +24,8 @@ final class InlineConstructorDefaultToPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; @@ -112,10 +111,10 @@ private function matchAssignedLocalPropertyName(Assign $assign) : ?string return null; } $propertyFetch = $assign->var; - if (!$this->nodeNameResolver->isName($propertyFetch->var, 'this')) { + if (!$this->isName($propertyFetch->var, 'this')) { return null; } - $propertyName = $this->nodeNameResolver->getName($propertyFetch->name); + $propertyName = $this->getName($propertyFetch->name); if (!\is_string($propertyName)) { return null; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php index 6a411353d..e3a0b156e 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\Concat; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Scalar\String_; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php index 21bfebb46..fa27368fb 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php @@ -17,12 +17,13 @@ use PhpParser\Node\Stmt\Property; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; -use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; +use PHPStan\Type\Type; use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\Php\ReservedKeywordAnalyzer; use Rector\PhpParser\AstResolver; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\AllAssignNodePropertyTypeInferer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -30,33 +31,28 @@ /** * @see \Rector\Tests\CodeQuality\Rector\Empty_\SimplifyEmptyCheckOnEmptyArrayRector\SimplifyEmptyCheckOnEmptyArrayRectorTest */ -final class SimplifyEmptyCheckOnEmptyArrayRector extends AbstractScopeAwareRector +final class SimplifyEmptyCheckOnEmptyArrayRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\AllAssignNodePropertyTypeInferer */ - private $allAssignNodePropertyTypeInferer; + private AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer; /** * @readonly - * @var \Rector\Php\ReservedKeywordAnalyzer */ - private $reservedKeywordAnalyzer; + private ReservedKeywordAnalyzer $reservedKeywordAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer, ReflectionResolver $reflectionResolver, AstResolver $astResolver, AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer, ReservedKeywordAnalyzer $reservedKeywordAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; @@ -91,8 +87,9 @@ public function getNodeTypes() : array /** * @param Empty_|BooleanNot $node $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($node instanceof BooleanNot) { if ($node->expr instanceof Empty_ && $this->isAllowedExpr($node->expr->expr, $scope)) { return new NotIdentical($node->expr->expr, new Array_()); @@ -113,7 +110,7 @@ private function isAllowedVariable(Variable $variable) : bool } private function isAllowedExpr(Expr $expr, Scope $scope) : bool { - if (!$scope->getType($expr) instanceof ArrayType) { + if (!$scope->getType($expr)->isArray()->yes()) { return \false; } if ($expr instanceof Variable) { @@ -136,7 +133,7 @@ private function isAllowedExpr(Expr $expr, Scope $scope) : bool $phpPropertyReflection = $classReflection->getNativeProperty($propertyName); $nativeType = $phpPropertyReflection->getNativeType(); if (!$nativeType instanceof MixedType) { - return $nativeType instanceof ArrayType; + return $nativeType->isArray()->yes(); } $property = $this->astResolver->resolvePropertyFromPropertyReflection($phpPropertyReflection); /** @@ -149,6 +146,9 @@ private function isAllowedExpr(Expr $expr, Scope $scope) : bool return \false; } $type = $this->allAssignNodePropertyTypeInferer->inferProperty($property, $classReflection, $this->file); - return $type instanceof ArrayType; + if (!$type instanceof Type) { + return \false; + } + return $type->isArray()->yes(); } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php index c8f08e1da..0f0c5ba8c 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php @@ -4,12 +4,12 @@ namespace Rector\CodeQuality\Rector\Equal; use PhpParser\Node; +use PhpParser\Node\Expr\ArrayDimFetch; 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\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,7 +26,7 @@ class SomeClass public function run(int $firstValue, int $secondValue) { $isSame = $firstValue == $secondValue; - $isDiffernt = $firstValue != $secondValue; + $isDifferent = $firstValue != $secondValue; } } CODE_SAMPLE @@ -36,7 +36,7 @@ class SomeClass public function run(int $firstValue, int $secondValue) { $isSame = $firstValue === $secondValue; - $isDiffernt = $firstValue !== $secondValue; + $isDifferent = $firstValue !== $secondValue; } } CODE_SAMPLE @@ -54,10 +54,13 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { + if ($node->left instanceof ArrayDimFetch || $node->right instanceof ArrayDimFetch) { + return null; + } $leftStaticType = $this->nodeTypeResolver->getNativeType($node->left); $rightStaticType = $this->nodeTypeResolver->getNativeType($node->right); // objects can be different by content - if ($leftStaticType instanceof ObjectType || $rightStaticType instanceof ObjectType) { + if (!$leftStaticType->isObject()->no() || !$rightStaticType->isObject()->no()) { return null; } if ($leftStaticType instanceof MixedType || $rightStaticType instanceof MixedType) { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Expression/InlineIfToExplicitIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Expression/InlineIfToExplicitIfRector.php index ce0f33ddc..9ea6e00bb 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Expression/InlineIfToExplicitIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Expression/InlineIfToExplicitIfRector.php @@ -22,9 +22,8 @@ final class InlineIfToExplicitIfRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; public function __construct(BinaryOpManipulator $binaryOpManipulator) { $this->binaryOpManipulator = $binaryOpManipulator; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php index f5e838c34..48643a825 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php @@ -9,21 +9,19 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; -use PHPStan\Analyser\Scope; use Rector\NodeAnalyzer\ExprAnalyzer; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\CodeQuality\Rector\Expression\TernaryFalseExpressionToIfRector\TernaryFalseExpressionToIfRectorTest */ -final class TernaryFalseExpressionToIfRector extends AbstractScopeAwareRector +final class TernaryFalseExpressionToIfRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; @@ -62,7 +60,7 @@ public function getNodeTypes() : array /** * @param Expression $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { if (!$node->expr instanceof Ternary) { return null; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/For_/ForRepeatedCountToOwnVariableRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/For_/ForRepeatedCountToOwnVariableRector.php index 2502cb38b..ce8320d11 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/For_/ForRepeatedCountToOwnVariableRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/For_/ForRepeatedCountToOwnVariableRector.php @@ -13,14 +13,14 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\For_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\CodeQuality\Rector\For_\ForRepeatedCountToOwnVariableRector\ForRepeatedCountToOwnVariableRectorTest */ -final class ForRepeatedCountToOwnVariableRector extends AbstractScopeAwareRector +final class ForRepeatedCountToOwnVariableRector extends AbstractRector { /** * @var string @@ -64,8 +64,9 @@ public function getNodeTypes() : array * @param For_ $node * @return Stmt[]|null */ - public function refactorWithScope(Node $node, Scope $scope) : ?array + public function refactor(Node $node) : ?array { + $scope = ScopeFetcher::fetch($node); if ($scope->hasVariableType(self::COUNTER_NAME)->yes()) { return null; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php index e8d8eac7d..10c409cec 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php @@ -5,15 +5,17 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Foreach_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\CodeQuality\NodeAnalyzer\ForeachAnalyzer; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -25,18 +27,21 @@ final class ForeachItemsAssignToEmptyArrayToAssignRector extends AbstractRector { /** * @readonly - * @var \Rector\CodeQuality\NodeAnalyzer\ForeachAnalyzer */ - private $foreachAnalyzer; + private ForeachAnalyzer $foreachAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - public function __construct(ForeachAnalyzer $foreachAnalyzer, ValueResolver $valueResolver) + private ValueResolver $valueResolver; + /** + * @readonly + */ + private ExprAnalyzer $exprAnalyzer; + public function __construct(ForeachAnalyzer $foreachAnalyzer, ValueResolver $valueResolver, ExprAnalyzer $exprAnalyzer) { $this->foreachAnalyzer = $foreachAnalyzer; $this->valueResolver = $valueResolver; + $this->exprAnalyzer = $exprAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -116,12 +121,12 @@ private function isAppend(Stmt $stmt, array $emptyArrayVariables) : bool if ($subNode instanceof Assign && $subNode->var instanceof ArrayDimFetch) { $isAppend = $this->isNames($subNode->var->var, $emptyArrayVariables); if ($isAppend) { - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } } if ($subNode instanceof Assign && $subNode->var instanceof Variable && $this->isNames($subNode->var, $emptyArrayVariables) && !$this->valueResolver->isValue($subNode->expr, [])) { $isAppend = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; }); @@ -155,10 +160,16 @@ private function matchEmptyArrayVariableAssign(Stmt $stmt) : ?string if (!$assign->var instanceof Variable) { return null; } + if (!$assign->expr instanceof Array_) { + return null; + } // must be assign of empty array if (!$this->valueResolver->isValue($assign->expr, [])) { return null; } + if ($this->exprAnalyzer->isDynamicArray($assign->expr)) { + return null; + } return $this->getName($assign->var); } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php index 4cf9b2b8c..cc1b238c6 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php @@ -28,19 +28,16 @@ final class ForeachToInArrayRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \PhpParser\NodeFinder */ - private $nodeFinder; + private NodeFinder $nodeFinder; public function __construct(BinaryOpManipulator $binaryOpManipulator, ValueResolver $valueResolver, NodeFinder $nodeFinder) { $this->binaryOpManipulator = $binaryOpManipulator; @@ -165,20 +162,18 @@ private function shouldSkipIf(If_ $if) : bool */ private function matchNodes($binaryOp, Expr $expr) : ?TwoNodeMatch { - return $this->binaryOpManipulator->matchFirstAndSecondConditionNode($binaryOp, Variable::class, function (Node $node, Node $otherNode) use($expr) : bool { - return $this->nodeComparator->areNodesEqual($otherNode, $expr); - }); + return $this->binaryOpManipulator->matchFirstAndSecondConditionNode($binaryOp, Variable::class, fn(Node $node, Node $otherNode): bool => $this->nodeComparator->areNodesEqual($otherNode, $expr)); } private function isIfBodyABoolReturnNode(If_ $if) : bool { - $ifStatment = $if->stmts[0]; - if (!$ifStatment instanceof Return_) { + $ifStatement = $if->stmts[0]; + if (!$ifStatement instanceof Return_) { return \false; } - if (!$ifStatment->expr instanceof Expr) { + if (!$ifStatement->expr instanceof Expr) { return \false; } - return $this->valueResolver->isTrueOrFalse($ifStatment->expr); + return $this->valueResolver->isTrueOrFalse($ifStatement->expr); } /** * @param \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BinaryOp\Equal $binaryOp diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php index b09ee4db5..c09b1167b 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php @@ -4,9 +4,9 @@ namespace Rector\CodeQuality\Rector\Foreach_; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; -use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; +use PhpParser\Node\Expr\List_; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Foreach_; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; @@ -23,19 +23,16 @@ final class UnusedForeachValueToArrayKeysRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\ExprUsedInNodeAnalyzer */ - private $exprUsedInNodeAnalyzer; + private ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; public function __construct(ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer, BetterNodeFinder $betterNodeFinder, StmtsManipulator $stmtsManipulator) { $this->exprUsedInNodeAnalyzer = $exprUsedInNodeAnalyzer; @@ -98,13 +95,14 @@ public function refactor(Node $node) : ?Node continue; } // special case of nested array items - if ($stmt->valueVar instanceof Array_) { + if ($stmt->valueVar instanceof List_) { $valueArray = $this->refactorArrayForeachValue($stmt->valueVar, $stmt); - if ($valueArray instanceof Array_) { - $stmt->valueVar = $valueArray; + if (!$valueArray instanceof List_) { + continue; } + $stmt->valueVar = $valueArray; // not sure what does this mean :) - if ($stmt->valueVar->items !== []) { + if ($valueArray->items !== []) { continue; } $hasChanged = \true; @@ -117,7 +115,7 @@ public function refactor(Node $node) : ?Node if ($this->isVariableUsedInForeach($stmt->valueVar, $stmt)) { continue; } - if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmts, $key + 1, (string) $this->getName($stmt->valueVar))) { + if ($this->stmtsManipulator->isVariableUsedInNextStmt($node, $key + 1, (string) $this->getName($stmt->valueVar))) { continue; } $hasChanged = \true; @@ -131,10 +129,10 @@ public function refactor(Node $node) : ?Node /** * @param int[] $removedKeys */ - private function isArrayItemsRemovalWithoutChangingOrder(Array_ $array, array $removedKeys) : bool + private function isArrayItemsRemovalWithoutChangingOrder(List_ $list, array $removedKeys) : bool { $hasRemovingStarted = \false; - foreach (\array_keys($array->items) as $key) { + foreach (\array_keys($list->items) as $key) { if (\in_array($key, $removedKeys, \true)) { $hasRemovingStarted = \true; } elseif ($hasRemovingStarted) { @@ -144,11 +142,11 @@ private function isArrayItemsRemovalWithoutChangingOrder(Array_ $array, array $r } return \true; } - private function refactorArrayForeachValue(Array_ $array, Foreach_ $foreach) : ?Array_ + private function refactorArrayForeachValue(List_ $list, Foreach_ $foreach) : ?List_ { // only last items can be removed, without changing the order $removedKeys = []; - foreach ($array->items as $key => $arrayItem) { + foreach ($list->items as $key => $arrayItem) { if (!$arrayItem instanceof ArrayItem) { // only known values can be processes return null; @@ -163,20 +161,18 @@ private function refactorArrayForeachValue(Array_ $array, Foreach_ $foreach) : ? } $removedKeys[] = $key; } - if (!$this->isArrayItemsRemovalWithoutChangingOrder($array, $removedKeys)) { + if (!$this->isArrayItemsRemovalWithoutChangingOrder($list, $removedKeys)) { return null; } // clear removed items foreach ($removedKeys as $removedKey) { - unset($array->items[$removedKey]); + unset($list->items[$removedKey]); } - return $array; + return $list; } private function isVariableUsedInForeach(Variable $variable, Foreach_ $foreach) : bool { - return (bool) $this->betterNodeFinder->findFirst($foreach->stmts, function (Node $node) use($variable) : bool { - return $this->exprUsedInNodeAnalyzer->isUsed($node, $variable); - }); + return (bool) $this->betterNodeFinder->findFirst($foreach->stmts, fn(Node $node): bool => $this->exprUsedInNodeAnalyzer->isUsed($node, $variable)); } private function removeForeachValueAndUseArrayKeys(Foreach_ $foreach, Expr $keyVarExpr) : void { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/ArrayMergeOfNonArraysToSimpleArrayRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/ArrayMergeOfNonArraysToSimpleArrayRector.php index 683b86a56..33fb31f5a 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/ArrayMergeOfNonArraysToSimpleArrayRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/ArrayMergeOfNonArraysToSimpleArrayRector.php @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CallUserFuncWithArrowFunctionToInlineRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CallUserFuncWithArrowFunctionToInlineRector.php index 188b19308..3403bca73 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CallUserFuncWithArrowFunctionToInlineRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CallUserFuncWithArrowFunctionToInlineRector.php @@ -19,16 +19,15 @@ final class CallUserFuncWithArrowFunctionToInlineRector extends AbstractRector { /** * @readonly - * @var \Rector\Php74\NodeAnalyzer\ClosureArrowFunctionAnalyzer */ - private $closureArrowFunctionAnalyzer; + private ClosureArrowFunctionAnalyzer $closureArrowFunctionAnalyzer; public function __construct(ClosureArrowFunctionAnalyzer $closureArrowFunctionAnalyzer) { $this->closureArrowFunctionAnalyzer = $closureArrowFunctionAnalyzer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Refactor call_user_func() with arrow function to direct call', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Refactor `call_user_func()` with arrow function to direct call', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CompactToVariablesRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CompactToVariablesRector.php index 4aae925a6..7658156fb 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CompactToVariablesRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/CompactToVariablesRector.php @@ -4,8 +4,8 @@ namespace Rector\CodeQuality\Rector\FuncCall; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; @@ -23,16 +23,15 @@ final class CompactToVariablesRector extends AbstractRector { /** * @readonly - * @var \Rector\CodeQuality\CompactConverter */ - private $compactConverter; + private CompactConverter $compactConverter; public function __construct(CompactConverter $compactConverter) { $this->compactConverter = $compactConverter; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change compact() call to own array', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `compact()` call to own array', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() @@ -85,7 +84,7 @@ public function refactor(Node $node) : ?Node if (!$firstValueStaticType instanceof ConstantArrayType) { return null; } - if ($firstValueStaticType->getItemType() instanceof MixedType) { + if ($firstValueStaticType->getIterableValueType() instanceof MixedType) { return null; } return $this->refactorAssignArray($firstValueStaticType); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/InlineIsAInstanceOfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/InlineIsAInstanceOfRector.php index 231f9af54..ce288e1ca 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/InlineIsAInstanceOfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/InlineIsAInstanceOfRector.php @@ -13,8 +13,8 @@ use PHPStan\Type\Generic\GenericClassStringType; use PHPStan\Type\ObjectType; use PHPStan\Type\ObjectWithoutClassType; -use PHPStan\Type\TypeWithClassName; use Rector\Rector\AbstractRector; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -24,7 +24,7 @@ final class InlineIsAInstanceOfRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change is_a() with object and class name check to instanceof', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `is_a()` with object and class name check to `instanceof`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run(object $object) @@ -88,10 +88,7 @@ private function resolveClassName(Expr $expr) : ?string if ($type instanceof GenericClassStringType) { $type = $type->getGenericType(); } - if (!$type instanceof TypeWithClassName) { - return null; - } - return $type->getClassName(); + return ClassNameFromObjectTypeResolver::resolve($type); } private function isFirstObjectType(Expr $expr) : bool { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/RemoveSoleValueSprintfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/RemoveSoleValueSprintfRector.php index 71acbfdb6..3bdc47bcb 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/RemoveSoleValueSprintfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/RemoveSoleValueSprintfRector.php @@ -16,7 +16,7 @@ final class RemoveSoleValueSprintfRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Remove sprintf() wrapper if not needed', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove `sprintf()` wrapper if not needed', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php index a5b5512d6..0884f7d3d 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Cast\Array_; @@ -17,7 +17,7 @@ use PhpParser\Node\Expr\Cast\String_; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Stmt\Expression; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -29,9 +29,8 @@ final class SetTypeToCastRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var array> */ @@ -46,7 +45,7 @@ public function __construct(ValueResolver $valueResolver) } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Changes settype() to (type) where possible', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `settype()` to `(type)` where possible', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run($foo) @@ -78,7 +77,7 @@ public function getNodeTypes() : array return [FuncCall::class, Expression::class, Assign::class, ArrayItem::class, Arg::class]; } /** - * @param FuncCall|Expression|Assign|Expr\ArrayItem|Node\Arg $node + * @param FuncCall|Expression|Assign|ArrayItem|Node\Arg $node * @return null|int|\PhpParser\Node\Stmt\Expression|\PhpParser\Node\Expr\Assign|\PhpParser\Node\Expr\Cast */ public function refactor(Node $node) @@ -93,7 +92,7 @@ public function refactor(Node $node) if (!$this->isSetTypeFuncCall($node->expr)) { return null; } - return NodeTraverser::DONT_TRAVERSE_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CHILDREN; } if ($node instanceof Expression) { if (!$node->expr instanceof FuncCall) { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php index 877da71b9..0b4040a3d 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyRegexPatternRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\FuncCall; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Scalar\String_; use Rector\NodeNameResolver\Regex\RegexPatternDetector; @@ -17,9 +17,8 @@ final class SimplifyRegexPatternRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeNameResolver\Regex\RegexPatternDetector */ - private $regexPatternDetector; + private RegexPatternDetector $regexPatternDetector; /** * @var array */ diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php index f0c997963..b26147ded 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SimplifyStrposLowerRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\FuncCall; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SingleInArrayToCompareRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SingleInArrayToCompareRector.php index 78205b235..6b018240b 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SingleInArrayToCompareRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SingleInArrayToCompareRector.php @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\BinaryOp\Equal; use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\BinaryOp\NotEqual; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/UnwrapSprintfOneArgumentRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/UnwrapSprintfOneArgumentRector.php index e278a1399..c624979ce 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/UnwrapSprintfOneArgumentRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/UnwrapSprintfOneArgumentRector.php @@ -15,7 +15,7 @@ final class UnwrapSprintfOneArgumentRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('unwrap sprintf() with one argument', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Unwrap `sprintf()` with one argument', [new CodeSample(<<<'CODE_SAMPLE' echo sprintf('value'); CODE_SAMPLE , <<<'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 e755d08e0..f65b7decb 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php @@ -7,6 +7,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\AssignOp; +use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; @@ -29,33 +30,26 @@ final class SimplifyUselessVariableRector extends AbstractRector implements Conf { /** * @readonly - * @var \Rector\PhpParser\Node\AssignAndBinaryMap */ - private $assignAndBinaryMap; + private AssignAndBinaryMap $assignAndBinaryMap; /** * @readonly - * @var \Rector\NodeAnalyzer\VariableAnalyzer */ - private $variableAnalyzer; + private VariableAnalyzer $variableAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\CallAnalyzer */ - private $callAnalyzer; + private CallAnalyzer $callAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @api * @var string */ public const ONLY_DIRECT_ASSIGN = 'only_direct_assign'; - /** - * @var bool - */ - private $onlyDirectAssign = \false; + private bool $onlyDirectAssign = \false; public function __construct(AssignAndBinaryMap $assignAndBinaryMap, VariableAnalyzer $variableAnalyzer, CallAnalyzer $callAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->assignAndBinaryMap = $assignAndBinaryMap; @@ -69,7 +63,7 @@ public function configure(array $configuration) : void } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Removes useless variable assigns', [new ConfiguredCodeSample( + return new RuleDefinition('Remove useless variable assigns', [new ConfiguredCodeSample( <<<'CODE_SAMPLE' function () { $a = true; @@ -178,6 +172,9 @@ private function shouldSkipStmt(Return_ $return, Stmt $previousStmt) : bool if ($this->onlyDirectAssign && $previousNode instanceof AssignOp) { return \true; } + if ($previousNode instanceof AssignOp && $previousNode->expr instanceof Ternary) { + return \true; + } $variable = $return->expr; // is the same variable if (!$this->nodeComparator->areNodesEqual($previousNode->var, $variable)) { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php index 668fdeaf9..0a0d72e41 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php @@ -13,6 +13,7 @@ use PHPStan\Type\ObjectType; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; +use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; use Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -24,14 +25,12 @@ final class FlipTypeControlToUseExclusiveTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer */ - private $nullableTypeAnalyzer; + private NullableTypeAnalyzer $nullableTypeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(NullableTypeAnalyzer $nullableTypeAnalyzer, ValueResolver $valueResolver) { $this->nullableTypeAnalyzer = $nullableTypeAnalyzer; @@ -85,7 +84,7 @@ public function refactor(Node $node) : ?Node */ private function processConvertToExclusiveType(ObjectType $objectType, Expr $expr, $binaryOp) { - $fullyQualifiedType = $objectType instanceof ShortenedObjectType ? $objectType->getFullyQualifiedName() : $objectType->getClassName(); + $fullyQualifiedType = $objectType instanceof ShortenedObjectType || $objectType instanceof AliasedObjectType ? $objectType->getFullyQualifiedName() : $objectType->getClassName(); $instanceof = new Instanceof_($expr, new FullyQualified($fullyQualifiedType)); if ($binaryOp instanceof NotIdentical) { return $instanceof; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php index c9d75bd8c..4eac89b85 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php @@ -22,14 +22,12 @@ final class SimplifyArraySearchRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(BinaryOpManipulator $binaryOpManipulator, ValueResolver $valueResolver) { $this->binaryOpManipulator = $binaryOpManipulator; @@ -55,10 +53,8 @@ public function refactor(Node $node) : ?Node if (!$node instanceof FuncCall) { return \false; } - return $this->nodeNameResolver->isName($node, 'array_search'); - }, function (Node $node) : bool { - return $node instanceof Expr && $this->valueResolver->isFalse($node); - }); + return $this->isName($node, 'array_search'); + }, fn(Node $node): bool => $node instanceof Expr && $this->valueResolver->isFalse($node)); if (!$twoNodeMatch instanceof TwoNodeMatch) { return null; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php index 065652184..6984cbe67 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php @@ -19,9 +19,8 @@ final class SimplifyBoolIdenticalTrueRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php index 92fd980c6..f3a756748 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php @@ -24,19 +24,16 @@ final class SimplifyConditionsRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\AssignAndBinaryMap */ - private $assignAndBinaryMap; + private AssignAndBinaryMap $assignAndBinaryMap; /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(AssignAndBinaryMap $assignAndBinaryMap, BinaryOpManipulator $binaryOpManipulator, ValueResolver $valueResolver) { $this->assignAndBinaryMap = $assignAndBinaryMap; @@ -76,11 +73,7 @@ private function processBooleanNot(BooleanNot $booleanNot) : ?Node } private function processIdenticalAndNotIdentical(Identical $identical) : ?Node { - $twoNodeMatch = $this->binaryOpManipulator->matchFirstAndSecondConditionNode($identical, static function (Node $node) : bool { - return $node instanceof Identical || $node instanceof NotIdentical; - }, function (Node $node) : bool { - return $node instanceof Expr && $this->valueResolver->isTrueOrFalse($node); - }); + $twoNodeMatch = $this->binaryOpManipulator->matchFirstAndSecondConditionNode($identical, static fn(Node $node): bool => $node instanceof Identical || $node instanceof NotIdentical, fn(Node $node): bool => $node instanceof Expr && $this->valueResolver->isTrueOrFalse($node)); if (!$twoNodeMatch instanceof TwoNodeMatch) { return $twoNodeMatch; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php index a1ed43b33..bb33461cc 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php @@ -19,9 +19,8 @@ final class StrlenZeroToIdenticalEmptyStringRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php index 1b0c674da..abe32995d 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php @@ -4,6 +4,7 @@ namespace Rector\CodeQuality\Rector\If_; use PhpParser\Node; +use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\If_; @@ -22,14 +23,12 @@ final class CombineIfRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\Comment\CommentsMerger */ - private $commentsMerger; + private CommentsMerger $commentsMerger; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(CommentsMerger $commentsMerger, PhpDocInfoFactory $phpDocInfoFactory) { $this->commentsMerger = $commentsMerger; @@ -37,7 +36,7 @@ public function __construct(CommentsMerger $commentsMerger, PhpDocInfoFactory $p } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Merges nested if statements', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Merge nested if statements', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() @@ -84,6 +83,13 @@ public function refactor(Node $node) : ?Node return null; } $node->cond->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $cond = $node->cond; + while ($cond instanceof BinaryOp) { + if (!$cond->right instanceof BinaryOp) { + $cond->right->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } + $cond = $cond->right; + } $node->cond = new BooleanAnd($node->cond, $subIf->cond); $node->stmts = $subIf->stmts; $this->commentsMerger->keepComments($node, [$subIf]); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php index 70ea3da6a..8fdc6fa56 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php @@ -82,7 +82,7 @@ private function isIfConditionFollowedByOpeningCurlyBracket($if, array $oldToken if ($i === $condEndTokenPos) { return \false; } - if (\in_array($oldTokens[$i], ['{', ':'], \true)) { + if (\in_array((string) $oldTokens[$i], ['{', ':'], \true)) { // all good return \true; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php index 941aa0049..a7ea526fe 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php @@ -6,11 +6,11 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Coalesce; -use PhpParser\Node\Expr\Throw_ as ExprThrow_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; -use PhpParser\Node\Stmt\Throw_; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\NodeManipulator\IfManipulator; use Rector\PhpParser\Node\Value\ValueResolver; @@ -26,14 +26,12 @@ final class ConsecutiveNullCompareReturnsToNullCoalesceQueueRector extends Abstr { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(IfManipulator $ifManipulator, ValueResolver $valueResolver) { $this->ifManipulator = $ifManipulator; @@ -117,9 +115,9 @@ public function refactor(Node $node) : ?Node if (!$hasChanged) { continue; } - if ($stmt instanceof Throw_) { + if ($stmt instanceof Expression && $stmt->expr instanceof Throw_) { unset($node->stmts[$key]); - $appendExpr = new ExprThrow_($stmt->expr); + $appendExpr = $stmt->expr; continue; } if (!$this->isReturnNull($stmt)) { @@ -129,7 +127,7 @@ public function refactor(Node $node) : ?Node continue; } $node->stmts = $originalStmts; - return $node; + return null; } unset($node->stmts[$key]); } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php index 800f1c9ab..b3bcc0396 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php @@ -18,8 +18,8 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\ElseIf_; @@ -40,19 +40,16 @@ final class ExplicitBoolCompareRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer */ - private $stringTypeAnalyzer; + private StringTypeAnalyzer $stringTypeAnalyzer; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeAnalyzer\ArrayTypeAnalyzer */ - private $arrayTypeAnalyzer; + private ArrayTypeAnalyzer $arrayTypeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(StringTypeAnalyzer $stringTypeAnalyzer, ArrayTypeAnalyzer $arrayTypeAnalyzer, ValueResolver $valueResolver) { $this->stringTypeAnalyzer = $stringTypeAnalyzer; @@ -132,7 +129,7 @@ public function refactor(Node $node) } private function resolveNewConditionNode(Expr $expr, bool $isNegated) : ?BinaryOp { - if ($expr instanceof FuncCall && $this->nodeNameResolver->isName($expr, 'count')) { + if ($expr instanceof FuncCall && $this->isName($expr, 'count')) { return $this->resolveCount($isNegated, $expr); } if ($this->arrayTypeAnalyzer->isArrayType($expr)) { @@ -165,12 +162,12 @@ private function resolveCount(bool $isNegated, FuncCall $funcCall) if ($countedType->isArray()->yes()) { return null; } - $lNumber = new LNumber(0); + $int = new Int_(0); // compare === 0, assumption if ($isNegated) { - return new Identical($funcCall, $lNumber); + return new Identical($funcCall, $int); } - return new Greater($funcCall, $lNumber); + return new Greater($funcCall, $int); } /** * @return Identical|NotIdentical|null @@ -214,7 +211,7 @@ private function resolveIdentical(Expr $expr, bool $isNegated, String_ $string) /** * // compare === '' * - * @var Identical|NotIdentical $identical + * @var Identical|NotIdentical */ $identical = $isNegated ? new Identical($expr, $string) : new NotIdentical($expr, $string); return $identical; @@ -234,22 +231,22 @@ private function resolveZeroIdenticalstring($identical, bool $isNegated, Expr $e */ private function resolveInteger(bool $isNegated, Expr $expr) { - $lNumber = new LNumber(0); + $int = new Int_(0); if ($isNegated) { - return new Identical($expr, $lNumber); + return new Identical($expr, $int); } - return new NotIdentical($expr, $lNumber); + return new NotIdentical($expr, $int); } /** * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BinaryOp\NotIdentical */ private function resolveFloat(bool $isNegated, Expr $expr) { - $dNumber = new DNumber(0.0); + $float = new Float_(0.0); if ($isNegated) { - return new Identical($expr, $dNumber); + return new Identical($expr, $float); } - return new NotIdentical($expr, $dNumber); + return new NotIdentical($expr, $float); } /** * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BinaryOp\NotIdentical diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ShortenElseIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ShortenElseIfRector.php index 0065e74f5..94c018def 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ShortenElseIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ShortenElseIfRector.php @@ -19,7 +19,7 @@ final class ShortenElseIfRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Shortens else/if to elseif', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Shorten `else`/`if` to `elseif`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php index 9ec551b6d..802724982 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php @@ -6,11 +6,13 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\Printer\BetterStandardPrinter; use Rector\Rector\AbstractRector; @@ -23,14 +25,12 @@ final class SimplifyIfElseToTernaryRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @var int */ @@ -113,6 +113,9 @@ public function refactor(Node $node) : ?Node if ($this->isNodeTooLong($assign)) { return null; } + if ($ternary->cond instanceof BinaryOp) { + $ternary->cond->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } $expression = new Expression($assign); $this->mirrorComments($expression, $node); return $expression; @@ -147,6 +150,9 @@ private function resolveOnlyStmtAssignExpr(array $stmts) : ?Expr if (!$stmt instanceof Expression) { return null; } + if ($stmt->getComments() !== []) { + return null; + } $stmtExpr = $stmt->expr; if (!$stmtExpr instanceof Assign) { return null; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php index d74f476cb..f0344564b 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php @@ -21,14 +21,12 @@ final class SimplifyIfNotNullReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(IfManipulator $ifManipulator, ValueResolver $valueResolver) { $this->ifManipulator = $ifManipulator; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php index cb8511916..f0e260e7f 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php @@ -13,7 +13,6 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; -use PHPStan\Type\NullType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; @@ -33,24 +32,20 @@ final class SimplifyIfNullableReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\CodeQuality\TypeResolver\AssignVariableTypeResolver */ - private $assignVariableTypeResolver; + private AssignVariableTypeResolver $assignVariableTypeResolver; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ - private $varTagRemover; + private VarTagRemover $varTagRemover; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(IfManipulator $ifManipulator, AssignVariableTypeResolver $assignVariableTypeResolver, VarTagRemover $varTagRemover, ValueResolver $valueResolver) { $this->ifManipulator = $ifManipulator; @@ -200,10 +195,10 @@ private function processSimplifyNullableReturn(UnionType $unionType, array $type if (\count($types) > 2) { return null; } - if ($types[0] instanceof FullyQualifiedObjectType && $types[1] instanceof NullType && $className === $types[0]->getClassName()) { + if ($types[0] instanceof FullyQualifiedObjectType && $types[1]->isNull()->yes() && $className === $types[0]->getClassName()) { return $this->createDirectReturn($expression, $expr, $unionType); } - if ($types[0] instanceof NullType && $types[1] instanceof FullyQualifiedObjectType && $className === $types[1]->getClassName()) { + if ($types[0]->isNull()->yes() && $types[1] instanceof FullyQualifiedObjectType && $className === $types[1]->getClassName()) { return $this->createDirectReturn($expression, $expr, $unionType); } if ($this->isNotTypedNullable($types, $className)) { @@ -219,7 +214,7 @@ private function isNotTypedNullable(array $types, string $className) : bool if (!$types[0] instanceof ObjectType) { return \true; } - if (!$types[1] instanceof NullType) { + if (!$types[1]->isNull()->yes()) { return \true; } return $className !== $types[0]->getClassName(); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php index 63fcdb3d6..11c660c39 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php @@ -28,24 +28,20 @@ final class SimplifyIfReturnBoolRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\Comment\CommentsMerger */ - private $commentsMerger; + private CommentsMerger $commentsMerger; /** * @readonly - * @var \Rector\CodeQuality\NodeManipulator\ExprBoolCaster */ - private $exprBoolCaster; + private ExprBoolCaster $exprBoolCaster; /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(CommentsMerger $commentsMerger, ExprBoolCaster $exprBoolCaster, BetterStandardPrinter $betterStandardPrinter, ValueResolver $valueResolver) { $this->commentsMerger = $commentsMerger; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php index 74a93b3b5..64317d1a7 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodeQuality\Rector\Include_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\Include_; @@ -11,6 +11,7 @@ use PhpParser\Node\Scalar\String_; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; +use Rector\Util\StringUtils; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -20,9 +21,13 @@ final class AbsolutizeRequireAndIncludePathRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; + /** + * @var string + * @see https://regex101.com/r/N8oLqv/1 + */ + private const WINDOWS_DRIVE_REGEX = '#^[a-zA-z]\\:[\\/\\\\]#'; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; @@ -82,12 +87,15 @@ public function refactor(Node $node) : ?Node return null; } // skip absolute paths - if (\strncmp($includeValue, '/', \strlen('/')) === 0) { + if (\strncmp($includeValue, '/', \strlen('/')) === 0 || \strncmp($includeValue, '\\', \strlen('\\')) === 0) { return null; } if (\strpos($includeValue, 'config/') !== \false) { return null; } + if (StringUtils::isMatch($includeValue, self::WINDOWS_DRIVE_REGEX)) { + return null; + } // add preslash to string $node->expr->value = \strncmp($includeValue, './', \strlen('./')) === 0 ? Strings::substring($includeValue, 1) : '/' . $includeValue; $node->expr = $this->prefixWithDirConstant($node->expr); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php index f69c7bc3e..64da921fa 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BinaryOp\Identical; @@ -20,10 +21,10 @@ use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\MixedType; use PHPStan\Type\TypeCombinator; -use PHPStan\Type\TypeWithClassName; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -33,19 +34,16 @@ final class IssetOnPropertyObjectToPropertyExistsRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, ValueResolver $valueResolver) { $this->reflectionProvider = $reflectionProvider; @@ -54,7 +52,7 @@ public function __construct(ReflectionProvider $reflectionProvider, ReflectionRe } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change isset on property object to property_exists() and not null check', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change isset on property object to `property_exists()` and not null check', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { private $x; @@ -119,6 +117,10 @@ public function refactor(Node $node) : ?Node if (!$classReflection instanceof ClassReflection) { continue; } + // possibly by docblock + if ($issetExpr->var instanceof ArrayDimFetch) { + continue; + } if (!$classReflection->hasProperty($propertyFetchName) || $classReflection->isBuiltin()) { $newNodes[] = $this->replaceToPropertyExistsWithNullCheck($issetExpr->var, $propertyFetchName, $issetExpr, $isNegated); } elseif ($isNegated) { @@ -176,15 +178,16 @@ private function createIdenticalToNull(PropertyFetch $propertyFetch) : Identical private function matchPropertyTypeClassReflection(PropertyFetch $propertyFetch) : ?ClassReflection { $propertyFetchVarType = $this->getType($propertyFetch->var); - if (!$propertyFetchVarType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($propertyFetchVarType); + if ($className === null) { return null; } - if ($propertyFetchVarType->getClassName() === 'stdClass') { + if ($className === 'stdClass') { return null; } - if (!$this->reflectionProvider->hasClass($propertyFetchVarType->getClassName())) { + if (!$this->reflectionProvider->hasClass($className)) { return null; } - return $this->reflectionProvider->getClass($propertyFetchVarType->getClassName()); + return $this->reflectionProvider->getClass($className); } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/AndAssignsToSeparateLinesRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/AndAssignsToSeparateLinesRector.php index 33753fea3..6b772d341 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/AndAssignsToSeparateLinesRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/AndAssignsToSeparateLinesRector.php @@ -17,7 +17,7 @@ final class AndAssignsToSeparateLinesRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Split 2 assigns ands to separate line', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Split 2 assigns with ands to separate line', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/LogicalToBooleanRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/LogicalToBooleanRector.php index 826e2a8ff..4ea0d821e 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/LogicalToBooleanRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/LogicalAnd/LogicalToBooleanRector.php @@ -4,6 +4,7 @@ namespace Rector\CodeQuality\Rector\LogicalAnd; use PhpParser\Node; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BinaryOp\LogicalAnd; @@ -39,9 +40,14 @@ public function getNodeTypes() : array } /** * @param LogicalOr|LogicalAnd $node + * @return \PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BinaryOp\BooleanOr|null */ - public function refactor(Node $node) : ?Node + public function refactor(Node $node) { + $type = $this->nodeTypeResolver->getNativeType($node->left); + if ($node->left instanceof Assign && !$type->isBoolean()->yes()) { + return null; + } return $this->refactorLogicalToBoolean($node); } /** diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php index 311ef36bc..ffa59d7a7 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php @@ -18,7 +18,7 @@ final class NewStaticToNewSelfRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change unsafe new static() to new self()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change unsafe `new static()` to `new self()`', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function build() diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/NotEqual/CommonNotEqualRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/NotEqual/CommonNotEqualRector.php index dd788954a..cfb1901a4 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/NotEqual/CommonNotEqualRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/NotEqual/CommonNotEqualRector.php @@ -61,10 +61,7 @@ private function doesNotEqualContainsShipCompareToken(NotEqual $notEqual) : bool $tokenEndPos = $notEqual->getEndTokenPos(); for ($i = $tokenStartPos; $i < $tokenEndPos; ++$i) { $token = $this->file->getOldTokens()[$i]; - if (!isset($token[1])) { - continue; - } - if ($token[1] === '<>') { + if ((string) $token === '<>') { return \true; } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 85e8a9ec7..0e0b96b73 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -25,9 +25,8 @@ final class CleanupUnneededNullsafeOperatorRector extends AbstractRector impleme { /** * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\ReturnStrictTypeAnalyzer */ - private $returnStrictTypeAnalyzer; + private ReturnStrictTypeAnalyzer $returnStrictTypeAnalyzer; public function __construct(ReturnStrictTypeAnalyzer $returnStrictTypeAnalyzer) { $this->returnStrictTypeAnalyzer = $returnStrictTypeAnalyzer; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SingularSwitchToIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SingularSwitchToIfRector.php index f8835ebb0..3d8430646 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SingularSwitchToIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SingularSwitchToIfRector.php @@ -21,16 +21,15 @@ final class SingularSwitchToIfRector extends AbstractRector { /** * @readonly - * @var \Rector\Renaming\NodeManipulator\SwitchManipulator */ - private $switchManipulator; + private SwitchManipulator $switchManipulator; public function __construct(SwitchManipulator $switchManipulator) { $this->switchManipulator = $switchManipulator; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change switch with only 1 check to if', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `switch` with only 1 check to `if`', [new CodeSample(<<<'CODE_SAMPLE' class SomeObject { public function run($value) @@ -81,9 +80,7 @@ public function refactor(Node $node) // only default → basically unwrap if (!$onlyCase->cond instanceof Expr) { // remove default clause because it cause syntax error - return \array_filter($onlyCase->stmts, static function (Stmt $stmt) : bool { - return !$stmt instanceof Break_; - }); + return \array_filter($onlyCase->stmts, static fn(Stmt $stmt): bool => !$stmt instanceof Break_); } $if = new If_(new Identical($node->cond, $onlyCase->cond)); $if->stmts = $this->switchManipulator->removeBreakNodes($onlyCase->stmts); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php index 7122b0a44..e5acfbc35 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php @@ -21,16 +21,15 @@ final class SwitchTrueToIfRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $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' + return new RuleDefinition('Change `switch (true)` to `if` statements', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php index 8c6a4140c..ee877d0dc 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php @@ -20,9 +20,8 @@ final class ArrayKeyExistsTernaryThenValueToCoalescingRector extends AbstractRec { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/NumberCompareToMaxFuncCallRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/NumberCompareToMaxFuncCallRector.php index 5d7d16504..7d3ffc645 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/NumberCompareToMaxFuncCallRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/NumberCompareToMaxFuncCallRector.php @@ -20,7 +20,7 @@ final class NumberCompareToMaxFuncCallRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Ternary number compare to max() call', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change ternary number compare to `max()` call', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run($value) diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SimplifyTautologyTernaryRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SimplifyTautologyTernaryRector.php index e8c4f150f..f6de3841b 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SimplifyTautologyTernaryRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SimplifyTautologyTernaryRector.php @@ -19,9 +19,8 @@ final class SimplifyTautologyTernaryRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; public function __construct(BinaryOpManipulator $binaryOpManipulator) { $this->binaryOpManipulator = $binaryOpManipulator; @@ -45,11 +44,7 @@ public function refactor(Node $node) : ?Node if (!$node->cond instanceof NotIdentical && !$node->cond instanceof Identical) { return null; } - $twoNodeMatch = $this->binaryOpManipulator->matchFirstAndSecondConditionNode($node->cond, function (Node $leftNode) use($node) : bool { - return $this->nodeComparator->areNodesEqual($leftNode, $node->if); - }, function (Node $leftNode) use($node) : bool { - return $this->nodeComparator->areNodesEqual($leftNode, $node->else); - }); + $twoNodeMatch = $this->binaryOpManipulator->matchFirstAndSecondConditionNode($node->cond, fn(Node $leftNode): bool => $this->nodeComparator->areNodesEqual($leftNode, $node->if), fn(Node $leftNode): bool => $this->nodeComparator->areNodesEqual($leftNode, $node->else)); if (!$twoNodeMatch instanceof TwoNodeMatch) { return null; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SwitchNegatedTernaryRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SwitchNegatedTernaryRector.php index 3eb6131c4..4d0315679 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SwitchNegatedTernaryRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/SwitchNegatedTernaryRector.php @@ -61,10 +61,17 @@ public function refactor(Node $node) : ?Node return null; } $node->cond = $node->cond->expr; - [$node->if, $node->else] = [$node->else, $node->if]; + $else = clone $node->else; + $if = clone $node->if; + $node->else = $if; + $node->if = $else; if ($node->if instanceof Ternary) { $ternary = $node->if; - $ternary->setAttribute(AttributeKey::KIND, 'wrapped_with_brackets'); + $ternary->setAttribute(AttributeKey::KIND, AttributeKey::WRAPPED_IN_PARENTHESES); + $ternary->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } + if ($node->else instanceof Ternary) { + $ternary = $node->else; $ternary->setAttribute(AttributeKey::ORIGINAL_NODE, null); } return $node; diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php index c4491004b..02aafefb1 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php @@ -21,14 +21,12 @@ final class UnnecessaryTernaryExpressionRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\AssignAndBinaryMap */ - private $assignAndBinaryMap; + private AssignAndBinaryMap $assignAndBinaryMap; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(AssignAndBinaryMap $assignAndBinaryMap, ValueResolver $valueResolver) { $this->assignAndBinaryMap = $assignAndBinaryMap; diff --git a/vendor/rector/rector/rules/CodeQuality/TypeResolver/ArrayDimFetchTypeResolver.php b/vendor/rector/rector/rules/CodeQuality/TypeResolver/ArrayDimFetchTypeResolver.php index cb36f025d..ba31fd488 100644 --- a/vendor/rector/rector/rules/CodeQuality/TypeResolver/ArrayDimFetchTypeResolver.php +++ b/vendor/rector/rector/rules/CodeQuality/TypeResolver/ArrayDimFetchTypeResolver.php @@ -14,9 +14,8 @@ final class ArrayDimFetchTypeResolver { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/rules/CodeQuality/TypeResolver/AssignVariableTypeResolver.php b/vendor/rector/rector/rules/CodeQuality/TypeResolver/AssignVariableTypeResolver.php index eec6e0213..ed315025b 100644 --- a/vendor/rector/rector/rules/CodeQuality/TypeResolver/AssignVariableTypeResolver.php +++ b/vendor/rector/rector/rules/CodeQuality/TypeResolver/AssignVariableTypeResolver.php @@ -11,9 +11,8 @@ final class AssignVariableTypeResolver { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/rules/CodeQuality/ValueObject/KeyAndExpr.php b/vendor/rector/rector/rules/CodeQuality/ValueObject/KeyAndExpr.php index 41542b65f..3b50d7848 100644 --- a/vendor/rector/rector/rules/CodeQuality/ValueObject/KeyAndExpr.php +++ b/vendor/rector/rector/rules/CodeQuality/ValueObject/KeyAndExpr.php @@ -9,19 +9,17 @@ final class KeyAndExpr { /** * @readonly - * @var \PhpParser\Node\Expr|null */ - private $keyExpr; + private ?Expr $keyExpr; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $expr; + private Expr $expr; /** * @var Comment[] * @readonly */ - private $comments; + private array $comments; /** * @param Comment[] $comments */ diff --git a/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php b/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php index 406ad6aa7..18d7d0972 100644 --- a/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php +++ b/vendor/rector/rector/rules/CodingStyle/Application/UseImportsAdder.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\CodingStyle\Application; -use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Declare_; @@ -11,7 +10,6 @@ use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\Nop; use PhpParser\Node\Stmt\Use_; -use PHPStan\Type\ObjectType; use Rector\CodingStyle\ClassNameImport\UsedImportsResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; @@ -22,14 +20,12 @@ final class UseImportsAdder { /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\UsedImportsResolver */ - private $usedImportsResolver; + private UsedImportsResolver $usedImportsResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; public function __construct(UsedImportsResolver $usedImportsResolver, TypeFactory $typeFactory) { $this->usedImportsResolver = $usedImportsResolver; @@ -55,6 +51,12 @@ public function addImportsToStmts(FileWithoutNamespace $fileWithoutNamespace, ar if ($newUses === []) { return [$fileWithoutNamespace]; } + $stmts = \array_values(\array_filter($stmts, static function (Stmt $stmt) : bool { + if (!$stmt instanceof Use_) { + return \true; + } + return $stmt->uses !== []; + })); // place after declare strict_types foreach ($stmts as $key => $stmt) { // maybe just added a space @@ -181,12 +183,15 @@ private function getNamespaceName(Namespace_ $namespace) : ?string } return $namespace->name->toString(); } - private function isCurrentNamespace(string $namespaceName, ObjectType $objectType) : bool + /** + * @param \Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType|\Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType $objectType + */ + private function isCurrentNamespace(string $namespaceName, $objectType) : bool { - $afterCurrentNamespace = Strings::after($objectType->getClassName(), $namespaceName . '\\'); - if ($afterCurrentNamespace === null) { + $className = $objectType->getClassName(); + if (\strncmp($className, $namespaceName . '\\', \strlen($namespaceName . '\\')) !== 0) { return \false; } - return \strpos($afterCurrentNamespace, '\\') === \false; + return $namespaceName . '\\' . $objectType->getShortName() === $className; } } diff --git a/vendor/rector/rector/rules/CodingStyle/Application/UseImportsRemover.php b/vendor/rector/rector/rules/CodingStyle/Application/UseImportsRemover.php index 9508d7a89..44070fb31 100644 --- a/vendor/rector/rector/rules/CodingStyle/Application/UseImportsRemover.php +++ b/vendor/rector/rector/rules/CodingStyle/Application/UseImportsRemover.php @@ -10,9 +10,8 @@ final class UseImportsRemover { /** * @readonly - * @var \Rector\Renaming\Collector\RenamedNameCollector */ - private $renamedNameCollector; + private RenamedNameCollector $renamedNameCollector; public function __construct(RenamedNameCollector $renamedNameCollector) { $this->renamedNameCollector = $renamedNameCollector; @@ -24,6 +23,7 @@ public function __construct(RenamedNameCollector $renamedNameCollector) */ public function removeImportsFromStmts(array $stmts, array $removedUses) : array { + $hasRemoved = \false; foreach ($stmts as $key => $stmt) { if (!$stmt instanceof Use_) { continue; @@ -32,9 +32,10 @@ public function removeImportsFromStmts(array $stmts, array $removedUses) : array // remove empty uses if ($stmt->uses === []) { unset($stmts[$key]); + $hasRemoved = \true; } } - return $stmts; + return $hasRemoved ? \array_values($stmts) : $stmts; } /** * @param string[] $removedUses diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php index 8eeb7e53c..205bff01e 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php @@ -8,15 +8,14 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; final class AliasUsesResolver { /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\UseImportsTraverser */ - private $useImportsTraverser; + private \Rector\CodingStyle\ClassNameImport\UseImportsTraverser $useImportsTraverser; public function __construct(\Rector\CodingStyle\ClassNameImport\UseImportsTraverser $useImportsTraverser) { $this->useImportsTraverser = $useImportsTraverser; @@ -29,9 +28,7 @@ public function resolveFromNode(Node $node, array $stmts) : array { if (!$node instanceof Namespace_ && !$node instanceof FileWithoutNamespace) { /** @var Namespace_[]|FileWithoutNamespace[] $namespaces */ - $namespaces = \array_filter($stmts, static function (Stmt $stmt) : bool { - return $stmt instanceof Namespace_ || $stmt instanceof FileWithoutNamespace; - }); + $namespaces = \array_filter($stmts, static fn(Stmt $stmt): bool => $stmt instanceof Namespace_ || $stmt instanceof FileWithoutNamespace); if (\count($namespaces) !== 1) { return []; } @@ -47,11 +44,11 @@ public function resolveFromStmts(array $stmts) : array { $aliasedUses = []; /** @param Use_::TYPE_* $useType */ - $this->useImportsTraverser->traverserStmts($stmts, static function (int $useType, UseUse $useUse, string $name) use(&$aliasedUses) : void { + $this->useImportsTraverser->traverserStmts($stmts, static function (int $useType, UseItem $useItem, string $name) use(&$aliasedUses) : void { if ($useType !== Use_::TYPE_NORMAL) { return; } - if (!$useUse->alias instanceof Identifier) { + if (!$useItem->alias instanceof Identifier) { return; } $aliasedUses[] = $name; diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/AliasClassNameImportSkipVoter.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/AliasClassNameImportSkipVoter.php index 80bcef99a..e0f7b6a98 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/AliasClassNameImportSkipVoter.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/AliasClassNameImportSkipVoter.php @@ -21,9 +21,8 @@ final class AliasClassNameImportSkipVoter implements ClassNameImportSkipVoterInt { /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\AliasUsesResolver */ - private $aliasUsesResolver; + private AliasUsesResolver $aliasUsesResolver; public function __construct(AliasUsesResolver $aliasUsesResolver) { $this->aliasUsesResolver = $aliasUsesResolver; @@ -31,6 +30,7 @@ public function __construct(AliasUsesResolver $aliasUsesResolver) public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedObjectType, Node $node) : bool { $aliasedUses = $this->aliasUsesResolver->resolveFromNode($node, $file->getNewStmts()); + $longNameLowered = \strtolower($fullyQualifiedObjectType->getClassName()); $shortNameLowered = $fullyQualifiedObjectType->getShortNameLowered(); foreach ($aliasedUses as $aliasedUse) { $aliasedUseLowered = \strtolower($aliasedUse); @@ -38,6 +38,9 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO if (\substr_compare($aliasedUseLowered, '\\' . $shortNameLowered, -\strlen('\\' . $shortNameLowered)) === 0) { return \true; } + if ($aliasedUseLowered === $shortNameLowered && $longNameLowered === $shortNameLowered) { + return \true; + } } return \false; } diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php index 20f611ee0..d03eb3033 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php @@ -21,9 +21,8 @@ final class ClassLikeNameClassNameImportSkipVoter implements ClassNameImportSkip { /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\ShortNameResolver */ - private $shortNameResolver; + private ShortNameResolver $shortNameResolver; public function __construct(ShortNameResolver $shortNameResolver) { $this->shortNameResolver = $shortNameResolver; diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index 9166d9f30..4fea57cea 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; @@ -22,9 +22,8 @@ final class FullyQualifiedNameClassNameImportSkipVoter implements ClassNameImpor { /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\ShortNameResolver */ - private $shortNameResolver; + private ShortNameResolver $shortNameResolver; public function __construct(ShortNameResolver $shortNameResolver) { $this->shortNameResolver = $shortNameResolver; diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ReservedClassNameImportSkipVoter.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ReservedClassNameImportSkipVoter.php new file mode 100644 index 000000000..979cd47e8 --- /dev/null +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ReservedClassNameImportSkipVoter.php @@ -0,0 +1,21 @@ +getShortNameLowered(); + return \in_array($shortName, self::RESERVED_CLASS_NAMES, \true); + } +} diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/UsesClassNameImportSkipVoter.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/UsesClassNameImportSkipVoter.php index 58d0a0443..4169fcb58 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/UsesClassNameImportSkipVoter.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/UsesClassNameImportSkipVoter.php @@ -19,9 +19,8 @@ final class UsesClassNameImportSkipVoter implements ClassNameImportSkipVoterInte { /** * @readonly - * @var \Rector\PostRector\Collector\UseNodesToAddCollector */ - private $useNodesToAddCollector; + private UseNodesToAddCollector $useNodesToAddCollector; public function __construct(UseNodesToAddCollector $useNodesToAddCollector) { $this->useNodesToAddCollector = $useNodesToAddCollector; diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php index 57075fb38..945e969ff 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php @@ -9,7 +9,7 @@ use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; @@ -23,12 +23,11 @@ final class ClassNameImportSkipper * @var ClassNameImportSkipVoterInterface[] * @readonly */ - private $classNameImportSkipVoters; + private iterable $classNameImportSkipVoters; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @param ClassNameImportSkipVoterInterface[] $classNameImportSkipVoters */ @@ -82,13 +81,6 @@ public function shouldSkipName(FullyQualified $fullyQualified, array $uses) : bo } private function shouldSkipShortName(FullyQualified $fullyQualified) : bool { - // is scalar name? - if (\in_array($fullyQualified->toLowerString(), ['true', 'false', 'bool'], \true)) { - return \true; - } - if ($fullyQualified->isSpecialClassName()) { - return \true; - } if ($this->isFunctionOrConstantImport($fullyQualified)) { return \true; } @@ -102,11 +94,11 @@ private function isFunctionOrConstantImport(FullyQualified $fullyQualified) : bo } return $fullyQualified->getAttribute(AttributeKey::IS_FUNCCALL_NAME) === \true; } - private function isConflictedShortNameInUse(UseUse $useUse, string $useName, string $lastUseName, string $stringName) : bool + private function isConflictedShortNameInUse(UseItem $useItem, string $useName, string $lastUseName, string $stringName) : bool { - if (!$useUse->alias instanceof Identifier && $useName !== $stringName && $lastUseName === $stringName) { + if (!$useItem->alias instanceof Identifier && $useName !== $stringName && $lastUseName === $stringName) { return \true; } - return $useUse->alias instanceof Identifier && $useUse->alias->toString() === $stringName; + return $useItem->alias instanceof Identifier && $useItem->alias->toString() === $stringName; } } diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php index db6efd460..648fb24f8 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php @@ -28,33 +28,28 @@ final class ShortNameResolver { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\CodingStyle\NodeAnalyzer\UseImportNameMatcher */ - private $useImportNameMatcher; + private UseImportNameMatcher $useImportNameMatcher; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var array */ - private $shortNamesByFilePath = []; + private array $shortNamesByFilePath = []; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, UseImportNameMatcher $useImportNameMatcher, PhpDocInfoFactory $phpDocInfoFactory) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -84,9 +79,7 @@ public function resolveShortClassLikeNames(File $file) : array { $newStmts = $file->getNewStmts(); /** @var Namespace_[]|FileWithoutNamespace[] $namespaces */ - $namespaces = \array_filter($newStmts, static function (Stmt $stmt) : bool { - return $stmt instanceof Namespace_ || $stmt instanceof FileWithoutNamespace; - }); + $namespaces = \array_filter($newStmts, static fn(Stmt $stmt): bool => $stmt instanceof Namespace_ || $stmt instanceof FileWithoutNamespace); if (\count($namespaces) !== 1) { // only handle single namespace nodes return []; diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php index 0872c49a1..b165bc435 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php @@ -7,23 +7,22 @@ use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; final class UseImportsTraverser { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; } /** * @param Stmt[] $stmts - * @param callable(Use_::TYPE_* $useType, UseUse $useUse, string $name): void $callable + * @param callable(Use_::TYPE_* $useType, UseItem $useUse, string $name):void $callable */ public function traverserStmts(array $stmts, callable $callable) : void { @@ -48,7 +47,7 @@ public function traverserStmts(array $stmts, callable $callable) : void } } /** - * @param callable(Use_::TYPE_* $useType, UseUse $useUse, string $name): void $callable + * @param callable(Use_::TYPE_* $useType, UseItem $useUse, string $name):void $callable */ private function processGroupUse(GroupUse $groupUse, callable $callable) : void { diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php index ac765353d..8c929776b 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php @@ -7,7 +7,7 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use Rector\CodingStyle\ClassNameImport\ValueObject\UsedImports; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpParser\Node\BetterNodeFinder; @@ -17,19 +17,16 @@ final class UsedImportsResolver { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\UseImportsTraverser */ - private $useImportsTraverser; + private \Rector\CodingStyle\ClassNameImport\UseImportsTraverser $useImportsTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(BetterNodeFinder $betterNodeFinder, \Rector\CodingStyle\ClassNameImport\UseImportsTraverser $useImportsTraverser, NodeNameResolver $nodeNameResolver) { $this->betterNodeFinder = $betterNodeFinder; @@ -53,10 +50,10 @@ public function resolveForStmts(array $stmts) : UsedImports $usedConstImports = []; $usedFunctionImports = []; /** @param Use_::TYPE_* $useType */ - $this->useImportsTraverser->traverserStmts($stmts, static function (int $useType, UseUse $useUse, string $name) use(&$usedImports, &$usedFunctionImports, &$usedConstImports) : void { + $this->useImportsTraverser->traverserStmts($stmts, static function (int $useType, UseItem $useItem, string $name) use(&$usedImports, &$usedFunctionImports, &$usedConstImports) : void { if ($useType === Use_::TYPE_NORMAL) { - if ($useUse->alias instanceof Identifier) { - $usedImports[] = new AliasedObjectType($useUse->alias->toString(), $name); + if ($useItem->alias instanceof Identifier) { + $usedImports[] = new AliasedObjectType($useItem->alias->toString(), $name); } else { $usedImports[] = new FullyQualifiedObjectType($name); } diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php index a60eb527f..b779408ec 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php @@ -8,20 +8,20 @@ final class UsedImports { /** - * @var array<(FullyQualifiedObjectType | AliasedObjectType)> + * @var array * @readonly */ - private $useImports; + private array $useImports; /** * @var FullyQualifiedObjectType[] * @readonly */ - private $functionImports; + private array $functionImports; /** * @var FullyQualifiedObjectType[] * @readonly */ - private $constantImports; + private array $constantImports; /** * @param array $useImports * @param FullyQualifiedObjectType[] $functionImports diff --git a/vendor/rector/rector/rules/CodingStyle/Guard/StaticGuard.php b/vendor/rector/rector/rules/CodingStyle/Guard/StaticGuard.php index 21ccfeca4..15bbaf95c 100644 --- a/vendor/rector/rector/rules/CodingStyle/Guard/StaticGuard.php +++ b/vendor/rector/rector/rules/CodingStyle/Guard/StaticGuard.php @@ -15,14 +15,12 @@ final class StaticGuard { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(BetterNodeFinder $betterNodeFinder, ReflectionResolver $reflectionResolver) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php b/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php index 6ce8dab39..70296e3a7 100644 --- a/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php +++ b/vendor/rector/rector/rules/CodingStyle/Naming/ClassNaming.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Naming; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassLike; diff --git a/vendor/rector/rector/rules/CodingStyle/Node/NameImporter.php b/vendor/rector/rector/rules/CodingStyle/Node/NameImporter.php index fa278619b..76c7ffa3c 100644 --- a/vendor/rector/rector/rules/CodingStyle/Node/NameImporter.php +++ b/vendor/rector/rector/rules/CodingStyle/Node/NameImporter.php @@ -19,24 +19,20 @@ final class NameImporter { /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\ClassNameImportSkipper */ - private $classNameImportSkipper; + private ClassNameImportSkipper $classNameImportSkipper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper */ - private $fullyQualifiedNodeMapper; + private FullyQualifiedNodeMapper $fullyQualifiedNodeMapper; /** * @readonly - * @var \Rector\PostRector\Collector\UseNodesToAddCollector */ - private $useNodesToAddCollector; + private UseNodesToAddCollector $useNodesToAddCollector; /** * @readonly - * @var \Rector\Naming\Naming\AliasNameResolver */ - private $aliasNameResolver; + private AliasNameResolver $aliasNameResolver; public function __construct(ClassNameImportSkipper $classNameImportSkipper, FullyQualifiedNodeMapper $fullyQualifiedNodeMapper, UseNodesToAddCollector $useNodesToAddCollector, AliasNameResolver $aliasNameResolver) { $this->classNameImportSkipper = $classNameImportSkipper; diff --git a/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php b/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php index aedfd4c44..57614e933 100644 --- a/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php +++ b/vendor/rector/rector/rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\CodingStyle\NodeAnalyzer; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use Rector\Exception\ShouldNotHappenException; use Rector\Naming\Naming\UseImportsResolver; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -18,14 +18,12 @@ final class UseImportNameMatcher { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @var string * @@ -49,6 +47,7 @@ public function matchNameWithStmts(string $tag, array $stmts) : ?string } /** * @param array $uses + * @return non-empty-string|null */ public function matchNameWithUses(string $tag, array $uses) : ?string { @@ -63,11 +62,14 @@ public function matchNameWithUses(string $tag, array $uses) : ?string } return null; } - private function resolveName(string $prefix, string $tag, UseUse $useUse) : string + /** + * @return non-empty-string + */ + private function resolveName(string $prefix, string $tag, UseItem $useItem) : string { // useuse can be renamed on the fly, so just in case, use the original one - $originalUseUseNode = $useUse->getAttribute(AttributeKey::ORIGINAL_NODE); - if (!$originalUseUseNode instanceof UseUse) { + $originalUseUseNode = $useItem->getAttribute(AttributeKey::ORIGINAL_NODE); + if (!$originalUseUseNode instanceof UseItem) { throw new ShouldNotHappenException(); } if (!$originalUseUseNode->alias instanceof Identifier) { @@ -84,11 +86,11 @@ private function resolveName(string $prefix, string $tag, UseUse $useUse) : stri } return $prefix . $originalUseUseNode->name . '\\' . $unaliasedShortClass; } - private function isUseMatchingName(string $tag, UseUse $useUse) : bool + private function isUseMatchingName(string $tag, UseItem $useItem) : bool { // useuse can be renamed on the fly, so just in case, use the original one - $originalUseUseNode = $useUse->getAttribute(AttributeKey::ORIGINAL_NODE); - if (!$originalUseUseNode instanceof UseUse) { + $originalUseUseNode = $useItem->getAttribute(AttributeKey::ORIGINAL_NODE); + if (!$originalUseUseNode instanceof UseItem) { return \false; } $shortName = $originalUseUseNode->alias instanceof Identifier ? $originalUseUseNode->alias->name : $originalUseUseNode->name->getLast(); diff --git a/vendor/rector/rector/rules/CodingStyle/NodeFactory/ArrayCallableToMethodCallFactory.php b/vendor/rector/rector/rules/CodingStyle/NodeFactory/ArrayCallableToMethodCallFactory.php index 0b276fa7b..31d7b5847 100644 --- a/vendor/rector/rector/rules/CodingStyle/NodeFactory/ArrayCallableToMethodCallFactory.php +++ b/vendor/rector/rector/rules/CodingStyle/NodeFactory/ArrayCallableToMethodCallFactory.php @@ -3,21 +3,20 @@ declare (strict_types=1); namespace Rector\CodingStyle\NodeFactory; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; -use PHPStan\Type\TypeWithClassName; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class ArrayCallableToMethodCallFactory { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -42,7 +41,8 @@ public function create(Array_ $array) : ?MethodCall return null; } $firstItemType = $this->nodeTypeResolver->getType($firstItem->value); - if (!$firstItemType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($firstItemType); + if ($className === null) { return null; } $string = $secondItem->value; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ArrowFunction/StaticArrowFunctionRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ArrowFunction/StaticArrowFunctionRector.php index 5c3ecac0b..0b13214a3 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ArrowFunction/StaticArrowFunctionRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ArrowFunction/StaticArrowFunctionRector.php @@ -16,9 +16,8 @@ final class StaticArrowFunctionRector extends AbstractRector { /** * @readonly - * @var \Rector\CodingStyle\Guard\StaticGuard */ - private $staticGuard; + private StaticGuard $staticGuard; public function __construct(StaticGuard $staticGuard) { $this->staticGuard = $staticGuard; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Assign/SplitDoubleAssignRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Assign/SplitDoubleAssignRector.php index 72bece791..79bc82da5 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Assign/SplitDoubleAssignRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Assign/SplitDoubleAssignRector.php @@ -84,10 +84,6 @@ private function collectExpressions(Assign $assign, Expr $expr) : array if ($expr instanceof CallLike) { $expr = $assign->var; } - if (!$assign->expr instanceof Assign) { - break; - } - /** @var Expr $assign */ $assign = $assign->expr; } return $expressions; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php index 48a7df6ba..ab16f174b 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Catch_/CatchExceptionNameMatchingTypeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\Catch_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Closure; @@ -15,7 +15,7 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\TryCatch; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\Scope; use PHPStan\Type\ObjectType; use Rector\Naming\Naming\PropertyNaming; @@ -31,9 +31,8 @@ final class CatchExceptionNameMatchingTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; /** * @var string * @see https://regex101.com/r/xmfMAX/1 @@ -143,7 +142,7 @@ private function renameVariableInStmts(Catch_ $catch, string $oldVariableName, s if (!$node instanceof Variable) { return null; } - if (!$this->nodeNameResolver->isName($node, $oldVariableName)) { + if (!$this->isName($node, $oldVariableName)) { return null; } $node->name = $newVariableName; @@ -162,12 +161,12 @@ private function replaceNextUsageVariable(string $oldVariableName, string $newVa $nonAssignedVariables = []; $this->traverseNodesWithCallable($nextNode, function (Node $node) use($oldVariableName, &$nonAssignedVariables) : ?int { if ($node instanceof Assign && $node->var instanceof Variable) { - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if (!$node instanceof Variable) { return null; } - if (!$this->nodeNameResolver->isName($node, $oldVariableName)) { + if (!$this->isName($node, $oldVariableName)) { return null; } $nonAssignedVariables[] = $node; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ClassConst/RemoveFinalFromConstRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ClassConst/RemoveFinalFromConstRector.php index 748c8161d..9bd0aa788 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ClassConst/RemoveFinalFromConstRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ClassConst/RemoveFinalFromConstRector.php @@ -18,9 +18,8 @@ final class RemoveFinalFromConstRector extends AbstractRector implements MinPhpV { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; public function __construct(VisibilityManipulator $visibilityManipulator) { $this->visibilityManipulator = $visibilityManipulator; @@ -57,11 +56,11 @@ public function refactor(Node $node) : ?Node return null; } $hasChanged = \false; - foreach ($node->getConstants() as $classConst) { - if (!$classConst->isFinal()) { + foreach ($node->getConstants() as $constant) { + if (!$constant->isFinal()) { continue; } - $this->visibilityManipulator->removeFinal($classConst); + $this->visibilityManipulator->removeFinal($constant); $hasChanged = \true; } if ($hasChanged) { diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php index 720552e33..417cd19ed 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php @@ -26,16 +26,15 @@ final class FuncGetArgsToVariadicParamRector extends AbstractRector implements M { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $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' + return new RuleDefinition('Refactor `func_get_args()` in to a variadic param', [new CodeSample(<<<'CODE_SAMPLE' function run() { $args = \func_get_args(); diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php index 07117271f..eea55d4e6 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php @@ -20,14 +20,12 @@ final class MakeInheritedMethodVisibilitySameAsParentRector extends AbstractRect { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(VisibilityManipulator $visibilityManipulator, ReflectionResolver $reflectionResolver) { $this->visibilityManipulator = $visibilityManipulator; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/NewlineBeforeNewAssignSetRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/NewlineBeforeNewAssignSetRector.php index cb089aaa8..0a015a2a7 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/NewlineBeforeNewAssignSetRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/NewlineBeforeNewAssignSetRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; +use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; @@ -14,22 +15,17 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Nop; +use Rector\Contract\Rector\HTMLAverseRectorInterface; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\CodingStyle\Rector\ClassMethod\NewlineBeforeNewAssignSetRector\NewlineBeforeNewAssignSetRectorTest */ -final class NewlineBeforeNewAssignSetRector extends AbstractRector +final class NewlineBeforeNewAssignSetRector extends AbstractRector implements HTMLAverseRectorInterface { - /** - * @var string|null - */ - private $previousStmtVariableName; - /** - * @var string|null - */ - private $previousPreviousStmtVariableName; + private ?string $previousStmtVariableName = null; + private ?string $previousPreviousStmtVariableName = null; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Add extra space before new assign set', [new CodeSample(<<<'CODE_SAMPLE' @@ -41,6 +37,10 @@ public function run() $value->setValue(5); $value2 = new Value; $value2->setValue(1); + $foo = new Value; + $foo->bar = 5; + $bar = new Value; + $bar->foo = 1; } } CODE_SAMPLE @@ -54,6 +54,12 @@ public function run() $value2 = new Value; $value2->setValue(1); + + $foo = new Value; + $foo->bar = 5; + + $bar = new Value; + $bar->foo = 1; } } CODE_SAMPLE @@ -108,7 +114,17 @@ private function resolveCurrentStmtVariableName(Stmt $stmt) : ?string return null; } if (!$stmtExpr->var instanceof MethodCall && !$stmtExpr->var instanceof StaticCall) { - return $this->getName($stmtExpr->var); + $nodeVar = $stmtExpr->var; + if ($nodeVar instanceof PropertyFetch) { + do { + $previous = $nodeVar; + $nodeVar = $nodeVar->var; + } while ($nodeVar instanceof PropertyFetch); + if ($this->getName($nodeVar) === 'this') { + $nodeVar = $previous; + } + } + return $this->getName($nodeVar); } } return null; @@ -133,7 +149,7 @@ private function shouldSkipLeftVariable($node) : bool return \false; } // local method call - return $this->nodeNameResolver->isName($node->var, 'this'); + return $this->isName($node->var, 'this'); } private function isNewVariableThanBefore(?string $currentStmtVariableName) : bool { @@ -161,6 +177,6 @@ private function isPrecededByEmptyLine($node, int $key) : bool } $previousNode = $node->stmts[$key - 1]; $currentNode = $node->stmts[$key]; - return \abs($currentNode->getLine() - $previousNode->getLine()) >= 2; + return \abs($currentNode->getStartLine() - $previousNode->getStartLine()) >= 2; } } diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Closure/StaticClosureRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Closure/StaticClosureRector.php index bd655fb5a..3f960470e 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Closure/StaticClosureRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Closure/StaticClosureRector.php @@ -16,9 +16,8 @@ final class StaticClosureRector extends AbstractRector { /** * @readonly - * @var \Rector\CodingStyle\Guard\StaticGuard */ - private $staticGuard; + private StaticGuard $staticGuard; public function __construct(StaticGuard $staticGuard) { $this->staticGuard = $staticGuard; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php index 1f2a97244..a1ca3c4b0 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\Encapsed; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; @@ -11,9 +11,9 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\InterpolatedStringPart; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\Encapsed; -use PhpParser\Node\Scalar\EncapsedStringPart; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use PHPStan\Type\Type; use Rector\Contract\Rector\ConfigurableRectorInterface; @@ -35,18 +35,12 @@ final class EncapsedStringsToSprintfRector extends AbstractRector implements Con * @var array>> */ private const FORMAT_SPECIFIERS = ['%s' => ['PHPStan\\Type\\StringType'], '%d' => ['PHPStan\\Type\\Constant\\ConstantIntegerType', 'PHPStan\\Type\\IntegerRangeType', 'PHPStan\\Type\\IntegerType']]; - /** - * @var bool - */ - private $always = \false; - /** - * @var string - */ - private $sprintfFormat = ''; + private bool $always = \false; + private string $sprintfFormat = ''; /** * @var Expr[] */ - private $argumentVariables = []; + private array $argumentVariables = []; public function configure(array $configuration) : void { $this->always = $configuration[self::ALWAYS] ?? \false; @@ -80,10 +74,10 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [Encapsed::class]; + return [InterpolatedString::class]; } /** - * @param Encapsed $node + * @param InterpolatedString $node */ public function refactor(Node $node) : ?Node { @@ -93,7 +87,7 @@ public function refactor(Node $node) : ?Node $this->sprintfFormat = ''; $this->argumentVariables = []; foreach ($node->parts as $part) { - if ($part instanceof EncapsedStringPart) { + if ($part instanceof InterpolatedStringPart) { $this->collectEncapsedStringPart($part); } else { $this->collectExpr($part); @@ -101,13 +95,24 @@ public function refactor(Node $node) : ?Node } return $this->createSprintfFuncCallOrConcat($this->sprintfFormat, $this->argumentVariables); } - private function shouldSkip(Encapsed $encapsed) : bool + private function shouldSkip(InterpolatedString $interpolatedString) : bool { - return $encapsed->hasAttribute(AttributeKey::DOC_LABEL); + if ($interpolatedString->hasAttribute(AttributeKey::DOC_LABEL)) { + return \true; + } + foreach ($interpolatedString->parts as $part) { + if (!$part instanceof InterpolatedStringPart) { + continue; + } + if ($this->containsControlASCIIChar($part->value)) { + return \true; + } + } + return \false; } - private function collectEncapsedStringPart(EncapsedStringPart $encapsedStringPart) : void + private function collectEncapsedStringPart(InterpolatedStringPart $interpolatedStringPart) : void { - $stringValue = $encapsedStringPart->value; + $stringValue = $interpolatedStringPart->value; if ($stringValue === "\n") { $this->argumentVariables[] = new ConstFetch(new Name('PHP_EOL')); $this->sprintfFormat .= '%s'; @@ -192,4 +197,8 @@ private function createString(string $value) : String_ $kind = \strpos($value, "'") !== \false ? String_::KIND_DOUBLE_QUOTED : String_::KIND_SINGLE_QUOTED; return new String_($value, ['kind' => $kind]); } + private function containsControlASCIIChar(string $content) : bool + { + return (bool) Strings::match($content, '#[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]#'); + } } diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/WrapEncapsedVariableInCurlyBracesRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/WrapEncapsedVariableInCurlyBracesRector.php index 9d83869b9..161dae799 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/WrapEncapsedVariableInCurlyBracesRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Encapsed/WrapEncapsedVariableInCurlyBracesRector.php @@ -5,7 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -35,10 +35,10 @@ function run($world) */ public function getNodeTypes() : array { - return [Encapsed::class]; + return [InterpolatedString::class]; } /** - * @param Encapsed $node + * @param InterpolatedString $node */ public function refactor(Node $node) : ?Node { diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php new file mode 100644 index 000000000..5ac53771f --- /dev/null +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php @@ -0,0 +1,162 @@ +reflectionProvider = $reflectionProvider; + $this->dynamicSourceLocatorProvider = $dynamicSourceLocatorProvider; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Convert enum cases to PascalCase and update their usages', [new CodeSample(<<<'CODE_SAMPLE' +enum Status +{ + case PENDING; + case published; + case IN_REVIEW; + case waiting_for_approval; +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +enum Status +{ + case Pending; + case Published; + case InReview; + case WaitingForApproval; +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Enum_::class, ClassConstFetch::class]; + } + /** + * @param Enum_|ClassConstFetch $node + */ + public function refactor(Node $node) : ?Node + { + if ($node instanceof Enum_) { + return $this->refactorEnum($node); + } + if ($node instanceof ClassConstFetch) { + return $this->refactorClassConstFetch($node); + } + return null; + } + public function refactorEnum(Enum_ $enum) : ?\PhpParser\Node\Stmt\Enum_ + { + $enumName = $this->getName($enum); + if ($enumName === null) { + return null; + } + $hasChanged = \false; + foreach ($enum->stmts as $stmt) { + if (!$stmt instanceof EnumCase) { + continue; + } + $currentName = $stmt->name->toString(); + $pascalCaseName = $this->convertToPascalCase($currentName); + if ($currentName === $pascalCaseName) { + continue; + } + $stmt->name = new Identifier($pascalCaseName); + $hasChanged = \true; + } + return $hasChanged ? $enum : null; + } + private function refactorClassConstFetch(ClassConstFetch $classConstFetch) : ?Node + { + if (!$classConstFetch->class instanceof Name) { + return null; + } + if (!$classConstFetch->name instanceof Identifier) { + return null; + } + if ($this->nodeTypeResolver->getType($classConstFetch->class)->isEnum()->no()) { + return null; + } + $constName = $classConstFetch->name->toString(); + // Skip "class" constant + if ($constName === 'class') { + return null; + } + $enumClassName = $classConstFetch->class->toString(); + if (!$this->reflectionProvider->hasClass($enumClassName)) { + return null; + } + $sourceLocator = $this->dynamicSourceLocatorProvider->provide(); + $defaultReflector = new DefaultReflector($sourceLocator); + try { + $classIdentifier = $defaultReflector->reflectClass($classConstFetch->class->toString()); + } catch (IdentifierNotFound $exception) { + // source is outside the paths defined in withPaths(), eg: vendor + return null; + } + // ensure exactly ReflectionEnum + if (!$classIdentifier instanceof ReflectionEnum) { + return null; + } + // ensure not part of definition in ->withAutoloadPaths() + $fileTarget = $classIdentifier->getFileName(); + // possibly native + if ($fileTarget === null) { + return null; + } + $autoloadPaths = SimpleParameterProvider::provideArrayParameter(Option::AUTOLOAD_PATHS); + $normalizedFileTarget = PathNormalizer::normalize((string) \realpath($fileTarget)); + foreach ($autoloadPaths as $autoloadPath) { + $normalizedAutoloadPath = PathNormalizer::normalize($autoloadPath); + if ($autoloadPath === $fileTarget) { + return null; + } + if (\strncmp($normalizedFileTarget, $normalizedAutoloadPath . '/', \strlen($normalizedAutoloadPath . '/')) === 0) { + return null; + } + } + $pascalCaseName = $this->convertToPascalCase($constName); + if ($constName !== $pascalCaseName) { + $classConstFetch->name = new Identifier($pascalCaseName); + return $classConstFetch; + } + return null; + } + private function convertToPascalCase(string $name) : string + { + $parts = \explode('_', \strtolower($name)); + return \implode('', \array_map(\Closure::fromCallable('ucfirst'), $parts)); + } +} diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Foreach_/MultiDimensionalArrayToArrayDestructRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Foreach_/MultiDimensionalArrayToArrayDestructRector.php index ba4b2ac4b..e233265d0 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Foreach_/MultiDimensionalArrayToArrayDestructRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Foreach_/MultiDimensionalArrayToArrayDestructRector.php @@ -4,14 +4,14 @@ namespace Rector\CodingStyle\Rector\Foreach_; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Foreach_; use PhpParser\NodeFinder; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -26,9 +26,8 @@ final class MultiDimensionalArrayToArrayDestructRector extends AbstractRector im { /** * @readonly - * @var \PhpParser\NodeFinder */ - private $nodeFinder; + private NodeFinder $nodeFinder; public function __construct(NodeFinder $nodeFinder) { $this->nodeFinder = $nodeFinder; @@ -110,7 +109,7 @@ private function replaceValueArrayAccessorsInForeachTree(Foreach_ $foreach) : ar $dim = $traverseNode->dim; if (!$dim instanceof String_) { $createdDestructedVariables = []; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } $destructedVariable = $this->getDestructedVariableName($usedVariableNames, $dim); $createdDestructedVariables[$dim->value] = $destructedVariable; @@ -122,15 +121,13 @@ private function replaceValueArrayAccessorsInForeachTree(Foreach_ $foreach) : ar * Get all variable names which are used in the foreach tree. We need this so that we don't create array destructor * with variable name which is already used somewhere bellow * - * @return list + * @return string[] */ private function getUsedVariableNamesInForeachTree(Foreach_ $foreach) : array { /** @var list $variableNodes */ $variableNodes = $this->nodeFinder->findInstanceOf($foreach, Variable::class); - return \array_unique(\array_map(function (Variable $variable) : string { - return (string) $this->getName($variable); - }, $variableNodes)); + return \array_unique(\array_map(fn(Variable $variable): string => (string) $this->getName($variable), $variableNodes)); } /** * Get variable name that will be used for destructor syntax. If variable name is already occupied @@ -140,7 +137,7 @@ private function getUsedVariableNamesInForeachTree(Foreach_ $foreach) : array */ private function getDestructedVariableName(array $usedVariableNames, String_ $string) : string { - $desiredVariableName = (string) $string->value; + $desiredVariableName = $string->value; if (\in_array($desiredVariableName, $usedVariableNames, \true) === \false) { return $desiredVariableName; } diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php index e96bb29e4..8e9f96f47 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php @@ -5,13 +5,14 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Expr\Variable; use PHPStan\Type\ArrayType; +use PHPStan\Type\Constant\ConstantArrayType; use Rector\NodeTypeResolver\TypeAnalyzer\ArrayTypeAnalyzer; use Rector\Php\PhpVersionProvider; use Rector\Rector\AbstractRector; @@ -27,14 +28,12 @@ final class ArraySpreadInsteadOfArrayMergeRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeAnalyzer\ArrayTypeAnalyzer */ - private $arrayTypeAnalyzer; + private ArrayTypeAnalyzer $arrayTypeAnalyzer; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(ArrayTypeAnalyzer $arrayTypeAnalyzer, PhpVersionProvider $phpVersionProvider) { $this->arrayTypeAnalyzer = $arrayTypeAnalyzer; @@ -126,14 +125,17 @@ private function shouldSkipArrayForInvalidTypeOrKeys(Expr $expr) : bool return \true; } $arrayStaticType = $this->getType($expr); - if (!$arrayStaticType instanceof ArrayType) { + if (!$arrayStaticType instanceof ArrayType && !$arrayStaticType instanceof ConstantArrayType) { return \true; } return !$this->isArrayKeyTypeAllowed($arrayStaticType); } - private function isArrayKeyTypeAllowed(ArrayType $arrayType) : bool + /** + * @param \PHPStan\Type\ArrayType|\PHPStan\Type\Constant\ConstantArrayType $arrayType + */ + private function isArrayKeyTypeAllowed($arrayType) : bool { - if ($arrayType->getKeyType()->isInteger()->yes()) { + if ($arrayType->getIterableKeyType()->isInteger()->yes()) { return \true; } // php 8.1+ allow mixed key: int, string, and null @@ -170,7 +172,7 @@ private function isIteratorToArrayFuncCall(Expr $expr) : bool if (!$expr instanceof FuncCall) { return \false; } - if (!$this->nodeNameResolver->isName($expr, 'iterator_to_array')) { + if (!$this->isName($expr, 'iterator_to_array')) { return \false; } if ($expr->isFirstClassCallable()) { diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php index eee075a25..c04d1af99 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php @@ -24,14 +24,12 @@ final class CallUserFuncArrayToVariadicRector extends AbstractRector implements { /** * @readonly - * @var \Rector\CodingStyle\NodeFactory\ArrayCallableToMethodCallFactory */ - private $arrayCallableToMethodCallFactory; + private ArrayCallableToMethodCallFactory $arrayCallableToMethodCallFactory; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ArrayCallableToMethodCallFactory $arrayCallableToMethodCallFactory, ValueResolver $valueResolver) { $this->arrayCallableToMethodCallFactory = $arrayCallableToMethodCallFactory; @@ -39,7 +37,7 @@ public function __construct(ArrayCallableToMethodCallFactory $arrayCallableToMet } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replace call_user_func_array() with variadic', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace `call_user_func_array()` with variadic', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncToMethodCallRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncToMethodCallRector.php index 41f8aafa9..479cafb2a 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncToMethodCallRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncToMethodCallRector.php @@ -18,16 +18,15 @@ final class CallUserFuncToMethodCallRector extends AbstractRector { /** * @readonly - * @var \Rector\CodingStyle\NodeFactory\ArrayCallableToMethodCallFactory */ - private $arrayCallableToMethodCallFactory; + private ArrayCallableToMethodCallFactory $arrayCallableToMethodCallFactory; public function __construct(ArrayCallableToMethodCallFactory $arrayCallableToMethodCallFactory) { $this->arrayCallableToMethodCallFactory = $arrayCallableToMethodCallFactory; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Refactor call_user_func() on known class method to a method call', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Refactor `call_user_func()` on known class method to a method call', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ConsistentImplodeRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ConsistentImplodeRector.php index 0292388c4..1431194be 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ConsistentImplodeRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/ConsistentImplodeRector.php @@ -18,9 +18,8 @@ final class ConsistentImplodeRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer */ - private $stringTypeAnalyzer; + private StringTypeAnalyzer $stringTypeAnalyzer; public function __construct(StringTypeAnalyzer $stringTypeAnalyzer) { $this->stringTypeAnalyzer = $stringTypeAnalyzer; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CountArrayToEmptyArrayComparisonRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CountArrayToEmptyArrayComparisonRector.php index bea2dc549..e8e423385 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CountArrayToEmptyArrayComparisonRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CountArrayToEmptyArrayComparisonRector.php @@ -12,7 +12,7 @@ use PhpParser\Node\Expr\BinaryOp\Smaller; use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\If_; use Rector\Rector\AbstractRector; @@ -164,7 +164,7 @@ private function matchCountFuncCallArgExpr(Expr $expr) : ?Expr } private function isZeroLNumber(Expr $expr) : bool { - if (!$expr instanceof LNumber) { + if (!$expr instanceof Int_) { return \false; } return $expr->value === 0; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/FunctionFirstClassCallableRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/FunctionFirstClassCallableRector.php index 524ec2650..100563639 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/FunctionFirstClassCallableRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/FunctionFirstClassCallableRector.php @@ -9,8 +9,7 @@ use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; use PhpParser\Node\VariadicPlaceholder; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersion; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use ReflectionException; @@ -21,7 +20,7 @@ /** * @see \Rector\Tests\CodingStyle\Rector\FuncCall\FunctionFirstClassCallableRector\FunctionFirstClassCallableRectorTest */ -final class FunctionFirstClassCallableRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class FunctionFirstClassCallableRector extends AbstractRector implements MinPhpVersionInterface { public function getRuleDefinition() : RuleDefinition { @@ -53,7 +52,7 @@ public function getNodeTypes() : array { return [FuncCall::class]; } - public function refactorWithScope(Node $node, Scope $scope) : ?FuncCall + public function refactor(Node $node) : ?FuncCall { if (!$node instanceof FuncCall) { return null; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/VersionCompareFuncCallToConstantRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/VersionCompareFuncCallToConstantRector.php index 7fa446633..89022a046 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/VersionCompareFuncCallToConstantRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/VersionCompareFuncCallToConstantRector.php @@ -15,7 +15,7 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\Rector\AbstractRector; use Rector\Util\PhpVersionFactory; @@ -98,7 +98,7 @@ private function isPhpVersionConstant(Expr $expr) : bool return $expr->name->toString() === 'PHP_VERSION'; } /** - * @return \PhpParser\Node\Expr\ConstFetch|\PhpParser\Node\Scalar\LNumber|null + * @return \PhpParser\Node\Expr\ConstFetch|\PhpParser\Node\Scalar\Int_|null */ private function getNewNodeForArg(Expr $expr) { @@ -107,12 +107,12 @@ private function getNewNodeForArg(Expr $expr) } return $this->getVersionNumberFormVersionString($expr); } - private function getVersionNumberFormVersionString(Expr $expr) : ?LNumber + private function getVersionNumberFormVersionString(Expr $expr) : ?Int_ { if (!$expr instanceof String_) { return null; } $value = PhpVersionFactory::createIntVersion($expr->value); - return new LNumber($value); + return new Int_($value); } } diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php new file mode 100644 index 000000000..07cdc5dd6 --- /dev/null +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php @@ -0,0 +1,158 @@ +extractMethodCallFromFuncLike($node); + if (!$extractedMethodCall instanceof MethodCall && !$extractedMethodCall instanceof StaticCall) { + return null; + } + if ($extractedMethodCall instanceof MethodCall) { + return new MethodCall($extractedMethodCall->var, $extractedMethodCall->name, [new VariadicPlaceholder()]); + } + return new StaticCall($extractedMethodCall->class, $extractedMethodCall->name, [new VariadicPlaceholder()]); + } + /** + * @param \PhpParser\Node\Expr\Closure|\PhpParser\Node\Expr\ArrowFunction $node + * @return \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null + */ + private function extractMethodCallFromFuncLike($node) + { + if ($node instanceof ArrowFunction) { + if (($node->expr instanceof MethodCall || $node->expr instanceof StaticCall) && !$node->expr->isFirstClassCallable() && $this->notUsingNamedArgs($node->expr->getArgs()) && $this->notUsingByRef($node->getParams()) && $this->sameParamsForArgs($node->getParams(), $node->expr->getArgs()) && $this->isNonDependantMethod($node->expr, $node->getParams())) { + return $node->expr; + } + return null; + } + if (\count($node->stmts) != 1 || !$node->getStmts()[0] instanceof Return_) { + return null; + } + $callLike = $node->getStmts()[0]->expr; + if (!$callLike instanceof MethodCall && !$callLike instanceof StaticCall) { + return null; + } + if (!$callLike->isFirstClassCallable() && $this->notUsingNamedArgs($callLike->getArgs()) && $this->notUsingByRef($node->getParams()) && $this->sameParamsForArgs($node->getParams(), $callLike->getArgs()) && $this->isNonDependantMethod($callLike, $node->getParams())) { + return $callLike; + } + return null; + } + /** + * @param Node\Param[] $params + * @param Node\Arg[] $args + */ + private function sameParamsForArgs(array $params, array $args) : bool + { + Assert::allIsInstanceOf($args, Arg::class); + Assert::allIsInstanceOf($params, Param::class); + if (\count($args) > \count($params)) { + return \false; + } + if (\count($args) === 1 && $args[0]->unpack) { + return $params[0]->variadic; + } + foreach ($args as $key => $arg) { + if (!$this->nodeComparator->areNodesEqual($arg->value, $params[$key]->var)) { + return \false; + } + } + return \true; + } + /** + * Makes sure the parameter isn't used to make the call e.g. in the var or class + * + * @param Param[] $params + * @param \PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall $expr + */ + private function isNonDependantMethod($expr, array $params) : bool + { + Assert::allIsInstanceOf($params, Param::class); + $found = \false; + foreach ($params as $param) { + if ($expr instanceof MethodCall) { + $this->traverseNodesWithCallable($expr->var, function (Node $node) use($param, &$found) { + if ($this->nodeComparator->areNodesEqual($node, $param->var)) { + $found = \true; + } + return null; + }); + } + if ($expr instanceof StaticCall) { + $this->traverseNodesWithCallable($expr->class, function (Node $node) use($param, &$found) { + if ($this->nodeComparator->areNodesEqual($node, $param->var)) { + $found = \true; + } + return null; + }); + } + if ($found) { + return \false; + } + } + return \true; + } + /** + * @param Param[] $params + */ + private function notUsingByRef(array $params) : bool + { + Assert::allIsInstanceOf($params, Param::class); + foreach ($params as $param) { + if ($param->byRef) { + return \false; + } + } + return \true; + } + /** + * @param Arg[] $args + */ + private function notUsingNamedArgs(array $args) : bool + { + Assert::allIsInstanceOf($args, Arg::class); + foreach ($args as $arg) { + if ($arg->name instanceof Identifier) { + return \false; + } + } + return \true; + } +} diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Property/SplitGroupedPropertiesRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Property/SplitGroupedPropertiesRector.php index 1faf9c45e..9b8191c34 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Property/SplitGroupedPropertiesRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Property/SplitGroupedPropertiesRector.php @@ -4,8 +4,8 @@ namespace Rector\CodingStyle\Rector\Property; use PhpParser\Node; +use PhpParser\Node\PropertyItem; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -58,7 +58,7 @@ public function refactor(Node $node) : ?array if (\count($allProperties) === 1) { return null; } - /** @var PropertyProperty $firstPropertyProperty */ + /** @var PropertyItem $firstPropertyProperty */ $firstPropertyProperty = \array_shift($allProperties); $node->props = [$firstPropertyProperty]; $nextProperties = []; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/NewlineAfterStatementRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/NewlineAfterStatementRector.php index a28b9a4ea..06b6247bd 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/NewlineAfterStatementRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/NewlineAfterStatementRector.php @@ -23,6 +23,7 @@ use PhpParser\Node\Stmt\TryCatch; use PhpParser\Node\Stmt\While_; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Contract\Rector\HTMLAverseRectorInterface; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -30,7 +31,7 @@ /** * @see \Rector\Tests\CodingStyle\Rector\Stmt\NewlineAfterStatementRector\NewlineAfterStatementRectorTest */ -final class NewlineAfterStatementRector extends AbstractRector +final class NewlineAfterStatementRector extends AbstractRector implements HTMLAverseRectorInterface { /** * @var array> @@ -87,9 +88,7 @@ private function processAddNewLine($node, bool $hasChanged, int $jumpToKey = 0) if ($node->stmts === null) { return null; } - \end($node->stmts); - $totalKeys = \key($node->stmts); - \reset($node->stmts); + $totalKeys = \array_key_last($node->stmts); for ($key = $jumpToKey; $key < $totalKeys; ++$key) { if (!isset($node->stmts[$key], $node->stmts[$key + 1])) { break; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php index e4935e32a..faada7454 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Stmt/RemoveUselessAliasInUseStatementRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\Stmt; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Namespace_; diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/String_/SymplifyQuoteEscapeRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/String_/SymplifyQuoteEscapeRector.php index 52f4951f1..7e9058305 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/String_/SymplifyQuoteEscapeRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/String_/SymplifyQuoteEscapeRector.php @@ -26,10 +26,7 @@ final class SymplifyQuoteEscapeRector extends AbstractRector * @see https://regex101.com/r/lGUhRb/1 */ private const HAS_NON_PRINTABLE_CHARS = '#[\\x00-\\x1F\\x80-\\xFF]#'; - /** - * @var bool - */ - private $hasChanged = \false; + private bool $hasChanged = \false; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Prefer quote that are not inside the string', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php index dcfb2ee6b..63d2a53d0 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/String_/UseClassKeywordForClassNameResolutionRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\Rector\String_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Name\FullyQualified; @@ -20,9 +20,8 @@ final class UseClassKeywordForClassNameResolutionRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var string * @see https://regex101.com/r/Vv41Qr/1/ @@ -79,9 +78,7 @@ private function getParts(String_ $string, array $classNames) : array $quotedClassNames = \array_map(\Closure::fromCallable('preg_quote'), $classNames); // @see https://regex101.com/r/8nGS0F/1 $parts = Strings::split($string->value, '#(' . \implode('|', $quotedClassNames) . ')#'); - return \array_filter($parts, static function (string $className) : bool { - return $className !== ''; - }); + return \array_filter($parts, static fn(string $className): bool => $className !== ''); } /** * @return string[] @@ -124,8 +121,6 @@ private function createExpressionsToConcat(array $parts) : array */ private function filterOurShortClasses(array $classNames) : array { - return \array_filter($classNames, static function (string $className) : bool { - return \strpos($className, '\\') !== \false; - }); + return \array_filter($classNames, static fn(string $className): bool => \strpos($className, '\\') !== \false); } } diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php index 5b630d61b..21dc118a4 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php @@ -105,7 +105,7 @@ private function refactorTraitUse(TraitUse $traitUse) : ?array foreach ($traitUse->traits as $singleTraitUse) { $adaptation = []; foreach ($traitUse->adaptations as $traitAdaptation) { - if ($traitAdaptation instanceof Alias && $traitAdaptation->trait && $traitAdaptation->trait instanceof Name && $traitAdaptation->trait->toString() === $singleTraitUse->toString()) { + if ($traitAdaptation instanceof Alias && $traitAdaptation->trait instanceof Name && $traitAdaptation->trait->toString() === $singleTraitUse->toString()) { $adaptation[] = $traitAdaptation; } } diff --git a/vendor/rector/rector/rules/CodingStyle/Reflection/VendorLocationDetector.php b/vendor/rector/rector/rules/CodingStyle/Reflection/VendorLocationDetector.php index b8d255613..2b4f779fe 100644 --- a/vendor/rector/rector/rules/CodingStyle/Reflection/VendorLocationDetector.php +++ b/vendor/rector/rector/rules/CodingStyle/Reflection/VendorLocationDetector.php @@ -10,9 +10,8 @@ final class VendorLocationDetector { /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; public function __construct(FilePathHelper $filePathHelper) { $this->filePathHelper = $filePathHelper; diff --git a/vendor/rector/rector/rules/DeadCode/ConditionEvaluator.php b/vendor/rector/rector/rules/DeadCode/ConditionEvaluator.php index 9b164c756..ce8f03aeb 100644 --- a/vendor/rector/rector/rules/DeadCode/ConditionEvaluator.php +++ b/vendor/rector/rector/rules/DeadCode/ConditionEvaluator.php @@ -16,9 +16,8 @@ final class ConditionEvaluator { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/rules/DeadCode/ConditionResolver.php b/vendor/rector/rector/rules/DeadCode/ConditionResolver.php index e371e9eef..bcca3e1f1 100644 --- a/vendor/rector/rector/rules/DeadCode/ConditionResolver.php +++ b/vendor/rector/rector/rules/DeadCode/ConditionResolver.php @@ -21,19 +21,16 @@ final class ConditionResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(NodeNameResolver $nodeNameResolver, PhpVersionProvider $phpVersionProvider, ValueResolver $valueResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/CallCollectionAnalyzer.php b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/CallCollectionAnalyzer.php index 866a81de2..da1e520e1 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/CallCollectionAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/CallCollectionAnalyzer.php @@ -10,22 +10,20 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PHPStan\Type\MixedType; -use PHPStan\Type\TypeWithClassName; use Rector\Enum\ObjectReference; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class CallCollectionAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -39,7 +37,8 @@ public function isExists(array $calls, string $classMethodName, string $classNam foreach ($calls as $call) { $callerRoot = $call instanceof StaticCall ? $call->class : $call->var; $callerType = $this->nodeTypeResolver->getType($callerRoot); - if (!$callerType instanceof TypeWithClassName) { + $callerTypeClassName = ClassNameFromObjectTypeResolver::resolve($callerType); + if ($callerTypeClassName === null) { // handle fluent by $this->bar()->baz()->qux() // that methods don't have return type if ($callerType instanceof MixedType && !$callerType->isExplicitMixed()) { @@ -66,7 +65,7 @@ public function isExists(array $calls, string $classMethodName, string $classNam if ($this->isSelfStatic($call) && $this->shouldSkip($call, $classMethodName)) { return \true; } - if ($callerType->getClassName() !== $className) { + if ($callerTypeClassName !== $className) { continue; } if ($this->shouldSkip($call, $classMethodName)) { diff --git a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/ExprUsedInNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/ExprUsedInNodeAnalyzer.php index 484aa23b0..9271c90e6 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/ExprUsedInNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/ExprUsedInNodeAnalyzer.php @@ -13,14 +13,12 @@ final class ExprUsedInNodeAnalyzer { /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\UsedVariableNameAnalyzer */ - private $usedVariableNameAnalyzer; + private \Rector\DeadCode\NodeAnalyzer\UsedVariableNameAnalyzer $usedVariableNameAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\CompactFuncCallAnalyzer */ - private $compactFuncCallAnalyzer; + private CompactFuncCallAnalyzer $compactFuncCallAnalyzer; public function __construct(\Rector\DeadCode\NodeAnalyzer\UsedVariableNameAnalyzer $usedVariableNameAnalyzer, CompactFuncCallAnalyzer $compactFuncCallAnalyzer) { $this->usedVariableNameAnalyzer = $usedVariableNameAnalyzer; diff --git a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php index 2291ebd03..02dfce0a8 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php @@ -6,7 +6,6 @@ use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\NullsafeMethodCall; @@ -16,7 +15,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Trait_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\Scope; use PHPStan\Parser\ArrayMapArgVisitor; use PHPStan\Reflection\ClassReflection; @@ -33,44 +32,36 @@ final class IsClassMethodUsedAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\NodeCollector\NodeAnalyzer\ArrayCallableMethodMatcher */ - private $arrayCallableMethodMatcher; + private ArrayCallableMethodMatcher $arrayCallableMethodMatcher; /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\CallCollectionAnalyzer */ - private $callCollectionAnalyzer; + private \Rector\DeadCode\NodeAnalyzer\CallCollectionAnalyzer $callCollectionAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(NodeNameResolver $nodeNameResolver, AstResolver $astResolver, BetterNodeFinder $betterNodeFinder, ValueResolver $valueResolver, ArrayCallableMethodMatcher $arrayCallableMethodMatcher, \Rector\DeadCode\NodeAnalyzer\CallCollectionAnalyzer $callCollectionAnalyzer, ReflectionResolver $reflectionResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->nodeNameResolver = $nodeNameResolver; @@ -133,9 +124,6 @@ private function isInArrayMap(Class_ $class, Array_ $array) : bool if (\count($array->items) !== 2) { return \false; } - if (!$array->items[1] instanceof ArrayItem) { - return \false; - } $value = $this->valueResolver->getValue($array->items[1]->value); if (!\is_string($value)) { return \false; @@ -201,15 +189,15 @@ private function isUsedByTrait(Trait_ $trait, string $classMethodName, string $c $callMethod = null; $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $subNode) use($className, $classMethodName, &$callMethod) : ?int { if ($subNode instanceof Class_ || $subNode instanceof Function_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof MethodCall && $this->nodeNameResolver->isName($subNode->var, 'this') && $this->nodeNameResolver->isName($subNode->name, $classMethodName)) { $callMethod = $subNode; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if ($this->isStaticCallMatch($subNode, $className, $classMethodName)) { $callMethod = $subNode; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; }); diff --git a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/PropertyWriteonlyAnalyzer.php b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/PropertyWriteonlyAnalyzer.php index 76bd3653c..79b13fa96 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/PropertyWriteonlyAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/PropertyWriteonlyAnalyzer.php @@ -4,27 +4,49 @@ namespace Rector\DeadCode\NodeAnalyzer; use PhpParser\Node; +use PhpParser\Node\Arg; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\NullsafePropertyFetch; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Class_; +use PHPStan\Type\ObjectType; +use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\BetterNodeFinder; final class PropertyWriteonlyAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; - public function __construct(BetterNodeFinder $betterNodeFinder) + private BetterNodeFinder $betterNodeFinder; + /** + * @readonly + */ + private NodeTypeResolver $nodeTypeResolver; + /** + * @readonly + */ + private NodeNameResolver $nodeNameResolver; + public function __construct(BetterNodeFinder $betterNodeFinder, NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver) { $this->betterNodeFinder = $betterNodeFinder; + $this->nodeTypeResolver = $nodeTypeResolver; + $this->nodeNameResolver = $nodeNameResolver; } public function hasClassDynamicPropertyNames(Class_ $class) : bool { - return (bool) $this->betterNodeFinder->findFirst($class, static function (Node $node) : bool { + $isImplementsJsonSerializable = $this->nodeTypeResolver->isObjectType($class, new ObjectType('JsonSerializable')); + return (bool) $this->betterNodeFinder->findFirst($class, function (Node $node) use($isImplementsJsonSerializable) : bool { + if ($isImplementsJsonSerializable && $node instanceof FuncCall && $this->nodeNameResolver->isName($node, 'get_object_vars') && !$node->isFirstClassCallable()) { + $firstArg = $node->getArgs()[0] ?? null; + if ($firstArg instanceof Arg && $firstArg->value instanceof Variable && $firstArg->value->name === 'this') { + return \true; + } + } if (!$node instanceof PropertyFetch && !$node instanceof NullsafePropertyFetch) { return \false; } diff --git a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php index e950f7e00..67614aac9 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php @@ -22,24 +22,20 @@ final class SafeLeftTypeBooleanAndOrAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(BetterNodeFinder $betterNodeFinder, ExprAnalyzer $exprAnalyzer, ReflectionResolver $reflectionResolver, NodeTypeResolver $nodeTypeResolver) { $this->betterNodeFinder = $betterNodeFinder; @@ -52,15 +48,11 @@ public function __construct(BetterNodeFinder $betterNodeFinder, ExprAnalyzer $ex */ public function isSafe($booleanAnd) : bool { - $hasNonTypedFromParam = (bool) $this->betterNodeFinder->findFirst($booleanAnd->left, function (Node $node) : bool { - return $node instanceof Variable && $this->exprAnalyzer->isNonTypedFromParam($node); - }); + $hasNonTypedFromParam = (bool) $this->betterNodeFinder->findFirst($booleanAnd->left, fn(Node $node): bool => $node instanceof Variable && $this->exprAnalyzer->isNonTypedFromParam($node)); if ($hasNonTypedFromParam) { return \false; } - $hasPropertyFetchOrArrayDimFetch = (bool) $this->betterNodeFinder->findFirst($booleanAnd->left, static function (Node $node) : bool { - return $node instanceof PropertyFetch || $node instanceof StaticPropertyFetch || $node instanceof ArrayDimFetch; - }); + $hasPropertyFetchOrArrayDimFetch = (bool) $this->betterNodeFinder->findFirst($booleanAnd->left, static fn(Node $node): bool => $node instanceof PropertyFetch || $node instanceof StaticPropertyFetch || $node instanceof ArrayDimFetch); // get type from Property and ArrayDimFetch is unreliable if ($hasPropertyFetchOrArrayDimFetch) { return \false; diff --git a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/UsedVariableNameAnalyzer.php b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/UsedVariableNameAnalyzer.php index 03b934953..18df028a5 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/UsedVariableNameAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/NodeAnalyzer/UsedVariableNameAnalyzer.php @@ -12,9 +12,8 @@ final class UsedVariableNameAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/DeadCode/NodeCollector/UnusedParameterResolver.php b/vendor/rector/rector/rules/DeadCode/NodeCollector/UnusedParameterResolver.php index 448b3ba4a..4f6e2b63e 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeCollector/UnusedParameterResolver.php +++ b/vendor/rector/rector/rules/DeadCode/NodeCollector/UnusedParameterResolver.php @@ -10,9 +10,8 @@ final class UnusedParameterResolver { /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; public function __construct(ParamAnalyzer $paramAnalyzer) { $this->paramAnalyzer = $paramAnalyzer; @@ -27,7 +26,7 @@ public function resolve(ClassMethod $classMethod) : array foreach ($classMethod->params as $i => $param) { // skip property promotion /** @var Param $param */ - if ($param->flags !== 0) { + if ($param->isPromoted()) { continue; } if ($this->paramAnalyzer->isParamUsedInClassMethod($classMethod, $param)) { diff --git a/vendor/rector/rector/rules/DeadCode/NodeManipulator/ClassMethodParamRemover.php b/vendor/rector/rector/rules/DeadCode/NodeManipulator/ClassMethodParamRemover.php index a95cbf91a..0a827fece 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeManipulator/ClassMethodParamRemover.php +++ b/vendor/rector/rector/rules/DeadCode/NodeManipulator/ClassMethodParamRemover.php @@ -10,14 +10,12 @@ final class ClassMethodParamRemover { /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\Removing\NodeManipulator\ComplexNodeRemover */ - private $complexNodeRemover; + private ComplexNodeRemover $complexNodeRemover; public function __construct(ParamAnalyzer $paramAnalyzer, ComplexNodeRemover $complexNodeRemover) { $this->paramAnalyzer = $paramAnalyzer; diff --git a/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php b/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php index 40bfeeb74..1f0ee8680 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php +++ b/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php @@ -7,20 +7,19 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; +use Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\NodeNameResolver\NodeNameResolver; final class ControllerClassMethodManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(NodeNameResolver $nodeNameResolver, PhpDocInfoFactory $phpDocInfoFactory) { $this->nodeNameResolver = $nodeNameResolver; @@ -35,7 +34,7 @@ public function isControllerClassMethod(Class_ $class, ClassMethod $classMethod) return \false; } $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); - return $phpDocInfo->hasByType(GenericTagValueNode::class); + return $phpDocInfo->hasByTypes([GenericTagValueNode::class, SpacelessPhpDocTagNode::class]); } private function hasParentClassController(Class_ $class) : bool { diff --git a/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php b/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php index 06383a401..b1c739e05 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php +++ b/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php @@ -9,7 +9,7 @@ use PhpParser\Node\Expr\BinaryOp\Smaller; use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PHPStan\Type\NeverType; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; @@ -18,19 +18,16 @@ final class CountManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeNameResolver $nodeNameResolver, NodeComparator $nodeComparator, NodeTypeResolver $nodeTypeResolver) { $this->nodeNameResolver = $nodeNameResolver; @@ -87,7 +84,7 @@ private function isSmallerOrEqual(SmallerOrEqual $smallerOrEqual, Expr $expr) : } private function isNumber(Expr $expr, int $value) : bool { - if (!$expr instanceof LNumber) { + if (!$expr instanceof Int_) { return \false; } return $expr->value === $value; diff --git a/vendor/rector/rector/rules/DeadCode/NodeManipulator/LivingCodeManipulator.php b/vendor/rector/rector/rules/DeadCode/NodeManipulator/LivingCodeManipulator.php index 4cbba9db6..163a1451c 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeManipulator/LivingCodeManipulator.php +++ b/vendor/rector/rector/rules/DeadCode/NodeManipulator/LivingCodeManipulator.php @@ -34,9 +34,8 @@ final class LivingCodeManipulator { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/rules/DeadCode/NodeManipulator/VariadicFunctionLikeDetector.php b/vendor/rector/rector/rules/DeadCode/NodeManipulator/VariadicFunctionLikeDetector.php index 78bd1ee4f..7f36a3327 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeManipulator/VariadicFunctionLikeDetector.php +++ b/vendor/rector/rector/rules/DeadCode/NodeManipulator/VariadicFunctionLikeDetector.php @@ -6,21 +6,19 @@ use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\FunctionLike; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; final class VariadicFunctionLikeDetector { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @var string[] */ @@ -44,7 +42,7 @@ public function isVariadic(FunctionLike $functionLike) : bool return null; } $isVariadic = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); return $isVariadic; } diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php index 1f9351ce5..8bae9f118 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\DeadCode\PhpDoc; +use PhpParser\Node; use PhpParser\Node\FunctionLike; use PhpParser\Node\Name; use PhpParser\Node\Param; @@ -22,49 +23,40 @@ final class DeadParamTagValueNodeAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\DeadCode\TypeNodeAnalyzer\GenericTypeNodeAnalyzer */ - private $genericTypeNodeAnalyzer; + private GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer; /** * @readonly - * @var \Rector\DeadCode\TypeNodeAnalyzer\MixedArrayTypeNodeAnalyzer */ - private $mixedArrayTypeNodeAnalyzer; + private MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\Guard\StandaloneTypeRemovalGuard */ - private $standaloneTypeRemovalGuard; + private StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard */ - private $templateTypeRemovalGuard; + private TemplateTypeRemovalGuard $templateTypeRemovalGuard; public function __construct(NodeNameResolver $nodeNameResolver, TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer, ParamAnalyzer $paramAnalyzer, PhpDocTypeChanger $phpDocTypeChanger, StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard, StaticTypeMapper $staticTypeMapper, TemplateTypeRemovalGuard $templateTypeRemovalGuard) { $this->nodeNameResolver = $nodeNameResolver; @@ -83,7 +75,7 @@ public function isDead(ParamTagValueNode $paramTagValueNode, FunctionLike $funct if (!$param instanceof Param) { return \false; } - if ($param->type === null) { + if (!$param->type instanceof Node) { return \false; } if ($paramTagValueNode->description !== '') { diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php index 020e61023..50b66e794 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php @@ -26,39 +26,32 @@ final class DeadReturnTagValueNodeAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\DeadCode\TypeNodeAnalyzer\GenericTypeNodeAnalyzer */ - private $genericTypeNodeAnalyzer; + private GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer; /** * @readonly - * @var \Rector\DeadCode\TypeNodeAnalyzer\MixedArrayTypeNodeAnalyzer */ - private $mixedArrayTypeNodeAnalyzer; + private MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\Guard\StandaloneTypeRemovalGuard */ - private $standaloneTypeRemovalGuard; + private StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard */ - private $templateTypeRemovalGuard; + private TemplateTypeRemovalGuard $templateTypeRemovalGuard; public function __construct(TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer, StandaloneTypeRemovalGuard $standaloneTypeRemovalGuard, PhpDocTypeChanger $phpDocTypeChanger, StaticTypeMapper $staticTypeMapper, TemplateTypeRemovalGuard $templateTypeRemovalGuard) { $this->typeComparator = $typeComparator; @@ -122,7 +115,7 @@ private function isDeadNotEqual(ReturnTagValueNode $returnTagValueNode, Node $no if ($returnTagValueNode->type instanceof IdentifierTypeNode && (string) $returnTagValueNode->type === 'void') { return \true; } - if (!$this->hasUsefullPhpdocType($returnTagValueNode, $node)) { + if (!$this->hasUsefulPhpdocType($returnTagValueNode, $node)) { return \true; } $nodeType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($node); @@ -147,7 +140,7 @@ private function hasTrueFalsePseudoType(BracketsAwareUnionTypeNode $bracketsAwar * exact different between @return and node return type * @param mixed $returnType */ - private function hasUsefullPhpdocType(ReturnTagValueNode $returnTagValueNode, $returnType) : bool + private function hasUsefulPhpdocType(ReturnTagValueNode $returnTagValueNode, $returnType) : bool { if ($returnTagValueNode->type instanceof IdentifierTypeNode && $returnTagValueNode->type->name === 'mixed') { return \false; diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php index e2f953d6b..e89aec1b9 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadVarTagValueNodeAnalyzer.php @@ -3,6 +3,8 @@ declare (strict_types=1); namespace Rector\DeadCode\PhpDoc; +use PhpParser\Node; +use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\Type\IntersectionType; @@ -16,28 +18,28 @@ final class DeadVarTagValueNodeAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\Guard\TemplateTypeRemovalGuard */ - private $templateTypeRemovalGuard; + private TemplateTypeRemovalGuard $templateTypeRemovalGuard; public function __construct(TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper, TemplateTypeRemovalGuard $templateTypeRemovalGuard) { $this->typeComparator = $typeComparator; $this->staticTypeMapper = $staticTypeMapper; $this->templateTypeRemovalGuard = $templateTypeRemovalGuard; } - public function isDead(VarTagValueNode $varTagValueNode, Property $property) : bool + /** + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $property + */ + public function isDead(VarTagValueNode $varTagValueNode, $property) : bool { - if ($property->type === null) { + if (!$property->type instanceof Node) { return \false; } if ($varTagValueNode->description !== '') { diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php index c93146d2c..052b7c8c6 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/Guard/TemplateTypeRemovalGuard.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\DeadCode\PhpDoc\Guard; +use PHPStan\Type\Generic\TemplateType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; -use PHPStan\Type\Generic\TemplateType; final class TemplateTypeRemovalGuard { public function isLegal(Type $docType) : bool diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php index ded731da3..545eb7c74 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ParamTagRemover.php @@ -16,14 +16,12 @@ final class ParamTagRemover { /** * @readonly - * @var \Rector\DeadCode\PhpDoc\DeadParamTagValueNodeAnalyzer */ - private $deadParamTagValueNodeAnalyzer; + private DeadParamTagValueNodeAnalyzer $deadParamTagValueNodeAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(DeadParamTagValueNodeAnalyzer $deadParamTagValueNodeAnalyzer, DocBlockUpdater $docBlockUpdater) { $this->deadParamTagValueNodeAnalyzer = $deadParamTagValueNodeAnalyzer; diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ReturnTagRemover.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ReturnTagRemover.php index 26266bd1b..05caa6f94 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ReturnTagRemover.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/ReturnTagRemover.php @@ -12,9 +12,8 @@ final class ReturnTagRemover { /** * @readonly - * @var \Rector\DeadCode\PhpDoc\DeadReturnTagValueNodeAnalyzer */ - private $deadReturnTagValueNodeAnalyzer; + private DeadReturnTagValueNodeAnalyzer $deadReturnTagValueNodeAnalyzer; public function __construct(DeadReturnTagValueNodeAnalyzer $deadReturnTagValueNodeAnalyzer) { $this->deadReturnTagValueNodeAnalyzer = $deadReturnTagValueNodeAnalyzer; diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php index d3e97eac0..c935edbdc 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/TagRemover/VarTagRemover.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Param; +use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; @@ -21,34 +22,28 @@ final class VarTagRemover { /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer */ - private $doctrineTypeAnalyzer; + private DoctrineTypeAnalyzer $doctrineTypeAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\DeadVarTagValueNodeAnalyzer */ - private $deadVarTagValueNodeAnalyzer; + private DeadVarTagValueNodeAnalyzer $deadVarTagValueNodeAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; public function __construct(DoctrineTypeAnalyzer $doctrineTypeAnalyzer, PhpDocInfoFactory $phpDocInfoFactory, DeadVarTagValueNodeAnalyzer $deadVarTagValueNodeAnalyzer, PhpDocTypeChanger $phpDocTypeChanger, DocBlockUpdater $docBlockUpdater, TypeComparator $typeComparator) { $this->doctrineTypeAnalyzer = $doctrineTypeAnalyzer; @@ -58,7 +53,10 @@ public function __construct(DoctrineTypeAnalyzer $doctrineTypeAnalyzer, PhpDocIn $this->docBlockUpdater = $docBlockUpdater; $this->typeComparator = $typeComparator; } - public function removeVarTagIfUseless(PhpDocInfo $phpDocInfo, Property $property) : bool + /** + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $property + */ + public function removeVarTagIfUseless(PhpDocInfo $phpDocInfo, $property) : bool { $varTagValueNode = $phpDocInfo->getVarTagValueNode(); if (!$varTagValueNode instanceof VarTagValueNode) { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Array_/RemoveDuplicatedArrayKeyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Array_/RemoveDuplicatedArrayKeyRector.php index a1989fc8a..744d7f869 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Array_/RemoveDuplicatedArrayKeyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Array_/RemoveDuplicatedArrayKeyRector.php @@ -4,9 +4,9 @@ namespace Rector\DeadCode\Rector\Array_; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\PreDec; use PhpParser\Node\Expr\PreInc; use Rector\PhpParser\Printer\BetterStandardPrinter; @@ -20,9 +20,8 @@ final class RemoveDuplicatedArrayKeyRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; public function __construct(BetterStandardPrinter $betterStandardPrinter) { $this->betterStandardPrinter = $betterStandardPrinter; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php index 9cd6fd28c..e890e1c03 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php @@ -5,38 +5,29 @@ use PhpParser\Node; use PhpParser\Node\Expr\Assign; -use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; -use PhpParser\Node\Stmt\Foreach_; -use PhpParser\Node\Stmt\Function_; -use PhpParser\Node\Stmt\If_; -use PhpParser\Node\Stmt\Namespace_; -use PHPStan\Analyser\Scope; +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\DeadCode\Rector\Assign\RemoveDoubleAssignRector\RemoveDoubleAssignRectorTest */ -final class RemoveDoubleAssignRector extends AbstractScopeAwareRector +final class RemoveDoubleAssignRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\SideEffect\SideEffectNodeDetector */ - private $sideEffectNodeDetector; + private SideEffectNodeDetector $sideEffectNodeDetector; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(SideEffectNodeDetector $sideEffectNodeDetector, BetterNodeFinder $betterNodeFinder) { $this->sideEffectNodeDetector = $sideEffectNodeDetector; @@ -55,12 +46,12 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [Foreach_::class, FileWithoutNamespace::class, ClassMethod::class, Function_::class, Closure::class, If_::class, Namespace_::class]; + return [StmtsAwareInterface::class]; } /** - * @param Foreach_|FileWithoutNamespace|If_|Namespace_|ClassMethod|Function_|Closure $node + * @param StmtsAwareInterface $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { $stmts = $node->stmts; if ($stmts === null) { @@ -94,13 +85,17 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } // detect call expression has side effect // no calls on right, could hide e.g. array_pop()|array_shift() - if ($this->sideEffectNodeDetector->detectCallExpr($stmt->expr->expr, $scope)) { + if ($this->sideEffectNodeDetector->detectCallExpr($stmt->expr->expr)) { + continue; + } + // next stmts can have side effect as well + if (($nextAssign->var instanceof PropertyFetch || $nextAssign->var instanceof StaticPropertyFetch) && $this->sideEffectNodeDetector->detectCallExpr($nextAssign->expr)) { continue; } if (!$stmt->expr->var instanceof Variable && !$stmt->expr->var instanceof PropertyFetch && !$stmt->expr->var instanceof StaticPropertyFetch) { continue; } - // remove current Stmt if will be overriden in next stmt + // remove current Stmt if will be overridden in next stmt unset($node->stmts[$key]); $hasChanged = \true; } @@ -111,8 +106,6 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } private function isSelfReferencing(Assign $assign) : bool { - return (bool) $this->betterNodeFinder->findFirst($assign->expr, function (Node $subNode) use($assign) : bool { - return $this->nodeComparator->areNodesEqual($assign->var, $subNode); - }); + return (bool) $this->betterNodeFinder->findFirst($assign->expr, fn(Node $subNode): bool => $this->nodeComparator->areNodesEqual($assign->var, $subNode)); } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php index ce3f4389b..9a12fb2db 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php @@ -15,45 +15,39 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; -use PHPStan\Analyser\Scope; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; use Rector\NodeAnalyzer\VariableAnalyzer; use Rector\NodeManipulator\StmtsManipulator; use Rector\Php\ReservedKeywordAnalyzer; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\DeadCode\Rector\Assign\RemoveUnusedVariableAssignRector\RemoveUnusedVariableAssignRectorTest */ -final class RemoveUnusedVariableAssignRector extends AbstractScopeAwareRector +final class RemoveUnusedVariableAssignRector extends AbstractRector { /** * @readonly - * @var \Rector\Php\ReservedKeywordAnalyzer */ - private $reservedKeywordAnalyzer; + private ReservedKeywordAnalyzer $reservedKeywordAnalyzer; /** * @readonly - * @var \Rector\DeadCode\SideEffect\SideEffectNodeDetector */ - private $sideEffectNodeDetector; + private SideEffectNodeDetector $sideEffectNodeDetector; /** * @readonly - * @var \Rector\NodeAnalyzer\VariableAnalyzer */ - private $variableAnalyzer; + private VariableAnalyzer $variableAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; public function __construct(ReservedKeywordAnalyzer $reservedKeywordAnalyzer, SideEffectNodeDetector $sideEffectNodeDetector, VariableAnalyzer $variableAnalyzer, BetterNodeFinder $betterNodeFinder, StmtsManipulator $stmtsManipulator) { $this->reservedKeywordAnalyzer = $reservedKeywordAnalyzer; @@ -94,7 +88,7 @@ public function getNodeTypes() : array * @param ClassMethod|Function_ $node * @return null|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_ */ - public function refactorWithScope(Node $node, Scope $scope) + public function refactor(Node $node) { $stmts = $node->stmts; if ($stmts === null || $stmts === []) { @@ -107,14 +101,14 @@ public function refactorWithScope(Node $node, Scope $scope) $assignedVariableNamesByStmtPosition = $this->resolvedAssignedVariablesByStmtPosition($stmts); $hasChanged = \false; foreach ($assignedVariableNamesByStmtPosition as $stmtPosition => $variableName) { - if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmts, $stmtPosition + 1, $variableName)) { + if ($this->stmtsManipulator->isVariableUsedInNextStmt($node, $stmtPosition + 1, $variableName)) { continue; } /** @var Expression $currentStmt */ $currentStmt = $stmts[$stmtPosition]; /** @var Assign $assign */ $assign = $currentStmt->expr; - if ($this->hasCallLikeInAssignExpr($assign, $scope)) { + if ($this->hasCallLikeInAssignExpr($assign)) { // clean safely $cleanAssignedExpr = $this->cleanCastedExpr($assign->expr); $newExpression = new Expression($cleanAssignedExpr); @@ -137,11 +131,9 @@ private function cleanCastedExpr(Expr $expr) : Expr } return $this->cleanCastedExpr($expr->expr); } - private function hasCallLikeInAssignExpr(Expr $expr, Scope $scope) : bool + private function hasCallLikeInAssignExpr(Expr $expr) : bool { - return (bool) $this->betterNodeFinder->findFirst($expr, function (Node $subNode) use($scope) : bool { - return $this->sideEffectNodeDetector->detectCallExpr($subNode, $scope); - }); + return (bool) $this->betterNodeFinder->findFirst($expr, fn(Node $subNode): bool => $this->sideEffectNodeDetector->detectCallExpr($subNode)); } /** * @param Stmt[] $stmts diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Block/ReplaceBlockToItsStmtsRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Block/ReplaceBlockToItsStmtsRector.php new file mode 100644 index 000000000..a34d4dea0 --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/Rector/Block/ReplaceBlockToItsStmtsRector.php @@ -0,0 +1,53 @@ +> + */ + public function getNodeTypes() : array + { + return [Block::class]; + } + /** + * @param Block $node + * @return int|Stmt[] + */ + public function refactor(Node $node) + { + if ($node->stmts === []) { + return NodeVisitor::REMOVE_NODE; + } + return $node->stmts; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php b/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php index c0d698658..f0792f2a0 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php @@ -17,16 +17,15 @@ final class RemoveAndTrueRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $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' + return new RuleDefinition('Remove `and true` that has no added value', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php index db50f0413..9997dc03c 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php @@ -17,12 +17,14 @@ use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Type\ArrayType; use PHPStan\Type\BooleanType; +use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use PHPStan\Type\UnionType; use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Rector\AbstractRector; @@ -36,19 +38,16 @@ final class RecastingRemovalRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @var array, class-string> */ @@ -61,7 +60,7 @@ public function __construct(PropertyFetchAnalyzer $propertyFetchAnalyzer, Reflec } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Removes recasting of the same type', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove recasting of the same type', [new CodeSample(<<<'CODE_SAMPLE' $string = ''; $string = (string) $string; @@ -97,6 +96,15 @@ public function refactor(Node $node) : ?Node if ($nodeType instanceof MixedType) { return null; } + if ($nodeType instanceof ConstantArrayType && $nodeClass === Array_::class) { + if ($this->shouldSkip($node->expr)) { + return null; + } + if ($this->shouldSkipCall($node->expr)) { + return null; + } + return $node->expr; + } $sameNodeType = self::CAST_CLASS_TO_NODE_TYPE[$nodeClass]; if (!$nodeType instanceof $sameNodeType) { return null; @@ -119,6 +127,14 @@ private function shouldSkipCall(Expr $expr) : bool } private function shouldSkip(Expr $expr) : bool { + $type = $this->getType($expr); + if ($type instanceof UnionType) { + foreach ($type->getTypes() as $unionedType) { + if ($unionedType instanceof MixedType) { + return \true; + } + } + } if (!$this->propertyFetchAnalyzer->isPropertyFetch($expr)) { return $this->exprAnalyzer->isNonTypedFromParam($expr); } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php index 07fa2f354..1aad5b018 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php @@ -5,29 +5,27 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassConst; -use PhpParser\NodeTraverser; -use PHPStan\Analyser\Scope; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ClassReflection; use Rector\NodeManipulator\ClassConstManipulator; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\DeadCode\Rector\ClassConst\RemoveUnusedPrivateClassConstantRector\RemoveUnusedPrivateClassConstantRectorTest */ -final class RemoveUnusedPrivateClassConstantRector extends AbstractScopeAwareRector +final class RemoveUnusedPrivateClassConstantRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\ClassConstManipulator */ - private $classConstManipulator; + private ClassConstManipulator $classConstManipulator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ClassConstManipulator $classConstManipulator, ReflectionResolver $reflectionResolver) { $this->classConstManipulator = $classConstManipulator; @@ -65,9 +63,9 @@ public function getNodeTypes() : array /** * @param ClassConst $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?int + public function refactor(Node $node) : ?int { - if ($this->shouldSkipClassConst($node, $scope)) { + if ($this->shouldSkipClassConst($node)) { return null; } $classReflection = $this->reflectionResolver->resolveClassReflection($node); @@ -77,9 +75,9 @@ public function refactorWithScope(Node $node, Scope $scope) : ?int if ($this->classConstManipulator->hasClassConstFetch($node, $classReflection)) { return null; } - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } - private function shouldSkipClassConst(ClassConst $classConst, Scope $scope) : bool + private function shouldSkipClassConst(ClassConst $classConst) : bool { if (!$classConst->isPrivate()) { return \true; @@ -87,6 +85,7 @@ private function shouldSkipClassConst(ClassConst $classConst, Scope $scope) : bo if (\count($classConst->consts) !== 1) { return \true; } + $scope = ScopeFetcher::fetch($classConst); $classReflection = $scope->getClassReflection(); if (!$classReflection instanceof ClassReflection) { return \false; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php index 4d4800186..40308373f 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php @@ -17,7 +17,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\DeadCode\Rector\ClassLike\RemoveAnnotationRector\RemoveAnnotationRectorTest */ @@ -25,23 +25,20 @@ final class RemoveAnnotationRector extends AbstractRector implements Configurabl { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var string[] */ - private $annotationsToRemove = []; + private array $annotationsToRemove = []; public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTagRemover = $phpDocTagRemover; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php index 5984622d4..80e872c85 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php @@ -28,23 +28,16 @@ final class RemoveTypedPropertyNonMockDocblockRector extends AbstractRector impl { /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ - private $varTagRemover; + private VarTagRemover $varTagRemover; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; - /** - * @var string - */ - private const MOCK_OBJECT_CLASS = 'PHPUnit\\Framework\\MockObject\\MockObject'; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(VarTagRemover $varTagRemover, StaticTypeMapper $staticTypeMapper, PhpDocInfoFactory $phpDocInfoFactory) { $this->varTagRemover = $varTagRemover; @@ -100,7 +93,7 @@ public function refactor(Node $node) : ?Node if (!$property->type instanceof FullyQualified) { continue; } - if ($this->isObjectType($property->type, new ObjectType(self::MOCK_OBJECT_CLASS))) { + if ($this->isObjectType($property->type, new ObjectType(ClassName::MOCK_OBJECT))) { continue; } $propertyDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); @@ -135,7 +128,7 @@ private function isVarTagUnionTypeMockObject(PhpDocInfo $phpDocInfo, Property $p return \false; } foreach ($varTagType->getTypes() as $unionedType) { - if ($unionedType->isSuperTypeOf(new ObjectType(self::MOCK_OBJECT_CLASS))->yes()) { + if ($unionedType->isSuperTypeOf(new ObjectType(ClassName::MOCK_OBJECT))->yes()) { return \true; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveArgumentFromDefaultParentCallRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveArgumentFromDefaultParentCallRector.php new file mode 100644 index 000000000..bc7ea9bbf --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveArgumentFromDefaultParentCallRector.php @@ -0,0 +1,179 @@ +reflectionResolver = $reflectionResolver; + $this->argsAnalyzer = $argsAnalyzer; + $this->valueResolver = $valueResolver; + $this->exprAnalyzer = $exprAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove default argument from parent call', [new CodeSample(<<<'CODE_SAMPLE' +class SomeParent +{ + public function __construct(array $param = []) + { + } +} + +class ChildClass extends SomeParent +{ + public function __construct(string $differentParam) + { + init($differentParam); + + parent::__construct([]); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeParent +{ + public function __construct(array $param = []) + { + } +} + +class ChildClass extends SomeParent +{ + public function __construct(string $differentParam) + { + init($differentParam); + + parent::__construct(); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if (!$node->extends instanceof FullyQualified) { + return null; + } + $classReflection = $this->reflectionResolver->resolveClassReflection($node); + if (!$classReflection instanceof ClassReflection) { + return null; + } + $ancestors = \array_filter($classReflection->getAncestors(), fn(ClassReflection $ancestorClassReflection): bool => $classReflection->isClass() && $ancestorClassReflection->getName() !== $classReflection->getName()); + $hasChanged = \false; + foreach ($node->getMethods() as $classMethod) { + if ($classMethod->isPrivate()) { + continue; + } + if ($classMethod->isAbstract()) { + continue; + } + foreach ((array) $classMethod->stmts as $stmt) { + if (!$stmt instanceof Expression) { + continue; + } + if (!$stmt->expr instanceof StaticCall) { + continue; + } + if (!$this->isName($stmt->expr->class, 'parent')) { + continue; + } + if ($stmt->expr->isFirstClassCallable()) { + continue; + } + $args = $stmt->expr->getArgs(); + if ($args === []) { + continue; + } + if ($this->argsAnalyzer->hasNamedArg($args)) { + continue; + } + $methodName = $this->getName($stmt->expr->name); + if ($methodName === null) { + continue; + } + foreach ($ancestors as $ancestor) { + $nativeClassReflection = $ancestor->getNativeReflection(); + if (!$nativeClassReflection->hasMethod($methodName)) { + continue; + } + $method = $nativeClassReflection->getMethod($methodName); + $parameters = $method->getParameters(); + $totalParameters = \count($parameters); + $justChanged = \false; + for ($index = $totalParameters - 1; $index >= 0; --$index) { + if (!$parameters[$index]->isDefaultValueAvailable()) { + break; + } + // already passed + if (!isset($args[$index])) { + break; + } + // only literal values + if ($this->exprAnalyzer->isDynamicExpr($args[$index]->value)) { + break; + } + $defaultValue = $parameters[$index]->getDefaultValue(); + if ($defaultValue === $this->valueResolver->getValue($args[$index]->value)) { + unset($args[$index]); + $hasChanged = \true; + $justChanged = \true; + } + } + if ($justChanged) { + $stmt->expr->args = \array_values($args); + } + break; + } + } + } + if (!$hasChanged) { + return null; + } + return $node; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php index ddc535be9..147e29303 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php @@ -4,18 +4,17 @@ namespace Rector\DeadCode\Rector\ClassMethod; use PhpParser\Node; -use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\Variable; 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\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; use Rector\DeadCode\NodeManipulator\ControllerClassMethodManipulator; use Rector\NodeAnalyzer\ParamAnalyzer; use Rector\NodeManipulator\ClassMethodManipulator; -use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\Rector\AbstractRector; use Rector\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -27,36 +26,31 @@ final class RemoveEmptyClassMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\ClassMethodManipulator */ - private $classMethodManipulator; + private ClassMethodManipulator $classMethodManipulator; /** * @readonly - * @var \Rector\DeadCode\NodeManipulator\ControllerClassMethodManipulator */ - private $controllerClassMethodManipulator; + private ControllerClassMethodManipulator $controllerClassMethodManipulator; /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; - public function __construct(ClassMethodManipulator $classMethodManipulator, ControllerClassMethodManipulator $controllerClassMethodManipulator, ParamAnalyzer $paramAnalyzer, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder) + private IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer; + public function __construct(ClassMethodManipulator $classMethodManipulator, ControllerClassMethodManipulator $controllerClassMethodManipulator, ParamAnalyzer $paramAnalyzer, PhpDocInfoFactory $phpDocInfoFactory, IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer) { $this->classMethodManipulator = $classMethodManipulator; $this->controllerClassMethodManipulator = $controllerClassMethodManipulator; $this->paramAnalyzer = $paramAnalyzer; $this->phpDocInfoFactory = $phpDocInfoFactory; - $this->betterNodeFinder = $betterNodeFinder; + $this->isClassMethodUsedAnalyzer = $isClassMethodUsedAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -130,15 +124,10 @@ private function shouldSkipNonFinalNonPrivateClassMethod(Class_ $class, ClassMet } private function shouldSkipClassMethod(Class_ $class, ClassMethod $classMethod) : bool { - $desiredClassMethodName = $this->getName($classMethod); // is method called somewhere else in the class? - foreach ($class->getMethods() as $anotherClassMethod) { - if ($anotherClassMethod === $classMethod) { - continue; - } - if ($this->containsMethodCall($anotherClassMethod, $desiredClassMethodName)) { - return \true; - } + $scope = ScopeFetcher::fetch($class); + if ($this->isClassMethodUsedAnalyzer->isClassMethodUsed($class, $classMethod, $scope)) { + return \true; } if ($this->classMethodManipulator->isNamedConstructor($classMethod)) { return \true; @@ -155,11 +144,11 @@ private function shouldSkipClassMethod(Class_ $class, ClassMethod $classMethod) if ($this->controllerClassMethodManipulator->isControllerClassMethod($class, $classMethod)) { return \true; } - if ($this->nodeNameResolver->isName($classMethod, MethodName::CONSTRUCT)) { + if ($this->isName($classMethod, MethodName::CONSTRUCT)) { // has parent class? return $class->extends instanceof FullyQualified; } - return $this->nodeNameResolver->isName($classMethod, MethodName::INVOKE); + return $this->isName($classMethod, MethodName::INVOKE); } private function hasDeprecatedAnnotation(ClassMethod $classMethod) : bool { @@ -169,19 +158,4 @@ private function hasDeprecatedAnnotation(ClassMethod $classMethod) : bool } return $phpDocInfo->hasByType(DeprecatedTagValueNode::class); } - private function containsMethodCall(ClassMethod $anotherClassMethod, string $desiredClassMethodName) : bool - { - return (bool) $this->betterNodeFinder->findFirst($anotherClassMethod, function (Node $node) use($desiredClassMethodName) : bool { - if (!$node instanceof MethodCall) { - return \false; - } - if (!$node->var instanceof Variable) { - return \false; - } - if (!$this->isName($node->var, 'this')) { - return \false; - } - return $this->isName($node->name, $desiredClassMethodName); - }); - } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php index e851c8c19..0e6770a4f 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php @@ -28,14 +28,12 @@ final class RemoveNullTagValueNodeRector extends AbstractRector { /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->docBlockUpdater = $docBlockUpdater; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php index a0939c5da..372d6325c 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php @@ -21,19 +21,16 @@ final class RemoveUnusedConstructorParamRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\DeadCode\NodeManipulator\ClassMethodParamRemover */ - private $classMethodParamRemover; + private ClassMethodParamRemover $classMethodParamRemover; public function __construct(ParamAnalyzer $paramAnalyzer, ReflectionResolver $reflectionResolver, ClassMethodParamRemover $classMethodParamRemover) { $this->paramAnalyzer = $paramAnalyzer; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php index a76e938dc..83423cfa1 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php @@ -5,11 +5,12 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Param; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\Type\ObjectType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; @@ -26,34 +27,28 @@ final class RemoveUnusedPrivateMethodParameterRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector */ - private $variadicFunctionLikeDetector; + private VariadicFunctionLikeDetector $variadicFunctionLikeDetector; /** * @readonly - * @var \Rector\DeadCode\NodeCollector\UnusedParameterResolver */ - private $unusedParameterResolver; + private UnusedParameterResolver $unusedParameterResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(VariadicFunctionLikeDetector $variadicFunctionLikeDetector, UnusedParameterResolver $unusedParameterResolver, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder) { $this->variadicFunctionLikeDetector = $variadicFunctionLikeDetector; @@ -133,11 +128,12 @@ private function removeCallerArgs(Class_ $class, ClassMethod $classMethod, array if ($classMethods === []) { return; } - $methodName = $this->nodeNameResolver->getName($classMethod); + $methodName = $this->getName($classMethod); $keysArg = \array_keys($unusedParameters); + $classObjectType = new ObjectType((string) $this->getName($class)); foreach ($classMethods as $classMethod) { - /** @var MethodCall[] $callers */ - $callers = $this->resolveCallers($classMethod, $methodName); + /** @var MethodCall[]|StaticCall[] $callers */ + $callers = $this->resolveCallers($classMethod, $methodName, $classObjectType); if ($callers === []) { continue; } @@ -148,40 +144,39 @@ private function removeCallerArgs(Class_ $class, ClassMethod $classMethod, array } /** * @param int[] $keysArg + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $call */ - private function cleanupArgs(MethodCall $methodCall, array $keysArg) : void + private function cleanupArgs($call, array $keysArg) : void { - if ($methodCall->isFirstClassCallable()) { + if ($call->isFirstClassCallable()) { return; } - $args = $methodCall->getArgs(); + $args = $call->getArgs(); foreach (\array_keys($args) as $key) { if (\in_array($key, $keysArg, \true)) { unset($args[$key]); } } // reset arg keys - $methodCall->args = \array_values($args); + $call->args = \array_values($args); } /** - * @return MethodCall[] + * @return MethodCall[]|StaticCall[] */ - private function resolveCallers(ClassMethod $classMethod, string $methodName) : array + private function resolveCallers(ClassMethod $classMethod, string $methodName, ObjectType $classObjectType) : array { - return $this->betterNodeFinder->find($classMethod, function (Node $subNode) use($methodName) : bool { - if (!$subNode instanceof MethodCall) { + return $this->betterNodeFinder->find($classMethod, function (Node $subNode) use($methodName, $classObjectType) : bool { + if (!$subNode instanceof MethodCall && !$subNode instanceof StaticCall) { return \false; } if ($subNode->isFirstClassCallable()) { return \false; } - if (!$subNode->var instanceof Variable) { + $nodeToCheck = $subNode instanceof MethodCall ? $subNode->var : $subNode->class; + if (!$this->isObjectType($nodeToCheck, $classObjectType)) { return \false; } - if (!$this->nodeNameResolver->isName($subNode->var, 'this')) { - return \false; - } - return $this->nodeNameResolver->isName($subNode->name, $methodName); + return $this->isName($subNode->name, $methodName); }); } private function shouldSkipClassMethod(ClassMethod $classMethod) : bool diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php index 7fbd8a465..86acae476 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php @@ -8,12 +8,17 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; +use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\Reflection\ClassReflection; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -21,28 +26,35 @@ /** * @see \Rector\Tests\DeadCode\Rector\ClassMethod\RemoveUnusedPrivateMethodRector\RemoveUnusedPrivateMethodRectorTest */ -final class RemoveUnusedPrivateMethodRector extends AbstractScopeAwareRector +final class RemoveUnusedPrivateMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer */ - private $isClassMethodUsedAnalyzer; + private IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; - public function __construct(IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder) + private BetterNodeFinder $betterNodeFinder; + /** + * @readonly + */ + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private PhpAttributeAnalyzer $phpAttributeAnalyzer; + public function __construct(IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory, PhpAttributeAnalyzer $phpAttributeAnalyzer) { $this->isClassMethodUsedAnalyzer = $isClassMethodUsedAnalyzer; $this->reflectionResolver = $reflectionResolver; $this->betterNodeFinder = $betterNodeFinder; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -81,15 +93,14 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); $classMethods = $node->getMethods(); if ($classMethods === []) { return null; } - $filter = static function (ClassMethod $classMethod) : bool { - return $classMethod->isPrivate(); - }; + $filter = static fn(ClassMethod $classMethod): bool => $classMethod->isPrivate(); $privateMethods = \array_filter($classMethods, $filter); if ($privateMethods === []) { return null; @@ -97,8 +108,12 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node if ($this->hasDynamicMethodCallOnFetchThis($classMethods)) { return null; } - $hasChanged = \false; $classReflection = $this->reflectionResolver->resolveClassReflection($node); + if (!$classReflection instanceof ClassReflection) { + return null; + } + $collectionTestMethodsUsesPrivateProvider = $this->collectTestMethodsUsesPrivateDataProvider($classReflection, $node, $classMethods); + $hasChanged = \false; foreach ($privateMethods as $privateMethod) { if ($this->shouldSkip($privateMethod, $classReflection)) { continue; @@ -106,6 +121,9 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node if ($this->isClassMethodUsedAnalyzer->isClassMethodUsed($node, $privateMethod, $scope)) { continue; } + if (\in_array($this->getName($privateMethod), $collectionTestMethodsUsesPrivateProvider, \true)) { + continue; + } unset($node->stmts[$privateMethod->getAttribute(AttributeKey::STMT_KEY)]); $hasChanged = \true; } @@ -114,6 +132,50 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } return null; } + /** + * @param ClassMethod[] $classMethods + * @return string[] + */ + private function collectTestMethodsUsesPrivateDataProvider(ClassReflection $classReflection, Class_ $class, array $classMethods) : array + { + if (!$classReflection->is('PHPUnit\\Framework\\TestCase')) { + return []; + } + $privateMethods = []; + foreach ($classMethods as $classMethod) { + // test method only public, but may use private data provider + // so verify @dataProvider and #[\PHPUnit\Framework\Attributes\DataProvider] only on public methods + if (!$classMethod->isPublic()) { + continue; + } + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod); + if ($phpDocInfo instanceof PhpDocInfo && $phpDocInfo->hasByName('dataProvider')) { + $dataProvider = $phpDocInfo->getByName('dataProvider'); + if ($dataProvider instanceof PhpDocTagNode && $dataProvider->value instanceof GenericTagValueNode) { + $dataProviderMethod = $class->getMethod($dataProvider->value->value); + if ($dataProviderMethod instanceof ClassMethod && $dataProviderMethod->isPrivate()) { + $privateMethods[] = $dataProvider->value->value; + } + } + } + if ($this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, 'PHPUnit\\Framework\\Attributes\\DataProvider')) { + foreach ($classMethod->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + if ($attr->name->toString() === 'PHPUnit\\Framework\\Attributes\\DataProvider') { + $argValue = $attr->args[0]->value->value ?? ''; + if (\is_string($argValue)) { + $dataProviderMethod = $class->getMethod($argValue); + if ($dataProviderMethod instanceof ClassMethod && $dataProviderMethod->isPrivate()) { + $privateMethods[] = $argValue; + } + } + } + } + } + } + } + return $privateMethods; + } private function shouldSkip(ClassMethod $classMethod, ?ClassReflection $classReflection) : bool { if (!$classReflection instanceof ClassReflection) { @@ -148,7 +210,7 @@ private function hasDynamicMethodCallOnFetchThis(array $classMethods) : bool if (!$subNode->var instanceof Variable) { return \false; } - if (!$this->nodeNameResolver->isName($subNode->var, 'this')) { + if (!$this->isName($subNode->var, 'this')) { return \false; } return $subNode->name instanceof Variable; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php index ac56943d0..a49d04905 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php @@ -8,7 +8,6 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\TraitUse; -use PHPStan\Analyser\Scope; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\Reflection\ClassReflection; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; @@ -19,7 +18,7 @@ use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\NodeFinder\PropertyFetchFinder; use Rector\Privatization\NodeManipulator\VisibilityManipulator; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\MethodName; use Rector\ValueObject\PhpVersionFeature; @@ -30,48 +29,40 @@ /** * @see \Rector\Tests\DeadCode\Rector\ClassMethod\RemoveUnusedPromotedPropertyRector\RemoveUnusedPromotedPropertyRectorTest */ -final class RemoveUnusedPromotedPropertyRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class RemoveUnusedPromotedPropertyRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\PhpParser\NodeFinder\PropertyFetchFinder */ - private $propertyFetchFinder; + private PropertyFetchFinder $propertyFetchFinder; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\PropertyWriteonlyAnalyzer */ - private $propertyWriteonlyAnalyzer; + private PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(PropertyFetchFinder $propertyFetchFinder, VisibilityManipulator $visibilityManipulator, PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer, BetterNodeFinder $betterNodeFinder, ReflectionResolver $reflectionResolver, PhpDocInfoFactory $phpDocInfoFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) { $this->propertyFetchFinder = $propertyFetchFinder; @@ -126,7 +117,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { $constructClassMethod = $node->getMethod(MethodName::CONSTRUCT); if (!$constructClassMethod instanceof ClassMethod) { @@ -203,6 +194,6 @@ private function shouldSkipClass(Class_ $class) : bool } } } - return \false; + return $this->propertyWriteonlyAnalyzer->hasClassDynamicPropertyNames($class); } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php index 733d00ed0..679f62f46 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php @@ -21,24 +21,20 @@ final class RemoveUnusedPublicMethodParameterRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector */ - private $variadicFunctionLikeDetector; + private VariadicFunctionLikeDetector $variadicFunctionLikeDetector; /** * @readonly - * @var \Rector\DeadCode\NodeManipulator\ClassMethodParamRemover */ - private $classMethodParamRemover; + private ClassMethodParamRemover $classMethodParamRemover; /** * @readonly - * @var \Rector\NodeAnalyzer\MagicClassMethodAnalyzer */ - private $magicClassMethodAnalyzer; + private MagicClassMethodAnalyzer $magicClassMethodAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; public function __construct(VariadicFunctionLikeDetector $variadicFunctionLikeDetector, ClassMethodParamRemover $classMethodParamRemover, MagicClassMethodAnalyzer $magicClassMethodAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer) { $this->variadicFunctionLikeDetector = $variadicFunctionLikeDetector; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php new file mode 100644 index 000000000..99ca97f73 --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php @@ -0,0 +1,105 @@ +std = $std; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeClass +{ + public function __construct(private \stdClass $std) + { + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->isName($node, MethodName::CONSTRUCT)) { + return null; + } + if ($node->stmts === null || $node->stmts == []) { + return null; + } + $variableNames = []; + foreach ($node->params as $param) { + if (!$param->isPromoted()) { + continue; + } + // re-assign will cause error on the first place, no need to collect names + // on readonly property promotion + if ($param->isReadonly()) { + continue; + } + $variableNames[] = (string) $this->getName($param->var); + } + if ($variableNames === []) { + return null; + } + $removeStmtKeys = []; + foreach ($node->stmts as $key => $stmt) { + // has non direct expression with assign, skip + if (!$stmt instanceof Expression || !$stmt->expr instanceof Assign) { + return null; + } + /** @var Assign $assign */ + $assign = $stmt->expr; + // has non property fetches assignments, skip + if (!$assign->var instanceof PropertyFetch) { + return null; + } + // collect first, ensure not removed too early on next non property fetch assignment + // which may have side effect + if ($assign->var->var instanceof Variable && $this->isName($assign->var->var, 'this') && $this->isNames($assign->var->name, $variableNames) && $assign->expr instanceof Variable && $this->isName($assign->expr, (string) $this->getName($assign->var->name))) { + $removeStmtKeys[] = $key; + continue; + } + // early return, if not all are property fetches from $this and its param + return null; + } + // empty data? nothing to remove + if ($removeStmtKeys === []) { + return null; + } + foreach ($removeStmtKeys as $removeStmtKey) { + unset($node->stmts[$removeStmtKey]); + } + return $node; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php index 329eeb0a9..64f15f15a 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php @@ -19,14 +19,12 @@ final class RemoveUselessParamTagRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\ParamTagRemover */ - private $paramTagRemover; + private ParamTagRemover $paramTagRemover; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(ParamTagRemover $paramTagRemover, PhpDocInfoFactory $phpDocInfoFactory) { $this->paramTagRemover = $paramTagRemover; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php index 80cddebef..957f0a2bb 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php @@ -11,7 +11,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\MethodName; @@ -24,9 +24,8 @@ final class RemoveUselessReturnExprInConstructRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; @@ -93,7 +92,7 @@ public function refactor(Node $node) : ?Node $hasChanged = \false; $this->traverseNodesWithCallable($node->stmts, function (Node $subNode) use(&$hasChanged) { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Return_) { return null; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php index 89d6b918e..fa927ea1b 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php @@ -19,19 +19,16 @@ final class RemoveUselessReturnTagRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\ReturnTagRemover */ - private $returnTagRemover; + private ReturnTagRemover $returnTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(ReturnTagRemover $returnTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->returnTagRemover = $returnTagRemover; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php index 5a62f08b2..6eb29ee72 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php @@ -18,7 +18,7 @@ final class RemoveConcatAutocastRector extends AbstractRector public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove (string) casting when it comes to concat, that does this by default', [new CodeSample(<<<'CODE_SAMPLE' -class SomeConcatingClass +class SomeConcatenatingClass { public function run($value) { @@ -27,7 +27,7 @@ public function run($value) } CODE_SAMPLE , <<<'CODE_SAMPLE' -class SomeConcatingClass +class SomeConcatenatingClass { public function run($value) { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php index 35c2d9776..72a9c1b48 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php @@ -9,10 +9,10 @@ use PhpParser\Node\Expr\BinaryOp\GreaterOrEqual; use PhpParser\Node\Expr\BinaryOp\Smaller; use PhpParser\Node\Expr\ConstFetch; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\If_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Php\PhpVersionProvider; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersion; @@ -25,9 +25,8 @@ final class RemovePhpVersionIdCheckRector extends AbstractRector { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @var PhpVersion::*|null */ @@ -126,11 +125,11 @@ private function processGreaterOrEqual(ConstFetch $constFetch, GreaterOrEqual $g private function refactorSmallerLeft(Smaller $smaller) : ?int { $value = $smaller->right; - if (!$value instanceof LNumber) { + if (!$value instanceof Int_) { return null; } if ($this->phpVersion >= $value->value) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return null; } @@ -140,14 +139,14 @@ private function refactorSmallerLeft(Smaller $smaller) : ?int private function refactorSmallerRight(Smaller $smaller, If_ $if) { $value = $smaller->left; - if (!$value instanceof LNumber) { + if (!$value instanceof Int_) { return null; } if ($this->phpVersion < $value->value) { return null; } if ($if->stmts === []) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return $if->stmts; } @@ -157,25 +156,25 @@ private function refactorSmallerRight(Smaller $smaller, If_ $if) private function refactorGreaterOrEqualLeft(GreaterOrEqual $greaterOrEqual, If_ $if) { $value = $greaterOrEqual->right; - if (!$value instanceof LNumber) { + if (!$value instanceof Int_) { return null; } if ($this->phpVersion < $value->value) { return null; } if ($if->stmts === []) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return $if->stmts; } private function refactorGreaterOrEqualRight(GreaterOrEqual $greaterOrEqual) : ?int { $value = $greaterOrEqual->left; - if (!$value instanceof LNumber) { + if (!$value instanceof Int_) { return null; } if ($this->phpVersion >= $value->value) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return null; } @@ -198,25 +197,25 @@ private function refactorGreater(ConstFetch $constFetch, Greater $greater, If_ $ private function refactorGreaterLeft(Greater $greater, If_ $if) { $value = $greater->right; - if (!$value instanceof LNumber) { + if (!$value instanceof Int_) { return null; } if ($this->phpVersion < $value->value) { return null; } if ($if->stmts === []) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return $if->stmts; } private function refactorGreaterRight(Greater $greater) : ?int { $value = $greater->left; - if (!$value instanceof LNumber) { + if (!$value instanceof Int_) { return null; } if ($this->phpVersion >= $value->value) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return null; } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php index 38ce28d42..bc9c8cb3b 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php @@ -8,7 +8,7 @@ use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Nop; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Reflection\Php\PhpPropertyReflection; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\DeadCode\NodeManipulator\LivingCodeManipulator; @@ -25,24 +25,20 @@ final class RemoveDeadStmtRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\NodeManipulator\LivingCodeManipulator */ - private $livingCodeManipulator; + private LivingCodeManipulator $livingCodeManipulator; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(LivingCodeManipulator $livingCodeManipulator, PropertyFetchAnalyzer $propertyFetchAnalyzer, ReflectionResolver $reflectionResolver, PhpDocInfoFactory $phpDocInfoFactory) { $this->livingCodeManipulator = $livingCodeManipulator; @@ -52,7 +48,7 @@ public function __construct(LivingCodeManipulator $livingCodeManipulator, Proper } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Removes dead code statements', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove dead code statements', [new CodeSample(<<<'CODE_SAMPLE' $value = 5; $value; CODE_SAMPLE @@ -118,6 +114,6 @@ private function removeNodeAndKeepComments(Expression $expression) $nop->setAttribute(AttributeKey::PHP_DOC_INFO, $phpDocInfo); return $nop; } - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Expression/SimplifyMirrorAssignRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Expression/SimplifyMirrorAssignRector.php index 37f9ea090..0b8ec3a3a 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Expression/SimplifyMirrorAssignRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Expression/SimplifyMirrorAssignRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Stmt\Expression; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,7 +17,7 @@ final class SimplifyMirrorAssignRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Removes unneeded $value = $value assigns', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove unneeded `$value = $value` assigns', [new CodeSample(<<<'CODE_SAMPLE' function run() { $result = $result; } @@ -47,6 +47,6 @@ public function refactor(Node $node) : ?int if (!$this->nodeComparator->areNodesEqual($assign->var, $assign->expr)) { return null; } - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadContinueRector.php b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadContinueRector.php index 1bd7165c9..e6a4c3ef6 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadContinueRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadContinueRector.php @@ -4,7 +4,7 @@ namespace Rector\DeadCode\Rector\For_; use PhpParser\Node; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Continue_; use PhpParser\Node\Stmt\Do_; @@ -61,9 +61,7 @@ private function canRemoveLastStatement(array $stmts) : bool if ($stmts === []) { return \false; } - \end($stmts); - $lastKey = \key($stmts); - \reset($stmts); + $lastKey = \array_key_last($stmts); $lastStmt = $stmts[$lastKey]; return $this->isRemovable($lastStmt); } @@ -72,7 +70,7 @@ private function isRemovable(Stmt $stmt) : bool if (!$stmt instanceof Continue_) { return \false; } - if ($stmt->num instanceof LNumber) { + if ($stmt->num instanceof Int_) { return $stmt->num->value < 2; } return \true; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php index fbdb0b8dc..0550732d1 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php @@ -26,23 +26,17 @@ final class RemoveDeadIfForeachForRector extends AbstractRector { /** * @readonly - * @var \Rector\EarlyReturn\NodeTransformer\ConditionInverter */ - private $conditionInverter; + private ConditionInverter $conditionInverter; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; - /** - * @var bool - */ - private $hasChanged = \false; + private StmtsManipulator $stmtsManipulator; + private bool $hasChanged = \false; public function __construct(ConditionInverter $conditionInverter, BetterNodeFinder $betterNodeFinder, StmtsManipulator $stmtsManipulator) { $this->conditionInverter = $conditionInverter; @@ -54,7 +48,7 @@ public function getRuleDefinition() : RuleDefinition return new RuleDefinition('Remove if, foreach and for that does not do anything', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { - public function run($value) + public function run($value, $differentValue) { if ($value) { } @@ -62,16 +56,16 @@ public function run($value) foreach ($values as $value) { } - return $value; + return $differentValue; } } CODE_SAMPLE , <<<'CODE_SAMPLE' class SomeClass { - public function run($value) + public function run($value, $differentValue) { - return $value; + return $differentValue; } } CODE_SAMPLE @@ -86,9 +80,8 @@ public function getNodeTypes() : array } /** * @param StmtsAwareInterface $node - * @return \PhpParser\Node|null|int */ - public function refactor(Node $node) + public function refactor(Node $node) : ?\PhpParser\Node { if ($node->stmts === null) { return null; @@ -136,11 +129,10 @@ private function processIf(If_ $if, int $key, StmtsAwareInterface $stmtsAware) : */ private function processForForeach($for, int $key, StmtsAwareInterface $stmtsAware) : void { - $stmts = (array) $stmtsAware->stmts; if ($for instanceof For_) { $variables = $this->betterNodeFinder->findInstanceOf(\array_merge($for->init, $for->cond, $for->loop), Variable::class); foreach ($variables as $variable) { - if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmts, $key + 1, (string) $this->getName($variable))) { + if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmtsAware, $key + 1, (string) $this->getName($variable))) { return; } } @@ -148,10 +140,10 @@ private function processForForeach($for, int $key, StmtsAwareInterface $stmtsAwa $this->hasChanged = \true; return; } - $exprs = \array_filter([$for->expr, $for->valueVar, $for->valueVar]); + $exprs = [$for->expr, $for->valueVar, $for->valueVar]; $variables = $this->betterNodeFinder->findInstanceOf($exprs, Variable::class); foreach ($variables as $variable) { - if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmts, $key + 1, (string) $this->getName($variable))) { + if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmtsAware, $key + 1, (string) $this->getName($variable))) { return; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadLoopRector.php b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadLoopRector.php index bc320ae08..a95148f5d 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadLoopRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadLoopRector.php @@ -4,11 +4,13 @@ namespace Rector\DeadCode\Rector\For_; use PhpParser\Node; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Stmt\Do_; use PhpParser\Node\Stmt\For_; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\While_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; +use Rector\DeadCode\SideEffect\SideEffectNodeDetector; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,6 +19,14 @@ */ final class RemoveDeadLoopRector extends AbstractRector { + /** + * @readonly + */ + private SideEffectNodeDetector $sideEffectNodeDetector; + public function __construct(SideEffectNodeDetector $sideEffectNodeDetector) + { + $this->sideEffectNodeDetector = $sideEffectNodeDetector; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove loop with no body', [new CodeSample(<<<'CODE_SAMPLE' @@ -54,6 +64,21 @@ public function refactor(Node $node) : ?int if ($node->stmts !== []) { return null; } - return NodeTraverser::REMOVE_NODE; + if ($node instanceof Do_ || $node instanceof While_) { + $exprs = [$node->cond]; + } elseif ($node instanceof For_) { + $exprs = \array_merge($node->init, $node->cond, $node->loop); + } else { + $exprs = [$node->expr, $node->valueVar]; + } + foreach ($exprs as $expr) { + if ($expr instanceof Assign) { + $expr = $expr->expr; + } + if ($this->sideEffectNodeDetector->detect($expr)) { + return null; + } + } + return NodeVisitor::REMOVE_NODE; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php index deb5fd321..0f01882b8 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php @@ -23,24 +23,20 @@ final class RemoveUnusedForeachKeyRector extends AbstractRector { /** * @readonly - * @var \PhpParser\NodeFinder */ - private $nodeFinder; + private NodeFinder $nodeFinder; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(NodeFinder $nodeFinder, StmtsManipulator $stmtsManipulator, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) { $this->nodeFinder = $nodeFinder; @@ -88,9 +84,7 @@ public function refactor(Node $node) : ?Node continue; } $keyVar = $stmt->keyVar; - $isNodeUsed = (bool) $this->nodeFinder->findFirst($stmt->stmts, function (Node $node) use($keyVar) : bool { - return $this->nodeComparator->areNodesEqual($node, $keyVar); - }); + $isNodeUsed = (bool) $this->nodeFinder->findFirst($stmt->stmts, fn(Node $node): bool => $this->nodeComparator->areNodesEqual($node, $keyVar)); if ($isNodeUsed) { continue; } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/FuncCall/RemoveFilterVarOnExactTypeRector.php b/vendor/rector/rector/rules/DeadCode/Rector/FuncCall/RemoveFilterVarOnExactTypeRector.php new file mode 100644 index 000000000..5801ee5ae --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/Rector/FuncCall/RemoveFilterVarOnExactTypeRector.php @@ -0,0 +1,68 @@ +isFirstClassCallable()) { + return null; + } + if (!$this->isName($node, 'filter_var')) { + return null; + } + // we need exact 2nd arg to assess value type + if (\count($node->getArgs()) !== 2) { + return null; + } + $firstArgValue = $node->getArgs()[0]->value; + $secondArgValue = $node->getArgs()[1]->value; + if (!$secondArgValue instanceof ConstFetch) { + return null; + } + $constantFilterName = $secondArgValue->name->toString(); + $valueType = $this->nodeTypeResolver->getNativeType($firstArgValue); + if ($constantFilterName === 'FILTER_VALIDATE_INT' && $valueType->isInteger()->yes()) { + return $firstArgValue; + } + if ($constantFilterName === 'FILTER_VALIDATE_FLOAT' && $valueType->isFloat()->yes()) { + return $firstArgValue; + } + if (\in_array($constantFilterName, ['FILTER_VALIDATE_BOOLEAN', 'FILTER_VALIDATE_BOOL']) && $valueType->isBoolean()->yes()) { + return $firstArgValue; + } + return null; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/Rector/FunctionLike/RemoveDeadReturnRector.php b/vendor/rector/rector/rules/DeadCode/Rector/FunctionLike/RemoveDeadReturnRector.php index f44997268..3238079f3 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/FunctionLike/RemoveDeadReturnRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/FunctionLike/RemoveDeadReturnRector.php @@ -66,9 +66,7 @@ public function refactor(Node $node) : ?Node if ($node->stmts === [] || $node->stmts === null) { return null; } - \end($node->stmts); - $lastStmtKey = \key($node->stmts); - \reset($node->stmts); + $lastStmtKey = \array_key_last($node->stmts); $lastStmt = $node->stmts[$lastStmtKey]; if ($lastStmt instanceof If_) { if (!$this->isBareIfWithOnlyStmtEmptyReturn($lastStmt)) { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php index 3c741f250..f4c9a2120 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php @@ -6,7 +6,6 @@ use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Stmt\If_; -use PHPStan\Type\Constant\ConstantBooleanType; use Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -18,16 +17,15 @@ final class ReduceAlwaysFalseIfOrRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer */ - private $safeLeftTypeBooleanAndOrAnalyzer; + private SafeLeftTypeBooleanAndOrAnalyzer $safeLeftTypeBooleanAndOrAnalyzer; public function __construct(SafeLeftTypeBooleanAndOrAnalyzer $safeLeftTypeBooleanAndOrAnalyzer) { $this->safeLeftTypeBooleanAndOrAnalyzer = $safeLeftTypeBooleanAndOrAnalyzer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Reduce always false in a if ( || ) condition', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Reduce always false in a `if (a || b)` condition', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run(int $number) @@ -72,10 +70,7 @@ public function refactor(Node $node) : ?Node } $booleanOr = $node->cond; $conditionStaticType = $this->getType($booleanOr->left); - if (!$conditionStaticType instanceof ConstantBooleanType) { - return null; - } - if ($conditionStaticType->getValue()) { + if (!$conditionStaticType->isFalse()->yes()) { return null; } if (!$this->safeLeftTypeBooleanAndOrAnalyzer->isSafe($booleanOr)) { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php index 2138bea87..8814f9f4a 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php @@ -16,9 +16,7 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\If_; -use PhpParser\NodeTraverser; -use PHPStan\Type\ArrayType; -use PHPStan\Type\Constant\ConstantBooleanType; +use PhpParser\NodeVisitor; use PHPStan\Type\IntersectionType; use Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer; use Rector\NodeAnalyzer\ExprAnalyzer; @@ -33,19 +31,16 @@ final class RemoveAlwaysTrueIfConditionRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer */ - private $safeLeftTypeBooleanAndOrAnalyzer; + private SafeLeftTypeBooleanAndOrAnalyzer $safeLeftTypeBooleanAndOrAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer, BetterNodeFinder $betterNodeFinder, SafeLeftTypeBooleanAndOrAnalyzer $safeLeftTypeBooleanAndOrAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; @@ -103,11 +98,8 @@ public function refactor(Node $node) if ($node->elseifs !== []) { return null; } - $conditionStaticType = $this->getType($node->cond); - if (!$conditionStaticType instanceof ConstantBooleanType) { - return null; - } - if (!$conditionStaticType->getValue()) { + $conditionStaticType = $this->nodeTypeResolver->getNativeType($node->cond); + if (!$conditionStaticType->isTrue()->yes()) { return null; } if ($this->shouldSkipExpr($node->cond)) { @@ -121,7 +113,7 @@ public function refactor(Node $node) return null; } if ($node->stmts === []) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return $node->stmts; } @@ -133,10 +125,10 @@ private function shouldSkipFromVariable(Expr $expr) : bool if ($this->exprAnalyzer->isNonTypedFromParam($variable)) { return \true; } - $type = $this->getType($variable); + $type = $this->nodeTypeResolver->getNativeType($variable); if ($type instanceof IntersectionType) { foreach ($type->getTypes() as $subType) { - if ($subType instanceof ArrayType) { + if ($subType->isArray()->yes()) { return \true; } } @@ -155,10 +147,7 @@ private function refactorIfWithBooleanAnd(If_ $if) : ?If_ } $booleanAnd = $if->cond; $leftType = $this->getType($booleanAnd->left); - if (!$leftType instanceof ConstantBooleanType) { - return null; - } - if (!$leftType->getValue()) { + if (!$leftType->isTrue()->yes()) { return null; } if (!$this->safeLeftTypeBooleanAndOrAnalyzer->isSafe($booleanAnd)) { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php index e74127643..42932a593 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php @@ -16,11 +16,12 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use Rector\NodeManipulator\IfManipulator; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -32,14 +33,12 @@ final class RemoveDeadInstanceOfRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(IfManipulator $ifManipulator, ReflectionResolver $reflectionResolver) { $this->ifManipulator = $ifManipulator; @@ -104,14 +103,15 @@ private function refactorStmtAndInstanceof(If_ $if, Instanceof_ $instanceof) return null; } if ($instanceof->expr instanceof Assign) { + $instanceof->expr->setAttribute(AttributeKey::WRAPPED_IN_PARENTHESES, \false); $assignExpression = new Expression($instanceof->expr); return \array_merge([$assignExpression], $if->stmts); } if ($if->cond !== $instanceof) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } if ($if->stmts === []) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } // unwrap stmts return $if->stmts; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveTypedPropertyDeadInstanceOfRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveTypedPropertyDeadInstanceOfRector.php index 7684a54a3..ed904d2e7 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveTypedPropertyDeadInstanceOfRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveTypedPropertyDeadInstanceOfRector.php @@ -17,7 +17,7 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\While_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeManipulator\IfManipulator; use Rector\Php80\NodeAnalyzer\PromotedPropertyResolver; use Rector\Rector\AbstractRector; @@ -31,19 +31,16 @@ final class RemoveTypedPropertyDeadInstanceOfRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; + private ConstructorAssignDetector $constructorAssignDetector; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PromotedPropertyResolver */ - private $promotedPropertyResolver; + private PromotedPropertyResolver $promotedPropertyResolver; public function __construct(IfManipulator $ifManipulator, ConstructorAssignDetector $constructorAssignDetector, PromotedPropertyResolver $promotedPropertyResolver) { $this->ifManipulator = $ifManipulator; @@ -107,7 +104,7 @@ public function refactor(Node $node) : ?Class_ $this->traverseNodesWithCallable($node->getMethods(), function (Node $node) use(&$hasChanged, $class) { // avoid loop ifs if ($node instanceof While_ || $node instanceof Foreach_ || $node instanceof For_ || $node instanceof Do_) { - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if (!$node instanceof If_) { return null; @@ -158,10 +155,10 @@ private function refactorStmtAndInstanceof(Class_ $class, If_ $if, Instanceof_ $ return null; } if ($if->cond !== $instanceof) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } if ($if->stmts === []) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return $if->stmts; } @@ -181,7 +178,7 @@ private function isSkippedPropertyFetch(Class_ $class, $propertyFetch) : bool if (!$property instanceof Property) { return \true; } - return $property->type === null; + return !$property->type instanceof Node; } /** * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch @@ -189,10 +186,10 @@ private function isSkippedPropertyFetch(Class_ $class, $propertyFetch) : bool private function isInPropertyPromotedParams(Class_ $class, $propertyFetch) : bool { /** @var string $propertyName */ - $propertyName = $this->nodeNameResolver->getName($propertyFetch); + $propertyName = $this->getName($propertyFetch); $params = $this->promotedPropertyResolver->resolveFromClass($class); foreach ($params as $param) { - if ($this->nodeNameResolver->isName($param, $propertyName)) { + if ($this->isName($param, $propertyName)) { return \true; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php index 1b812b228..e325c3ed2 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php @@ -20,39 +20,35 @@ use Rector\NodeManipulator\IfManipulator; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php\ReservedKeywordAnalyzer; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\DeadCode\Rector\If_\RemoveUnusedNonEmptyArrayBeforeForeachRector\RemoveUnusedNonEmptyArrayBeforeForeachRectorTest */ -final class RemoveUnusedNonEmptyArrayBeforeForeachRector extends AbstractScopeAwareRector +final class RemoveUnusedNonEmptyArrayBeforeForeachRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\NodeManipulator\CountManipulator */ - private $countManipulator; + private CountManipulator $countManipulator; /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\DeadCode\UselessIfCondBeforeForeachDetector */ - private $uselessIfCondBeforeForeachDetector; + private UselessIfCondBeforeForeachDetector $uselessIfCondBeforeForeachDetector; /** * @readonly - * @var \Rector\Php\ReservedKeywordAnalyzer */ - private $reservedKeywordAnalyzer; + private ReservedKeywordAnalyzer $reservedKeywordAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; public function __construct(CountManipulator $countManipulator, IfManipulator $ifManipulator, UselessIfCondBeforeForeachDetector $uselessIfCondBeforeForeachDetector, ReservedKeywordAnalyzer $reservedKeywordAnalyzer, PropertyFetchAnalyzer $propertyFetchAnalyzer) { $this->countManipulator = $countManipulator; @@ -100,11 +96,12 @@ public function getNodeTypes() : array } /** * @param If_|StmtsAwareInterface $node - * @return Stmt[]|Foreach_|StmtsAwareInterface|null + * @return Foreach_|StmtsAwareInterface|null */ - public function refactorWithScope(Node $node, Scope $scope) + public function refactor(Node $node) { if ($node instanceof If_) { + $scope = ScopeFetcher::fetch($node); return $this->refactorIf($node, $scope); } return $this->refactorStmtsAware($node); @@ -198,7 +195,7 @@ private function refactorIf(If_ $if, Scope $scope) : ?Foreach_ } private function shouldSkipForeachExpr(Expr $foreachExpr, Scope $scope) : bool { - if ($foreachExpr instanceof ArrayDimFetch && $foreachExpr->dim !== null) { + if ($foreachExpr instanceof ArrayDimFetch && $foreachExpr->dim instanceof Expr) { $exprType = $this->nodeTypeResolver->getNativeType($foreachExpr->var); $dimType = $this->nodeTypeResolver->getNativeType($foreachExpr->dim); if (!$exprType->hasOffsetValueType($dimType)->yes()) { @@ -206,7 +203,7 @@ private function shouldSkipForeachExpr(Expr $foreachExpr, Scope $scope) : bool } } if ($foreachExpr instanceof Variable) { - $variableName = $this->nodeNameResolver->getName($foreachExpr); + $variableName = $this->getName($foreachExpr); if (\is_string($variableName) && $this->reservedKeywordAnalyzer->isNativeVariable($variableName)) { return \true; } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/SimplifyIfElseWithSameContentRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/SimplifyIfElseWithSameContentRector.php index 3de2abf5b..dafe763cc 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/SimplifyIfElseWithSameContentRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/SimplifyIfElseWithSameContentRector.php @@ -19,9 +19,8 @@ final class SimplifyIfElseWithSameContentRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; public function __construct(BetterStandardPrinter $betterStandardPrinter) { $this->betterStandardPrinter = $betterStandardPrinter; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfPhpVersionRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfPhpVersionRector.php index c2d986fc4..86c1c8a0e 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfPhpVersionRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfPhpVersionRector.php @@ -7,7 +7,7 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\If_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\DeadCode\ConditionEvaluator; use Rector\DeadCode\ConditionResolver; use Rector\DeadCode\Contract\ConditionInterface; @@ -21,14 +21,12 @@ final class UnwrapFutureCompatibleIfPhpVersionRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\ConditionEvaluator */ - private $conditionEvaluator; + private ConditionEvaluator $conditionEvaluator; /** * @readonly - * @var \Rector\DeadCode\ConditionResolver */ - private $conditionResolver; + private ConditionResolver $conditionResolver; public function __construct(ConditionEvaluator $conditionEvaluator, ConditionResolver $conditionResolver) { $this->conditionEvaluator = $conditionEvaluator; @@ -100,7 +98,7 @@ private function refactorIsNotMatch(If_ $if) { // no else → just remove the node if (!$if->else instanceof Else_) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } // else is always used return $if->else->stmts; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php index 8f93d62a4..7dfeb77df 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php @@ -19,7 +19,6 @@ use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Static_; use PhpParser\Node\Stmt\Switch_; -use PhpParser\Node\Stmt\Throw_; use PhpParser\Node\Stmt\While_; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; @@ -39,33 +38,28 @@ final class RemoveNonExistingVarAnnotationRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $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]; + private const NODE_TYPES = [Foreach_::class, Static_::class, Echo_::class, Return_::class, Expression::class, If_::class, While_::class, Switch_::class, Nop::class]; public function __construct(StmtsManipulator $stmtsManipulator, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder) { $this->stmtsManipulator = $stmtsManipulator; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php index 67cb0ff71..63d60cdb9 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php @@ -28,9 +28,8 @@ final class RemoveDeadZeroAndOneOperationRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php index 41083d090..f701e0ef7 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php @@ -10,36 +10,32 @@ use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\TraitUse; -use PhpParser\NodeTraverser; -use PHPStan\Analyser\Scope; +use PhpParser\NodeVisitor; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\DeadCode\NodeAnalyzer\PropertyWriteonlyAnalyzer; use Rector\PhpParser\NodeFinder\PropertyFetchFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\DeadCode\Rector\Property\RemoveUnusedPrivatePropertyRector\RemoveUnusedPrivatePropertyRectorTest */ -final class RemoveUnusedPrivatePropertyRector extends AbstractScopeAwareRector +final class RemoveUnusedPrivatePropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\NodeFinder\PropertyFetchFinder */ - private $propertyFetchFinder; + private PropertyFetchFinder $propertyFetchFinder; /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\PropertyWriteonlyAnalyzer */ - private $propertyWriteonlyAnalyzer; + private PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(PropertyFetchFinder $propertyFetchFinder, PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->propertyFetchFinder = $propertyFetchFinder; @@ -71,7 +67,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { if ($this->shouldSkipClass($node)) { return null; @@ -154,7 +150,7 @@ private function removePropertyAssigns(Class_ $class, string $propertyName) : vo return null; } if ($node instanceof Expression) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } $node->expr = $node->expr->expr; return $node; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessReadOnlyTagRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessReadOnlyTagRector.php index cf0b6ff17..7154a1874 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessReadOnlyTagRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessReadOnlyTagRector.php @@ -24,19 +24,16 @@ final class RemoveUselessReadOnlyTagRector extends AbstractRector implements Min { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(VisibilityManipulator $visibilityManipulator, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) { $this->visibilityManipulator = $visibilityManipulator; @@ -45,7 +42,7 @@ public function __construct(VisibilityManipulator $visibilityManipulator, PhpDoc } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Remove useless @readonly annotation on native readonly type', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove useless `@readonly` annotation on native readonly type', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { /** @@ -85,7 +82,7 @@ public function getNodeTypes() : array public function refactor(Node $node) : ?Node { // for param, only on property promotion - if ($node instanceof Param && $node->flags === 0) { + if ($node instanceof Param && !$node->isPromoted()) { return null; } if (!$this->visibilityManipulator->isReadonly($node)) { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php index 891c3c2cc..11f644593 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php @@ -4,6 +4,7 @@ namespace Rector\DeadCode\Rector\Property; use PhpParser\Node; +use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\Property; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover; @@ -17,14 +18,12 @@ final class RemoveUselessVarTagRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ - private $varTagRemover; + private VarTagRemover $varTagRemover; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(VarTagRemover $varTagRemover, PhpDocInfoFactory $phpDocInfoFactory) { $this->varTagRemover = $varTagRemover; @@ -32,7 +31,7 @@ public function __construct(VarTagRemover $varTagRemover, PhpDocInfoFactory $php } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Remove unused @var annotation for properties', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove unused `@var` annotation for properties and class constants', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { /** @@ -54,10 +53,10 @@ final class SomeClass */ public function getNodeTypes() : array { - return [Property::class]; + return [Property::class, ClassConst::class]; } /** - * @param Property $node + * @param Property|ClassConst $node */ public function refactor(Node $node) : ?Node { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Return_/RemoveDeadConditionAboveReturnRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Return_/RemoveDeadConditionAboveReturnRector.php index 17b8f9c43..bedbc73df 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Return_/RemoveDeadConditionAboveReturnRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Return_/RemoveDeadConditionAboveReturnRector.php @@ -8,10 +8,8 @@ use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; -use PHPStan\Analyser\Scope; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -22,9 +20,8 @@ final class RemoveDeadConditionAboveReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\DeadCode\SideEffect\SideEffectNodeDetector */ - private $sideEffectNodeDetector; + private SideEffectNodeDetector $sideEffectNodeDetector; public function __construct(SideEffectNodeDetector $sideEffectNodeDetector) { $this->sideEffectNodeDetector = $sideEffectNodeDetector; @@ -75,10 +72,8 @@ public function refactor(Node $node) : ?StmtsAwareInterface if (!$this->isBareIf($previousNode)) { continue; } - /** @var Scope $scope */ - $scope = $stmt->getAttribute(AttributeKey::SCOPE); /** @var If_ $previousNode */ - if ($this->sideEffectNodeDetector->detect($previousNode->cond, $scope)) { + if ($this->sideEffectNodeDetector->detect($previousNode->cond)) { continue; } $countStmt = \count($previousNode->stmts); diff --git a/vendor/rector/rector/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php b/vendor/rector/rector/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php index 5bd234b65..e5d2d421e 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php @@ -25,19 +25,16 @@ final class RemoveParentCallWithoutParentRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\ClassMethodManipulator */ - private $classMethodManipulator; + private ClassMethodManipulator $classMethodManipulator; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ClassMethodManipulator $classMethodManipulator, ClassAnalyzer $classAnalyzer, ReflectionProvider $reflectionProvider) { $this->classMethodManipulator = $classMethodManipulator; @@ -120,6 +117,9 @@ private function isParentStaticCall(Expr $expr) : bool if (!$expr instanceof StaticCall) { return \false; } + if ($expr->name instanceof Expr) { + return \false; + } return $this->isName($expr->class, ObjectReference::PARENT); } private function shouldSkipClass(Class_ $class) : bool diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Stmt/RemoveUnreachableStatementRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Stmt/RemoveUnreachableStatementRector.php index 546b75b24..0798616b2 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Stmt/RemoveUnreachableStatementRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Stmt/RemoveUnreachableStatementRector.php @@ -17,9 +17,8 @@ final class RemoveUnreachableStatementRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\TerminatedNodeAnalyzer */ - private $terminatedNodeAnalyzer; + private TerminatedNodeAnalyzer $terminatedNodeAnalyzer; public function __construct(TerminatedNodeAnalyzer $terminatedNodeAnalyzer) { $this->terminatedNodeAnalyzer = $terminatedNodeAnalyzer; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php index fc9d864a7..9963045d1 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php @@ -16,10 +16,7 @@ */ final class RemoveDuplicatedCaseInSwitchRector extends AbstractRector { - /** - * @var bool - */ - private $hasChanged = \false; + private bool $hasChanged = \false; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('2 following switch keys with identical will be reduced to one result', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php index 7c0cc94de..1cfb178d7 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php @@ -18,16 +18,15 @@ final class TernaryToBooleanOrFalseToBooleanAndRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $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' + return new RuleDefinition('Change ternary of `bool : false` to `&& bool`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function go() diff --git a/vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadCatchRector.php b/vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadCatchRector.php new file mode 100644 index 000000000..05de0c671 --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadCatchRector.php @@ -0,0 +1,151 @@ +getMessage()); + } catch (Throwable $throwable) { + throw $throwable; + } + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeClass +{ + public function run() + { + try { + // some code + } catch (RuntimeException $exception) { + throw new InvalidArgumentException($exception->getMessage()); + } + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [TryCatch::class]; + } + /** + * @param TryCatch $node + * @return TryCatch|null + */ + public function refactor(Node $node) : ?Node + { + $catches = $node->catches; + if (\count($catches) === 1) { + return null; + } + $hasChanged = \false; + $maxIndexCatches = \count($catches) - 1; + foreach ($catches as $key => $catchItem) { + if (!$this->isJustThrowedSameVariable($catchItem)) { + continue; + } + /** @var FullyQualified $type */ + $type = $catchItem->types[0]; + if ($this->shouldSkipNextCatchClassParentWithSpecialTreatment($catches, $type, $key, $maxIndexCatches)) { + continue; + } + unset($catches[$key]); + $hasChanged = \true; + } + if (!$hasChanged || $catches === []) { + return null; + } + $node->catches = $catches; + return $node; + } + private function isJustThrowedSameVariable(Catch_ $catch) : bool + { + if ($this->isEmpty($catch->stmts)) { + return \false; + } + $catchItemStmt = $catch->stmts[0]; + if (!($catchItemStmt instanceof Expression && $catchItemStmt->expr instanceof Throw_)) { + return \false; + } + if (!$this->nodeComparator->areNodesEqual($catch->var, $catchItemStmt->expr->expr)) { + return \false; + } + // too complex to check + if (\count($catch->types) !== 1) { + return \false; + } + $type = $catch->types[0]; + return $type instanceof FullyQualified; + } + /** + * @param Catch_[] $catches + */ + private function shouldSkipNextCatchClassParentWithSpecialTreatment(array $catches, FullyQualified $fullyQualified, int $key, int $maxIndexCatches) : bool + { + for ($index = $key + 1; $index <= $maxIndexCatches; ++$index) { + if (!isset($catches[$index])) { + continue; + } + $nextCatch = $catches[$index]; + // too complex to check + if (\count($nextCatch->types) !== 1) { + return \true; + } + $nextCatchType = $nextCatch->types[0]; + if (!$nextCatchType instanceof FullyQualified) { + return \true; + } + if (!$this->isObjectType($fullyQualified, new ObjectType($nextCatchType->toString()))) { + continue; + } + if (!$this->isJustThrowedSameVariable($nextCatch)) { + return \true; + } + } + return \false; + } + /** + * @param Stmt[] $stmts + */ + private function isEmpty(array $stmts) : bool + { + if ($stmts === []) { + return \true; + } + if (\count($stmts) > 1) { + return \false; + } + return $stmts[0] instanceof Nop; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadTryCatchRector.php b/vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadTryCatchRector.php index a01f9adc5..fbc17e1ca 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadTryCatchRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/TryCatch/RemoveDeadTryCatchRector.php @@ -4,12 +4,13 @@ namespace Rector\DeadCode\Rector\TryCatch; use PhpParser\Node; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Finally_; use PhpParser\Node\Stmt\Nop; -use PhpParser\Node\Stmt\Throw_; use PhpParser\Node\Stmt\TryCatch; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -53,7 +54,7 @@ public function getNodeTypes() : array } /** * @param TryCatch $node - * @return Stmt[]|null|TryCatch|int + * @return Stmt[]|null|int */ public function refactor(Node $node) { @@ -63,7 +64,7 @@ public function refactor(Node $node) return null; } if ($this->isEmpty($node->stmts)) { - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } if (\count($node->catches) !== 1) { return null; @@ -73,10 +74,10 @@ public function refactor(Node $node) return null; } $onlyCatchStmt = $onlyCatch->stmts[0]; - if (!$onlyCatchStmt instanceof Throw_) { + if (!($onlyCatchStmt instanceof Expression && $onlyCatchStmt->expr instanceof Throw_)) { return null; } - if (!$this->nodeComparator->areNodesEqual($onlyCatch->var, $onlyCatchStmt->expr)) { + if (!$this->nodeComparator->areNodesEqual($onlyCatch->var, $onlyCatchStmt->expr->expr)) { return null; } return $node->stmts; diff --git a/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php b/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php index 4d655ad2b..ac99988ec 100644 --- a/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php +++ b/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php @@ -5,7 +5,6 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\Native\NativeFunctionReflection; use PHPStan\Reflection\ReflectionProvider; use Rector\NodeNameResolver\NodeNameResolver; @@ -13,31 +12,29 @@ final class PureFunctionDetector { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider) { $this->nodeNameResolver = $nodeNameResolver; $this->reflectionProvider = $reflectionProvider; } - public function detect(FuncCall $funcCall, Scope $scope) : bool + public function detect(FuncCall $funcCall) : bool { $funcCallName = $this->nodeNameResolver->getName($funcCall); if ($funcCallName === null) { return \false; } $name = new Name($funcCallName); - $hasFunction = $this->reflectionProvider->hasFunction($name, $scope); + $hasFunction = $this->reflectionProvider->hasFunction($name, null); if (!$hasFunction) { return \false; } - $functionReflection = $this->reflectionProvider->getFunction($name, $scope); + $functionReflection = $this->reflectionProvider->getFunction($name, null); if (!$functionReflection instanceof NativeFunctionReflection) { return \false; } diff --git a/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php b/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php index 0a57d0b4e..57697ae61 100644 --- a/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php +++ b/vendor/rector/rector/rules/DeadCode/SideEffect/SideEffectNodeDetector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\DeadCode\SideEffect; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrayDimFetch; @@ -16,40 +16,47 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; -use PHPStan\Analyser\Scope; use PHPStan\Type\ObjectType; +use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\BetterNodeFinder; final class SideEffectNodeDetector { /** * @readonly - * @var \Rector\DeadCode\SideEffect\PureFunctionDetector */ - private $pureFunctionDetector; + private \Rector\DeadCode\SideEffect\PureFunctionDetector $pureFunctionDetector; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; + /** + * @readonly + */ + private NodeTypeResolver $nodeTypeResolver; + /** + * @readonly + */ + private NodeNameResolver $nodeNameResolver; /** * @var array> */ private const CALL_EXPR_SIDE_EFFECT_NODE_TYPES = [MethodCall::class, New_::class, NullsafeMethodCall::class, StaticCall::class]; - public function __construct(\Rector\DeadCode\SideEffect\PureFunctionDetector $pureFunctionDetector, BetterNodeFinder $betterNodeFinder) + public function __construct(\Rector\DeadCode\SideEffect\PureFunctionDetector $pureFunctionDetector, BetterNodeFinder $betterNodeFinder, NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver) { $this->pureFunctionDetector = $pureFunctionDetector; $this->betterNodeFinder = $betterNodeFinder; + $this->nodeTypeResolver = $nodeTypeResolver; + $this->nodeNameResolver = $nodeNameResolver; } - public function detect(Expr $expr, Scope $scope) : bool + public function detect(Expr $expr) : bool { if ($expr instanceof Assign) { return \true; } - return (bool) $this->betterNodeFinder->findFirst($expr, function (Node $subNode) use($scope) : bool { - return $this->detectCallExpr($subNode, $scope); - }); + return (bool) $this->betterNodeFinder->findFirst($expr, fn(Node $subNode): bool => $this->detectCallExpr($subNode)); } - public function detectCallExpr(Node $node, Scope $scope) : bool + public function detectCallExpr(Node $node) : bool { if (!$node instanceof Expr) { return \false; @@ -60,12 +67,15 @@ public function detectCallExpr(Node $node, Scope $scope) : bool if ($node instanceof New_ && $this->isPhpParser($node)) { return \false; } + if (($node instanceof MethodCall || $node instanceof StaticCall) && $this->isTestMock($node)) { + return \false; + } $exprClass = \get_class($node); if (\in_array($exprClass, self::CALL_EXPR_SIDE_EFFECT_NODE_TYPES, \true)) { return \true; } if ($node instanceof FuncCall) { - return !$this->pureFunctionDetector->detect($node, $scope); + return !$this->pureFunctionDetector->detect($node); } if ($node instanceof Variable || $node instanceof ArrayDimFetch) { $variable = $this->resolveVariable($node); @@ -74,6 +84,18 @@ public function detectCallExpr(Node $node, Scope $scope) : bool } return \false; } + /** + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $node + */ + private function isTestMock($node) : bool + { + $objectType = new ObjectType('PHPUnit\\Framework\\TestCase'); + $nodeCaller = $node instanceof MethodCall ? $node->var : $node->class; + if (!$this->nodeTypeResolver->isObjectType($nodeCaller, $objectType)) { + return \false; + } + return $this->nodeNameResolver->isName($node->name, 'createMock'); + } private function isPhpParser(New_ $new) : bool { if (!$new->class instanceof FullyQualified) { diff --git a/vendor/rector/rector/rules/DeadCode/UselessIfCondBeforeForeachDetector.php b/vendor/rector/rector/rules/DeadCode/UselessIfCondBeforeForeachDetector.php index 8d6f4916d..1572cfc0f 100644 --- a/vendor/rector/rector/rules/DeadCode/UselessIfCondBeforeForeachDetector.php +++ b/vendor/rector/rector/rules/DeadCode/UselessIfCondBeforeForeachDetector.php @@ -17,9 +17,8 @@ final class UselessIfCondBeforeForeachDetector { /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; public function __construct(NodeComparator $nodeComparator) { $this->nodeComparator = $nodeComparator; diff --git a/vendor/rector/rector/rules/DeadCode/ValueObject/BinaryToVersionCompareCondition.php b/vendor/rector/rector/rules/DeadCode/ValueObject/BinaryToVersionCompareCondition.php index 13bd6888e..0d3603682 100644 --- a/vendor/rector/rector/rules/DeadCode/ValueObject/BinaryToVersionCompareCondition.php +++ b/vendor/rector/rector/rules/DeadCode/ValueObject/BinaryToVersionCompareCondition.php @@ -8,14 +8,12 @@ final class BinaryToVersionCompareCondition implements ConditionInterface { /** * @readonly - * @var \Rector\DeadCode\ValueObject\VersionCompareCondition */ - private $versionCompareCondition; + private \Rector\DeadCode\ValueObject\VersionCompareCondition $versionCompareCondition; /** * @readonly - * @var string */ - private $binaryClass; + private string $binaryClass; /** * @readonly * @var mixed diff --git a/vendor/rector/rector/rules/DeadCode/ValueObject/VersionCompareCondition.php b/vendor/rector/rector/rules/DeadCode/ValueObject/VersionCompareCondition.php index bb876afbe..2e498016a 100644 --- a/vendor/rector/rector/rules/DeadCode/ValueObject/VersionCompareCondition.php +++ b/vendor/rector/rector/rules/DeadCode/ValueObject/VersionCompareCondition.php @@ -8,19 +8,16 @@ final class VersionCompareCondition implements ConditionInterface { /** * @readonly - * @var int */ - private $firstVersion; + private int $firstVersion; /** * @readonly - * @var int */ - private $secondVersion; + private int $secondVersion; /** * @readonly - * @var string|null */ - private $compareSign; + private ?string $compareSign; public function __construct(int $firstVersion, int $secondVersion, ?string $compareSign) { $this->firstVersion = $firstVersion; diff --git a/vendor/rector/rector/rules/EarlyReturn/NodeTransformer/ConditionInverter.php b/vendor/rector/rector/rules/EarlyReturn/NodeTransformer/ConditionInverter.php index 3b969508a..b6008fc01 100644 --- a/vendor/rector/rector/rules/EarlyReturn/NodeTransformer/ConditionInverter.php +++ b/vendor/rector/rector/rules/EarlyReturn/NodeTransformer/ConditionInverter.php @@ -12,9 +12,8 @@ final class ConditionInverter { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; public function __construct(BinaryOpManipulator $binaryOpManipulator) { $this->binaryOpManipulator = $binaryOpManipulator; diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/Foreach_/ChangeNestedForeachIfsToEarlyContinueRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/Foreach_/ChangeNestedForeachIfsToEarlyContinueRector.php index cb1e4b22f..927e6a9df 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/Foreach_/ChangeNestedForeachIfsToEarlyContinueRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/Foreach_/ChangeNestedForeachIfsToEarlyContinueRector.php @@ -26,14 +26,12 @@ final class ChangeNestedForeachIfsToEarlyContinueRector extends AbstractRector { /** * @readonly - * @var \Rector\EarlyReturn\NodeTransformer\ConditionInverter */ - private $conditionInverter; + private ConditionInverter $conditionInverter; /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; public function __construct(ConditionInverter $conditionInverter, IfManipulator $ifManipulator) { $this->conditionInverter = $conditionInverter; @@ -96,6 +94,9 @@ public function refactor(Node $node) : ?Node if (\count($nestedIfsWithOnlyNonReturn) < 2) { return null; } + foreach ($nestedIfsWithOnlyNonReturn as $nestedIfWithOnlyNonReturn) { + $nestedIfWithOnlyNonReturn->cond->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } return $this->processNestedIfsWithNonBreaking($node, $nestedIfsWithOnlyNonReturn); } /** diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeIfElseValueAssignToEarlyReturnRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeIfElseValueAssignToEarlyReturnRector.php index bc8071992..40364b298 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeIfElseValueAssignToEarlyReturnRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeIfElseValueAssignToEarlyReturnRector.php @@ -23,14 +23,12 @@ final class ChangeIfElseValueAssignToEarlyReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; public function __construct(IfManipulator $ifManipulator, StmtsManipulator $stmtsManipulator) { $this->ifManipulator = $ifManipulator; @@ -97,9 +95,7 @@ public function refactor(Node $node) : ?StmtsAwareInterface if (!$this->ifManipulator->isIfAndElseWithSameVariableAssignAsLastStmts($if, $stmt->expr)) { continue; } - \end($if->stmts); - $lastIfStmtKey = \key($if->stmts); - \reset($if->stmts); + $lastIfStmtKey = \array_key_last($if->stmts); /** @var Assign $assign */ $assign = $this->stmtsManipulator->getUnwrappedLastStmt($if->stmts); $returnLastIf = new Return_($assign->expr); diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeNestedIfsToEarlyReturnRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeNestedIfsToEarlyReturnRector.php index 576158586..e949c7183 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeNestedIfsToEarlyReturnRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeNestedIfsToEarlyReturnRector.php @@ -21,14 +21,12 @@ final class ChangeNestedIfsToEarlyReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\EarlyReturn\NodeTransformer\ConditionInverter */ - private $conditionInverter; + private ConditionInverter $conditionInverter; /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; public function __construct(ConditionInverter $conditionInverter, IfManipulator $ifManipulator) { $this->conditionInverter = $conditionInverter; diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeOrIfContinueToMultiContinueRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeOrIfContinueToMultiContinueRector.php index 35ce947d6..f6d1a0c12 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeOrIfContinueToMultiContinueRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/ChangeOrIfContinueToMultiContinueRector.php @@ -19,16 +19,15 @@ final class ChangeOrIfContinueToMultiContinueRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; public function __construct(IfManipulator $ifManipulator) { $this->ifManipulator = $ifManipulator; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Changes if || to early return', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `if a || b` to early return', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function canDrive(Car $newCar) diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php index ca5b1cdd5..d95f014c4 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php @@ -5,13 +5,13 @@ use PhpParser\Node; use PhpParser\Node\Expr\Exit_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Stmt\Continue_; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; -use PhpParser\Node\Stmt\Throw_; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -91,7 +91,7 @@ private function handleElseIfs(If_ $if) : array // If the last statement in the `elseif` breaks flow, merge it into the original `if` and stop processing if ($this->doesLastStatementBreakFlow($currentElseIf)) { $this->updateIfWithElseIf($if, $currentElseIf); - $nodesToReturn = \array_merge(\is_array($nodesToReturn) ? $nodesToReturn : \iterator_to_array($nodesToReturn), [$if], $this->getStatementsElseIfs($if)); + $nodesToReturn = \array_merge($nodesToReturn, [$if], $this->getStatementsElseIfs($if)); break; } $isLastElseIf = $if->elseifs === []; @@ -141,7 +141,7 @@ private function doesLastStatementBreakFlow($node) : bool } return \false; } - return !($lastStmt instanceof Return_ || $lastStmt instanceof Throw_ || $lastStmt instanceof Continue_ || $lastStmt instanceof Expression && $lastStmt->expr instanceof Exit_); + return !($lastStmt instanceof Return_ || $lastStmt instanceof Expression && $lastStmt->expr instanceof Throw_ || $lastStmt instanceof Continue_ || $lastStmt instanceof Expression && $lastStmt->expr instanceof Exit_); } /** * @param \PhpParser\Node\Stmt\If_|\PhpParser\Node\Stmt\ElseIf_ $node diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php index 9007cc4b7..caefff329 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php @@ -9,9 +9,13 @@ use PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Do_; use PhpParser\Node\Stmt\Expression; +use PhpParser\Node\Stmt\For_; +use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; +use PhpParser\Node\Stmt\While_; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\EarlyReturn\ValueObject\BareSingleAssignIf; use Rector\NodeManipulator\IfManipulator; @@ -26,14 +30,12 @@ final class PreparedValueToEarlyReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\IfManipulator */ - private $ifManipulator; + private IfManipulator $ifManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(IfManipulator $ifManipulator, BetterNodeFinder $betterNodeFinder) { $this->ifManipulator = $ifManipulator; @@ -102,6 +104,12 @@ public function refactor(Node $node) : ?StmtsAwareInterface if ($stmt instanceof Expression && $stmt->expr instanceof AssignOp) { return null; } + if (($stmt instanceof For_ || $stmt instanceof Foreach_ || $stmt instanceof While_ || $stmt instanceof Do_) && $initialAssign instanceof Assign) { + $isReassignInLoop = (bool) $this->betterNodeFinder->findFirst($stmt, fn(Node $node): bool => $node instanceof Assign && $this->nodeComparator->areNodesEqual($node->var, $initialAssign->var)); + if ($isReassignInLoop) { + return null; + } + } if ($stmt instanceof If_) { $ifs[$key] = $stmt; continue; @@ -163,9 +171,7 @@ private function isVariableSharedInAssignIfsAndReturn(array $bareSingleAssignIfs } foreach ($bareSingleAssignIfs as $bareSingleAssignIf) { $assign = $bareSingleAssignIf->getAssign(); - $isVariableUsed = (bool) $this->betterNodeFinder->findFirst([$bareSingleAssignIf->getIfCondExpr(), $assign->expr], function (Node $node) use($returnedExpr) : bool { - return $this->nodeComparator->areNodesEqual($node, $returnedExpr); - }); + $isVariableUsed = (bool) $this->betterNodeFinder->findFirst([$bareSingleAssignIf->getIfCondExpr(), $assign->expr], fn(Node $node): bool => $this->nodeComparator->areNodesEqual($node, $returnedExpr)); if ($isVariableUsed) { return \false; } diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/ReturnBinaryOrToEarlyReturnRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/ReturnBinaryOrToEarlyReturnRector.php index 806998096..cdc08fb0d 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/ReturnBinaryOrToEarlyReturnRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/ReturnBinaryOrToEarlyReturnRector.php @@ -22,14 +22,12 @@ final class ReturnBinaryOrToEarlyReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\AssignAndBinaryMap */ - private $assignAndBinaryMap; + private AssignAndBinaryMap $assignAndBinaryMap; /** * @readonly - * @var \Rector\NodeAnalyzer\CallAnalyzer */ - private $callAnalyzer; + private CallAnalyzer $callAnalyzer; public function __construct(AssignAndBinaryMap $assignAndBinaryMap, CallAnalyzer $callAnalyzer) { $this->assignAndBinaryMap = $assignAndBinaryMap; @@ -37,7 +35,7 @@ public function __construct(AssignAndBinaryMap $assignAndBinaryMap, CallAnalyzer } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Changes Single return of || to early returns', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change single return of `||` to early returns', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function accept() diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php index 764f6d174..afb7f75bd 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php @@ -26,14 +26,12 @@ final class ReturnEarlyIfVariableRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\VariableAnalyzer */ - private $variableAnalyzer; + private VariableAnalyzer $variableAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(VariableAnalyzer $variableAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->variableAnalyzer = $variableAnalyzer; diff --git a/vendor/rector/rector/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php b/vendor/rector/rector/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php index 7f142d58d..3b6bda489 100644 --- a/vendor/rector/rector/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php +++ b/vendor/rector/rector/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php @@ -10,14 +10,12 @@ final class BareSingleAssignIf { /** * @readonly - * @var \PhpParser\Node\Stmt\If_ */ - private $if; + private If_ $if; /** * @readonly - * @var \PhpParser\Node\Expr\Assign */ - private $assign; + private Assign $assign; public function __construct(If_ $if, Assign $assign) { $this->if = $if; diff --git a/vendor/rector/rector/rules/Instanceof_/Rector/Ternary/FlipNegatedTernaryInstanceofRector.php b/vendor/rector/rector/rules/Instanceof_/Rector/Ternary/FlipNegatedTernaryInstanceofRector.php index 7220ce65d..a502b6450 100644 --- a/vendor/rector/rector/rules/Instanceof_/Rector/Ternary/FlipNegatedTernaryInstanceofRector.php +++ b/vendor/rector/rector/rules/Instanceof_/Rector/Ternary/FlipNegatedTernaryInstanceofRector.php @@ -18,7 +18,7 @@ final class FlipNegatedTernaryInstanceofRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Flip negated ternary of instanceof to direct use of object', [new CodeSample('echo ! $object instanceof Product ? null : $object->getPrice();', 'echo $object instanceof Product ? $object->getPrice() : null;')]); + return new RuleDefinition('Flip negated ternary of `instanceof` to direct use of object', [new CodeSample('echo ! $object instanceof Product ? null : $object->getPrice();', 'echo $object instanceof Product ? $object->getPrice() : null;')]); } /** * @return array> diff --git a/vendor/rector/rector/rules/Naming/AssignVariableNameResolver/NewAssignVariableNameResolver.php b/vendor/rector/rector/rules/Naming/AssignVariableNameResolver/NewAssignVariableNameResolver.php deleted file mode 100644 index 0ac9fa771..000000000 --- a/vendor/rector/rector/rules/Naming/AssignVariableNameResolver/NewAssignVariableNameResolver.php +++ /dev/null @@ -1,40 +0,0 @@ - - */ -final class NewAssignVariableNameResolver implements AssignVariableNameResolverInterface -{ - /** - * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver - */ - private $nodeNameResolver; - public function __construct(NodeNameResolver $nodeNameResolver) - { - $this->nodeNameResolver = $nodeNameResolver; - } - public function match(Node $node) : bool - { - return $node instanceof New_; - } - /** - * @param New_ $node - */ - public function resolve(Node $node) : string - { - $className = $this->nodeNameResolver->getName($node->class); - if ($className === null) { - throw new NotImplementedYetException(); - } - return $this->nodeNameResolver->getShortName($className); - } -} diff --git a/vendor/rector/rector/rules/Naming/AssignVariableNameResolver/PropertyFetchAssignVariableNameResolver.php b/vendor/rector/rector/rules/Naming/AssignVariableNameResolver/PropertyFetchAssignVariableNameResolver.php deleted file mode 100644 index 53e88b22a..000000000 --- a/vendor/rector/rector/rules/Naming/AssignVariableNameResolver/PropertyFetchAssignVariableNameResolver.php +++ /dev/null @@ -1,47 +0,0 @@ - - */ -final class PropertyFetchAssignVariableNameResolver implements AssignVariableNameResolverInterface -{ - /** - * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver - */ - private $nodeNameResolver; - public function __construct(NodeNameResolver $nodeNameResolver) - { - $this->nodeNameResolver = $nodeNameResolver; - } - public function match(Node $node) : bool - { - return $node instanceof PropertyFetch; - } - /** - * @param PropertyFetch $node - */ - public function resolve(Node $node) : string - { - $varName = $this->nodeNameResolver->getName($node->var); - if (!\is_string($varName)) { - throw new NotImplementedYetException(); - } - $propertyName = $this->nodeNameResolver->getName($node->name); - if (!\is_string($propertyName)) { - throw new NotImplementedYetException(); - } - if ($varName === 'this') { - return $propertyName; - } - return $varName . \ucfirst($propertyName); - } -} diff --git a/vendor/rector/rector/rules/Naming/Contract/AssignVariableNameResolverInterface.php b/vendor/rector/rector/rules/Naming/Contract/AssignVariableNameResolverInterface.php deleted file mode 100644 index ea4b754c5..000000000 --- a/vendor/rector/rector/rules/Naming/Contract/AssignVariableNameResolverInterface.php +++ /dev/null @@ -1,17 +0,0 @@ - */ diff --git a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php index ccb2536bf..55eebaed5 100644 --- a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php +++ b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php @@ -3,44 +3,30 @@ declare (strict_types=1); namespace Rector\Naming\ExpectedNameResolver; +use PhpParser\Node; use PhpParser\Node\Param; -use PHPStan\Type\ObjectType; use Rector\Naming\Naming\PropertyNaming; use Rector\Naming\ValueObject\ExpectedName; -use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\StaticTypeMapper\StaticTypeMapper; final class MatchParamTypeExpectedNameResolver { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; - /** - * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver - */ - private $nodeTypeResolver; - public function __construct(StaticTypeMapper $staticTypeMapper, PropertyNaming $propertyNaming, NodeTypeResolver $nodeTypeResolver) + private PropertyNaming $propertyNaming; + public function __construct(StaticTypeMapper $staticTypeMapper, PropertyNaming $propertyNaming) { $this->staticTypeMapper = $staticTypeMapper; $this->propertyNaming = $propertyNaming; - $this->nodeTypeResolver = $nodeTypeResolver; } public function resolve(Param $param) : ?string { // nothing to verify - if ($param->type === null) { - return null; - } - // include nullable too - // skip date time + date time interface, as should be kept - if ($this->nodeTypeResolver->isObjectType($param->type, new ObjectType('DateTimeInterface'))) { + if (!$param->type instanceof Node) { return null; } $staticType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); diff --git a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchPropertyTypeExpectedNameResolver.php b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchPropertyTypeExpectedNameResolver.php index bdf5ea562..75713f15a 100644 --- a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchPropertyTypeExpectedNameResolver.php +++ b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchPropertyTypeExpectedNameResolver.php @@ -21,34 +21,28 @@ final class MatchPropertyTypeExpectedNameResolver { /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeManipulator\PropertyManipulator */ - private $propertyManipulator; + private PropertyManipulator $propertyManipulator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(PropertyNaming $propertyNaming, PhpDocInfoFactory $phpDocInfoFactory, NodeNameResolver $nodeNameResolver, PropertyManipulator $propertyManipulator, ReflectionResolver $reflectionResolver, StaticTypeMapper $staticTypeMapper) { $this->propertyNaming = $propertyNaming; diff --git a/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php b/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php index 987ff0b21..1d80ae34d 100644 --- a/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php +++ b/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php @@ -14,14 +14,14 @@ use PhpParser\Node\Stmt\Function_; use PHPStan\Analyser\Scope; use PHPStan\Type\ObjectType; -use PHPStan\Type\TypeWithClassName; use Rector\Naming\Naming\ConflictingNameResolver; -use Rector\Naming\Naming\OverridenExistingNamesResolver; +use Rector\Naming\Naming\OverriddenExistingNamesResolver; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PHPStanStaticTypeMapper\Utils\TypeUnwrapper; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\Util\StringUtils; /** * This class check if a variable name change breaks existing code in class method @@ -30,45 +30,39 @@ final class BreakingVariableRenameGuard { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Naming\Naming\ConflictingNameResolver */ - private $conflictingNameResolver; + private ConflictingNameResolver $conflictingNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\Naming\Naming\OverridenExistingNamesResolver */ - private $overridenExistingNamesResolver; + private OverriddenExistingNamesResolver $overriddenExistingNamesResolver; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\Utils\TypeUnwrapper */ - private $typeUnwrapper; + private TypeUnwrapper $typeUnwrapper; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @var string * @see https://regex101.com/r/1pKLgf/1 */ public const AT_NAMING_REGEX = '#[\\w+]At$#'; - public function __construct(BetterNodeFinder $betterNodeFinder, ConflictingNameResolver $conflictingNameResolver, NodeTypeResolver $nodeTypeResolver, OverridenExistingNamesResolver $overridenExistingNamesResolver, TypeUnwrapper $typeUnwrapper, NodeNameResolver $nodeNameResolver) + public function __construct(BetterNodeFinder $betterNodeFinder, ConflictingNameResolver $conflictingNameResolver, NodeTypeResolver $nodeTypeResolver, OverriddenExistingNamesResolver $overriddenExistingNamesResolver, TypeUnwrapper $typeUnwrapper, NodeNameResolver $nodeNameResolver) { $this->betterNodeFinder = $betterNodeFinder; $this->conflictingNameResolver = $conflictingNameResolver; $this->nodeTypeResolver = $nodeTypeResolver; - $this->overridenExistingNamesResolver = $overridenExistingNamesResolver; + $this->overriddenExistingNamesResolver = $overriddenExistingNamesResolver; $this->typeUnwrapper = $typeUnwrapper; $this->nodeNameResolver = $nodeNameResolver; } @@ -85,7 +79,7 @@ public function shouldSkipVariable(string $currentName, string $expectedName, $f if ($this->conflictingNameResolver->hasNameIsInFunctionLike($expectedName, $functionLike)) { return \true; } - if (!$functionLike instanceof ArrowFunction && $this->overridenExistingNamesResolver->hasNameInClassMethodForNew($currentName, $functionLike)) { + if (!$functionLike instanceof ArrowFunction && $this->overriddenExistingNamesResolver->hasNameInClassMethodForNew($currentName, $functionLike)) { return \true; } if ($this->isVariableAlreadyDefined($variable, $currentName)) { @@ -113,7 +107,7 @@ public function shouldSkipParam(string $currentName, string $expectedName, $clas if ($this->conflictingNameResolver->hasNameIsInFunctionLike($expectedName, $classMethod)) { return \true; } - if ($this->overridenExistingNamesResolver->hasNameInFunctionLikeForParam($expectedName, $classMethod)) { + if ($this->overriddenExistingNamesResolver->hasNameInFunctionLikeForParam($expectedName, $classMethod)) { return \true; } if ($param->var instanceof Error) { @@ -178,10 +172,11 @@ private function isDateTimeAtNamingConvention(Param $param) : bool { $type = $this->nodeTypeResolver->getType($param); $type = $this->typeUnwrapper->unwrapFirstObjectTypeFromUnionType($type); - if (!$type instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($type); + if ($className === null) { return \false; } - if (!\is_a($type->getClassName(), DateTimeInterface::class, \true)) { + if (!\is_a($className, DateTimeInterface::class, \true)) { return \false; } /** @var string $currentName */ diff --git a/vendor/rector/rector/rules/Naming/Guard/DateTimeAtNamingConventionGuard.php b/vendor/rector/rector/rules/Naming/Guard/DateTimeAtNamingConventionGuard.php index 7d1a3933c..67d143d83 100644 --- a/vendor/rector/rector/rules/Naming/Guard/DateTimeAtNamingConventionGuard.php +++ b/vendor/rector/rector/rules/Naming/Guard/DateTimeAtNamingConventionGuard.php @@ -4,23 +4,21 @@ namespace Rector\Naming\Guard; use DateTimeInterface; -use PHPStan\Type\TypeWithClassName; use Rector\Naming\ValueObject\PropertyRename; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PHPStanStaticTypeMapper\Utils\TypeUnwrapper; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\Util\StringUtils; final class DateTimeAtNamingConventionGuard { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\Utils\TypeUnwrapper */ - private $typeUnwrapper; + private TypeUnwrapper $typeUnwrapper; public function __construct(NodeTypeResolver $nodeTypeResolver, TypeUnwrapper $typeUnwrapper) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -30,10 +28,11 @@ public function isConflicting(PropertyRename $propertyRename) : bool { $type = $this->nodeTypeResolver->getType($propertyRename->getProperty()); $type = $this->typeUnwrapper->unwrapFirstObjectTypeFromUnionType($type); - if (!$type instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($type); + if ($className === null) { return \false; } - if (!\is_a($type->getClassName(), DateTimeInterface::class, \true)) { + if (!\is_a($className, DateTimeInterface::class, \true)) { return \false; } return StringUtils::isMatch($propertyRename->getCurrentName(), \Rector\Naming\Guard\BreakingVariableRenameGuard::AT_NAMING_REGEX); diff --git a/vendor/rector/rector/rules/Naming/Guard/HasMagicGetSetGuard.php b/vendor/rector/rector/rules/Naming/Guard/HasMagicGetSetGuard.php index fdee4cc78..392c1f7da 100644 --- a/vendor/rector/rector/rules/Naming/Guard/HasMagicGetSetGuard.php +++ b/vendor/rector/rector/rules/Naming/Guard/HasMagicGetSetGuard.php @@ -9,9 +9,8 @@ final class HasMagicGetSetGuard { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/rules/Naming/Guard/PropertyConflictingNameGuard/MatchPropertyTypeConflictingNameGuard.php b/vendor/rector/rector/rules/Naming/Guard/PropertyConflictingNameGuard/MatchPropertyTypeConflictingNameGuard.php index 9c339f639..4da8614b8 100644 --- a/vendor/rector/rector/rules/Naming/Guard/PropertyConflictingNameGuard/MatchPropertyTypeConflictingNameGuard.php +++ b/vendor/rector/rector/rules/Naming/Guard/PropertyConflictingNameGuard/MatchPropertyTypeConflictingNameGuard.php @@ -12,19 +12,16 @@ final class MatchPropertyTypeConflictingNameGuard { /** * @readonly - * @var \Rector\Naming\ExpectedNameResolver\MatchPropertyTypeExpectedNameResolver */ - private $matchPropertyTypeExpectedNameResolver; + private MatchPropertyTypeExpectedNameResolver $matchPropertyTypeExpectedNameResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Naming\PhpArray\ArrayFilter */ - private $arrayFilter; + private ArrayFilter $arrayFilter; public function __construct(MatchPropertyTypeExpectedNameResolver $matchPropertyTypeExpectedNameResolver, NodeNameResolver $nodeNameResolver, ArrayFilter $arrayFilter) { $this->matchPropertyTypeExpectedNameResolver = $matchPropertyTypeExpectedNameResolver; @@ -50,6 +47,6 @@ private function resolve(ClassLike $classLike) : array } $expectedNames[] = $expectedName; } - return $this->arrayFilter->filterWithAtLeastTwoOccurences($expectedNames); + return $this->arrayFilter->filterWithAtLeastTwoOccurrences($expectedNames); } } diff --git a/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php b/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php index 0e9bebc2c..ae0b5931a 100644 --- a/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php +++ b/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php @@ -15,14 +15,12 @@ final class ForeachMatcher { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Naming\Matcher\CallMatcher */ - private $callMatcher; + private \Rector\Naming\Matcher\CallMatcher $callMatcher; public function __construct(NodeNameResolver $nodeNameResolver, \Rector\Naming\Matcher\CallMatcher $callMatcher) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php b/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php index ccc623b06..17cb13956 100644 --- a/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php +++ b/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php @@ -16,19 +16,16 @@ final class VariableAndCallAssignMatcher { /** * @readonly - * @var \Rector\Naming\Matcher\CallMatcher */ - private $callMatcher; + private \Rector\Naming\Matcher\CallMatcher $callMatcher; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(\Rector\Naming\Matcher\CallMatcher $callMatcher, NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder) { $this->callMatcher = $callMatcher; @@ -51,9 +48,7 @@ public function match(Assign $assign, $functionLike) : ?VariableAndCallAssign if ($variableName === null) { return null; } - $isVariableFoundInCallArgs = (bool) $this->betterNodeFinder->findFirst($call->isFirstClassCallable() ? [] : $call->getArgs(), function (Node $subNode) use($variableName) : bool { - return $subNode instanceof Variable && $this->nodeNameResolver->isName($subNode, $variableName); - }); + $isVariableFoundInCallArgs = (bool) $this->betterNodeFinder->findFirst($call->isFirstClassCallable() ? [] : $call->getArgs(), fn(Node $subNode): bool => $subNode instanceof Variable && $this->nodeNameResolver->isName($subNode, $variableName)); if ($isVariableFoundInCallArgs) { return null; } diff --git a/vendor/rector/rector/rules/Naming/Naming/AliasNameResolver.php b/vendor/rector/rector/rules/Naming/Naming/AliasNameResolver.php index 6c7dd82d5..dd3acf9bd 100644 --- a/vendor/rector/rector/rules/Naming/Naming/AliasNameResolver.php +++ b/vendor/rector/rector/rules/Naming/Naming/AliasNameResolver.php @@ -11,9 +11,8 @@ final class AliasNameResolver { /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private \Rector\Naming\Naming\UseImportsResolver $useImportsResolver; public function __construct(\Rector\Naming\Naming\UseImportsResolver $useImportsResolver) { $this->useImportsResolver = $useImportsResolver; diff --git a/vendor/rector/rector/rules/Naming/Naming/ConflictingNameResolver.php b/vendor/rector/rector/rules/Naming/Naming/ConflictingNameResolver.php index da6e3a492..9972ceb9d 100644 --- a/vendor/rector/rector/rules/Naming/Naming/ConflictingNameResolver.php +++ b/vendor/rector/rector/rules/Naming/Naming/ConflictingNameResolver.php @@ -16,33 +16,28 @@ final class ConflictingNameResolver { /** * @readonly - * @var \Rector\Naming\PhpArray\ArrayFilter */ - private $arrayFilter; + private ArrayFilter $arrayFilter; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Naming\Naming\ExpectedNameResolver */ - private $expectedNameResolver; + private \Rector\Naming\Naming\ExpectedNameResolver $expectedNameResolver; /** * @readonly - * @var \Rector\Naming\ExpectedNameResolver\MatchParamTypeExpectedNameResolver */ - private $matchParamTypeExpectedNameResolver; + private MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver; /** * @readonly - * @var \Rector\NodeManipulator\FunctionLikeManipulator */ - private $functionLikeManipulator; + private FunctionLikeManipulator $functionLikeManipulator; /** * @var array */ - private $conflictingVariableNamesByClassMethod = []; + private array $conflictingVariableNamesByClassMethod = []; public function __construct(ArrayFilter $arrayFilter, BetterNodeFinder $betterNodeFinder, \Rector\Naming\Naming\ExpectedNameResolver $expectedNameResolver, MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver, FunctionLikeManipulator $functionLikeManipulator) { $this->arrayFilter = $arrayFilter; @@ -65,7 +60,7 @@ public function resolveConflictingVariableNamesForParam($classMethod) : array } $expectedNames[] = $expectedName; } - return $this->arrayFilter->filterWithAtLeastTwoOccurences($expectedNames); + return $this->arrayFilter->filterWithAtLeastTwoOccurrences($expectedNames); } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure|\PhpParser\Node\Expr\ArrowFunction $functionLike @@ -90,7 +85,7 @@ private function resolveConflictingVariableNamesForNew($functionLike) : array $newAssignNames = $this->resolveForNewAssigns($functionLike); $nonNewAssignNames = $this->resolveForNonNewAssigns($functionLike); $protectedNames = \array_merge($paramNames, $newAssignNames, $nonNewAssignNames); - $protectedNames = $this->arrayFilter->filterWithAtLeastTwoOccurences($protectedNames); + $protectedNames = $this->arrayFilter->filterWithAtLeastTwoOccurrences($protectedNames); $this->conflictingVariableNamesByClassMethod[$classMethodId] = $protectedNames; return $protectedNames; } diff --git a/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php b/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php index 571407e60..7e70fc67e 100644 --- a/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php +++ b/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php @@ -26,24 +26,20 @@ final class ExpectedNameResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private \Rector\Naming\Naming\PropertyNaming $propertyNaming; /** * @readonly - * @var \Rector\Naming\ExpectedNameResolver\MatchParamTypeExpectedNameResolver */ - private $matchParamTypeExpectedNameResolver; + private MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver; public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, \Rector\Naming\Naming\PropertyNaming $propertyNaming, MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver) { $this->nodeNameResolver = $nodeNameResolver; @@ -116,10 +112,7 @@ public function resolveForCall($expr) : ?string return null; } $returnedType = $this->nodeTypeResolver->getType($expr); - if (!$returnedType->isObject()->yes()) { - return null; - } - if ($this->isDateTimeType($returnedType)) { + if (!$returnedType instanceof ObjectType) { return null; } $expectedName = $this->propertyNaming->getExpectedNameFromType($returnedType); @@ -189,22 +182,9 @@ private function isDynamicNameCall($expr) : bool } private function resolveReturnTypeFromArrayType(ArrayType $arrayType) : ?Type { - if (!$arrayType->getItemType() instanceof ObjectType) { + if (!$arrayType->getIterableValueType() instanceof ObjectType) { return null; } - return $arrayType->getItemType(); - } - /** - * Skip date time, as custom naming - */ - private function isDateTimeType(Type $type) : bool - { - if (!$type instanceof ObjectType) { - return \false; - } - if ($type->isInstanceOf('DateTimeInterface')->yes()) { - return \true; - } - return $type->isInstanceOf('DateTime')->yes(); + return $arrayType->getIterableValueType(); } } diff --git a/vendor/rector/rector/rules/Naming/Naming/OverridenExistingNamesResolver.php b/vendor/rector/rector/rules/Naming/Naming/OverriddenExistingNamesResolver.php similarity index 74% rename from vendor/rector/rector/rules/Naming/Naming/OverridenExistingNamesResolver.php rename to vendor/rector/rector/rules/Naming/Naming/OverriddenExistingNamesResolver.php index ad0a1694a..96d4d3d89 100644 --- a/vendor/rector/rector/rules/Naming/Naming/OverridenExistingNamesResolver.php +++ b/vendor/rector/rector/rules/Naming/Naming/OverriddenExistingNamesResolver.php @@ -12,27 +12,24 @@ use Rector\Naming\PhpArray\ArrayFilter; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpParser\Node\BetterNodeFinder; -final class OverridenExistingNamesResolver +final class OverriddenExistingNamesResolver { /** * @readonly - * @var \Rector\Naming\PhpArray\ArrayFilter */ - private $arrayFilter; + private ArrayFilter $arrayFilter; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @var array> */ - private $overridenExistingVariableNamesByClassMethod = []; + private array $overriddenExistingVariableNamesByClassMethod = []; public function __construct(ArrayFilter $arrayFilter, BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver) { $this->arrayFilter = $arrayFilter; @@ -44,8 +41,8 @@ public function __construct(ArrayFilter $arrayFilter, BetterNodeFinder $betterNo */ public function hasNameInClassMethodForNew(string $variableName, $functionLike) : bool { - $overridenVariableNames = $this->resolveOveriddenNamesForNew($functionLike); - return \in_array($variableName, $overridenVariableNames, \true); + $overriddenVariableNames = $this->resolveOverriddenNamesForNew($functionLike); + return \in_array($variableName, $overriddenVariableNames, \true); } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure|\PhpParser\Node\Expr\ArrowFunction $classMethod @@ -71,11 +68,11 @@ public function hasNameInFunctionLikeForParam(string $expectedName, $classMethod * @return string[] * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike */ - private function resolveOveriddenNamesForNew($functionLike) : array + private function resolveOverriddenNamesForNew($functionLike) : array { $classMethodId = \spl_object_id($functionLike); - if (isset($this->overridenExistingVariableNamesByClassMethod[$classMethodId])) { - return $this->overridenExistingVariableNamesByClassMethod[$classMethodId]; + if (isset($this->overriddenExistingVariableNamesByClassMethod[$classMethodId])) { + return $this->overriddenExistingVariableNamesByClassMethod[$classMethodId]; } $currentlyUsedNames = []; /** @var Assign[] $assigns */ @@ -89,9 +86,8 @@ private function resolveOveriddenNamesForNew($functionLike) : array } $currentlyUsedNames[] = $currentVariableName; } - $currentlyUsedNames = \array_values($currentlyUsedNames); - $currentlyUsedNames = $this->arrayFilter->filterWithAtLeastTwoOccurences($currentlyUsedNames); - $this->overridenExistingVariableNamesByClassMethod[$classMethodId] = $currentlyUsedNames; + $currentlyUsedNames = $this->arrayFilter->filterWithAtLeastTwoOccurrences($currentlyUsedNames); + $this->overriddenExistingVariableNamesByClassMethod[$classMethodId] = $currentlyUsedNames; return $currentlyUsedNames; } } diff --git a/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php b/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php index f1f88f280..bf0df6dd3 100644 --- a/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php +++ b/vendor/rector/rector/rules/Naming/Naming/PropertyNaming.php @@ -3,19 +3,18 @@ declare (strict_types=1); namespace Rector\Naming\Naming; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PHPStan\Type\Generic\GenericObjectType; use PHPStan\Type\ObjectType; use PHPStan\Type\StaticType; use PHPStan\Type\ThisType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; -use PHPStan\Type\TypeWithClassName; +use Rector\Enum\ClassName; use Rector\Exception\ShouldNotHappenException; use Rector\Naming\RectorNamingInflector; use Rector\Naming\ValueObject\ExpectedName; -use Rector\NodeTypeResolver\NodeTypeResolver; -use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\StaticTypeMapper\ValueObject\Type\SelfObjectType; use Rector\Util\StringUtils; /** @@ -25,14 +24,8 @@ final class PropertyNaming { /** * @readonly - * @var \Rector\Naming\RectorNamingInflector */ - private $rectorNamingInflector; - /** - * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver - */ - private $nodeTypeResolver; + private RectorNamingInflector $rectorNamingInflector; /** * @var string[] */ @@ -55,10 +48,9 @@ final class PropertyNaming * @var string */ private const GET_PREFIX_REGEX = '#^get(?[A-Z].+)#'; - public function __construct(RectorNamingInflector $rectorNamingInflector, NodeTypeResolver $nodeTypeResolver) + public function __construct(RectorNamingInflector $rectorNamingInflector) { $this->rectorNamingInflector = $rectorNamingInflector; - $this->nodeTypeResolver = $nodeTypeResolver; } public function getExpectedNameFromMethodName(string $methodName) : ?ExpectedName { @@ -71,6 +63,7 @@ public function getExpectedNameFromMethodName(string $methodName) : ?ExpectedNam } public function getExpectedNameFromType(Type $type) : ?ExpectedName { + $type = TypeCombinator::removeNull($type); // keep collections untouched if ($type instanceof ObjectType) { if ($type->isInstanceOf('Doctrine\\Common\\Collections\\Collection')->yes()) { @@ -79,6 +72,9 @@ public function getExpectedNameFromType(Type $type) : ?ExpectedName if ($type->isInstanceOf('Illuminate\\Support\\Collection')->yes()) { return null; } + if ($type->isInstanceOf(ClassName::DATE_TIME_INTERFACE)->yes()) { + return null; + } } $className = $this->resolveClassNameFromType($type); if (!\is_string($className)) { @@ -155,7 +151,7 @@ private function normalizeUpperCase(string $shortClassName) : string } private function prolongIfTooShort(string $shortClassName, string $className) : string { - if (\in_array($shortClassName, ['Factory', 'Repository'], \true)) { + if (\in_array($shortClassName, ['Factory', 'Repository'], \true) && \substr_compare($className, 'Repository', -\strlen('Repository')) !== 0 && \substr_compare($className, 'Factory', -\strlen('Factory')) !== 0) { $namespaceAbove = (string) Strings::after($className, '\\', -2); $namespaceAbove = (string) Strings::before($namespaceAbove, '\\'); return \lcfirst($namespaceAbove) . $shortClassName; @@ -237,8 +233,8 @@ private function normalizeShortClassName(string $shortClassName) : string } private function resolveClassNameFromType(Type $type) : ?string { - $type = TypeCombinator::removeNull($type); - if (!$type instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($type); + if ($className === null) { return null; } if ($type instanceof SelfObjectType) { @@ -251,6 +247,6 @@ private function resolveClassNameFromType(Type $type) : ?string if ($type instanceof GenericObjectType) { return null; } - return $type instanceof AliasedObjectType ? $type->getClassName() : $this->nodeTypeResolver->getFullyQualifiedClassName($type); + return $className; } } diff --git a/vendor/rector/rector/rules/Naming/Naming/UseImportsResolver.php b/vendor/rector/rector/rules/Naming/Naming/UseImportsResolver.php index ed9301192..a51dbf617 100644 --- a/vendor/rector/rector/rules/Naming/Naming/UseImportsResolver.php +++ b/vendor/rector/rector/rules/Naming/Naming/UseImportsResolver.php @@ -15,9 +15,8 @@ final class UseImportsResolver { /** * @readonly - * @var \Rector\Application\Provider\CurrentFileProvider */ - private $currentFileProvider; + private CurrentFileProvider $currentFileProvider; public function __construct(CurrentFileProvider $currentFileProvider) { $this->currentFileProvider = $currentFileProvider; @@ -31,9 +30,7 @@ public function resolve() : array if (!$namespace instanceof Node) { return []; } - return \array_filter($namespace->stmts, static function (Stmt $stmt) : bool { - return $stmt instanceof Use_ || $stmt instanceof GroupUse; - }); + return \array_filter($namespace->stmts, static fn(Stmt $stmt): bool => $stmt instanceof Use_ || $stmt instanceof GroupUse); } /** * @api @@ -45,9 +42,7 @@ public function resolveBareUses() : array if (!$namespace instanceof Node) { return []; } - return \array_filter($namespace->stmts, static function (Stmt $stmt) : bool { - return $stmt instanceof Use_; - }); + return \array_filter($namespace->stmts, static fn(Stmt $stmt): bool => $stmt instanceof Use_); } /** * @param \PhpParser\Node\Stmt\Use_|\PhpParser\Node\Stmt\GroupUse $use @@ -71,9 +66,7 @@ private function resolveNamespace() return null; } /** @var Namespace_[]|FileWithoutNamespace[] $namespaces */ - $namespaces = \array_filter($newStmts, static function (Stmt $stmt) : bool { - return $stmt instanceof Namespace_ || $stmt instanceof FileWithoutNamespace; - }); + $namespaces = \array_filter($newStmts, static fn(Stmt $stmt): bool => $stmt instanceof Namespace_ || $stmt instanceof FileWithoutNamespace); // multiple namespaces is not supported if (\count($namespaces) !== 1) { return null; diff --git a/vendor/rector/rector/rules/Naming/Naming/VariableNaming.php b/vendor/rector/rector/rules/Naming/Naming/VariableNaming.php index 8c4e8fca8..eafb82129 100644 --- a/vendor/rector/rector/rules/Naming/Naming/VariableNaming.php +++ b/vendor/rector/rector/rules/Naming/Naming/VariableNaming.php @@ -3,48 +3,12 @@ declare (strict_types=1); namespace Rector\Naming\Naming; -use PhpParser\Node; -use PhpParser\Node\Arg; -use PhpParser\Node\Expr\Cast; -use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\NullsafeMethodCall; -use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Expr\Ternary; -use PhpParser\Node\Scalar\String_; use PHPStan\Analyser\Scope; -use PHPStan\Type\ThisType; -use PHPStan\Type\Type; -use Rector\Naming\AssignVariableNameResolver\NewAssignVariableNameResolver; -use Rector\Naming\AssignVariableNameResolver\PropertyFetchAssignVariableNameResolver; -use Rector\Naming\Contract\AssignVariableNameResolverInterface; -use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\NodeTypeResolver; /** * @api used in downgrade */ final class VariableNaming { - /** - * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver - */ - private $nodeNameResolver; - /** - * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver - */ - private $nodeTypeResolver; - /** - * @var AssignVariableNameResolverInterface[] - */ - private $assignVariableNameResolvers = []; - public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, PropertyFetchAssignVariableNameResolver $propertyFetchAssignVariableNameResolver, NewAssignVariableNameResolver $newAssignVariableNameResolver) - { - $this->nodeNameResolver = $nodeNameResolver; - $this->nodeTypeResolver = $nodeTypeResolver; - $this->assignVariableNameResolvers = [$propertyFetchAssignVariableNameResolver, $newAssignVariableNameResolver]; - } /** * @api used in downgrade */ @@ -66,75 +30,4 @@ public function createCountedValueName(string $valueName, ?Scope $scope) : strin } return $valueName; } - private function resolveFromNodeAndType(Node $node, Type $type) : ?string - { - $variableName = $this->resolveBareFromNode($node); - if ($variableName === null) { - return null; - } - // adjust static to specific class - if ($variableName === 'this' && $type instanceof ThisType) { - $shortClassName = $this->nodeNameResolver->getShortName($type->getClassName()); - return \lcfirst($shortClassName); - } - return $this->nodeNameResolver->getShortName($variableName); - } - private function resolveFromNode(Node $node) : ?string - { - $nodeType = $this->nodeTypeResolver->getType($node); - return $this->resolveFromNodeAndType($node, $nodeType); - } - private function resolveBareFromNode(Node $node) : ?string - { - $unwrappedNode = $this->unwrapNode($node); - if (!$unwrappedNode instanceof Node) { - return null; - } - foreach ($this->assignVariableNameResolvers as $assignVariableNameResolver) { - if ($assignVariableNameResolver->match($unwrappedNode)) { - return $assignVariableNameResolver->resolve($unwrappedNode); - } - } - if ($unwrappedNode instanceof MethodCall || $unwrappedNode instanceof NullsafeMethodCall || $unwrappedNode instanceof StaticCall) { - return $this->resolveFromMethodCall($unwrappedNode); - } - if ($unwrappedNode instanceof FuncCall) { - return $this->resolveFromNode($unwrappedNode->name); - } - $paramName = $this->nodeNameResolver->getName($unwrappedNode); - if ($paramName !== null) { - return $paramName; - } - if ($unwrappedNode instanceof String_) { - return $unwrappedNode->value; - } - return null; - } - /** - * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\NullsafeMethodCall|\PhpParser\Node\Expr\StaticCall $node - */ - private function resolveFromMethodCall($node) : ?string - { - if ($node->name instanceof MethodCall) { - return $this->resolveFromMethodCall($node->name); - } - $methodName = $this->nodeNameResolver->getName($node->name); - if (!\is_string($methodName)) { - return null; - } - return $methodName; - } - private function unwrapNode(Node $node) : ?Node - { - if ($node instanceof Arg) { - return $node->value; - } - if ($node instanceof Cast) { - return $node->expr; - } - if ($node instanceof Ternary) { - return $node->if; - } - return $node; - } } diff --git a/vendor/rector/rector/rules/Naming/NamingConvention/NamingConventionAnalyzer.php b/vendor/rector/rector/rules/Naming/NamingConvention/NamingConventionAnalyzer.php index a71f03fff..9e676c04e 100644 --- a/vendor/rector/rector/rules/Naming/NamingConvention/NamingConventionAnalyzer.php +++ b/vendor/rector/rector/rules/Naming/NamingConvention/NamingConventionAnalyzer.php @@ -12,9 +12,8 @@ final class NamingConventionAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/Naming/ParamRenamer/ParamRenamer.php b/vendor/rector/rector/rules/Naming/ParamRenamer/ParamRenamer.php index e62f1bf7e..6ba63b2eb 100644 --- a/vendor/rector/rector/rules/Naming/ParamRenamer/ParamRenamer.php +++ b/vendor/rector/rector/rules/Naming/ParamRenamer/ParamRenamer.php @@ -14,19 +14,16 @@ final class ParamRenamer { /** * @readonly - * @var \Rector\Naming\VariableRenamer */ - private $variableRenamer; + private VariableRenamer $variableRenamer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->variableRenamer = $variableRenamer; diff --git a/vendor/rector/rector/rules/Naming/PhpArray/ArrayFilter.php b/vendor/rector/rector/rules/Naming/PhpArray/ArrayFilter.php index aa08433e9..a34d95ede 100644 --- a/vendor/rector/rector/rules/Naming/PhpArray/ArrayFilter.php +++ b/vendor/rector/rector/rules/Naming/PhpArray/ArrayFilter.php @@ -9,7 +9,7 @@ final class ArrayFilter * @param mixed[] $values * @return string[] */ - public function filterWithAtLeastTwoOccurences(array $values) : array + public function filterWithAtLeastTwoOccurrences(array $values) : array { /** @var array $valueToCount */ $valueToCount = \array_count_values($values); diff --git a/vendor/rector/rector/rules/Naming/PropertyRenamer/MatchTypePropertyRenamer.php b/vendor/rector/rector/rules/Naming/PropertyRenamer/MatchTypePropertyRenamer.php index 0ffb77e0f..bb5d29b73 100644 --- a/vendor/rector/rector/rules/Naming/PropertyRenamer/MatchTypePropertyRenamer.php +++ b/vendor/rector/rector/rules/Naming/PropertyRenamer/MatchTypePropertyRenamer.php @@ -12,19 +12,16 @@ final class MatchTypePropertyRenamer { /** * @readonly - * @var \Rector\Naming\Guard\PropertyConflictingNameGuard\MatchPropertyTypeConflictingNameGuard */ - private $matchPropertyTypeConflictingNameGuard; + private MatchPropertyTypeConflictingNameGuard $matchPropertyTypeConflictingNameGuard; /** * @readonly - * @var \Rector\Naming\RenameGuard\PropertyRenameGuard */ - private $propertyRenameGuard; + private PropertyRenameGuard $propertyRenameGuard; /** * @readonly - * @var \Rector\Naming\PropertyRenamer\PropertyFetchRenamer */ - private $propertyFetchRenamer; + private \Rector\Naming\PropertyRenamer\PropertyFetchRenamer $propertyFetchRenamer; public function __construct(MatchPropertyTypeConflictingNameGuard $matchPropertyTypeConflictingNameGuard, PropertyRenameGuard $propertyRenameGuard, \Rector\Naming\PropertyRenamer\PropertyFetchRenamer $propertyFetchRenamer) { $this->matchPropertyTypeConflictingNameGuard = $matchPropertyTypeConflictingNameGuard; @@ -42,8 +39,8 @@ public function rename(PropertyRename $propertyRename) : ?Property if ($this->propertyRenameGuard->shouldSkip($propertyRename)) { return null; } - $onlyPropertyProperty = $propertyRename->getPropertyProperty(); - $onlyPropertyProperty->name = new VarLikeIdentifier($propertyRename->getExpectedName()); + $propertyItem = $propertyRename->getPropertyProperty(); + $propertyItem->name = new VarLikeIdentifier($propertyRename->getExpectedName()); $this->renamePropertyFetchesInClass($propertyRename); return $propertyRename->getProperty(); } diff --git a/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyFetchRenamer.php b/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyFetchRenamer.php index 93208687a..e7e0cbaec 100644 --- a/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyFetchRenamer.php +++ b/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyFetchRenamer.php @@ -15,14 +15,12 @@ final class PropertyFetchRenamer { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, PropertyFetchAnalyzer $propertyFetchAnalyzer) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; diff --git a/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyPromotionRenamer.php b/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyPromotionRenamer.php index 519cf54b1..a41855680 100644 --- a/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyPromotionRenamer.php +++ b/vendor/rector/rector/rules/Naming/PropertyRenamer/PropertyPromotionRenamer.php @@ -9,8 +9,8 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Interface_; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\Reflection\ClassReflection; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; @@ -19,58 +19,59 @@ use Rector\Naming\ValueObject\ParamRename; use Rector\Naming\ValueObjectFactory\ParamRenameFactory; use Rector\Naming\VariableRenamer; +use Rector\NodeManipulator\PropertyManipulator; use Rector\NodeNameResolver\NodeNameResolver; use Rector\Php\PhpVersionProvider; +use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\MethodName; use Rector\ValueObject\PhpVersionFeature; final class PropertyPromotionRenamer { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\Naming\ExpectedNameResolver\MatchParamTypeExpectedNameResolver */ - private $matchParamTypeExpectedNameResolver; + private MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver; /** * @readonly - * @var \Rector\Naming\ValueObjectFactory\ParamRenameFactory */ - private $paramRenameFactory; + private ParamRenameFactory $paramRenameFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Naming\ParamRenamer\ParamRenamer */ - private $paramRenamer; + private ParamRenamer $paramRenamer; /** * @readonly - * @var \Rector\Naming\PropertyRenamer\PropertyFetchRenamer */ - private $propertyFetchRenamer; + private \Rector\Naming\PropertyRenamer\PropertyFetchRenamer $propertyFetchRenamer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Naming\VariableRenamer */ - private $variableRenamer; + private VariableRenamer $variableRenamer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; - public function __construct(PhpVersionProvider $phpVersionProvider, MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver, ParamRenameFactory $paramRenameFactory, PhpDocInfoFactory $phpDocInfoFactory, ParamRenamer $paramRenamer, \Rector\Naming\PropertyRenamer\PropertyFetchRenamer $propertyFetchRenamer, NodeNameResolver $nodeNameResolver, VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater) + private DocBlockUpdater $docBlockUpdater; + /** + * @readonly + */ + private ReflectionResolver $reflectionResolver; + /** + * @readonly + */ + private PropertyManipulator $propertyManipulator; + public function __construct(PhpVersionProvider $phpVersionProvider, MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver, ParamRenameFactory $paramRenameFactory, PhpDocInfoFactory $phpDocInfoFactory, ParamRenamer $paramRenamer, \Rector\Naming\PropertyRenamer\PropertyFetchRenamer $propertyFetchRenamer, NodeNameResolver $nodeNameResolver, VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater, ReflectionResolver $reflectionResolver, PropertyManipulator $propertyManipulator) { $this->phpVersionProvider = $phpVersionProvider; $this->matchParamTypeExpectedNameResolver = $matchParamTypeExpectedNameResolver; @@ -81,24 +82,34 @@ public function __construct(PhpVersionProvider $phpVersionProvider, MatchParamTy $this->nodeNameResolver = $nodeNameResolver; $this->variableRenamer = $variableRenamer; $this->docBlockUpdater = $docBlockUpdater; + $this->reflectionResolver = $reflectionResolver; + $this->propertyManipulator = $propertyManipulator; } - /** - * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_ $classLike - */ - public function renamePropertyPromotion($classLike) : bool + public function renamePropertyPromotion(Class_ $class) : bool { $hasChanged = \false; if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::PROPERTY_PROMOTION)) { return \false; } - $constructClassMethod = $classLike->getMethod(MethodName::CONSTRUCT); + $constructClassMethod = $class->getMethod(MethodName::CONSTRUCT); if (!$constructClassMethod instanceof ClassMethod) { return \false; } + $classReflection = $this->reflectionResolver->resolveClassReflection($class); + if (!$classReflection instanceof ClassReflection) { + return \false; + } // resolve possible and existing param names $blockingParamNames = $this->resolveBlockingParamNames($constructClassMethod); foreach ($constructClassMethod->params as $param) { - if ($param->flags === 0) { + if (!$param->isPromoted()) { + continue; + } + // skip public properties, as they can be used in external code + if ($param->isPublic()) { + continue; + } + if (!$class->isFinal() && $param->isProtected()) { continue; } // promoted property @@ -113,7 +124,10 @@ public function renamePropertyPromotion($classLike) : bool if ($this->isNameSuffixed($currentParamName, $desiredPropertyName)) { continue; } - $this->renameParamVarNameAndVariableUsage($classLike, $constructClassMethod, $desiredPropertyName, $param); + if ($this->propertyManipulator->isUsedByTrait($classReflection, $currentParamName)) { + continue; + } + $this->renameParamVarNameAndVariableUsage($class, $constructClassMethod, $desiredPropertyName, $param); $hasChanged = \true; } return $hasChanged; diff --git a/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php index 53d21c323..a29a803f6 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Naming\Rector\Assign; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Closure; @@ -30,44 +30,36 @@ final class RenameVariableToMatchMethodCallReturnTypeRector extends AbstractRect { /** * @readonly - * @var \Rector\Naming\Guard\BreakingVariableRenameGuard */ - private $breakingVariableRenameGuard; + private BreakingVariableRenameGuard $breakingVariableRenameGuard; /** * @readonly - * @var \Rector\Naming\Naming\ExpectedNameResolver */ - private $expectedNameResolver; + private ExpectedNameResolver $expectedNameResolver; /** * @readonly - * @var \Rector\Naming\NamingConvention\NamingConventionAnalyzer */ - private $namingConventionAnalyzer; + private NamingConventionAnalyzer $namingConventionAnalyzer; /** * @readonly - * @var \Rector\Naming\PhpDoc\VarTagValueNodeRenamer */ - private $varTagValueNodeRenamer; + private VarTagValueNodeRenamer $varTagValueNodeRenamer; /** * @readonly - * @var \Rector\Naming\Matcher\VariableAndCallAssignMatcher */ - private $variableAndCallAssignMatcher; + private VariableAndCallAssignMatcher $variableAndCallAssignMatcher; /** * @readonly - * @var \Rector\Naming\VariableRenamer */ - private $variableRenamer; + private VariableRenamer $variableRenamer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var string * @see https://regex101.com/r/JG5w9j/1 diff --git a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameParamToMatchTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameParamToMatchTypeRector.php index 3ffed0846..3034211e1 100644 --- a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameParamToMatchTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameParamToMatchTypeRector.php @@ -26,33 +26,25 @@ final class RenameParamToMatchTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\Naming\Guard\BreakingVariableRenameGuard */ - private $breakingVariableRenameGuard; + private BreakingVariableRenameGuard $breakingVariableRenameGuard; /** * @readonly - * @var \Rector\Naming\Naming\ExpectedNameResolver */ - private $expectedNameResolver; + private ExpectedNameResolver $expectedNameResolver; /** * @readonly - * @var \Rector\Naming\ExpectedNameResolver\MatchParamTypeExpectedNameResolver */ - private $matchParamTypeExpectedNameResolver; + private MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver; /** * @readonly - * @var \Rector\Naming\ValueObjectFactory\ParamRenameFactory */ - private $paramRenameFactory; + private ParamRenameFactory $paramRenameFactory; /** * @readonly - * @var \Rector\Naming\ParamRenamer\ParamRenamer */ - private $paramRenamer; - /** - * @var bool - */ - private $hasChanged = \false; + private ParamRenamer $paramRenamer; + private bool $hasChanged = \false; public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver, ParamRenameFactory $paramRenameFactory, ParamRenamer $paramRenamer) { $this->breakingVariableRenameGuard = $breakingVariableRenameGuard; @@ -97,6 +89,10 @@ public function refactor(Node $node) : ?Node { $this->hasChanged = \false; foreach ($node->params as $param) { + // skip as array-like + if ($param->variadic) { + continue; + } $expectedName = $this->expectedNameResolver->resolveForParamIfNotYet($param); if ($expectedName === null) { continue; @@ -137,6 +133,6 @@ private function shouldSkipParam(Param $param, string $expectedName, $classMetho if (!$this->isName($classMethod, MethodName::CONSTRUCT)) { return \false; } - return $param->flags !== 0; + return $param->isPromoted(); } } diff --git a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php index ce0c02644..d500bce7f 100644 --- a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php @@ -22,24 +22,20 @@ final class RenameVariableToMatchNewTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\Naming\Guard\BreakingVariableRenameGuard */ - private $breakingVariableRenameGuard; + private BreakingVariableRenameGuard $breakingVariableRenameGuard; /** * @readonly - * @var \Rector\Naming\Naming\ExpectedNameResolver */ - private $expectedNameResolver; + private ExpectedNameResolver $expectedNameResolver; /** * @readonly - * @var \Rector\Naming\VariableRenamer */ - private $variableRenamer; + private VariableRenamer $variableRenamer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, VariableRenamer $variableRenamer, BetterNodeFinder $betterNodeFinder) { $this->breakingVariableRenameGuard = $breakingVariableRenameGuard; @@ -124,8 +120,6 @@ private function getAssignsOfNew(ClassMethod $classMethod) : array { /** @var Assign[] $assigns */ $assigns = $this->betterNodeFinder->findInstanceOf((array) $classMethod->stmts, Assign::class); - return \array_filter($assigns, static function (Assign $assign) : bool { - return $assign->expr instanceof New_; - }); + return \array_filter($assigns, static fn(Assign $assign): bool => $assign->expr instanceof New_); } } diff --git a/vendor/rector/rector/rules/Naming/Rector/Class_/RenamePropertyToMatchTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/Class_/RenamePropertyToMatchTypeRector.php index 30f517031..06451011a 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Class_/RenamePropertyToMatchTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Class_/RenamePropertyToMatchTypeRector.php @@ -4,10 +4,11 @@ namespace Rector\Naming\Rector\Class_; use PhpParser\Node; +use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassLike; -use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Property; +use PHPStan\Type\ObjectType; +use Rector\Enum\ClassName; use Rector\Naming\ExpectedNameResolver\MatchPropertyTypeExpectedNameResolver; use Rector\Naming\PropertyRenamer\MatchTypePropertyRenamer; use Rector\Naming\PropertyRenamer\PropertyPromotionRenamer; @@ -23,28 +24,21 @@ final class RenamePropertyToMatchTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\Naming\PropertyRenamer\MatchTypePropertyRenamer */ - private $matchTypePropertyRenamer; + private MatchTypePropertyRenamer $matchTypePropertyRenamer; /** * @readonly - * @var \Rector\Naming\ValueObjectFactory\PropertyRenameFactory */ - private $propertyRenameFactory; + private PropertyRenameFactory $propertyRenameFactory; /** * @readonly - * @var \Rector\Naming\ExpectedNameResolver\MatchPropertyTypeExpectedNameResolver */ - private $matchPropertyTypeExpectedNameResolver; + private MatchPropertyTypeExpectedNameResolver $matchPropertyTypeExpectedNameResolver; /** * @readonly - * @var \Rector\Naming\PropertyRenamer\PropertyPromotionRenamer */ - private $propertyPromotionRenamer; - /** - * @var bool - */ - private $hasChanged = \false; + private PropertyPromotionRenamer $propertyPromotionRenamer; + private bool $hasChanged = \false; public function __construct(MatchTypePropertyRenamer $matchTypePropertyRenamer, PropertyRenameFactory $propertyRenameFactory, MatchPropertyTypeExpectedNameResolver $matchPropertyTypeExpectedNameResolver, PropertyPromotionRenamer $propertyPromotionRenamer) { $this->matchTypePropertyRenamer = $matchTypePropertyRenamer; @@ -89,10 +83,10 @@ public function __construct(EntityManager $entityManager) */ public function getNodeTypes() : array { - return [Class_::class, Interface_::class]; + return [Class_::class]; } /** - * @param Class_|Interface_ $node + * @param Class_ $node */ public function refactor(Node $node) : ?Node { @@ -107,17 +101,27 @@ public function refactor(Node $node) : ?Node } return null; } - private function refactorClassProperties(ClassLike $classLike) : void + private function refactorClassProperties(Class_ $class) : void { - foreach ($classLike->getProperties() as $property) { - $expectedPropertyName = $this->matchPropertyTypeExpectedNameResolver->resolve($property, $classLike); + foreach ($class->getProperties() as $property) { + // skip public properties, as they can be used in external code + if ($property->isPublic()) { + continue; + } + if (!$class->isFinal() && $property->isProtected()) { + continue; + } + $expectedPropertyName = $this->matchPropertyTypeExpectedNameResolver->resolve($property, $class); if ($expectedPropertyName === null) { continue; } - $propertyRename = $this->propertyRenameFactory->createFromExpectedName($classLike, $property, $expectedPropertyName); + $propertyRename = $this->propertyRenameFactory->createFromExpectedName($class, $property, $expectedPropertyName); if (!$propertyRename instanceof PropertyRename) { continue; } + if ($this->skipDateTimeOrMockObjectPropertyType($property)) { + continue; + } $renameProperty = $this->matchTypePropertyRenamer->rename($propertyRename); if (!$renameProperty instanceof Property) { continue; @@ -125,4 +129,18 @@ private function refactorClassProperties(ClassLike $classLike) : void $this->hasChanged = \true; } } + /** + * Such properties can have "xMock" names that are not compatible with "MockObject" suffix + * They should be kept and handled by another naming rule that deals with mocks + */ + private function skipDateTimeOrMockObjectPropertyType(Property $property) : bool + { + if (!$property->type instanceof Name) { + return \false; + } + if ($this->isObjectType($property->type, new ObjectType(ClassName::MOCK_OBJECT))) { + return \true; + } + return $this->isObjectType($property->type, new ObjectType(ClassName::DATE_TIME_INTERFACE)); + } } diff --git a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php index 338f3b64b..1fd0a237a 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php @@ -21,24 +21,20 @@ final class RenameForeachValueVariableToMatchExprVariableRector extends Abstract { /** * @readonly - * @var \Rector\Naming\ExpectedNameResolver\InflectorSingularResolver */ - private $inflectorSingularResolver; + private InflectorSingularResolver $inflectorSingularResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(InflectorSingularResolver $inflectorSingularResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer, StmtsManipulator $stmtsManipulator, BetterNodeFinder $betterNodeFinder) { $this->inflectorSingularResolver = $inflectorSingularResolver; @@ -48,7 +44,7 @@ public function __construct(InflectorSingularResolver $inflectorSingularResolver } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Renames value variable name in foreach loop to match expression variable', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Rename value variable name in foreach loop to match expression variable', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php index 59ae43901..44234a076 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php @@ -9,7 +9,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Naming\Guard\BreakingVariableRenameGuard; use Rector\Naming\Matcher\ForeachMatcher; use Rector\Naming\Naming\ExpectedNameResolver; @@ -26,29 +26,24 @@ final class RenameForeachValueVariableToMatchMethodCallReturnTypeRector extends { /** * @readonly - * @var \Rector\Naming\Guard\BreakingVariableRenameGuard */ - private $breakingVariableRenameGuard; + private BreakingVariableRenameGuard $breakingVariableRenameGuard; /** * @readonly - * @var \Rector\Naming\Naming\ExpectedNameResolver */ - private $expectedNameResolver; + private ExpectedNameResolver $expectedNameResolver; /** * @readonly - * @var \Rector\Naming\NamingConvention\NamingConventionAnalyzer */ - private $namingConventionAnalyzer; + private NamingConventionAnalyzer $namingConventionAnalyzer; /** * @readonly - * @var \Rector\Naming\VariableRenamer */ - private $variableRenamer; + private VariableRenamer $variableRenamer; /** * @readonly - * @var \Rector\Naming\Matcher\ForeachMatcher */ - private $foreachMatcher; + private ForeachMatcher $foreachMatcher; /** * @var string[] */ @@ -107,7 +102,7 @@ public function refactor(Node $node) : ?Node $hasRenamed = \false; $this->traverseNodesWithCallable($node->stmts, function (Node $subNode) use($node, &$hasRenamed) : ?int { if ($subNode instanceof Class_ || $subNode instanceof Closure || $subNode instanceof Function_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Foreach_) { return null; diff --git a/vendor/rector/rector/rules/Naming/RectorNamingInflector.php b/vendor/rector/rector/rules/Naming/RectorNamingInflector.php index f2f481588..735ee4459 100644 --- a/vendor/rector/rector/rules/Naming/RectorNamingInflector.php +++ b/vendor/rector/rector/rules/Naming/RectorNamingInflector.php @@ -3,15 +3,14 @@ declare (strict_types=1); namespace Rector\Naming; -use RectorPrefix202411\Doctrine\Inflector\Inflector; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Doctrine\Inflector\Inflector; +use RectorPrefix202506\Nette\Utils\Strings; final class RectorNamingInflector { /** * @readonly - * @var \Doctrine\Inflector\Inflector */ - private $inflector; + private Inflector $inflector; /** * @var string * @see https://regex101.com/r/VqVvke/3 diff --git a/vendor/rector/rector/rules/Naming/RenameGuard/PropertyRenameGuard.php b/vendor/rector/rector/rules/Naming/RenameGuard/PropertyRenameGuard.php index ceacbacb3..12887022a 100644 --- a/vendor/rector/rector/rules/Naming/RenameGuard/PropertyRenameGuard.php +++ b/vendor/rector/rector/rules/Naming/RenameGuard/PropertyRenameGuard.php @@ -12,19 +12,16 @@ final class PropertyRenameGuard { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\Naming\Guard\DateTimeAtNamingConventionGuard */ - private $dateTimeAtNamingConventionGuard; + private DateTimeAtNamingConventionGuard $dateTimeAtNamingConventionGuard; /** * @readonly - * @var \Rector\Naming\Guard\HasMagicGetSetGuard */ - private $hasMagicGetSetGuard; + private HasMagicGetSetGuard $hasMagicGetSetGuard; public function __construct(NodeTypeResolver $nodeTypeResolver, DateTimeAtNamingConventionGuard $dateTimeAtNamingConventionGuard, HasMagicGetSetGuard $hasMagicGetSetGuard) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/rules/Naming/ValueObject/ExpectedName.php b/vendor/rector/rector/rules/Naming/ValueObject/ExpectedName.php index 47bb8ff60..013bffddc 100644 --- a/vendor/rector/rector/rules/Naming/ValueObject/ExpectedName.php +++ b/vendor/rector/rector/rules/Naming/ValueObject/ExpectedName.php @@ -7,14 +7,12 @@ final class ExpectedName { /** * @readonly - * @var string */ - private $name; + private string $name; /** * @readonly - * @var string */ - private $singularized; + private string $singularized; public function __construct(string $name, string $singularized) { $this->name = $name; diff --git a/vendor/rector/rector/rules/Naming/ValueObject/ParamRename.php b/vendor/rector/rector/rules/Naming/ValueObject/ParamRename.php index 1392dcb1a..be5970294 100644 --- a/vendor/rector/rector/rules/Naming/ValueObject/ParamRename.php +++ b/vendor/rector/rector/rules/Naming/ValueObject/ParamRename.php @@ -9,24 +9,20 @@ final class ParamRename { /** * @readonly - * @var string */ - private $currentName; + private string $currentName; /** * @readonly - * @var string */ - private $expectedName; + private string $expectedName; /** * @readonly - * @var \PhpParser\Node\Expr\Variable */ - private $variable; + private Variable $variable; /** * @readonly - * @var \PhpParser\Node\FunctionLike */ - private $functionLike; + private FunctionLike $functionLike; public function __construct(string $currentName, string $expectedName, Variable $variable, FunctionLike $functionLike) { $this->currentName = $currentName; diff --git a/vendor/rector/rector/rules/Naming/ValueObject/PropertyRename.php b/vendor/rector/rector/rules/Naming/ValueObject/PropertyRename.php index ff0cc4669..3807b98e7 100644 --- a/vendor/rector/rector/rules/Naming/ValueObject/PropertyRename.php +++ b/vendor/rector/rector/rules/Naming/ValueObject/PropertyRename.php @@ -3,50 +3,44 @@ declare (strict_types=1); namespace Rector\Naming\ValueObject; +use PhpParser\Node\PropertyItem; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; use Rector\Validation\RectorAssert; final class PropertyRename { /** * @readonly - * @var \PhpParser\Node\Stmt\Property */ - private $property; + private Property $property; /** * @readonly - * @var string */ - private $expectedName; + private string $expectedName; /** * @readonly - * @var string */ - private $currentName; + private string $currentName; /** * @readonly - * @var \PhpParser\Node\Stmt\ClassLike */ - private $classLike; + private ClassLike $classLike; /** * @readonly - * @var string */ - private $classLikeName; + private string $classLikeName; /** * @readonly - * @var \PhpParser\Node\Stmt\PropertyProperty */ - private $propertyProperty; - public function __construct(Property $property, string $expectedName, string $currentName, ClassLike $classLike, string $classLikeName, PropertyProperty $propertyProperty) + private PropertyItem $propertyItem; + public function __construct(Property $property, string $expectedName, string $currentName, ClassLike $classLike, string $classLikeName, PropertyItem $propertyItem) { $this->property = $property; $this->expectedName = $expectedName; $this->currentName = $currentName; $this->classLike = $classLike; $this->classLikeName = $classLikeName; - $this->propertyProperty = $propertyProperty; + $this->propertyItem = $propertyItem; // name must be valid RectorAssert::propertyName($currentName); RectorAssert::propertyName($expectedName); @@ -79,8 +73,8 @@ public function getClassLikeName() : string { return $this->classLikeName; } - public function getPropertyProperty() : PropertyProperty + public function getPropertyProperty() : PropertyItem { - return $this->propertyProperty; + return $this->propertyItem; } } diff --git a/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallAssign.php b/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallAssign.php index 554c1b0a0..ea7d83a30 100644 --- a/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallAssign.php +++ b/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallAssign.php @@ -15,9 +15,8 @@ final class VariableAndCallAssign { /** * @readonly - * @var \PhpParser\Node\Expr\Variable */ - private $variable; + private Variable $variable; /** * @readonly * @var \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall @@ -25,14 +24,12 @@ final class VariableAndCallAssign private $expr; /** * @readonly - * @var \PhpParser\Node\Expr\Assign */ - private $assign; + private Assign $assign; /** * @readonly - * @var string */ - private $variableName; + private string $variableName; /** * @readonly * @var \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure diff --git a/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallForeach.php b/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallForeach.php index 7b9719904..cd4785a0b 100644 --- a/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallForeach.php +++ b/vendor/rector/rector/rules/Naming/ValueObject/VariableAndCallForeach.php @@ -14,9 +14,8 @@ final class VariableAndCallForeach { /** * @readonly - * @var \PhpParser\Node\Expr\Variable */ - private $variable; + private Variable $variable; /** * @readonly * @var \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall @@ -24,9 +23,8 @@ final class VariableAndCallForeach private $expr; /** * @readonly - * @var string */ - private $variableName; + private string $variableName; /** * @readonly * @var \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure diff --git a/vendor/rector/rector/rules/Naming/ValueObjectFactory/ParamRenameFactory.php b/vendor/rector/rector/rules/Naming/ValueObjectFactory/ParamRenameFactory.php index f45ebc345..7593f3f84 100644 --- a/vendor/rector/rector/rules/Naming/ValueObjectFactory/ParamRenameFactory.php +++ b/vendor/rector/rector/rules/Naming/ValueObjectFactory/ParamRenameFactory.php @@ -12,9 +12,8 @@ final class ParamRenameFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php b/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php index eb196e616..0bf71645a 100644 --- a/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php +++ b/vendor/rector/rector/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php @@ -3,28 +3,27 @@ declare (strict_types=1); namespace Rector\Naming\ValueObjectFactory; -use PhpParser\Node\Stmt\ClassLike; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Property; use Rector\Naming\ValueObject\PropertyRename; use Rector\NodeNameResolver\NodeNameResolver; -use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202506\Webmozart\Assert\InvalidArgumentException; final class PropertyRenameFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; } - public function createFromExpectedName(ClassLike $classLike, Property $property, string $expectedName) : ?PropertyRename + public function createFromExpectedName(Class_ $class, Property $property, string $expectedName) : ?PropertyRename { $currentName = $this->nodeNameResolver->getName($property); - $className = (string) $this->nodeNameResolver->getName($classLike); + $className = (string) $this->nodeNameResolver->getName($class); try { - return new PropertyRename($property, $expectedName, $currentName, $classLike, $className, $property->props[0]); + return new PropertyRename($property, $expectedName, $currentName, $class, $className, $property->props[0]); } catch (InvalidArgumentException $exception) { } return null; diff --git a/vendor/rector/rector/rules/Naming/VariableRenamer.php b/vendor/rector/rector/rules/Naming/VariableRenamer.php index 10b761abc..723d20993 100644 --- a/vendor/rector/rector/rules/Naming/VariableRenamer.php +++ b/vendor/rector/rector/rules/Naming/VariableRenamer.php @@ -9,7 +9,7 @@ use PhpParser\Node\FunctionLike; use PhpParser\Node\Param; use PhpParser\Node\Stmt; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\MutatingScope; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; @@ -21,24 +21,20 @@ final class VariableRenamer { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Naming\PhpDoc\VarTagValueNodeRenamer */ - private $varTagValueNodeRenamer; + private VarTagValueNodeRenamer $varTagValueNodeRenamer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, VarTagValueNodeRenamer $varTagValueNodeRenamer, PhpDocInfoFactory $phpDocInfoFactory) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -58,7 +54,7 @@ public function renameVariableInFunctionLike(FunctionLike $functionLike, string $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $functionLike->getStmts(), function (Node $node) use($oldName, $expectedName, $assign, &$isRenamingActive, &$hasRenamed, &$currentStmt, &$currentFunctionLike) { // skip param names if ($node instanceof Param) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($assign instanceof Assign && $node === $assign) { $isRenamingActive = \true; diff --git a/vendor/rector/rector/rules/NetteUtils/Rector/StaticCall/UtilsJsonStaticCallNamedArgRector.php b/vendor/rector/rector/rules/NetteUtils/Rector/StaticCall/UtilsJsonStaticCallNamedArgRector.php new file mode 100644 index 000000000..8a873d0d3 --- /dev/null +++ b/vendor/rector/rector/rules/NetteUtils/Rector/StaticCall/UtilsJsonStaticCallNamedArgRector.php @@ -0,0 +1,70 @@ +isName($node->class, 'Nette\\Utils\\Json')) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + if (\count($node->getArgs()) < 2) { + return null; + } + if (!$this->isNames($node->name, ['encode', 'decode'])) { + return null; + } + // flip 2nd arg from true/false to named arg + // check if 2nd arg is named arg already + $secondArg = $node->getArgs()[1]; + // already set → skip + if ($secondArg->name instanceof Identifier) { + return null; + } + if ($this->isName($node->name, 'encode')) { + $secondArg->name = new Identifier('pretty'); + return $node; + } + $secondArg->name = new Identifier('forceArrays'); + return $node; + } +} diff --git a/vendor/rector/rector/rules/Php52/Rector/Property/VarToPublicPropertyRector.php b/vendor/rector/rector/rules/Php52/Rector/Property/VarToPublicPropertyRector.php index 73fd47d53..64727ee55 100644 --- a/vendor/rector/rector/rules/Php52/Rector/Property/VarToPublicPropertyRector.php +++ b/vendor/rector/rector/rules/Php52/Rector/Property/VarToPublicPropertyRector.php @@ -18,9 +18,8 @@ final class VarToPublicPropertyRector extends AbstractRector implements MinPhpVe { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; public function __construct(VisibilityManipulator $visibilityManipulator) { $this->visibilityManipulator = $visibilityManipulator; diff --git a/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php b/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php index 77587601b..065157696 100644 --- a/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php +++ b/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php @@ -7,7 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Break_; use PhpParser\Node\Stmt\Class_; @@ -18,9 +18,8 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Switch_; use PhpParser\Node\Stmt\While_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\Constant\ConstantIntegerType; -use PHPStan\Type\ConstantType; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; @@ -35,13 +34,9 @@ final class ContinueToBreakInSwitchRector extends AbstractRector implements MinP { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - /** - * @var bool - */ - private $hasChanged = \false; + private ValueResolver $valueResolver; + private bool $hasChanged = \false; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; @@ -52,7 +47,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Use break instead of continue in switch statements', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Use `break` instead of `continue` in switch statements', [new CodeSample(<<<'CODE_SAMPLE' function some_run($value) { switch ($value) { @@ -108,11 +103,11 @@ private function processContinueStatement($stmt) : void { $this->traverseNodesWithCallable($stmt, function (Node $subNode) { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } // continue is belong to loop if ($subNode instanceof Foreach_ || $subNode instanceof While_ || $subNode instanceof Do_ || $subNode instanceof For_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Continue_) { return null; @@ -121,7 +116,7 @@ private function processContinueStatement($stmt) : void $this->hasChanged = \true; return new Break_(); } - if ($subNode->num instanceof LNumber) { + if ($subNode->num instanceof Int_) { $continueNumber = $this->valueResolver->getValue($subNode->num); if ($continueNumber <= 1) { $this->hasChanged = \true; @@ -143,7 +138,7 @@ private function processContinueStatement($stmt) : void private function processVariableNum(Continue_ $continue, Variable $numVariable) { $staticType = $this->getType($numVariable); - if (!$staticType instanceof ConstantType) { + if (!$staticType->isConstantValue()->yes()) { return $continue; } if (!$staticType instanceof ConstantIntegerType) { diff --git a/vendor/rector/rector/rules/Php53/Rector/FuncCall/DirNameFileConstantToDirConstantRector.php b/vendor/rector/rector/rules/Php53/Rector/FuncCall/DirNameFileConstantToDirConstantRector.php index 7b49ba28f..c86c615cf 100644 --- a/vendor/rector/rector/rules/Php53/Rector/FuncCall/DirNameFileConstantToDirConstantRector.php +++ b/vendor/rector/rector/rules/Php53/Rector/FuncCall/DirNameFileConstantToDirConstantRector.php @@ -19,7 +19,7 @@ final class DirNameFileConstantToDirConstantRector extends AbstractRector implem { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Convert dirname(__FILE__) to __DIR__', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Convert `dirname(__FILE__)` to `__DIR__`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/Php53/Rector/Ternary/TernaryToElvisRector.php b/vendor/rector/rector/rules/Php53/Rector/Ternary/TernaryToElvisRector.php index 03a70e716..fa7ee21db 100644 --- a/vendor/rector/rector/rules/Php53/Rector/Ternary/TernaryToElvisRector.php +++ b/vendor/rector/rector/rules/Php53/Rector/Ternary/TernaryToElvisRector.php @@ -4,6 +4,7 @@ namespace Rector\Php53\Rector\Ternary; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Ternary; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; @@ -18,7 +19,7 @@ final class TernaryToElvisRector extends AbstractRector implements MinPhpVersion { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Use ?: instead of ?, where useful', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Use `?:` instead of `?`, where useful', [new CodeSample(<<<'CODE_SAMPLE' function elvis() { $value = $a ? $a : false; @@ -48,6 +49,11 @@ public function refactor(Node $node) : ?Node return null; } $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + /** @var Expr $nodeIf */ + $nodeIf = $node->if; + if ($node->else instanceof Ternary && $this->isParenthesized($nodeIf, $node->else)) { + $node->else->setAttribute(AttributeKey::WRAPPED_IN_PARENTHESES, \true); + } $node->if = null; return $node; } @@ -55,4 +61,23 @@ public function provideMinPhpVersion() : int { return PhpVersionFeature::ELVIS_OPERATOR; } + private function isParenthesized(Expr $ifExpr, Expr $elseExpr) : bool + { + $tokens = $this->file->getOldTokens(); + $ifExprTokenEnd = $ifExpr->getEndTokenPos(); + $elseExprTokenStart = $elseExpr->getStartTokenPos(); + if ($ifExprTokenEnd < 0 || $elseExprTokenStart < 0 || $elseExprTokenStart <= $ifExprTokenEnd) { + return \false; + } + while (isset($tokens[$ifExprTokenEnd])) { + ++$ifExprTokenEnd; + if ($elseExprTokenStart === $ifExprTokenEnd) { + break; + } + if ((string) $tokens[$ifExprTokenEnd] === '(') { + return \true; + } + } + return \false; + } } diff --git a/vendor/rector/rector/rules/Php54/Rector/Array_/LongArrayToShortArrayRector.php b/vendor/rector/rector/rules/Php54/Rector/Array_/LongArrayToShortArrayRector.php index 4290bb49a..0aa26ba1d 100644 --- a/vendor/rector/rector/rules/Php54/Rector/Array_/LongArrayToShortArrayRector.php +++ b/vendor/rector/rector/rules/Php54/Rector/Array_/LongArrayToShortArrayRector.php @@ -62,8 +62,30 @@ public function refactor(Node $node) : ?Node if ($node->getAttribute(AttributeKey::KIND) === Array_::KIND_SHORT) { return null; } - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); $node->setAttribute(AttributeKey::KIND, Array_::KIND_SHORT); + $tokens = $this->file->getOldTokens(); + $startTokenPos = $node->getStartTokenPos(); + $endTokenPos = $node->getEndTokenPos(); + if (!isset($tokens[$startTokenPos], $tokens[$endTokenPos])) { + return null; + } + // replace array opening + $tokens[$startTokenPos]->text = ''; + $iteration = 1; + while (isset($tokens[$startTokenPos + $iteration])) { + if (\trim($tokens[$startTokenPos + $iteration]->text) === '') { + ++$iteration; + continue; + } + if (\trim($tokens[$startTokenPos + $iteration]->text) !== '(') { + break; + } + // replace ( parentheses opening + $tokens[$startTokenPos + $iteration]->text = '['; + // replace ) parentheses closing + $tokens[$endTokenPos]->text = ']'; + break; + } return $node; } } diff --git a/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php b/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php index 934678123..3ef784340 100644 --- a/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php +++ b/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php @@ -6,11 +6,10 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt\Break_; use PhpParser\Node\Stmt\Continue_; use PHPStan\Type\Constant\ConstantIntegerType; -use PHPStan\Type\ConstantType; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; @@ -24,9 +23,8 @@ final class RemoveZeroBreakContinueRector extends AbstractRector implements MinP { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; @@ -84,7 +82,7 @@ public function refactor(Node $node) : ?Node if (!$node->num instanceof Expr) { return null; } - if ($node->num instanceof LNumber) { + if ($node->num instanceof Int_) { $number = $this->valueResolver->getValue($node->num); if ($number > 1) { return null; @@ -106,14 +104,14 @@ public function refactor(Node $node) : ?Node private function processVariableNum($stmt, Variable $numVariable) : ?Node { $staticType = $this->getType($numVariable); - if ($staticType instanceof ConstantType) { + if ($staticType->isConstantValue()->yes()) { if ($staticType instanceof ConstantIntegerType) { if ($staticType->getValue() === 0) { $stmt->num = null; return $stmt; } if ($staticType->getValue() > 0) { - $stmt->num = new LNumber($staticType->getValue()); + $stmt->num = new Int_($staticType->getValue()); return $stmt; } } diff --git a/vendor/rector/rector/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php b/vendor/rector/rector/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php index cb0a5580a..22dae1af7 100644 --- a/vendor/rector/rector/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php +++ b/vendor/rector/rector/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php @@ -24,7 +24,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Remove & from function and method calls', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove `&` from function and method calls', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function run($one) diff --git a/vendor/rector/rector/rules/Php55/Rector/Class_/ClassConstantToSelfClassRector.php b/vendor/rector/rector/rules/Php55/Rector/Class_/ClassConstantToSelfClassRector.php index a0aa20274..f46d1d0ea 100644 --- a/vendor/rector/rector/rules/Php55/Rector/Class_/ClassConstantToSelfClassRector.php +++ b/vendor/rector/rector/rules/Php55/Rector/Class_/ClassConstantToSelfClassRector.php @@ -18,7 +18,7 @@ final class ClassConstantToSelfClassRector extends AbstractRector implements Min { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change `__CLASS__` to self::class', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `__CLASS__` to `self::class`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function callOnMe() diff --git a/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToSelfClassRector.php b/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToSelfClassRector.php index d0293b2ea..bb7fdf778 100644 --- a/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToSelfClassRector.php +++ b/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToSelfClassRector.php @@ -21,16 +21,15 @@ final class GetCalledClassToSelfClassRector extends AbstractRector implements Mi { /** * @readonly - * @var \Rector\Reflection\ClassModifierChecker */ - private $classModifierChecker; + private ClassModifierChecker $classModifierChecker; public function __construct(ClassModifierChecker $classModifierChecker) { $this->classModifierChecker = $classModifierChecker; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change get_called_class() to self::class on final class', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `get_called_class()` to `self::class` on final class', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function callOnMe() diff --git a/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToStaticClassRector.php b/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToStaticClassRector.php index ed176ff2c..794cd2ddb 100644 --- a/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToStaticClassRector.php +++ b/vendor/rector/rector/rules/Php55/Rector/FuncCall/GetCalledClassToStaticClassRector.php @@ -5,9 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; -use PHPStan\Analyser\Scope; use Rector\Enum\ObjectReference; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -15,11 +15,11 @@ /** * @see \Rector\Tests\Php55\Rector\FuncCall\GetCalledClassToStaticClassRector\GetCalledClassToStaticClassRectorTest */ -final class GetCalledClassToStaticClassRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class GetCalledClassToStaticClassRector extends AbstractRector implements MinPhpVersionInterface { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change get_called_class() to static::class on non-final class', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `get_called_class()` to `static::class` on non-final class', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function callOnMe() @@ -49,8 +49,9 @@ public function getNodeTypes() : array /** * @param FuncCall $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if (!$this->isName($node, 'get_called_class')) { return null; } diff --git a/vendor/rector/rector/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php b/vendor/rector/rector/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php index dabac98d9..100d032f4 100644 --- a/vendor/rector/rector/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php +++ b/vendor/rector/rector/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php @@ -23,14 +23,12 @@ final class PregReplaceEModifierRector extends AbstractRector implements MinPhpV { /** * @readonly - * @var \Rector\Php72\NodeFactory\AnonymousFunctionFactory */ - private $anonymousFunctionFactory; + private AnonymousFunctionFactory $anonymousFunctionFactory; /** * @readonly - * @var \Rector\Php55\RegexMatcher */ - private $regexMatcher; + private RegexMatcher $regexMatcher; public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory, RegexMatcher $regexMatcher) { $this->anonymousFunctionFactory = $anonymousFunctionFactory; diff --git a/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php b/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php index c8b379d12..c00d97766 100644 --- a/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php +++ b/vendor/rector/rector/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php @@ -10,7 +10,7 @@ use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassConst; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ReflectionProvider; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Rector\AbstractRector; @@ -18,7 +18,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php55\Rector\String_\StringClassNameToClassConstantRector\StringClassNameToClassConstantRectorTest */ @@ -26,9 +26,8 @@ final class StringClassNameToClassConstantRector extends AbstractRector implemen { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var string */ @@ -40,18 +39,15 @@ final class StringClassNameToClassConstantRector extends AbstractRector implemen /** * @var string[] */ - private $classesToSkip = []; - /** - * @var bool - */ - private $shouldKeepPreslash = \false; + private array $classesToSkip = []; + private bool $shouldKeepPreslash = \false; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replace string class names by ::class constant', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace string class names by `::class` constant', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class AnotherClass { } @@ -100,7 +96,7 @@ public function refactor(Node $node) // keep allowed string as condition if ($node instanceof FuncCall) { if ($this->isName($node, 'is_a')) { - return NodeTraverser::DONT_TRAVERSE_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CHILDREN; } return null; } diff --git a/vendor/rector/rector/rules/Php55/RegexMatcher.php b/vendor/rector/rector/rules/Php55/RegexMatcher.php index cafecbc36..06777b3c1 100644 --- a/vendor/rector/rector/rules/Php55/RegexMatcher.php +++ b/vendor/rector/rector/rules/Php55/RegexMatcher.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php55; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Scalar\String_; diff --git a/vendor/rector/rector/rules/Php56/Rector/FuncCall/PowToExpRector.php b/vendor/rector/rector/rules/Php56/Rector/FuncCall/PowToExpRector.php index b214812ac..f2da59357 100644 --- a/vendor/rector/rector/rules/Php56/Rector/FuncCall/PowToExpRector.php +++ b/vendor/rector/rector/rules/Php56/Rector/FuncCall/PowToExpRector.php @@ -18,7 +18,7 @@ final class PowToExpRector extends AbstractRector implements MinPhpVersionInterf { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Changes pow(val, val2) to ** (exp) parameter', [new CodeSample('pow(1, 2);', '1**2;')]); + return new RuleDefinition('Changes `pow(val, val2)` to `**` (exp) parameter', [new CodeSample('pow(1, 2);', '1**2;')]); } /** * @return array> diff --git a/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php b/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php index d95a2c9d1..a3e27897b 100644 --- a/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php +++ b/vendor/rector/rector/rules/Php70/EregToPcreTransformer.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php70; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\Php70\Exception\InvalidEregException; /** * @changelog https://gist.github.com/lifthrasiir/704754/7e486f43e62fd1c9d3669330c251f8ca4a59a3f8 @@ -14,9 +14,8 @@ final class EregToPcreTransformer { /** * @readonly - * @var string */ - private $pcreDelimiter = '#'; + private string $pcreDelimiter = '#'; /** * @var array */ @@ -54,13 +53,13 @@ final class EregToPcreTransformer /** * @var array */ - private $icache = []; + private array $icache = []; /** * @var array */ - private $cache = []; + private array $cache = []; /** - * Change this via services configuratoin in rector.php if you need it + * Change this via services configuration in rector.php if you need it * Single type is chosen to prevent every regular with different delimiter. */ public function __construct(string $pcreDelimiter = '#') diff --git a/vendor/rector/rector/rules/Php70/NodeAnalyzer/BattleshipTernaryAnalyzer.php b/vendor/rector/rector/rules/Php70/NodeAnalyzer/BattleshipTernaryAnalyzer.php index bd1440f29..1cd1e571f 100644 --- a/vendor/rector/rector/rules/Php70/NodeAnalyzer/BattleshipTernaryAnalyzer.php +++ b/vendor/rector/rector/rules/Php70/NodeAnalyzer/BattleshipTernaryAnalyzer.php @@ -15,14 +15,12 @@ final class BattleshipTernaryAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(NodeComparator $nodeComparator, ValueResolver $valueResolver) { $this->nodeComparator = $nodeComparator; diff --git a/vendor/rector/rector/rules/Php70/Rector/Assign/ListSwapArrayOrderRector.php b/vendor/rector/rector/rules/Php70/Rector/Assign/ListSwapArrayOrderRector.php index 137558708..3bfbd7936 100644 --- a/vendor/rector/rector/rules/Php70/Rector/Assign/ListSwapArrayOrderRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/Assign/ListSwapArrayOrderRector.php @@ -4,9 +4,9 @@ namespace Rector\Php70\Rector\Assign; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrayDimFetch; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\List_; @@ -23,9 +23,8 @@ final class ListSwapArrayOrderRector extends AbstractRector implements MinPhpVer { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; public function __construct(BetterStandardPrinter $betterStandardPrinter) { $this->betterStandardPrinter = $betterStandardPrinter; diff --git a/vendor/rector/rector/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php b/vendor/rector/rector/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php index 6a4fd4d76..867db954d 100644 --- a/vendor/rector/rector/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php @@ -10,7 +10,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeNestingScope\ContextAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; @@ -24,9 +24,8 @@ final class BreakNotInLoopOrSwitchToReturnRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\NodeNestingScope\ContextAnalyzer */ - private $contextAnalyzer; + private ContextAnalyzer $contextAnalyzer; /** * @var string */ @@ -85,7 +84,7 @@ public function refactor(Node $node) if ($node instanceof Switch_) { $this->traverseNodesWithCallable($node->cases, static function (Node $subNode) : ?int { if ($subNode instanceof Class_ || $subNode instanceof FunctionLike && !$subNode instanceof ArrowFunction) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Break_) { return null; @@ -104,6 +103,6 @@ public function refactor(Node $node) if ($this->contextAnalyzer->isInIf($node)) { return new Return_(); } - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } } diff --git a/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php b/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php index 9df393c1f..460c2afc3 100644 --- a/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; use PhpParser\Node\Name; +use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; @@ -18,7 +19,8 @@ use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php70\NodeAnalyzer\Php4ConstructorClassMethodAnalyzer; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\ValueObject\MethodName; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -27,18 +29,16 @@ /** * @see \Rector\Tests\Php70\Rector\ClassMethod\Php4ConstructorRector\Php4ConstructorRectorTest */ -final class Php4ConstructorRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class Php4ConstructorRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\Php70\NodeAnalyzer\Php4ConstructorClassMethodAnalyzer */ - private $php4ConstructorClassMethodAnalyzer; + private Php4ConstructorClassMethodAnalyzer $php4ConstructorClassMethodAnalyzer; /** * @readonly - * @var \Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver */ - private $parentClassScopeResolver; + private ParentClassScopeResolver $parentClassScopeResolver; public function __construct(Php4ConstructorClassMethodAnalyzer $php4ConstructorClassMethodAnalyzer, ParentClassScopeResolver $parentClassScopeResolver) { $this->php4ConstructorClassMethodAnalyzer = $php4ConstructorClassMethodAnalyzer; @@ -77,9 +77,8 @@ public function getNodeTypes() : array } /** * @param Class_ $node - * @return \PhpParser\Node\Stmt\Class_|int|null */ - public function refactorWithScope(Node $node, Scope $scope) + public function refactor(Node $node) : ?\PhpParser\Node\Stmt\Class_ { $className = $this->getName($node); if (!\is_string($className)) { @@ -89,6 +88,7 @@ public function refactorWithScope(Node $node, Scope $scope) if (!$psr4ConstructorMethod instanceof ClassMethod) { return null; } + $scope = ScopeFetcher::fetch($node); if (!$this->php4ConstructorClassMethodAnalyzer->detect($psr4ConstructorMethod, $scope)) { return null; } @@ -99,22 +99,27 @@ public function refactorWithScope(Node $node, Scope $scope) // process parent call references first $this->processClassMethodStatementsForParentConstructorCalls($psr4ConstructorMethod, $scope); // does it already have a __construct method? - if (!$classReflection->hasNativeMethod(MethodName::CONSTRUCT)) { + if (!$node->getMethod(MethodName::CONSTRUCT) instanceof ClassMethod) { $psr4ConstructorMethod->name = new Identifier(MethodName::CONSTRUCT); } $classMethodStmts = $psr4ConstructorMethod->stmts; if ($classMethodStmts === null) { return null; } - if (\count($classMethodStmts) === 1) { - $stmt = $psr4ConstructorMethod->stmts[0]; - if (!$stmt instanceof Expression) { + $parentClassName = $classReflection->getParentClass() instanceof ClassReflection ? $classReflection->getParentClass()->getName() : ''; + foreach ($classMethodStmts as $classMethodStmt) { + if (!$classMethodStmt instanceof Expression) { return null; } - if ($this->isLocalMethodCallNamed($stmt->expr, MethodName::CONSTRUCT)) { + if ($this->isLocalMethodCallNamed($classMethodStmt->expr, MethodName::CONSTRUCT)) { $stmtKey = $psr4ConstructorMethod->getAttribute(AttributeKey::STMT_KEY); unset($node->stmts[$stmtKey]); } + if ($this->isLocalMethodCallNamed($classMethodStmt->expr, $parentClassName) && !$node->getMethod($parentClassName) instanceof ClassMethod) { + /** @var MethodCall $expr */ + $expr = $classMethodStmt->expr; + $classMethodStmt->expr = new StaticCall(new FullyQualified($parentClassName), new Identifier(MethodName::CONSTRUCT), $expr->args); + } } return $node; } diff --git a/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php b/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php index ae226dbf7..fffba674c 100644 --- a/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php @@ -13,7 +13,7 @@ use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\Php70\EregToPcreTransformer; use Rector\Rector\AbstractRector; @@ -21,7 +21,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php70\Rector\FuncCall\EregToPregMatchRector\EregToPregMatchRectorTest */ @@ -29,9 +29,8 @@ final class EregToPregMatchRector extends AbstractRector implements MinPhpVersio { /** * @readonly - * @var \Rector\Php70\EregToPcreTransformer */ - private $eregToPcreTransformer; + private EregToPcreTransformer $eregToPcreTransformer; /** * @var array */ @@ -121,10 +120,10 @@ private function processSplitLimitArgument(FuncCall $funcCall, string $functionN return; } // 3rd argument - $limit, 0 → 1 - if (!$funcCall->args[2]->value instanceof LNumber) { + if (!$funcCall->args[2]->value instanceof Int_) { return; } - /** @var LNumber $limitNumberNode */ + /** @var Int_ $limitNumberNode */ $limitNumberNode = $funcCall->args[2]->value; if ($limitNumberNode->value !== 0) { return; @@ -134,7 +133,7 @@ private function processSplitLimitArgument(FuncCall $funcCall, string $functionN private function createTernaryWithStrlenOfFirstMatch(FuncCall $funcCall) : Ternary { $thirdArg = $funcCall->getArgs()[2]; - $arrayDimFetch = new ArrayDimFetch($thirdArg->value, new LNumber(0)); + $arrayDimFetch = new ArrayDimFetch($thirdArg->value, new Int_(0)); $strlenFuncCall = $this->nodeFactory->createFuncCall('strlen', [$arrayDimFetch]); return new Ternary($funcCall, $strlenFuncCall, $this->nodeFactory->createFalse()); } diff --git a/vendor/rector/rector/rules/Php70/Rector/FuncCall/MultiDirnameRector.php b/vendor/rector/rector/rules/Php70/Rector/FuncCall/MultiDirnameRector.php index 284479eac..85a25d99e 100644 --- a/vendor/rector/rector/rules/Php70/Rector/FuncCall/MultiDirnameRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/FuncCall/MultiDirnameRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -21,10 +21,7 @@ final class MultiDirnameRector extends AbstractRector implements MinPhpVersionIn * @var string */ private const DIRNAME = 'dirname'; - /** - * @var int - */ - private $nestingLevel = 0; + private int $nestingLevel = 0; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes multiple dirname() calls to one with nesting level', [new CodeSample('dirname(dirname($path));', 'dirname($path, 2);')]); @@ -47,15 +44,17 @@ public function refactor(Node $node) : ?Node } $activeFuncCallNode = $node; $lastFuncCallNode = $node; + $shouldUpdate = \false; while (($activeFuncCallNode = $this->matchNestedDirnameFuncCall($activeFuncCallNode)) instanceof FuncCall) { $lastFuncCallNode = $activeFuncCallNode; + $shouldUpdate = \true; } // nothing to improve - if ($this->shouldSkip()) { + if (!$shouldUpdate || $this->shouldSkip()) { return null; } $node->args[0] = $lastFuncCallNode->args[0]; - $node->args[1] = new Arg(new LNumber($this->nestingLevel)); + $node->args[1] = new Arg(new Int_($this->nestingLevel)); return $node; } public function provideMinPhpVersion() : int @@ -80,10 +79,10 @@ private function matchNestedDirnameFuncCall(FuncCall $funcCall) : ?FuncCall } // dirname($path, ); if (\count($args) === 2) { - if (!$args[1]->value instanceof LNumber) { + if (!$args[1]->value instanceof Int_) { return null; } - /** @var LNumber $levelNumber */ + /** @var Int_ $levelNumber */ $levelNumber = $args[1]->value; $this->nestingLevel += $levelNumber->value; } else { diff --git a/vendor/rector/rector/rules/Php70/Rector/FuncCall/RandomFunctionRector.php b/vendor/rector/rector/rules/Php70/Rector/FuncCall/RandomFunctionRector.php index b984924f5..6039f089c 100644 --- a/vendor/rector/rector/rules/Php70/Rector/FuncCall/RandomFunctionRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/FuncCall/RandomFunctionRector.php @@ -7,7 +7,7 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; @@ -21,9 +21,8 @@ final class RandomFunctionRector extends AbstractRector implements MinPhpVersion { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var array */ @@ -58,7 +57,7 @@ public function refactor(Node $node) : ?\PhpParser\Node\Expr\FuncCall if ($newFunctionName === 'random_int') { $args = $node->getArgs(); if ($args === []) { - $node->args[0] = new Arg(new LNumber(0)); + $node->args[0] = new Arg(new Int_(0)); $node->args[1] = new Arg($this->nodeFactory->createFuncCall('mt_getrandmax')); } elseif (\count($args) === 2) { $minValue = $this->valueResolver->getValue($args[0]->value); diff --git a/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php b/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php index de23455e0..c39c50b98 100644 --- a/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php @@ -29,14 +29,12 @@ final class IfToSpaceshipRector extends AbstractRector implements MinPhpVersionI { /** * @readonly - * @var \Rector\Php70\NodeAnalyzer\BattleshipTernaryAnalyzer */ - private $battleshipTernaryAnalyzer; + private BattleshipTernaryAnalyzer $battleshipTernaryAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(BattleshipTernaryAnalyzer $battleshipTernaryAnalyzer, ValueResolver $valueResolver) { $this->battleshipTernaryAnalyzer = $battleshipTernaryAnalyzer; @@ -85,7 +83,7 @@ public function refactor(Node $node) : ?Node if (!$stmt->expr instanceof Ternary) { continue; } - // preceeded by if + // preceded by if $prevStmt = $node->stmts[$key - 1] ?? null; if (!$prevStmt instanceof If_) { continue; diff --git a/vendor/rector/rector/rules/Php70/Rector/List_/EmptyListRector.php b/vendor/rector/rector/rules/Php70/Rector/List_/EmptyListRector.php index b906c0087..9070cbb0f 100644 --- a/vendor/rector/rector/rules/Php70/Rector/List_/EmptyListRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/List_/EmptyListRector.php @@ -4,7 +4,7 @@ namespace Rector\Php70\Rector\List_; use PhpParser\Node; -use PhpParser\Node\Expr\ArrayItem; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\List_; use PhpParser\Node\Expr\Variable; use Rector\Rector\AbstractRector; diff --git a/vendor/rector/rector/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php b/vendor/rector/rector/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php index 491a2a36d..64f2cb9d0 100644 --- a/vendor/rector/rector/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php @@ -8,15 +8,15 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Stmt\Class_; -use PhpParser\NodeTraverser; -use PHPStan\Analyser\Scope; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\Php\PhpMethodReflection; use Rector\Enum\ObjectReference; use Rector\NodeCollector\StaticAnalyzer; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -25,22 +25,17 @@ /** * @see \Rector\Tests\Php70\Rector\MethodCall\ThisCallOnStaticMethodToStaticCallRector\ThisCallOnStaticMethodToStaticCallRectorTest */ -final class ThisCallOnStaticMethodToStaticCallRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ThisCallOnStaticMethodToStaticCallRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeCollector\StaticAnalyzer */ - private $staticAnalyzer; + private StaticAnalyzer $staticAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; - /** - * @var bool - */ - private $hasChanged = \false; + private ReflectionResolver $reflectionResolver; + private bool $hasChanged = \false; public function __construct(StaticAnalyzer $staticAnalyzer, ReflectionResolver $reflectionResolver) { $this->staticAnalyzer = $staticAnalyzer; @@ -90,14 +85,15 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if (!$scope->isInClass()) { return null; } $classReflection = $scope->getClassReflection(); // skip PHPUnit calls, as they accept both self:: and $this-> formats - if ($classReflection->isSubclassOf('PHPUnit\\Framework\\TestCase')) { + if ($classReflection->is('PHPUnit\\Framework\\TestCase')) { return null; } $this->hasChanged = \false; @@ -110,8 +106,8 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node private function processThisToStatic(Class_ $class, ClassReflection $classReflection) : void { $this->traverseNodesWithCallable($class, function (Node $subNode) use($class, $classReflection) { - if ($subNode instanceof Encapsed) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + if ($subNode instanceof InterpolatedString) { + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof MethodCall) { return null; @@ -119,7 +115,7 @@ private function processThisToStatic(Class_ $class, ClassReflection $classReflec if (!$subNode->var instanceof Variable) { return null; } - if (!$this->nodeNameResolver->isName($subNode->var, 'this')) { + if (!$this->isName($subNode->var, 'this')) { return null; } if (!$subNode->name instanceof Identifier) { diff --git a/vendor/rector/rector/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php b/vendor/rector/rector/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php index f296aef61..fe38cd66a 100644 --- a/vendor/rector/rector/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php @@ -18,7 +18,8 @@ use Rector\Enum\ObjectReference; use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver; use Rector\NodeCollector\StaticAnalyzer; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -28,28 +29,24 @@ /** * @see \Rector\Tests\Php70\Rector\StaticCall\StaticCallOnNonStaticToInstanceCallRector\StaticCallOnNonStaticToInstanceCallRectorTest */ -final class StaticCallOnNonStaticToInstanceCallRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class StaticCallOnNonStaticToInstanceCallRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeCollector\StaticAnalyzer */ - private $staticAnalyzer; + private StaticAnalyzer $staticAnalyzer; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver */ - private $parentClassScopeResolver; + private ParentClassScopeResolver $parentClassScopeResolver; public function __construct(StaticAnalyzer $staticAnalyzer, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, ParentClassScopeResolver $parentClassScopeResolver) { $this->staticAnalyzer = $staticAnalyzer; @@ -107,8 +104,9 @@ public function getNodeTypes() : array /** * @param StaticCall $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($node->name instanceof Expr) { return null; } @@ -160,7 +158,7 @@ private function shouldSkip(string $methodName, string $className, StaticCall $s return \true; } $reflection = $scope->getClassReflection(); - if ($reflection instanceof ClassReflection && $reflection->isSubclassOf($className)) { + if ($reflection instanceof ClassReflection && $reflection->is($className)) { return \true; } $className = $this->getName($staticCall->class); diff --git a/vendor/rector/rector/rules/Php70/Rector/StmtsAwareInterface/IfIssetToCoalescingRector.php b/vendor/rector/rector/rules/Php70/Rector/StmtsAwareInterface/IfIssetToCoalescingRector.php index 1dfc8f0e0..7d851ddcb 100644 --- a/vendor/rector/rector/rules/Php70/Rector/StmtsAwareInterface/IfIssetToCoalescingRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/StmtsAwareInterface/IfIssetToCoalescingRector.php @@ -24,7 +24,7 @@ final class IfIssetToCoalescingRector extends AbstractRector implements MinPhpVe { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change if with isset and return to coalesce', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `if` with `isset` and `return` to coalesce', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { private $items = []; diff --git a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php index 7322c30e3..82d5661de 100644 --- a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php @@ -23,9 +23,8 @@ final class TernaryToNullCoalescingRector extends AbstractRector implements MinP { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; @@ -84,7 +83,7 @@ private function processTernaryWithIsset(Ternary $ternary, Isset_ $isset) : ?Coa if (!$ternary->if instanceof Expr) { return null; } - if ($isset->vars === null) { + if ($isset->vars === []) { return null; } // none or multiple isset values cannot be handled here diff --git a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php index 7fd239d9e..42570270e 100644 --- a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php @@ -22,9 +22,8 @@ final class TernaryToSpaceshipRector extends AbstractRector implements MinPhpVer { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/Php70/ValueObject/ComparedExprs.php b/vendor/rector/rector/rules/Php70/ValueObject/ComparedExprs.php index 985fa725d..d4ff7b0bb 100644 --- a/vendor/rector/rector/rules/Php70/ValueObject/ComparedExprs.php +++ b/vendor/rector/rector/rules/Php70/ValueObject/ComparedExprs.php @@ -8,14 +8,12 @@ final class ComparedExprs { /** * @readonly - * @var \PhpParser\Node\Expr */ - private $firstExpr; + private Expr $firstExpr; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $secondExpr; + private Expr $secondExpr; public function __construct(Expr $firstExpr, Expr $secondExpr) { $this->firstExpr = $firstExpr; diff --git a/vendor/rector/rector/rules/Php71/IsArrayAndDualCheckToAble.php b/vendor/rector/rector/rules/Php71/IsArrayAndDualCheckToAble.php index 04ec03634..8d0c0d6c1 100644 --- a/vendor/rector/rector/rules/Php71/IsArrayAndDualCheckToAble.php +++ b/vendor/rector/rector/rules/Php71/IsArrayAndDualCheckToAble.php @@ -17,19 +17,16 @@ final class IsArrayAndDualCheckToAble { /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; public function __construct(BinaryOpManipulator $binaryOpManipulator, NodeNameResolver $nodeNameResolver, NodeComparator $nodeComparator) { $this->binaryOpManipulator = $binaryOpManipulator; diff --git a/vendor/rector/rector/rules/Php71/Rector/Assign/AssignArrayToStringRector.php b/vendor/rector/rector/rules/Php71/Rector/Assign/AssignArrayToStringRector.php index 29fc4ae4e..d264c5fe3 100644 --- a/vendor/rector/rector/rules/Php71/Rector/Assign/AssignArrayToStringRector.php +++ b/vendor/rector/rector/rules/Php71/Rector/Assign/AssignArrayToStringRector.php @@ -16,7 +16,7 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\Property; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\UnionType; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\PhpParser\NodeFinder\PropertyFetchFinder; @@ -32,9 +32,8 @@ final class AssignArrayToStringRector extends AbstractRector implements MinPhpVe { /** * @readonly - * @var \Rector\PhpParser\NodeFinder\PropertyFetchFinder */ - private $propertyFetchFinder; + private PropertyFetchFinder $propertyFetchFinder; public function __construct(PropertyFetchFinder $propertyFetchFinder) { $this->propertyFetchFinder = $propertyFetchFinder; @@ -76,7 +75,7 @@ public function refactor(Node $node) : ?Node $hasChanged = \false; $this->traverseNodesWithCallable($node->stmts, function (Node $subNode) use(&$hasChanged, $node) : ?int { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Assign) { $assign = $this->refactorAssign($subNode, $node); @@ -137,7 +136,7 @@ private function findSameNamedVariableAssigns(Variable $variable, $node) : array if ($node->stmts === null) { return []; } - $variableName = $this->nodeNameResolver->getName($variable); + $variableName = $this->getName($variable); if ($variableName === null) { return []; } @@ -148,7 +147,7 @@ private function findSameNamedVariableAssigns(Variable $variable, $node) : array } if ($this->isReAssignedAsArray($node, $variableName, $variable)) { $assignedArrayDimFetches = []; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if (!$node->var instanceof ArrayDimFetch) { return null; diff --git a/vendor/rector/rector/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php b/vendor/rector/rector/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php index 7427b5998..01b5f7bfb 100644 --- a/vendor/rector/rector/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php +++ b/vendor/rector/rector/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php @@ -10,8 +10,8 @@ use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\MagicConst\Line; use PhpParser\Node\Scalar\String_; use PHPStan\Type\Constant\ConstantStringType; @@ -28,9 +28,8 @@ final class BinaryOpBetweenNumberAndStringRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; @@ -88,11 +87,11 @@ public function refactor(Node $node) : ?Node return null; } if ($this->isStringOrStaticNonNumericString($node->left) && $this->nodeTypeResolver->isNumberType($node->right)) { - $node->left = $this->nodeTypeResolver->getNativeType($node->right)->isInteger()->yes() ? new LNumber(0) : new DNumber(0); + $node->left = $this->nodeTypeResolver->getNativeType($node->right)->isInteger()->yes() ? new Int_(0) : new Float_(0); return $node; } if ($this->isStringOrStaticNonNumericString($node->right) && $this->nodeTypeResolver->isNumberType($node->left)) { - $node->right = $this->nodeTypeResolver->getNativeType($node->left)->isInteger()->yes() ? new LNumber(0) : new DNumber(0); + $node->right = $this->nodeTypeResolver->getNativeType($node->left)->isInteger()->yes() ? new Int_(0) : new Float_(0); return $node; } return null; diff --git a/vendor/rector/rector/rules/Php71/Rector/BooleanOr/IsIterableRector.php b/vendor/rector/rector/rules/Php71/Rector/BooleanOr/IsIterableRector.php index 569122fee..39343a7b3 100644 --- a/vendor/rector/rector/rules/Php71/Rector/BooleanOr/IsIterableRector.php +++ b/vendor/rector/rector/rules/Php71/Rector/BooleanOr/IsIterableRector.php @@ -21,19 +21,16 @@ final class IsIterableRector extends AbstractRector implements MinPhpVersionInte { /** * @readonly - * @var \Rector\Php71\IsArrayAndDualCheckToAble */ - private $isArrayAndDualCheckToAble; + private IsArrayAndDualCheckToAble $isArrayAndDualCheckToAble; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(IsArrayAndDualCheckToAble $isArrayAndDualCheckToAble, ReflectionProvider $reflectionProvider, PhpVersionProvider $phpVersionProvider) { $this->isArrayAndDualCheckToAble = $isArrayAndDualCheckToAble; diff --git a/vendor/rector/rector/rules/Php71/Rector/ClassConst/PublicConstantVisibilityRector.php b/vendor/rector/rector/rules/Php71/Rector/ClassConst/PublicConstantVisibilityRector.php deleted file mode 100644 index 45e1bbada..000000000 --- a/vendor/rector/rector/rules/Php71/Rector/ClassConst/PublicConstantVisibilityRector.php +++ /dev/null @@ -1,64 +0,0 @@ -visibilityManipulator = $visibilityManipulator; - } - public function getRuleDefinition() : RuleDefinition - { - return new RuleDefinition('Add explicit public constant visibility.', [new CodeSample(<<<'CODE_SAMPLE' -class SomeClass -{ - const HEY = 'you'; -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -class SomeClass -{ - public const HEY = 'you'; -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [ClassConst::class]; - } - /** - * @param ClassConst $node - */ - public function refactor(Node $node) : ?Node - { - return $this->visibilityManipulator->publicize($node); - } - public function provideMinPhpVersion() : int - { - return PhpVersionFeature::CONSTANT_VISIBILITY; - } -} diff --git a/vendor/rector/rector/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php b/vendor/rector/rector/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php index 9e6fed93d..eec90a8d3 100644 --- a/vendor/rector/rector/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php +++ b/vendor/rector/rector/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php @@ -27,14 +27,12 @@ final class RemoveExtraParametersRector extends AbstractRector implements MinPhp { /** * @readonly - * @var \Rector\NodeAnalyzer\VariadicAnalyzer */ - private $variadicAnalyzer; + private VariadicAnalyzer $variadicAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(VariadicAnalyzer $variadicAnalyzer, ReflectionResolver $reflectionResolver) { $this->variadicAnalyzer = $variadicAnalyzer; @@ -140,8 +138,8 @@ private function shouldSkip($call) : bool private function resolveMaximumAllowedParameterCount($functionLikeReflection) : int { $parameterCounts = [0]; - foreach ($functionLikeReflection->getVariants() as $parametersAcceptor) { - $parameterCounts[] = \count($parametersAcceptor->getParameters()); + foreach ($functionLikeReflection->getVariants() as $variant) { + $parameterCounts[] = \count($variant->getParameters()); } return \max($parameterCounts); } diff --git a/vendor/rector/rector/rules/Php71/Rector/List_/ListToArrayDestructRector.php b/vendor/rector/rector/rules/Php71/Rector/List_/ListToArrayDestructRector.php index 5ca94cc3e..6ac203aae 100644 --- a/vendor/rector/rector/rules/Php71/Rector/List_/ListToArrayDestructRector.php +++ b/vendor/rector/rector/rules/Php71/Rector/List_/ListToArrayDestructRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\List_; use PhpParser\Node\Stmt\Foreach_; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -20,7 +21,7 @@ final class ListToArrayDestructRector extends AbstractRector implements MinPhpVe { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change list() to array destruct', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `list()` to array destruct', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() @@ -62,6 +63,9 @@ public function refactor(Node $node) : ?Node if (!$node->var instanceof List_) { return null; } + if ($node->var->getAttribute(AttributeKey::KIND) === List_::KIND_ARRAY) { + return null; + } $list = $node->var; $node->var = new Array_($list->items); return $node; @@ -69,7 +73,16 @@ public function refactor(Node $node) : ?Node if (!$node->valueVar instanceof List_) { return null; } + if ($node->valueVar->getAttribute(AttributeKey::KIND) === List_::KIND_ARRAY) { + return null; + } $list = $node->valueVar; + // all list items must be set + foreach ($list->items as $listItem) { + if ($listItem === null) { + return null; + } + } $node->valueVar = new Array_($list->items); return $node; } diff --git a/vendor/rector/rector/rules/Php71/Rector/TryCatch/MultiExceptionCatchRector.php b/vendor/rector/rector/rules/Php71/Rector/TryCatch/MultiExceptionCatchRector.php index 56a0bde7f..cfcfb95a4 100644 --- a/vendor/rector/rector/rules/Php71/Rector/TryCatch/MultiExceptionCatchRector.php +++ b/vendor/rector/rector/rules/Php71/Rector/TryCatch/MultiExceptionCatchRector.php @@ -18,9 +18,8 @@ final class MultiExceptionCatchRector extends AbstractRector implements MinPhpVe { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; public function __construct(BetterStandardPrinter $betterStandardPrinter) { $this->betterStandardPrinter = $betterStandardPrinter; diff --git a/vendor/rector/rector/rules/Php71/ValueObject/TwoNodeMatch.php b/vendor/rector/rector/rules/Php71/ValueObject/TwoNodeMatch.php index 57837d27f..67ca5a4a0 100644 --- a/vendor/rector/rector/rules/Php71/ValueObject/TwoNodeMatch.php +++ b/vendor/rector/rector/rules/Php71/ValueObject/TwoNodeMatch.php @@ -8,14 +8,12 @@ final class TwoNodeMatch { /** * @readonly - * @var \PhpParser\Node\Expr */ - private $firstExpr; + private Expr $firstExpr; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $secondExpr; + private Expr $secondExpr; public function __construct(Expr $firstExpr, Expr $secondExpr) { $this->firstExpr = $firstExpr; diff --git a/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php b/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php index 954854317..8125cc622 100644 --- a/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php +++ b/vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php @@ -3,19 +3,19 @@ declare (strict_types=1); namespace Rector\Php72\NodeFactory; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; +use PhpParser\Node\ClosureUse; use PhpParser\Node\ComplexType; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\ClosureUse; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\NullableType; use PhpParser\Node\Param; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; @@ -23,6 +23,7 @@ use PhpParser\Node\UnionType; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Php\ReservedKeywordAnalyzer; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\Parser\InlineCodeParser; @@ -31,41 +32,41 @@ final class AnonymousFunctionFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\PhpParser\Parser\SimplePhpParser */ - private $simplePhpParser; + private SimplePhpParser $simplePhpParser; /** * @readonly - * @var \Rector\PhpParser\Parser\InlineCodeParser */ - private $inlineCodeParser; + private InlineCodeParser $inlineCodeParser; + /** + * @readonly + */ + private ReservedKeywordAnalyzer $reservedKeywordAnalyzer; /** * @var string * @see https://regex101.com/r/jkLLlM/2 */ private const DIM_FETCH_REGEX = '#(\\$|\\\\|\\x0)(?\\d+)#'; - public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, SimplePhpParser $simplePhpParser, InlineCodeParser $inlineCodeParser) + public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, SimplePhpParser $simplePhpParser, InlineCodeParser $inlineCodeParser, ReservedKeywordAnalyzer $reservedKeywordAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; $this->betterNodeFinder = $betterNodeFinder; $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; $this->simplePhpParser = $simplePhpParser; $this->inlineCodeParser = $inlineCodeParser; + $this->reservedKeywordAnalyzer = $reservedKeywordAnalyzer; } /** * @api @@ -110,14 +111,12 @@ public function createAnonymousFunctionFromExpr(Expr $expr) : ?Closure return $node; } $matchesVariable = new Variable('matches'); - return new ArrayDimFetch($matchesVariable, new LNumber((int) $match['number'])); + return new ArrayDimFetch($matchesVariable, new Int_((int) $match['number'])); }); $anonymousFunction->stmts[] = new Return_($stmt); $anonymousFunction->params[] = new Param(new Variable('matches')); $variables = $expr instanceof Variable ? [] : $this->betterNodeFinder->findInstanceOf($expr, Variable::class); - $anonymousFunction->uses = \array_map(static function (Variable $variable) : ClosureUse { - return new ClosureUse($variable); - }, $variables); + $anonymousFunction->uses = \array_map(static fn(Variable $variable): ClosureUse => new ClosureUse($variable), $variables); return $anonymousFunction; } /** @@ -157,6 +156,10 @@ private function createUseVariablesFromParams(array $nodes, array $params) : arr if (\in_array($variableName, $paramNames, \true)) { continue; } + // Superglobal variables cannot be in a use statement + if ($this->reservedKeywordAnalyzer->isNativeVariable($variableName)) { + continue; + } if ($variable->getAttribute(AttributeKey::IS_BEING_ASSIGNED) === \true || $variable->getAttribute(AttributeKey::IS_PARAM_VAR) === \true || $variable->getAttribute(AttributeKey::IS_VARIABLE_LOOP) === \true) { $alreadyAssignedVariables[] = $variableName; } diff --git a/vendor/rector/rector/rules/Php72/Rector/Assign/ListEachRector.php b/vendor/rector/rector/rules/Php72/Rector/Assign/ListEachRector.php index 782d91aee..8fbfa350d 100644 --- a/vendor/rector/rector/rules/Php72/Rector/Assign/ListEachRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/Assign/ListEachRector.php @@ -4,7 +4,7 @@ namespace Rector\Php72\Rector\Assign; use PhpParser\Node; -use PhpParser\Node\Expr\ArrayItem; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; @@ -23,9 +23,8 @@ final class ListEachRector extends AbstractRector implements MinPhpVersionInterf { /** * @readonly - * @var \Rector\NodeManipulator\AssignManipulator */ - private $assignManipulator; + private AssignManipulator $assignManipulator; public function __construct(AssignManipulator $assignManipulator) { $this->assignManipulator = $assignManipulator; diff --git a/vendor/rector/rector/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php b/vendor/rector/rector/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php index ed170fc12..14bcdeda6 100644 --- a/vendor/rector/rector/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php @@ -33,7 +33,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replace each() assign outside loop', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace `each()` assign outside loop', [new CodeSample(<<<'CODE_SAMPLE' $array = ['b' => 1, 'a' => 2]; $eachedArray = each($array); @@ -87,7 +87,7 @@ private function shouldSkip(Assign $assign) : bool if (!$assign->expr instanceof FuncCall) { return \true; } - if (!$this->nodeNameResolver->isName($assign->expr, 'each')) { + if (!$this->isName($assign->expr, 'each')) { return \true; } return $assign->var instanceof List_; @@ -98,9 +98,7 @@ private function shouldSkip(Assign $assign) : bool private function createNewStmts(Expr $assignVariable, Expr $eachedVariable) : array { $exprs = [$this->createDimFetchAssignWithFuncCall($assignVariable, $eachedVariable, 1, 'current'), $this->createDimFetchAssignWithFuncCall($assignVariable, $eachedVariable, 'value', 'current'), $this->createDimFetchAssignWithFuncCall($assignVariable, $eachedVariable, 0, self::KEY), $this->createDimFetchAssignWithFuncCall($assignVariable, $eachedVariable, self::KEY, self::KEY), $this->nodeFactory->createFuncCall('next', [new Arg($eachedVariable)])]; - return \array_map(static function (Expr $expr) : Expression { - return new Expression($expr); - }, $exprs); + return \array_map(static fn(Expr $expr): Expression => new Expression($expr), $exprs); } /** * @param string|int $dimValue diff --git a/vendor/rector/rector/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php b/vendor/rector/rector/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php index c953d6d81..d3db5b640 100644 --- a/vendor/rector/rector/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php @@ -12,7 +12,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use PhpParser\Node\Param; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; @@ -32,19 +32,16 @@ final class CreateFunctionToAnonymousFunctionRector extends AbstractRector imple { /** * @readonly - * @var \Rector\PhpParser\Parser\InlineCodeParser */ - private $inlineCodeParser; + private InlineCodeParser $inlineCodeParser; /** * @readonly - * @var \Rector\Php72\NodeFactory\AnonymousFunctionFactory */ - private $anonymousFunctionFactory; + private AnonymousFunctionFactory $anonymousFunctionFactory; /** * @readonly - * @var \Rector\Php\ReservedKeywordAnalyzer */ - private $reservedKeywordAnalyzer; + private ReservedKeywordAnalyzer $reservedKeywordAnalyzer; public function __construct(InlineCodeParser $inlineCodeParser, AnonymousFunctionFactory $anonymousFunctionFactory, ReservedKeywordAnalyzer $reservedKeywordAnalyzer) { $this->inlineCodeParser = $inlineCodeParser; @@ -140,7 +137,7 @@ private function createParamsFromString(Expr $expr) : array */ private function parseStringToBody(Expr $expr) : array { - if (!$expr instanceof String_ && !$expr instanceof Encapsed && !$expr instanceof Concat) { + if (!$expr instanceof String_ && !$expr instanceof InterpolatedString && !$expr instanceof Concat) { // special case of code elsewhere return [$this->createEval($expr)]; } diff --git a/vendor/rector/rector/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php b/vendor/rector/rector/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php index c1cd45aa4..afe9f3138 100644 --- a/vendor/rector/rector/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php @@ -9,11 +9,9 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Stmt\Class_; -use PhpParser\NodeTraverser; -use PHPStan\Analyser\Scope; -use PHPStan\Type\NullType; +use PhpParser\NodeVisitor; use Rector\NodeTypeResolver\Node\AttributeKey; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -21,7 +19,7 @@ /** * @see \Rector\Tests\Php72\Rector\FuncCall\GetClassOnNullRector\GetClassOnNullRectorTest */ -final class GetClassOnNullRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class GetClassOnNullRector extends AbstractRector implements MinPhpVersionInterface { public function provideMinPhpVersion() : int { @@ -29,7 +27,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Null is no more allowed in get_class()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Null is no more allowed in `get_class()`', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function getItem() @@ -61,12 +59,12 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { $hasChanged = \false; $this->traverseNodesWithCallable($node, function (Node $node) use(&$hasChanged) { if ($node instanceof Ternary) { - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if (!$node instanceof FuncCall) { return null; @@ -87,7 +85,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } $firstArgValue = $firstArg->value; $firstArgType = $this->getType($firstArgValue); - if (!$this->nodeTypeResolver->isNullableType($firstArgValue) && !$firstArgType instanceof NullType) { + if (!$this->nodeTypeResolver->isNullableType($firstArgValue) && !$firstArgType->isNull()->yes()) { return null; } $notIdentical = new NotIdentical($firstArgValue, $this->nodeFactory->createNull()); diff --git a/vendor/rector/rector/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php b/vendor/rector/rector/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php index ec4736a9c..04d97fdc8 100644 --- a/vendor/rector/rector/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php @@ -55,9 +55,7 @@ private function processStrWithResult(StmtsAwareInterface $stmtsAware, bool $has if ($stmtsAware->stmts === null) { return null; } - \end($stmtsAware->stmts); - $totalKeys = \key($stmtsAware->stmts); - \reset($stmtsAware->stmts); + $totalKeys = \array_key_last($stmtsAware->stmts); for ($key = $jumpToKey; $key < $totalKeys; ++$key) { if (!isset($stmtsAware->stmts[$key], $stmtsAware->stmts[$key + 1])) { break; @@ -66,10 +64,8 @@ private function processStrWithResult(StmtsAwareInterface $stmtsAware, bool $has if ($this->shouldSkip($stmt)) { continue; } - /** - * @var Expression $stmt - * @var FuncCall $expr - */ + /** @var Expression $stmt */ + /** @var FuncCall $expr */ $expr = $stmt->expr; $resultVariable = new Variable('result'); $expr->args[1] = new Arg($resultVariable); diff --git a/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringifyDefineRector.php b/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringifyDefineRector.php index 6ab150222..6dbfc3976 100644 --- a/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringifyDefineRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringifyDefineRector.php @@ -20,9 +20,8 @@ final class StringifyDefineRector extends AbstractRector implements MinPhpVersio { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer */ - private $stringTypeAnalyzer; + private StringTypeAnalyzer $stringTypeAnalyzer; public function __construct(StringTypeAnalyzer $stringTypeAnalyzer) { $this->stringTypeAnalyzer = $stringTypeAnalyzer; diff --git a/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php b/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php index 1c264b748..715013b80 100644 --- a/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php @@ -21,9 +21,8 @@ final class StringsAssertNakedRector extends AbstractRector implements MinPhpVer { /** * @readonly - * @var \Rector\PhpParser\Parser\SimplePhpParser */ - private $simplePhpParser; + private SimplePhpParser $simplePhpParser; public function __construct(SimplePhpParser $simplePhpParser) { $this->simplePhpParser = $simplePhpParser; diff --git a/vendor/rector/rector/rules/Php72/Rector/Unset_/UnsetCastRector.php b/vendor/rector/rector/rules/Php72/Rector/Unset_/UnsetCastRector.php index 634b3cda4..f066d7688 100644 --- a/vendor/rector/rector/rules/Php72/Rector/Unset_/UnsetCastRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/Unset_/UnsetCastRector.php @@ -8,7 +8,7 @@ use PhpParser\Node\Expr\Cast\Unset_; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Stmt\Expression; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -25,7 +25,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Removes (unset) cast', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove `(unset)` cast', [new CodeSample(<<<'CODE_SAMPLE' $different = (unset) $value; $value = (unset) $value; @@ -57,7 +57,7 @@ public function refactor(Node $node) if (!$node->expr instanceof Unset_) { return null; } - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return $this->nodeFactory->createNull(); } diff --git a/vendor/rector/rector/rules/Php72/Rector/While_/WhileEachToForeachRector.php b/vendor/rector/rector/rules/Php72/Rector/While_/WhileEachToForeachRector.php index efae476e3..3d7c5d294 100644 --- a/vendor/rector/rector/rules/Php72/Rector/While_/WhileEachToForeachRector.php +++ b/vendor/rector/rector/rules/Php72/Rector/While_/WhileEachToForeachRector.php @@ -4,7 +4,7 @@ namespace Rector\Php72\Rector\While_; use PhpParser\Node; -use PhpParser\Node\Expr\ArrayItem; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\While_; @@ -22,9 +22,8 @@ final class WhileEachToForeachRector extends AbstractRector implements MinPhpVer { /** * @readonly - * @var \Rector\NodeManipulator\AssignManipulator */ - private $assignManipulator; + private AssignManipulator $assignManipulator; public function __construct(AssignManipulator $assignManipulator) { $this->assignManipulator = $assignManipulator; @@ -91,7 +90,7 @@ public function refactor(Node $node) : ?Node $arrayItem = \current($list->items); $isTrailingCommaLast = \true; } - $foreach = new Foreach_($foreachedExpr, $arrayItem, ['stmts' => $node->stmts]); + $foreach = new Foreach_($foreachedExpr, $arrayItem->value, ['stmts' => $node->stmts]); $this->mirrorComments($foreach, $node); // is key included? add it to foreach if ($list->items !== []) { diff --git a/vendor/rector/rector/rules/Php72/ValueObject/ListAndEach.php b/vendor/rector/rector/rules/Php72/ValueObject/ListAndEach.php index a60db26b3..e7056970b 100644 --- a/vendor/rector/rector/rules/Php72/ValueObject/ListAndEach.php +++ b/vendor/rector/rector/rules/Php72/ValueObject/ListAndEach.php @@ -9,14 +9,12 @@ final class ListAndEach { /** * @readonly - * @var \PhpParser\Node\Expr\List_ */ - private $list; + private List_ $list; /** * @readonly - * @var \PhpParser\Node\Expr\FuncCall */ - private $eachFuncCall; + private FuncCall $eachFuncCall; public function __construct(List_ $list, FuncCall $eachFuncCall) { $this->list = $list; diff --git a/vendor/rector/rector/rules/Php73/Rector/BooleanOr/IsCountableRector.php b/vendor/rector/rector/rules/Php73/Rector/BooleanOr/IsCountableRector.php index 2e7b6a361..fb9c00776 100644 --- a/vendor/rector/rector/rules/Php73/Rector/BooleanOr/IsCountableRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/BooleanOr/IsCountableRector.php @@ -22,14 +22,12 @@ final class IsCountableRector extends AbstractRector implements MinPhpVersionInt { /** * @readonly - * @var \Rector\Php71\IsArrayAndDualCheckToAble */ - private $isArrayAndDualCheckToAble; + private IsArrayAndDualCheckToAble $isArrayAndDualCheckToAble; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(IsArrayAndDualCheckToAble $isArrayAndDualCheckToAble, ReflectionProvider $reflectionProvider) { $this->isArrayAndDualCheckToAble = $isArrayAndDualCheckToAble; diff --git a/vendor/rector/rector/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php b/vendor/rector/rector/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php index 7c07bc440..e7a6b7d70 100644 --- a/vendor/rector/rector/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php @@ -20,9 +20,8 @@ final class SensitiveConstantNameRector extends AbstractRector implements MinPhp { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @see http://php.net/manual/en/reserved.constants.php * @var string[] diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php index 1cf350d31..f4ac84c1e 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php @@ -28,14 +28,12 @@ final class ArrayKeyFirstLastRector extends AbstractRector implements MinPhpVers { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @var string */ @@ -83,7 +81,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?StmtsAwareInterface { - return $this->processArrayKeyFirstLast($node, \false); + return $this->processArrayKeyFirstLast($node); } public function provideMinPhpVersion() : int { @@ -93,16 +91,13 @@ public function providePolyfillPackage() : string { return PolyfillPackage::PHP_73; } - private function processArrayKeyFirstLast(StmtsAwareInterface $stmtsAware, bool $hasChanged, int $jumpToKey = 0) : ?StmtsAwareInterface + private function processArrayKeyFirstLast(StmtsAwareInterface $stmtsAware, int $jumpToKey = 0) : ?StmtsAwareInterface { if ($stmtsAware->stmts === null) { return null; } /** @var int $totalKeys */ - \end($stmtsAware->stmts); - /** @var int $totalKeys */ - $totalKeys = \key($stmtsAware->stmts); - \reset($stmtsAware->stmts); + $totalKeys = \array_key_last($stmtsAware->stmts); for ($key = $jumpToKey; $key < $totalKeys; ++$key) { if (!isset($stmtsAware->stmts[$key], $stmtsAware->stmts[$key + 1])) { break; @@ -127,15 +122,30 @@ private function processArrayKeyFirstLast(StmtsAwareInterface $stmtsAware, bool } $newName = self::PREVIOUS_TO_NEW_FUNCTIONS[$this->getName($stmt->expr)]; $keyFuncCall->name = new Name($newName); + $this->changeNextKeyCall($stmtsAware, $key + 2, $resetOrEndFuncCall, $keyFuncCall->name); unset($stmtsAware->stmts[$key]); - $hasChanged = \true; - return $this->processArrayKeyFirstLast($stmtsAware, $hasChanged, $key + 2); - } - if ($hasChanged) { return $stmtsAware; } return null; } + private function changeNextKeyCall(StmtsAwareInterface $stmtsAware, int $key, FuncCall $resetOrEndFuncCall, Name $newName) : void + { + $counter = \count($stmtsAware->stmts); + for ($nextKey = $key; $nextKey < $counter; ++$nextKey) { + if (!isset($stmtsAware->stmts[$nextKey])) { + break; + } + if ($stmtsAware->stmts[$nextKey] instanceof Expression && !$this->shouldSkip($stmtsAware->stmts[$nextKey])) { + $this->processArrayKeyFirstLast($stmtsAware, $nextKey); + break; + } + $keyFuncCall = $this->resolveKeyFuncCall($stmtsAware->stmts[$nextKey], $resetOrEndFuncCall); + if (!$keyFuncCall instanceof FuncCall) { + continue; + } + $keyFuncCall->name = $newName; + } + } private function resolveKeyFuncCall(Stmt $nextStmt, FuncCall $resetOrEndFuncCall) : ?FuncCall { if ($resetOrEndFuncCall->isFirstClassCallable()) { diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php index 9d38ef442..a80d37228 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php @@ -9,7 +9,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Identifier; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\Node\Value\ValueResolver; @@ -25,18 +25,13 @@ final class JsonThrowOnErrorRector extends AbstractRector implements MinPhpVersi { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; - /** - * @var bool - */ - private $hasChanged = \false; + private BetterNodeFinder $betterNodeFinder; + private bool $hasChanged = \false; public function __construct(ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder) { $this->valueResolver = $valueResolver; @@ -67,9 +62,7 @@ public function getNodeTypes() : array public function refactor(Node $node) : ?Node { // if found, skip it :) - $hasJsonErrorFuncCall = (bool) $this->betterNodeFinder->findFirst($node, function (Node $node) : bool { - return $this->isNames($node, ['json_last_error', 'json_last_error_msg']); - }); + $hasJsonErrorFuncCall = (bool) $this->betterNodeFinder->findFirst($node, fn(Node $node): bool => $this->isNames($node, ['json_last_error', 'json_last_error_msg'])); if ($hasJsonErrorFuncCall) { return null; } @@ -103,7 +96,7 @@ private function shouldSkipFuncCall(FuncCall $funcCall) : bool if ($funcCall->isFirstClassCallable()) { return \true; } - if ($funcCall->args === null) { + if ($funcCall->args === []) { return \true; } foreach ($funcCall->args as $arg) { @@ -135,7 +128,7 @@ private function processJsonDecode(FuncCall $funcCall) : ?FuncCall $funcCall->args[1] = new Arg($this->nodeFactory->createNull()); } if (!isset($funcCall->args[2])) { - $funcCall->args[2] = new Arg(new LNumber(512)); + $funcCall->args[2] = new Arg(new Int_(512)); } $this->hasChanged = \true; $funcCall->args[3] = new Arg($this->createConstFetch('JSON_THROW_ON_ERROR')); diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php index 136f827cb..62288e3af 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php73\Rector\FuncCall; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Scalar\String_; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -68,19 +68,34 @@ public function refactor(Node $node) : ?Node if (StringUtils::isMatch($node->value, self::THREE_BACKSLASH_FOR_ESCAPE_NEXT_REGEX)) { return null; } - $stringValue = $node->value; + if ($node->getAttribute(AttributeKey::RAW_VALUE) !== null) { + $stringValue = \substr($node->getAttribute(AttributeKey::RAW_VALUE), 1, -1); + } else { + $stringValue = $node->value; + } if (StringUtils::isMatch($stringValue, self::LEFT_HAND_UNESCAPED_DASH_REGEX)) { $node->value = Strings::replace($stringValue, self::LEFT_HAND_UNESCAPED_DASH_REGEX, '$1\\-'); + $this->setRawValue($node); // helped needed to skip re-escaping regular expression $node->setAttribute(AttributeKey::IS_REGULAR_PATTERN, \true); return $node; } if (StringUtils::isMatch($stringValue, self::RIGHT_HAND_UNESCAPED_DASH_REGEX)) { $node->value = Strings::replace($stringValue, self::RIGHT_HAND_UNESCAPED_DASH_REGEX, '\\-$1]'); + $this->setRawValue($node); // helped needed to skip re-escaping regular expression $node->setAttribute(AttributeKey::IS_REGULAR_PATTERN, \true); return $node; } return null; } + private function setRawValue(String_ $string) : void + { + $rawValue = $string->getAttribute(AttributeKey::RAW_VALUE); + if ($rawValue === null) { + return; + } + $rawValue = \strncmp($rawValue, '"', \strlen('"')) === 0 ? '"' . $string->value . '"' : "'" . $string->value . "'"; + $string->setAttribute(AttributeKey::RAW_VALUE, $rawValue); + } } diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/SetCookieRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/SetCookieRector.php index a30a7dcfc..281f94fef 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/SetCookieRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/SetCookieRector.php @@ -5,10 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; @@ -73,15 +72,19 @@ private function shouldSkip(FuncCall $funcCall) : bool if ($funcCall->isFirstClassCallable()) { return \true; } - $argsCount = \count($funcCall->args); + $args = $funcCall->getArgs(); + $argsCount = \count($args); if ($argsCount <= 2) { return \true; } - if ($funcCall->args[2] instanceof Arg && $funcCall->args[2]->value instanceof Array_) { + if ($args[2]->value instanceof Array_) { return \true; } if ($argsCount === 3) { - return $funcCall->args[2] instanceof Arg && $funcCall->args[2]->value instanceof Variable; + $type = $this->nodeTypeResolver->getNativeType($args[2]->value); + if (!$type->isInteger()->yes()) { + return \true; + } } return \false; } diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php index d4404b1ae..83ad8dbde 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php @@ -7,7 +7,7 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\Cast\String_; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -28,7 +28,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Makes needles explicit strings', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Make needles explicit strings', [new CodeSample(<<<'CODE_SAMPLE' $needle = 5; $fivePosition = strpos('725', $needle); CODE_SAMPLE @@ -65,7 +65,7 @@ public function refactor(Node $node) : ?Node if ($needleType->isString()->yes()) { return null; } - if ($needleArgValue instanceof Encapsed) { + if ($needleArgValue instanceof InterpolatedString) { return null; } $node->args[1]->value = new String_($node->args[1]->value); diff --git a/vendor/rector/rector/rules/Php74/Guard/MakePropertyTypedGuard.php b/vendor/rector/rector/rules/Php74/Guard/MakePropertyTypedGuard.php index 79c44b942..63d5ca6f1 100644 --- a/vendor/rector/rector/rules/Php74/Guard/MakePropertyTypedGuard.php +++ b/vendor/rector/rector/rules/Php74/Guard/MakePropertyTypedGuard.php @@ -3,22 +3,22 @@ declare (strict_types=1); namespace Rector\Php74\Guard; +use PhpParser\Node; use PhpParser\Node\Stmt\Property; use PHPStan\Reflection\ClassReflection; final class MakePropertyTypedGuard { /** * @readonly - * @var \Rector\Php74\Guard\PropertyTypeChangeGuard */ - private $propertyTypeChangeGuard; + private \Rector\Php74\Guard\PropertyTypeChangeGuard $propertyTypeChangeGuard; public function __construct(\Rector\Php74\Guard\PropertyTypeChangeGuard $propertyTypeChangeGuard) { $this->propertyTypeChangeGuard = $propertyTypeChangeGuard; } public function isLegal(Property $property, ClassReflection $classReflection, bool $inlinePublic = \true) : bool { - if ($property->type !== null) { + if ($property->type instanceof Node) { return \false; } return $this->propertyTypeChangeGuard->isLegal($property, $classReflection, $inlinePublic); diff --git a/vendor/rector/rector/rules/Php74/Guard/PropertyTypeChangeGuard.php b/vendor/rector/rector/rules/Php74/Guard/PropertyTypeChangeGuard.php index b0d4abb34..1cb04f987 100644 --- a/vendor/rector/rector/rules/Php74/Guard/PropertyTypeChangeGuard.php +++ b/vendor/rector/rector/rules/Php74/Guard/PropertyTypeChangeGuard.php @@ -13,24 +13,20 @@ final class PropertyTypeChangeGuard { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyAnalyzer */ - private $propertyAnalyzer; + private PropertyAnalyzer $propertyAnalyzer; /** * @readonly - * @var \Rector\NodeManipulator\PropertyManipulator */ - private $propertyManipulator; + private PropertyManipulator $propertyManipulator; /** * @readonly - * @var \Rector\Privatization\Guard\ParentPropertyLookupGuard */ - private $parentPropertyLookupGuard; + private ParentPropertyLookupGuard $parentPropertyLookupGuard; public function __construct(NodeNameResolver $nodeNameResolver, PropertyAnalyzer $propertyAnalyzer, PropertyManipulator $propertyManipulator, ParentPropertyLookupGuard $parentPropertyLookupGuard) { $this->nodeNameResolver = $nodeNameResolver; @@ -51,7 +47,7 @@ public function isLegal(Property $property, ClassReflection $classReflection, bo return \false; } $propertyName = $this->nodeNameResolver->getName($property); - if ($this->propertyManipulator->isUsedByTrait($classReflection, $propertyName)) { + if ($this->propertyManipulator->hasTraitWithSamePropertyOrWritten($classReflection, $propertyName)) { return \false; } if ($this->propertyAnalyzer->hasForbiddenType($property)) { diff --git a/vendor/rector/rector/rules/Php74/NodeAnalyzer/ClosureArrowFunctionAnalyzer.php b/vendor/rector/rector/rules/Php74/NodeAnalyzer/ClosureArrowFunctionAnalyzer.php index 4d442d7d4..b62774285 100644 --- a/vendor/rector/rector/rules/Php74/NodeAnalyzer/ClosureArrowFunctionAnalyzer.php +++ b/vendor/rector/rector/rules/Php74/NodeAnalyzer/ClosureArrowFunctionAnalyzer.php @@ -4,11 +4,16 @@ namespace Rector\Php74\NodeAnalyzer; use PhpParser\Node; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\ClosureUse; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Return_; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; +use PHPStan\Type\MixedType; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; +use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Comparing\NodeComparator; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Util\ArrayChecker; @@ -16,24 +21,31 @@ final class ClosureArrowFunctionAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\Util\ArrayChecker */ - private $arrayChecker; - public function __construct(BetterNodeFinder $betterNodeFinder, NodeComparator $nodeComparator, ArrayChecker $arrayChecker) + private ArrayChecker $arrayChecker; + /** + * @readonly + */ + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private NodeTypeResolver $nodeTypeResolver; + public function __construct(BetterNodeFinder $betterNodeFinder, NodeComparator $nodeComparator, ArrayChecker $arrayChecker, PhpDocInfoFactory $phpDocInfoFactory, NodeTypeResolver $nodeTypeResolver) { $this->betterNodeFinder = $betterNodeFinder; $this->nodeComparator = $nodeComparator; $this->arrayChecker = $arrayChecker; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->nodeTypeResolver = $nodeTypeResolver; } public function matchArrowFunctionExpr(Closure $closure) : ?Expr { @@ -52,8 +64,37 @@ public function matchArrowFunctionExpr(Closure $closure) : ?Expr if ($this->shouldSkipForUsedReferencedValue($closure)) { return null; } + if ($this->shouldSkipMoreSpecificTypeWithVarDoc($return, $return->expr)) { + return null; + } return $return->expr; } + /** + * Ensure @var doc usage with more specific type on purpose to be skipped + */ + private function shouldSkipMoreSpecificTypeWithVarDoc(Return_ $return, Expr $expr) : bool + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($return); + if (!$phpDocInfo instanceof PhpDocInfo) { + return \false; + } + $varTagValueNode = $phpDocInfo->getVarTagValueNode(); + if (!$varTagValueNode instanceof VarTagValueNode) { + return \false; + } + $varType = $phpDocInfo->getVarType(); + if ($varType instanceof MixedType) { + return \false; + } + $variableName = \ltrim($varTagValueNode->variableName, '$'); + $variable = $this->betterNodeFinder->findFirst($expr, static fn(Node $node): bool => $node instanceof Variable && $node->name === $variableName); + if (!$variable instanceof Variable) { + return \false; + } + $nativeVariableType = $this->nodeTypeResolver->getNativeType($variable); + // not equal with native type means more specific type + return !$nativeVariableType->equals($varType); + } private function shouldSkipForUsedReferencedValue(Closure $closure) : bool { $referencedValues = $this->resolveReferencedUseVariablesFromClosure($closure); @@ -83,9 +124,7 @@ private function isFoundInInnerUses(Closure $node, array $referencedValues) : bo return \false; } foreach ($referencedValues as $referencedValue) { - $isFoundInInnerUses = $this->arrayChecker->doesExist($subNode->uses, function (ClosureUse $closureUse) use($referencedValue) : bool { - return $closureUse->byRef && $this->nodeComparator->areNodesEqual($closureUse->var, $referencedValue); - }); + $isFoundInInnerUses = $this->arrayChecker->doesExist($subNode->uses, fn(ClosureUse $closureUse): bool => $closureUse->byRef && $this->nodeComparator->areNodesEqual($closureUse->var, $referencedValue)); if ($isFoundInInnerUses) { return \true; } diff --git a/vendor/rector/rector/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php b/vendor/rector/rector/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php index 4c1dce008..f1eb70729 100644 --- a/vendor/rector/rector/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php @@ -62,9 +62,9 @@ private function isFollowedByCurlyBracket(File $file, ArrayDimFetch $arrayDimFet { $oldTokens = $file->getOldTokens(); $endTokenPost = $arrayDimFetch->getEndTokenPos(); - if (isset($oldTokens[$endTokenPost]) && $oldTokens[$endTokenPost] === '}') { - $startTokenPost = $arrayDimFetch->getStartTokenPos(); - return !(isset($oldTokens[$startTokenPost][1]) && $oldTokens[$startTokenPost][1] === '${'); + if (isset($oldTokens[$endTokenPost]) && (string) $oldTokens[$endTokenPost] === '}') { + $startTokenPos = $arrayDimFetch->getStartTokenPos(); + return !(isset($oldTokens[$startTokenPos]) && (string) $oldTokens[$startTokenPos] === '${'); } return \false; } diff --git a/vendor/rector/rector/rules/Php74/Rector/Assign/NullCoalescingOperatorRector.php b/vendor/rector/rector/rules/Php74/Rector/Assign/NullCoalescingOperatorRector.php index b1d8a8343..163f6298b 100644 --- a/vendor/rector/rector/rules/Php74/Rector/Assign/NullCoalescingOperatorRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/Assign/NullCoalescingOperatorRector.php @@ -19,7 +19,7 @@ final class NullCoalescingOperatorRector extends AbstractRector implements MinPh { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Use null coalescing operator ??=', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Use null coalescing operator `??=`', [new CodeSample(<<<'CODE_SAMPLE' $array = []; $array['user_id'] = $array['user_id'] ?? 'value'; CODE_SAMPLE diff --git a/vendor/rector/rector/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php b/vendor/rector/rector/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php index d5c4f5fa2..305c6c3a8 100644 --- a/vendor/rector/rector/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php @@ -21,9 +21,8 @@ final class ClosureToArrowFunctionRector extends AbstractRector implements MinPh { /** * @readonly - * @var \Rector\Php74\NodeAnalyzer\ClosureArrowFunctionAnalyzer */ - private $closureArrowFunctionAnalyzer; + private ClosureArrowFunctionAnalyzer $closureArrowFunctionAnalyzer; public function __construct(ClosureArrowFunctionAnalyzer $closureArrowFunctionAnalyzer) { $this->closureArrowFunctionAnalyzer = $closureArrowFunctionAnalyzer; diff --git a/vendor/rector/rector/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php b/vendor/rector/rector/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php index a1ea3b246..9202cfd8e 100644 --- a/vendor/rector/rector/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php @@ -22,7 +22,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change deprecated (real) to (float)', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change deprecated `(real)` to `(float)`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php b/vendor/rector/rector/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php index 5017b4cc8..6f476db66 100644 --- a/vendor/rector/rector/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -54,7 +54,7 @@ public function refactor(Node $node) : ?Node return null; } $node->args[3] = $node->args[2]; - $node->args[2] = new Arg(new LNumber(0)); + $node->args[2] = new Arg(new Int_(0)); return $node; } } diff --git a/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php b/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php index 0d0764c58..439e29f1d 100644 --- a/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php @@ -9,7 +9,7 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\NodeAnalyzer\ArgsAnalyzer; use Rector\PhpParser\Node\Value\ValueResolver; @@ -25,14 +25,12 @@ final class MoneyFormatToNumberFormatRector extends AbstractRector implements Mi { /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) { $this->argsAnalyzer = $argsAnalyzer; @@ -82,9 +80,9 @@ public function refactor(Node $node) : ?FuncCall } private function warpInNumberFormatFuncCall(FuncCall $funcCall, Expr $expr) : FuncCall { - $roundFuncCall = $this->nodeFactory->createFuncCall('round', [$expr, new LNumber(2), new ConstFetch(new Name('PHP_ROUND_HALF_ODD'))]); + $roundFuncCall = $this->nodeFactory->createFuncCall('round', [$expr, new Int_(2), new ConstFetch(new Name('PHP_ROUND_HALF_ODD'))]); $funcCall->name = new Name('number_format'); - $funcCall->args = [new Arg($roundFuncCall), new Arg(new LNumber(2)), new Arg(new String_('.')), new Arg(new String_(''))]; + $funcCall->args = [new Arg($roundFuncCall), new Arg(new Int_(2)), new Arg(new String_('.')), new Arg(new String_(''))]; return $funcCall; } } diff --git a/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php b/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php index fc205241f..6304a8959 100644 --- a/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php @@ -4,8 +4,8 @@ namespace Rector\Php74\Rector\LNumber; use PhpParser\Node; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; @@ -14,12 +14,12 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** - * @see \Rector\Tests\Php74\Rector\LNumber\AddLiteralSeparatorToNumberRector\AddLiteralSeparatorToNumberRectorTest - * * Taking the most generic use case to the account: https://wiki.php.net/rfc/numeric_literal_separator#should_it_be_the_role_of_an_ide_to_group_digits * The final check should be done manually + * + * @see \Rector\Tests\Php74\Rector\LNumber\AddLiteralSeparatorToNumberRector\AddLiteralSeparatorToNumberRectorTest */ final class AddLiteralSeparatorToNumberRector extends AbstractRector implements MinPhpVersionInterface, ConfigurableRectorInterface { @@ -36,10 +36,7 @@ final class AddLiteralSeparatorToNumberRector extends AbstractRector implements * @var int */ private const DEFAULT_LIMIT_VALUE = 1000000; - /** - * @var int - */ - private $limitValue = self::DEFAULT_LIMIT_VALUE; + private int $limitValue = self::DEFAULT_LIMIT_VALUE; /** * @param mixed[] $configuration */ @@ -78,10 +75,10 @@ public function run() */ public function getNodeTypes() : array { - return [LNumber::class, DNumber::class]; + return [Int_::class, Float_::class]; } /** - * @param LNumber|DNumber $node + * @param Int_|Float_ $node */ public function refactor(Node $node) : ?Node { @@ -113,7 +110,7 @@ public function provideMinPhpVersion() : int return PhpVersionFeature::LITERAL_SEPARATOR; } /** - * @param \PhpParser\Node\Scalar\LNumber|\PhpParser\Node\Scalar\DNumber $node + * @param \PhpParser\Node\Scalar\Int_|\PhpParser\Node\Scalar\Float_ $node * @param mixed $rawValue */ private function shouldSkip($node, $rawValue) : bool @@ -129,7 +126,7 @@ private function shouldSkip($node, $rawValue) : bool return \true; } $kind = $node->getAttribute(AttributeKey::KIND); - if (\in_array($kind, [LNumber::KIND_BIN, LNumber::KIND_OCT, LNumber::KIND_HEX], \true)) { + if (\in_array($kind, [Int_::KIND_BIN, Int_::KIND_OCT, Int_::KIND_HEX], \true)) { return \true; } // e+/e- @@ -140,6 +137,7 @@ private function shouldSkip($node, $rawValue) : bool return \strlen($rawValue) <= self::GROUP_SIZE; } /** + * @param int<1, max> $length * @return string[] */ private function strSplitNegative(string $string, int $length) : array diff --git a/vendor/rector/rector/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php b/vendor/rector/rector/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php index 686591359..a1068d442 100644 --- a/vendor/rector/rector/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php @@ -21,14 +21,12 @@ final class RestoreDefaultNullToNullableTypePropertyRector extends AbstractRecto { /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; + private ConstructorAssignDetector $constructorAssignDetector; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(ConstructorAssignDetector $constructorAssignDetector, PhpDocInfoFactory $phpDocInfoFactory) { $this->constructorAssignDetector = $constructorAssignDetector; @@ -67,7 +65,7 @@ public function refactor(Node $node) : ?Node } $hasChanged = \false; foreach ($node->getProperties() as $property) { - if ($this->shouldSkip($property, $node)) { + if ($this->shouldSkipProperty($property, $node)) { continue; } $onlyProperty = $property->props[0]; @@ -83,16 +81,15 @@ public function provideMinPhpVersion() : int { return PhpVersionFeature::TYPED_PROPERTIES; } - private function shouldSkip(Property $property, Class_ $class) : bool + private function shouldSkipProperty(Property $property, Class_ $class) : bool { - if ($property->type === null) { + if (!$property->type instanceof Node) { return \true; } if (\count($property->props) > 1) { return \true; } - $onlyProperty = $property->props[0]; - if ($onlyProperty->default instanceof Expr) { + if ($property->props[0]->default instanceof Expr) { return \true; } if ($this->isReadonlyProperty($property)) { @@ -101,9 +98,12 @@ private function shouldSkip(Property $property, Class_ $class) : bool if (!$this->nodeTypeResolver->isNullableType($property)) { return \true; } + if ($property->hooks !== []) { + return \true; + } // is variable assigned in constructor $propertyName = $this->getName($property); - return $this->constructorAssignDetector->isPropertyAssigned($class, $propertyName); + return $this->constructorAssignDetector->isPropertyAssignedConditionally($class, $propertyName); } private function isReadonlyProperty(Property $property) : bool { diff --git a/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php b/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php index b8b6e6749..9c0a371a1 100644 --- a/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php @@ -23,9 +23,8 @@ final class ExportToReflectionFunctionRector extends AbstractRector implements M { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/Php74/Rector/Ternary/ParenthesizeNestedTernaryRector.php b/vendor/rector/rector/rules/Php74/Rector/Ternary/ParenthesizeNestedTernaryRector.php index 9f06b71ba..ce51147ef 100644 --- a/vendor/rector/rector/rules/Php74/Rector/Ternary/ParenthesizeNestedTernaryRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/Ternary/ParenthesizeNestedTernaryRector.php @@ -19,9 +19,8 @@ final class ParenthesizeNestedTernaryRector extends AbstractRector implements Mi { /** * @readonly - * @var \Rector\Php74\Tokenizer\ParenthesizedNestedTernaryAnalyzer */ - private $parenthesizedNestedTernaryAnalyzer; + private ParenthesizedNestedTernaryAnalyzer $parenthesizedNestedTernaryAnalyzer; public function __construct(ParenthesizedNestedTernaryAnalyzer $parenthesizedNestedTernaryAnalyzer) { $this->parenthesizedNestedTernaryAnalyzer = $parenthesizedNestedTernaryAnalyzer; @@ -57,7 +56,7 @@ public function refactor(Node $node) : ?Node return null; } // re-print with brackets - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $node->cond->setAttribute(AttributeKey::ORIGINAL_NODE, null); return $node; } return null; diff --git a/vendor/rector/rector/rules/Php74/Tokenizer/ParenthesizedNestedTernaryAnalyzer.php b/vendor/rector/rector/rules/Php74/Tokenizer/ParenthesizedNestedTernaryAnalyzer.php index 4aec8953c..4ea9e6f29 100644 --- a/vendor/rector/rector/rules/Php74/Tokenizer/ParenthesizedNestedTernaryAnalyzer.php +++ b/vendor/rector/rector/rules/Php74/Tokenizer/ParenthesizedNestedTernaryAnalyzer.php @@ -12,8 +12,8 @@ public function isParenthesized(File $file, Ternary $ternary) : bool $oldTokens = $file->getOldTokens(); $startTokenPos = $ternary->getStartTokenPos(); $endTokenPos = $ternary->getEndTokenPos(); - $hasOpenParentheses = isset($oldTokens[$startTokenPos]) && $oldTokens[$startTokenPos] === '('; - $hasCloseParentheses = isset($oldTokens[$endTokenPos]) && $oldTokens[$endTokenPos] === ')'; + $hasOpenParentheses = isset($oldTokens[$startTokenPos]) && (string) $oldTokens[$startTokenPos] === '('; + $hasCloseParentheses = isset($oldTokens[$endTokenPos]) && (string) $oldTokens[$endTokenPos] === ')'; return $hasOpenParentheses || $hasCloseParentheses; } } diff --git a/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php b/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php index c1bd70390..70970ce50 100644 --- a/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php +++ b/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php @@ -4,6 +4,7 @@ namespace Rector\Php80\DocBlock; use PhpParser\Comment; +use PhpParser\Node; use PhpParser\Node\Param; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; @@ -20,34 +21,28 @@ final class PropertyPromotionDocBlockMerger { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ - private $varTagRemover; + private VarTagRemover $varTagRemover; /** * @readonly - * @var \Rector\BetterPhpDocParser\Printer\PhpDocInfoPrinter */ - private $phpDocInfoPrinter; + private PhpDocInfoPrinter $phpDocInfoPrinter; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, PhpDocTypeChanger $phpDocTypeChanger, VarTagRemover $varTagRemover, PhpDocInfoPrinter $phpDocInfoPrinter, DocBlockUpdater $docBlockUpdater) { $this->phpDocInfoFactory = $phpDocInfoFactory; @@ -79,7 +74,7 @@ public function decorateParamWithPropertyPhpDocInfo(ClassMethod $classMethod, Pr $propertyPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); $param->setAttribute(AttributeKey::PHP_DOC_INFO, $propertyPhpDocInfo); // make sure the docblock is useful - if ($param->type === null) { + if (!$param->type instanceof Node) { $varTagValueNode = $propertyPhpDocInfo->getVarTagValueNode(); if (!$varTagValueNode instanceof VarTagValueNode) { return; @@ -98,8 +93,6 @@ public function decorateParamWithPropertyPhpDocInfo(ClassMethod $classMethod, Pr */ private function removeEmptyComments(array $mergedComments) : array { - return \array_filter($mergedComments, static function (Comment $comment) : bool { - return $comment->getText() !== ''; - }); + return \array_filter($mergedComments, static fn(Comment $comment): bool => $comment->getText() !== ''); } } diff --git a/vendor/rector/rector/rules/Php80/Guard/MakePropertyPromotionGuard.php b/vendor/rector/rector/rules/Php80/Guard/MakePropertyPromotionGuard.php index d4624ad4a..535020fb3 100644 --- a/vendor/rector/rector/rules/Php80/Guard/MakePropertyPromotionGuard.php +++ b/vendor/rector/rector/rules/Php80/Guard/MakePropertyPromotionGuard.php @@ -13,9 +13,8 @@ final class MakePropertyPromotionGuard { /** * @readonly - * @var \Rector\Php74\Guard\PropertyTypeChangeGuard */ - private $propertyTypeChangeGuard; + private PropertyTypeChangeGuard $propertyTypeChangeGuard; public function __construct(PropertyTypeChangeGuard $propertyTypeChangeGuard) { $this->propertyTypeChangeGuard = $propertyTypeChangeGuard; diff --git a/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrncmpMatchAndRefactor.php b/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrncmpMatchAndRefactor.php index 672353085..c76184ccf 100644 --- a/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrncmpMatchAndRefactor.php +++ b/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrncmpMatchAndRefactor.php @@ -9,7 +9,7 @@ use PhpParser\Node\Expr\BinaryOp\NotEqual; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\NodeNameResolver\NodeNameResolver; use Rector\Php80\Contract\StrStartWithMatchAndRefactorInterface; @@ -21,24 +21,20 @@ final class StrncmpMatchAndRefactor implements StrStartWithMatchAndRefactorInter { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Php80\ValueObjectFactory\StrStartsWithFactory */ - private $strStartsWithFactory; + private StrStartsWithFactory $strStartsWithFactory; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\Php80\NodeFactory\StrStartsWithFuncCallFactory */ - private $strStartsWithFuncCallFactory; + private StrStartsWithFuncCallFactory $strStartsWithFuncCallFactory; /** * @var string */ @@ -110,7 +106,7 @@ private function isHardcodedStringWithLNumberLength(StrStartsWith $strStartsWith return \false; } $lNumberLength = $strncmpFuncCall->getArgs()[2]->value; - if (!$lNumberLength instanceof LNumber) { + if (!$lNumberLength instanceof Int_) { return \false; } return $lNumberLength->value === \strlen($hardcodedStringNeedle->value); diff --git a/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrposMatchAndRefactor.php b/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrposMatchAndRefactor.php index db064efe6..bb8080c67 100644 --- a/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrposMatchAndRefactor.php +++ b/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/StrposMatchAndRefactor.php @@ -21,19 +21,16 @@ final class StrposMatchAndRefactor implements StrStartWithMatchAndRefactorInterf { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Php80\NodeFactory\StrStartsWithFuncCallFactory */ - private $strStartsWithFuncCallFactory; + private StrStartsWithFuncCallFactory $strStartsWithFuncCallFactory; public function __construct(NodeNameResolver $nodeNameResolver, ValueResolver $valueResolver, StrStartsWithFuncCallFactory $strStartsWithFuncCallFactory) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php b/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php index 16ac46d2b..50d018a8a 100644 --- a/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php +++ b/vendor/rector/rector/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php @@ -9,7 +9,7 @@ use PhpParser\Node\Expr\BinaryOp\NotEqual; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\NodeNameResolver\NodeNameResolver; use Rector\Php80\Contract\StrStartWithMatchAndRefactorInterface; @@ -21,24 +21,20 @@ final class SubstrMatchAndRefactor implements StrStartWithMatchAndRefactorInterf { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\Php80\NodeFactory\StrStartsWithFuncCallFactory */ - private $strStartsWithFuncCallFactory; + private StrStartsWithFuncCallFactory $strStartsWithFuncCallFactory; public function __construct(NodeNameResolver $nodeNameResolver, ValueResolver $valueResolver, NodeComparator $nodeComparator, StrStartsWithFuncCallFactory $strStartsWithFuncCallFactory) { $this->nodeNameResolver = $nodeNameResolver; @@ -116,7 +112,7 @@ private function isHardcodedStringWithLNumberLength(StrStartsWith $strStartsWith return \false; } $lNumberLength = $substrFuncCall->getArgs()[2]->value; - if (!$lNumberLength instanceof LNumber) { + if (!$lNumberLength instanceof Int_) { return \false; } return $lNumberLength->value === \strlen($expr->value); diff --git a/vendor/rector/rector/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php b/vendor/rector/rector/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php index 398792a9d..a660a9000 100644 --- a/vendor/rector/rector/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php +++ b/vendor/rector/rector/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php @@ -8,11 +8,11 @@ use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Match_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; -use PhpParser\Node\Stmt\Throw_; use Rector\NodeNameResolver\NodeNameResolver; use Rector\Php80\Enum\MatchKind; use Rector\Php80\ValueObject\CondAndExpr; @@ -22,24 +22,20 @@ final class MatchSwitchAnalyzer { /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\SwitchAnalyzer */ - private $switchAnalyzer; + private \Rector\Php80\NodeAnalyzer\SwitchAnalyzer $switchAnalyzer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; public function __construct(\Rector\Php80\NodeAnalyzer\SwitchAnalyzer $switchAnalyzer, NodeNameResolver $nodeNameResolver, NodeComparator $nodeComparator, BetterStandardPrinter $betterStandardPrinter) { $this->switchAnalyzer = $switchAnalyzer; @@ -83,7 +79,7 @@ public function shouldSkipSwitch(Switch_ $switch, array $condAndExprs, ?Stmt $ne if ($this->isNextStmtReturnWithExpr($switch, $nextStmt)) { return \false; } - return !$nextStmt instanceof Throw_; + return !($nextStmt instanceof Expression && $nextStmt->expr instanceof Throw_); } /** * @param CondAndExpr[] $condAndExprs @@ -158,9 +154,7 @@ private function isNextStmtReturnWithExpr(Switch_ $switch, ?Stmt $nextStmt) : bo } foreach ($switch->cases as $case) { /** @var Expression[] $expressions */ - $expressions = \array_filter($case->stmts, static function (Node $node) : bool { - return $node instanceof Expression; - }); + $expressions = \array_filter($case->stmts, static fn(Node $node): bool => $node instanceof Expression); foreach ($expressions as $expression) { if (!$expression->expr instanceof Assign) { continue; diff --git a/vendor/rector/rector/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php b/vendor/rector/rector/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php index 4daa42508..f9679ac85 100644 --- a/vendor/rector/rector/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php +++ b/vendor/rector/rector/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php @@ -4,9 +4,9 @@ namespace Rector\Php80\NodeAnalyzer; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\AttributeGroup; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Param; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; @@ -21,14 +21,12 @@ final class PhpAttributeAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyCandidateResolver.php b/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyCandidateResolver.php index 1f292c13d..4869faded 100644 --- a/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyCandidateResolver.php +++ b/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyCandidateResolver.php @@ -21,24 +21,20 @@ final class PromotedPropertyCandidateResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, NodeComparator $nodeComparator, PropertyFetchAnalyzer $propertyFetchAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; @@ -154,7 +150,7 @@ private function isParamUsedBeforeAssign(Variable $variable, array $firstParamAs private function shouldSkipParam(Param $matchedParam, Variable $assignedVariable, array $firstParamAsVariable) : bool { // already promoted - if ($matchedParam->flags !== 0) { + if ($matchedParam->isPromoted()) { return \true; } return $this->isParamUsedBeforeAssign($assignedVariable, $firstParamAsVariable); diff --git a/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyResolver.php b/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyResolver.php index 8876bb45f..d9e4ca4ed 100644 --- a/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyResolver.php +++ b/vendor/rector/rector/rules/Php80/NodeAnalyzer/PromotedPropertyResolver.php @@ -20,7 +20,7 @@ public function resolveFromClass(Class_ $class) : array } $promotedPropertyParams = []; foreach ($constructClassMethod->getParams() as $param) { - if ($param->flags === 0) { + if (!$param->isPromoted()) { continue; } $promotedPropertyParams[] = $param; diff --git a/vendor/rector/rector/rules/Php80/NodeAnalyzer/SwitchAnalyzer.php b/vendor/rector/rector/rules/Php80/NodeAnalyzer/SwitchAnalyzer.php index 2c0510477..09b178a1a 100644 --- a/vendor/rector/rector/rules/Php80/NodeAnalyzer/SwitchAnalyzer.php +++ b/vendor/rector/rector/rules/Php80/NodeAnalyzer/SwitchAnalyzer.php @@ -16,14 +16,12 @@ final class SwitchAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; public function __construct(NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -76,9 +74,7 @@ public function hasEachCaseSingleStmt(Switch_ $switch) : bool if (!$case->cond instanceof Expr) { continue; } - $stmtsWithoutBreak = \array_filter($case->stmts, static function (Node $node) : bool { - return !$node instanceof Break_; - }); + $stmtsWithoutBreak = \array_filter($case->stmts, static fn(Node $node): bool => !$node instanceof Break_); if (\count($stmtsWithoutBreak) !== 1) { return \false; } @@ -89,9 +85,7 @@ public function hasDefaultSingleStmt(Switch_ $switch) : bool { foreach ($switch->cases as $case) { if (!$case->cond instanceof Expr) { - $stmtsWithoutBreak = \array_filter($case->stmts, static function (Node $node) : bool { - return !$node instanceof Break_; - }); + $stmtsWithoutBreak = \array_filter($case->stmts, static fn(Node $node): bool => !$node instanceof Break_); return \count($stmtsWithoutBreak) === 1; } } diff --git a/vendor/rector/rector/rules/Php80/NodeFactory/AttrGroupsFactory.php b/vendor/rector/rector/rules/Php80/NodeFactory/AttrGroupsFactory.php index 5825b6aa9..eb045493f 100644 --- a/vendor/rector/rector/rules/Php80/NodeFactory/AttrGroupsFactory.php +++ b/vendor/rector/rector/rules/Php80/NodeFactory/AttrGroupsFactory.php @@ -11,9 +11,8 @@ final class AttrGroupsFactory { /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory) { $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; diff --git a/vendor/rector/rector/rules/Php80/NodeFactory/MatchArmsFactory.php b/vendor/rector/rector/rules/Php80/NodeFactory/MatchArmsFactory.php index fd2139999..62b1a9308 100644 --- a/vendor/rector/rector/rules/Php80/NodeFactory/MatchArmsFactory.php +++ b/vendor/rector/rector/rules/Php80/NodeFactory/MatchArmsFactory.php @@ -3,8 +3,10 @@ declare (strict_types=1); namespace Rector\Php80\NodeFactory; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; use PhpParser\Node\MatchArm; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php80\ValueObject\CondAndExpr; final class MatchArmsFactory { @@ -15,14 +17,14 @@ final class MatchArmsFactory public function createFromCondAndExprs(array $condAndExprs) : array { $matchArms = []; - foreach ($condAndExprs as $condAndExpr) { + foreach ($condAndExprs as $key => $condAndExpr) { $expr = $condAndExpr->getExpr(); if ($expr instanceof Assign) { - // $this->assignExpr = $expr->var; $expr = $expr->expr; } + /** @var null|list $condExprs */ $condExprs = $condAndExpr->getCondExprs(); - $matchArms[] = new MatchArm($condExprs, $expr); + $matchArms[] = new MatchArm($condExprs, $expr, [AttributeKey::COMMENTS => $condAndExprs[$key]->getComments()]); } return $matchArms; } diff --git a/vendor/rector/rector/rules/Php80/NodeFactory/MatchFactory.php b/vendor/rector/rector/rules/Php80/NodeFactory/MatchFactory.php index b7d532d2e..e19d1af32 100644 --- a/vendor/rector/rector/rules/Php80/NodeFactory/MatchFactory.php +++ b/vendor/rector/rector/rules/Php80/NodeFactory/MatchFactory.php @@ -9,8 +9,8 @@ use PhpParser\Node\Expr\Match_; use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; -use PhpParser\Node\Stmt\Throw_ as ThrowsStmt; use Rector\Php80\Enum\MatchKind; use Rector\Php80\NodeAnalyzer\MatchSwitchAnalyzer; use Rector\Php80\ValueObject\CondAndExpr; @@ -20,19 +20,16 @@ final class MatchFactory { /** * @readonly - * @var \Rector\Php80\NodeFactory\MatchArmsFactory */ - private $matchArmsFactory; + private \Rector\Php80\NodeFactory\MatchArmsFactory $matchArmsFactory; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\MatchSwitchAnalyzer */ - private $matchSwitchAnalyzer; + private MatchSwitchAnalyzer $matchSwitchAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; public function __construct(\Rector\Php80\NodeFactory\MatchArmsFactory $matchArmsFactory, MatchSwitchAnalyzer $matchSwitchAnalyzer, NodeComparator $nodeComparator) { $this->matchArmsFactory = $matchArmsFactory; @@ -48,8 +45,8 @@ public function createFromCondAndExprs(Expr $condExpr, array $condAndExprs, ?Stm // is default value missing? maybe it can be found in next stmt if (!$this->matchSwitchAnalyzer->hasCondsAndExprDefaultValue($condAndExprs)) { // 1. is followed by throws stmts? - if ($nextStmt instanceof ThrowsStmt) { - $throw = new Throw_($nextStmt->expr); + if ($nextStmt instanceof Expression && $nextStmt->expr instanceof Throw_) { + $throw = $nextStmt->expr; $condAndExprs[] = new CondAndExpr([], $throw, MatchKind::RETURN); $shouldRemoteNextStmt = \true; } @@ -65,7 +62,7 @@ public function createFromCondAndExprs(Expr $condExpr, array $condAndExprs, ?Stm return null; } $shouldRemoteNextStmt = !$expr instanceof Expr; - $condAndExprs[] = new CondAndExpr([], $nextStmt->expr, MatchKind::RETURN); + $condAndExprs[] = new CondAndExpr([], $nextStmt->expr, MatchKind::RETURN, $nextStmt->getComments()); } } $matchArms = $this->matchArmsFactory->createFromCondAndExprs($condAndExprs); diff --git a/vendor/rector/rector/rules/Php80/NodeFactory/NestedAttrGroupsFactory.php b/vendor/rector/rector/rules/Php80/NodeFactory/NestedAttrGroupsFactory.php index 8c391ae5a..a2a1bdf4f 100644 --- a/vendor/rector/rector/rules/Php80/NodeFactory/NestedAttrGroupsFactory.php +++ b/vendor/rector/rector/rules/Php80/NodeFactory/NestedAttrGroupsFactory.php @@ -11,9 +11,8 @@ final class NestedAttrGroupsFactory { /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpNestedAttributeGroupFactory */ - private $phpNestedAttributeGroupFactory; + private PhpNestedAttributeGroupFactory $phpNestedAttributeGroupFactory; public function __construct(PhpNestedAttributeGroupFactory $phpNestedAttributeGroupFactory) { $this->phpNestedAttributeGroupFactory = $phpNestedAttributeGroupFactory; diff --git a/vendor/rector/rector/rules/Php80/NodeManipulator/AttributeGroupNamedArgumentManipulator.php b/vendor/rector/rector/rules/Php80/NodeManipulator/AttributeGroupNamedArgumentManipulator.php index 7d0af0549..b93de8fd2 100644 --- a/vendor/rector/rector/rules/Php80/NodeManipulator/AttributeGroupNamedArgumentManipulator.php +++ b/vendor/rector/rector/rules/Php80/NodeManipulator/AttributeGroupNamedArgumentManipulator.php @@ -12,7 +12,7 @@ final class AttributeGroupNamedArgumentManipulator * @var ConverterAttributeDecoratorInterface[] * @readonly */ - private $converterAttributeDecorators; + private array $converterAttributeDecorators; /** * @param ConverterAttributeDecoratorInterface[] $converterAttributeDecorators */ diff --git a/vendor/rector/rector/rules/Php80/NodeResolver/SwitchExprsResolver.php b/vendor/rector/rector/rules/Php80/NodeResolver/SwitchExprsResolver.php index 858944c03..2db0d5f64 100644 --- a/vendor/rector/rector/rules/Php80/NodeResolver/SwitchExprsResolver.php +++ b/vendor/rector/rector/rules/Php80/NodeResolver/SwitchExprsResolver.php @@ -5,12 +5,12 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Stmt\Break_; use PhpParser\Node\Stmt\Case_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; -use PhpParser\Node\Stmt\Throw_; use Rector\Php80\Enum\MatchKind; use Rector\Php80\ValueObject\CondAndExpr; final class SwitchExprsResolver @@ -32,7 +32,7 @@ public function resolve(Switch_ $switch) : array continue; } if (!$case->cond instanceof Expr) { - continue; + return []; } $collectionEmptyCasesCond[$key] = $case->cond; } @@ -41,6 +41,7 @@ public function resolve(Switch_ $switch) : array continue; } $expr = $case->stmts[0]; + $comments = $expr->getComments(); if ($expr instanceof Expression) { $expr = $expr->expr; } @@ -57,19 +58,18 @@ public function resolve(Switch_ $switch) : array $condExprs = $emptyCasesCond; $condExprs[] = $case->cond; } - if ($expr instanceof Return_) { + if ($expr instanceof Throw_) { + $condAndExpr[] = new CondAndExpr($condExprs, $expr, MatchKind::THROW, $comments); + } elseif ($expr instanceof Return_) { $returnedExpr = $expr->expr; if (!$returnedExpr instanceof Expr) { return []; } - $condAndExpr[] = new CondAndExpr($condExprs, $returnedExpr, MatchKind::RETURN); + $condAndExpr[] = new CondAndExpr($condExprs, $returnedExpr, MatchKind::RETURN, $comments); } elseif ($expr instanceof Assign) { - $condAndExpr[] = new CondAndExpr($condExprs, $expr, MatchKind::ASSIGN); + $condAndExpr[] = new CondAndExpr($condExprs, $expr, MatchKind::ASSIGN, $comments); } elseif ($expr instanceof Expr) { - $condAndExpr[] = new CondAndExpr($condExprs, $expr, MatchKind::NORMAL); - } elseif ($expr instanceof Throw_) { - $throwExpr = new Expr\Throw_($expr->expr); - $condAndExpr[] = new CondAndExpr($condExprs, $throwExpr, MatchKind::THROW); + $condAndExpr[] = new CondAndExpr($condExprs, $expr, MatchKind::NORMAL, $comments); } else { return []; } diff --git a/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php b/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php index f7cf1be4f..d12f41819 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php @@ -22,19 +22,16 @@ final class RemoveUnusedVariableInCatchRector extends AbstractRector implements { /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\ExprUsedInNodeAnalyzer */ - private $exprUsedInNodeAnalyzer; + private ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer; public function __construct(StmtsManipulator $stmtsManipulator, BetterNodeFinder $betterNodeFinder, ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer) { $this->stmtsManipulator = $stmtsManipulator; @@ -43,7 +40,7 @@ public function __construct(StmtsManipulator $stmtsManipulator, BetterNodeFinder } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Remove unused variable in catch()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove unused variable in `catch()`', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function run() @@ -94,9 +91,7 @@ public function refactor(Node $node) : ?Node } /** @var string $variableName */ $variableName = $this->getName($caughtVar); - $isFoundInCatchStmts = (bool) $this->betterNodeFinder->findFirst($catch->stmts, function (Node $subNode) use($caughtVar) : bool { - return $this->exprUsedInNodeAnalyzer->isUsed($subNode, $caughtVar); - }); + $isFoundInCatchStmts = (bool) $this->betterNodeFinder->findFirst($catch->stmts, fn(Node $subNode): bool => $this->exprUsedInNodeAnalyzer->isUsed($subNode, $caughtVar)); if ($isFoundInCatchStmts) { continue; } diff --git a/vendor/rector/rector/rules/Php80/Rector/ClassConstFetch/ClassOnThisVariableObjectRector.php b/vendor/rector/rector/rules/Php80/Rector/ClassConstFetch/ClassOnThisVariableObjectRector.php index 84e4fc931..65d755c48 100644 --- a/vendor/rector/rector/rules/Php80/Rector/ClassConstFetch/ClassOnThisVariableObjectRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/ClassConstFetch/ClassOnThisVariableObjectRector.php @@ -9,8 +9,7 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -21,7 +20,7 @@ * * @see \Rector\Tests\Php80\Rector\ClassConstFetch\ClassOnThisVariableObjectRector\ClassOnThisVariableObjectRectorTest */ -final class ClassOnThisVariableObjectRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ClassOnThisVariableObjectRector extends AbstractRector implements MinPhpVersionInterface { public function getRuleDefinition() : RuleDefinition { @@ -55,7 +54,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { $className = $node->isFinal() ? 'self' : 'static'; $hasChanged = \false; diff --git a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php index 0eeafe72a..6bce3bf69 100644 --- a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php @@ -33,29 +33,24 @@ final class AddParamBasedOnParentClassMethodRector extends AbstractRector implem { /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, AstResolver $astResolver, BetterStandardPrinter $betterStandardPrinter, BetterNodeFinder $betterNodeFinder, ReflectionResolver $reflectionResolver) { $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; @@ -112,7 +107,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if ($this->nodeNameResolver->isName($node, MethodName::CONSTRUCT)) { + if ($this->isName($node, MethodName::CONSTRUCT)) { return null; } $parentMethodReflection = $this->parentClassMethodTypeOverrideGuard->getParentClassMethod($node); @@ -123,7 +118,7 @@ public function refactor(Node $node) : ?Node return null; } $currentClassReflection = $this->reflectionResolver->resolveClassReflection($node); - $isPDO = $currentClassReflection instanceof ClassReflection && $currentClassReflection->isSubclassOf('PDO'); + $isPDO = $currentClassReflection instanceof ClassReflection && $currentClassReflection->is('PDO'); // It relies on phpstorm stubs that define 2 kind of query method for both php 7.4 and php 8.0 // @see https://github.com/JetBrains/phpstorm-stubs/blob/e2e898a29929d2f520fe95bdb2109d8fa895ba4a/PDO/PDO.php#L1096-L1126 if ($isPDO && $parentMethodReflection->getName() === 'query') { @@ -179,7 +174,7 @@ private function processReplaceClassMethodParams(ClassMethod $node, ClassMethod $originalParams = $node->params; foreach ($parentClassMethodParams as $key => $parentClassMethodParam) { if (isset($currentClassMethodParams[$key])) { - $currentParamName = $this->nodeNameResolver->getName($currentClassMethodParams[$key]); + $currentParamName = $this->getName($currentClassMethodParams[$key]); $collectParamNamesNextKey = $this->collectParamNamesNextKey($parentClassMethod, $key); if (\in_array($currentParamName, $collectParamNamesNextKey, \true)) { $node->params = $originalParams; @@ -201,7 +196,7 @@ private function processReplaceClassMethodParams(ClassMethod $node, ClassMethod if ($paramDefault instanceof Expr) { $paramDefault = $this->nodeFactory->createReprintedNode($paramDefault); } - $paramName = $this->nodeNameResolver->getName($parentClassMethodParam); + $paramName = $this->getName($parentClassMethodParam); $paramType = $this->resolveParamType($parentClassMethodParam); $node->params[$key] = new Param(new Variable($paramName), $paramDefault, $paramType, $parentClassMethodParam->byRef, $parentClassMethodParam->variadic, [], $parentClassMethodParam->flags); if ($parentClassMethodParam->attrGroups !== []) { @@ -216,7 +211,7 @@ private function processReplaceClassMethodParams(ClassMethod $node, ClassMethod */ private function resolveParamType(Param $param) { - if ($param->type === null) { + if (!$param->type instanceof Node) { return null; } return $this->nodeFactory->createReprintedNode($param->type); @@ -229,7 +224,7 @@ private function collectParamNamesNextKey(ClassMethod $classMethod, int $key) : $paramNames = []; foreach ($classMethod->params as $paramKey => $param) { if ($paramKey > $key) { - $paramNames[] = $this->nodeNameResolver->getName($param); + $paramNames[] = $this->getName($param); } } return $paramNames; diff --git a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php index 8b81738d5..1d110daa4 100644 --- a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php @@ -19,9 +19,8 @@ final class FinalPrivateToPrivateVisibilityRector extends AbstractRector impleme { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; public function __construct(VisibilityManipulator $visibilityManipulator) { $this->visibilityManipulator = $visibilityManipulator; @@ -32,7 +31,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Changes method visibility from final private to only private', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change method visibility from final private to only private', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { final private function getter() { diff --git a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php index edcbee9df..b22a8ee5f 100644 --- a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php @@ -19,9 +19,8 @@ final class SetStateToStaticRector extends AbstractRector implements MinPhpVersi { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; public function __construct(VisibilityManipulator $visibilityManipulator) { $this->visibilityManipulator = $visibilityManipulator; @@ -32,7 +31,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Adds static visibility to __set_state() methods', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Add `static` visibility to `__set_state()` methods', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function __set_state($properties) { diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php b/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php index 2406a14e2..6615b62d3 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php @@ -16,7 +16,10 @@ use PhpParser\Node\Stmt\Use_; use PHPStan\PhpDocParser\Ast\Node as DocNode; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode; +use PHPStan\Reflection\ReflectionProvider; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; @@ -29,6 +32,7 @@ use Rector\Php80\NodeFactory\AttrGroupsFactory; use Rector\Php80\NodeManipulator\AttributeGroupNamedArgumentManipulator; use Rector\Php80\ValueObject\AnnotationToAttribute; +use Rector\Php80\ValueObject\AttributeValueAndDocComment; use Rector\Php80\ValueObject\DoctrineTagAndAnnotationToAttribute; use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; @@ -37,58 +41,59 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\AnnotationToAttributeRectorTest * @see \Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Php81NestedAttributesRectorTest + * @see \Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\MultipleCallAnnotationToAttributeRectorTest */ final class AnnotationToAttributeRector extends AbstractRector implements ConfigurableRectorInterface, MinPhpVersionInterface { /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\Php80\NodeFactory\AttrGroupsFactory */ - private $attrGroupsFactory; + private AttrGroupsFactory $attrGroupsFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Php80\NodeManipulator\AttributeGroupNamedArgumentManipulator */ - private $attributeGroupNamedArgumentManipulator; + private AttributeGroupNamedArgumentManipulator $attributeGroupNamedArgumentManipulator; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private ReflectionProvider $reflectionProvider; + /** + * @readonly + */ + private \Rector\Php80\Rector\Class_\AttributeValueResolver $attributeValueResolver; /** * @var AnnotationToAttribute[] */ - private $annotationsToAttributes = []; - public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, AttrGroupsFactory $attrGroupsFactory, PhpDocTagRemover $phpDocTagRemover, AttributeGroupNamedArgumentManipulator $attributeGroupNamedArgumentManipulator, UseImportsResolver $useImportsResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) + private array $annotationsToAttributes = []; + public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, AttrGroupsFactory $attrGroupsFactory, PhpDocTagRemover $phpDocTagRemover, AttributeGroupNamedArgumentManipulator $attributeGroupNamedArgumentManipulator, UseImportsResolver $useImportsResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ReflectionProvider $reflectionProvider, \Rector\Php80\Rector\Class_\AttributeValueResolver $attributeValueResolver) { $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->attrGroupsFactory = $attrGroupsFactory; @@ -98,6 +103,8 @@ public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->reflectionProvider = $reflectionProvider; + $this->attributeValueResolver = $attributeValueResolver; } public function getRuleDefinition() : RuleDefinition { @@ -147,11 +154,11 @@ public function refactor(Node $node) : ?Node return null; } $uses = $this->useImportsResolver->resolveBareUses(); - // 1. bare tags without annotation class, e.g. "@require" - $genericAttributeGroups = $this->processGenericTags($phpDocInfo); - // 2. Doctrine annotation classes + // 1. Doctrine annotation classes $annotationAttributeGroups = $this->processDoctrineAnnotationClasses($phpDocInfo, $uses); - $attributeGroups = \array_merge($genericAttributeGroups, $annotationAttributeGroups); + // 2. bare tags without annotation class, e.g. "@require" + $genericAttributeGroups = $this->processGenericTags($phpDocInfo); + $attributeGroups = \array_merge($annotationAttributeGroups, $genericAttributeGroups); if ($attributeGroups === []) { return null; } @@ -167,12 +174,27 @@ public function refactor(Node $node) : ?Node public function configure(array $configuration) : void { Assert::allIsAOf($configuration, AnnotationToAttribute::class); - $this->annotationsToAttributes = $configuration; + $this->annotationsToAttributes = $this->resolveWithChangedAttributesClass($configuration); } public function provideMinPhpVersion() : int { return PhpVersionFeature::ATTRIBUTES; } + /** + * @param AnnotationToAttribute[] $configuration + * @return AnnotationToAttribute[] $configuration + */ + private function resolveWithChangedAttributesClass(array $configuration) : array + { + foreach ($configuration as $config) { + /** @var AnnotationToAttribute $config */ + if ($config->getAttributeClass() !== $config->getTag()) { + // add to make sure apply after use statement changed + $configuration[] = new AnnotationToAttribute($config->getAttributeClass(), $config->getAttributeClass(), $config->getClassReferenceFields(), $config->getUseValueAsAttributeArgument()); + } + } + return $configuration; + } /** * @return AttributeGroup[] */ @@ -180,11 +202,11 @@ private function processGenericTags(PhpDocInfo $phpDocInfo) : array { $attributeGroups = []; $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (DocNode $docNode) use(&$attributeGroups) : ?int { + $phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', function (DocNode $docNode) use(&$attributeGroups) { if (!$docNode instanceof PhpDocTagNode) { return null; } - if (!$docNode->value instanceof GenericTagValueNode) { + if (!$docNode->value instanceof GenericTagValueNode && !$docNode->value instanceof DoctrineAnnotationTagValueNode) { return null; } $tag = \trim($docNode->name, '@'); @@ -194,10 +216,19 @@ private function processGenericTags(PhpDocInfo $phpDocInfo) : array } foreach ($this->annotationsToAttributes as $annotationToAttribute) { $desiredTag = $annotationToAttribute->getTag(); - if ($desiredTag !== $tag) { + if (\strtolower($desiredTag) !== \strtolower($tag)) { + continue; + } + // make sure the attribute class really exists to avoid error on early upgrade + if (!$this->reflectionProvider->hasClass($annotationToAttribute->getAttributeClass())) { continue; } - $attributeGroups[] = $this->phpAttributeGroupFactory->createFromSimpleTag($annotationToAttribute); + $attributeValueAndDocComment = $this->attributeValueResolver->resolve($annotationToAttribute, $docNode); + $attributeGroups[] = $this->phpAttributeGroupFactory->createFromSimpleTag($annotationToAttribute, $attributeValueAndDocComment instanceof AttributeValueAndDocComment ? $attributeValueAndDocComment->attributeValue : null); + // keep partial original comment, if useful + if ($attributeValueAndDocComment instanceof AttributeValueAndDocComment && $attributeValueAndDocComment->docComment) { + return new PhpDocTextNode($attributeValueAndDocComment->docComment); + } return PhpDocNodeTraverser::NODE_REMOVE; } return null; @@ -227,6 +258,13 @@ private function processDoctrineAnnotationClasses(PhpDocInfo $phpDocInfo, array if (!$annotationToAttribute instanceof AnnotationToAttribute) { continue; } + if ($annotationToAttribute->getUseValueAsAttributeArgument()) { + /* Will be processed by processGenericTags instead */ + continue; + } + if (!$this->isExistingAttributeClass($annotationToAttribute)) { + continue; + } $doctrineTagAndAnnotationToAttributes[] = new DoctrineTagAndAnnotationToAttribute($doctrineTagValueNode, $annotationToAttribute); $doctrineTagValueNodes[] = $doctrineTagValueNode; } @@ -249,4 +287,14 @@ private function matchAnnotationToAttribute(DoctrineAnnotationTagValueNode $doct } return null; } + private function isExistingAttributeClass(AnnotationToAttribute $annotationToAttribute) : bool + { + // make sure the attribute class really exists to avoid error on early upgrade + if (!$this->reflectionProvider->hasClass($annotationToAttribute->getAttributeClass())) { + return \false; + } + // make sure the class is marked as attribute + $classReflection = $this->reflectionProvider->getClass($annotationToAttribute->getAttributeClass()); + return $classReflection->isAttributeClass(); + } } diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/AttributeValueResolver.php b/vendor/rector/rector/rules/Php80/Rector/Class_/AttributeValueResolver.php new file mode 100644 index 000000000..e6cbeea99 --- /dev/null +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/AttributeValueResolver.php @@ -0,0 +1,68 @@ +getUseValueAsAttributeArgument()) { + return null; + } + $docValue = (string) $phpDocTagNode->value; + if ($phpDocTagNode->value instanceof DoctrineAnnotationTagValueNode) { + $originalContent = (string) $phpDocTagNode->value->getOriginalContent(); + if ($docValue === '') { + $attributeComment = (string) $phpDocTagNode->value->getAttribute(AttributeKey::ATTRIBUTE_COMMENT); + if ($originalContent === $attributeComment) { + $docValue = $originalContent; + } + } else { + $attributeComment = \ltrim($originalContent, $docValue); + if ($attributeComment !== '') { + $docValue .= "\n" . $attributeComment; + } + } + } + $docComment = ''; + // special case for newline + if (\strpos($docValue, "\n") !== \false) { + $keepJoining = \true; + $docValueLines = NewLineSplitter::split($docValue); + $joinDocValue = ''; + $hasPreviousEndSlash = \false; + foreach ($docValueLines as $key => $docValueLine) { + if ($keepJoining) { + $joinDocValue .= \rtrim($docValueLine, '\\\\'); + } + if (Strings::match($docValueLine, self::END_SLASH_REGEX) === null) { + if ($hasPreviousEndSlash === \false && $key > 0) { + if ($docComment === '') { + $docComment .= $docValueLine; + } else { + $docComment .= "\n * " . $docValueLine; + } + } + $keepJoining = \false; + } else { + $hasPreviousEndSlash = \true; + } + } + $docValue = $joinDocValue; + } + return new AttributeValueAndDocComment($docValue, $docComment); + } +} diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php b/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php index b404f5ef5..7d84c3636 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\FunctionLike; use PhpParser\Node\Identifier; use PhpParser\Node\NullableType; use PhpParser\Node\Param; @@ -14,6 +15,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PhpParser\Node\UnionType; +use PhpParser\NodeVisitor; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\MixedType; @@ -44,54 +46,44 @@ final class ClassPropertyAssignToConstructorPromotionRector extends AbstractRect { /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PromotedPropertyCandidateResolver */ - private $promotedPropertyCandidateResolver; + private PromotedPropertyCandidateResolver $promotedPropertyCandidateResolver; /** * @readonly - * @var \Rector\Naming\VariableRenamer */ - private $variableRenamer; + private VariableRenamer $variableRenamer; /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\Php80\DocBlock\PropertyPromotionDocBlockMerger */ - private $propertyPromotionDocBlockMerger; + private PropertyPromotionDocBlockMerger $propertyPromotionDocBlockMerger; /** * @readonly - * @var \Rector\Php80\Guard\MakePropertyPromotionGuard */ - private $makePropertyPromotionGuard; + private MakePropertyPromotionGuard $makePropertyPromotionGuard; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\Naming\PropertyRenamer\PropertyPromotionRenamer */ - private $propertyPromotionRenamer; + private PropertyPromotionRenamer $propertyPromotionRenamer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @api * @var string @@ -109,14 +101,12 @@ final class ClassPropertyAssignToConstructorPromotionRector extends AbstractRect * - protected/public modifier property when property typed * * Set to true will allow change whether property is typed or not as far as not forbidden, eg: callable type, null type, etc. - * @var bool */ - private $inlinePublic = \false; + private bool $inlinePublic = \false; /** * Set to false will skip property promotion when parameter and property have different names. - * @var bool */ - private $renameProperty = \true; + private bool $renameProperty = \true; public function __construct(PromotedPropertyCandidateResolver $promotedPropertyCandidateResolver, VariableRenamer $variableRenamer, ParamAnalyzer $paramAnalyzer, PropertyPromotionDocBlockMerger $propertyPromotionDocBlockMerger, MakePropertyPromotionGuard $makePropertyPromotionGuard, TypeComparator $typeComparator, ReflectionResolver $reflectionResolver, PropertyPromotionRenamer $propertyPromotionRenamer, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper) { $this->promotedPropertyCandidateResolver = $promotedPropertyCandidateResolver; @@ -185,6 +175,7 @@ public function refactor(Node $node) : ?Node if (!$classReflection instanceof ClassReflection) { return null; } + $hasChanged = \false; foreach ($promotionCandidates as $promotionCandidate) { $param = $promotionCandidate->getParam(); if ($this->shouldSkipParam($param)) { @@ -200,6 +191,7 @@ public function refactor(Node $node) : ?Node if (!$this->renameProperty && $paramName !== $propertyName) { continue; } + $hasChanged = \true; // remove property from class $propertyStmtKey = $property->getAttribute(AttributeKey::STMT_KEY); unset($node->stmts[$propertyStmtKey]); @@ -224,7 +216,10 @@ public function refactor(Node $node) : ?Node $this->processUnionType($property, $param); $this->propertyPromotionDocBlockMerger->mergePropertyAndParamDocBlocks($property, $param, $paramTagValueNode); // update variable to property fetch references - $this->traverseNodesWithCallable((array) $constructClassMethod->stmts, function (Node $node) use($promotionCandidate, $propertyName) : ?PropertyFetch { + $this->traverseNodesWithCallable((array) $constructClassMethod->stmts, function (Node $node) use($promotionCandidate, $propertyName) { + if ($node instanceof Class_ || $node instanceof FunctionLike) { + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } if (!$node instanceof Variable) { return null; } @@ -234,6 +229,9 @@ public function refactor(Node $node) : ?Node return new PropertyFetch(new Variable('this'), $propertyName); }); } + if (!$hasChanged) { + return null; + } return $node; } public function provideMinPhpVersion() : int diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php b/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php index b76df8908..cad19b931 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php @@ -14,12 +14,12 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer; use Rector\NodeAnalyzer\ClassAnalyzer; -use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer; +use Rector\TypeDeclaration\TypeInferer\SilentVoidResolver; use Rector\ValueObject\MethodName; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -32,38 +32,31 @@ final class StringableForToStringRector extends AbstractRector implements MinPhp { /** * @readonly - * @var \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer */ - private $familyRelationsAnalyzer; + private FamilyRelationsAnalyzer $familyRelationsAnalyzer; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private SilentVoidResolver $silentVoidResolver; /** * @var string */ private const STRINGABLE = 'Stringable'; - /** - * @var bool - */ - private $hasChanged = \false; - public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer, BetterNodeFinder $betterNodeFinder) + private bool $hasChanged = \false; + public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer, SilentVoidResolver $silentVoidResolver) { $this->familyRelationsAnalyzer = $familyRelationsAnalyzer; $this->returnTypeInferer = $returnTypeInferer; $this->classAnalyzer = $classAnalyzer; - $this->betterNodeFinder = $betterNodeFinder; + $this->silentVoidResolver = $silentVoidResolver; } public function provideMinPhpVersion() : int { @@ -111,7 +104,7 @@ public function refactor(Node $node) : ?Node return null; } $this->hasChanged = \false; - // warning, classes that implements __toString() will return Stringable interface even if they don't implemen it + // warning, classes that implements __toString() will return Stringable interface even if they don't implement it // reflection cannot be used for real detection $classLikeAncestorNames = $this->familyRelationsAnalyzer->getClassLikeAncestorNames($node); $isAncestorHasStringable = \in_array(self::STRINGABLE, $classLikeAncestorNames, \true); @@ -125,7 +118,7 @@ public function refactor(Node $node) : ?Node $this->hasChanged = \true; } // add return type - if ($toStringClassMethod->returnType === null) { + if (!$toStringClassMethod->returnType instanceof Node) { $toStringClassMethod->returnType = new Identifier('string'); $this->hasChanged = \true; } @@ -139,8 +132,7 @@ private function processNotStringType(ClassMethod $toStringClassMethod) : void if ($toStringClassMethod->isAbstract()) { return; } - $hasReturn = $this->betterNodeFinder->hasInstancesOfInFunctionLikeScoped($toStringClassMethod, Return_::class); - if (!$hasReturn) { + if ($this->silentVoidResolver->hasSilentVoid($toStringClassMethod)) { $emptyStringReturn = new Return_(new String_('')); $toStringClassMethod->stmts[] = $emptyStringReturn; $this->hasChanged = \true; @@ -148,7 +140,7 @@ private function processNotStringType(ClassMethod $toStringClassMethod) : void } $this->traverseNodesWithCallable((array) $toStringClassMethod->stmts, function (Node $subNode) : ?int { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Return_) { return null; diff --git a/vendor/rector/rector/rules/Php80/Rector/FuncCall/ClassOnObjectRector.php b/vendor/rector/rector/rules/Php80/Rector/FuncCall/ClassOnObjectRector.php index b65302d45..a3894c9c3 100644 --- a/vendor/rector/rector/rules/Php80/Rector/FuncCall/ClassOnObjectRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/FuncCall/ClassOnObjectRector.php @@ -51,7 +51,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if (!$this->nodeNameResolver->isName($node, 'get_class')) { + if (!$this->isName($node, 'get_class')) { return null; } if ($node->isFirstClassCallable()) { diff --git a/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php b/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php index 76d93eb81..c21f09d2a 100644 --- a/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php @@ -6,59 +6,20 @@ use PhpParser\Node; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; -use PHPStan\Reflection\ClassReflection; -use PHPStan\Type\MixedType; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\DeadCode\PhpDoc\TagRemover\ParamTagRemover; -use Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\Php80\Rector\FunctionLike\MixedTypeRector\MixedTypeRectorTest + * @deprecated Instead blindly filling `mixed` type, use "typeDeclarations" set with explicit types. */ -final class MixedTypeRector extends AbstractRector implements MinPhpVersionInterface +final class MixedTypeRector extends AbstractRector implements MinPhpVersionInterface, DeprecatedInterface { - /** - * @readonly - * @var \Rector\Reflection\ReflectionResolver - */ - private $reflectionResolver; - /** - * @readonly - * @var \Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer - */ - private $classChildAnalyzer; - /** - * @readonly - * @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, PhpDocInfoFactory $phpDocInfoFactory) - { - $this->reflectionResolver = $reflectionResolver; - $this->classChildAnalyzer = $classChildAnalyzer; - $this->paramTagRemover = $paramTagRemover; - $this->phpDocInfoFactory = $phpDocInfoFactory; - } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change mixed docs type to mixed typed', [new CodeSample(<<<'CODE_SAMPLE' @@ -94,57 +55,10 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if ($node instanceof ClassMethod && $this->shouldSkipClassMethod($node)) { - return null; - } - $this->hasChanged = \false; - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); - $this->refactorParamTypes($node, $phpDocInfo); - $hasChanged = $this->paramTagRemover->removeParamTagsIfUseless($phpDocInfo, $node, new MixedType()); - if ($this->hasChanged) { - return $node; - } - if ($hasChanged) { - return $node; - } - return null; + throw new ShouldNotHappenException(\sprintf('The `%s` is removed. Use "typeDeclarations" set in rector.php instead, to avoid filling mixed on better known types.', self::class)); } public function provideMinPhpVersion() : int { return PhpVersionFeature::MIXED_TYPE; } - private function shouldSkipClassMethod(ClassMethod $classMethod) : bool - { - $classReflection = $this->reflectionResolver->resolveClassReflection($classMethod); - if (!$classReflection instanceof ClassReflection) { - return \false; - } - $methodName = $this->nodeNameResolver->getName($classMethod); - return $this->classChildAnalyzer->hasParentClassMethod($classReflection, $methodName); - } - /** - * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure|\PhpParser\Node\Expr\ArrowFunction $functionLike - */ - private function refactorParamTypes($functionLike, PhpDocInfo $phpDocInfo) : void - { - foreach ($functionLike->params as $param) { - if ($param->type instanceof Node) { - continue; - } - $paramName = (string) $this->getName($param->var); - $paramTagValue = $phpDocInfo->getParamTagValueByName($paramName); - if (!$paramTagValue instanceof ParamTagValueNode) { - continue; - } - $paramType = $phpDocInfo->getParamType($paramName); - if (!$paramType instanceof MixedType) { - continue; - } - $this->hasChanged = \true; - $param->type = new Identifier('mixed'); - if ($param->flags !== 0) { - $param->setAttribute(AttributeKey::ORIGINAL_NODE, null); - } - } - } } diff --git a/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php b/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php index 7da261144..0dd2b8858 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php @@ -14,7 +14,7 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\UnaryMinus; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\NodeAnalyzer\BinaryOpAnalyzer; use Rector\PhpParser\Node\Value\ValueResolver; @@ -33,14 +33,12 @@ final class StrEndsWithRector extends AbstractRector implements MinPhpVersionInt { /** * @readonly - * @var \Rector\NodeAnalyzer\BinaryOpAnalyzer */ - private $binaryOpAnalyzer; + private BinaryOpAnalyzer $binaryOpAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(BinaryOpAnalyzer $binaryOpAnalyzer, ValueResolver $valueResolver) { $this->binaryOpAnalyzer = $binaryOpAnalyzer; @@ -52,7 +50,7 @@ public function provideMinPhpVersion() : int } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change helper functions to str_ends_with()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change helper functions to `str_ends_with()`', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() @@ -188,7 +186,7 @@ private function isUnaryMinusStrlenFuncCallArgValue(Expr $substrOffset, Expr $ne return \false; } $funcCall = $substrOffset->expr; - if (!$this->nodeNameResolver->isName($funcCall, 'strlen')) { + if (!$this->isName($funcCall, 'strlen')) { return \false; } if (!isset($funcCall->getArgs()[0])) { @@ -204,7 +202,7 @@ private function isHardCodedLNumberAndString(Expr $substrOffset, Expr $needle) : if (!$substrOffset instanceof UnaryMinus) { return \false; } - if (!$substrOffset->expr instanceof LNumber) { + if (!$substrOffset->expr instanceof Int_) { return \false; } $lNumber = $substrOffset->expr; diff --git a/vendor/rector/rector/rules/Php80/Rector/Identical/StrStartsWithRector.php b/vendor/rector/rector/rules/Php80/Rector/Identical/StrStartsWithRector.php index 4aafdb0ca..ea4386c6c 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Identical/StrStartsWithRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Identical/StrStartsWithRector.php @@ -28,7 +28,7 @@ final class StrStartsWithRector extends AbstractRector implements MinPhpVersionI /** * @var StrStartWithMatchAndRefactorInterface[] */ - private $strStartWithMatchAndRefactors = []; + private array $strStartWithMatchAndRefactors = []; public function __construct(StrncmpMatchAndRefactor $strncmpMatchAndRefactor, SubstrMatchAndRefactor $substrMatchAndRefactor, StrposMatchAndRefactor $strposMatchAndRefactor) { $this->strStartWithMatchAndRefactors = [$strncmpMatchAndRefactor, $substrMatchAndRefactor, $strposMatchAndRefactor]; diff --git a/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php b/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php index 274a590be..9f4a33b72 100644 --- a/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php @@ -13,7 +13,7 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; @@ -29,9 +29,8 @@ final class StrContainsRector extends AbstractRector implements MinPhpVersionInt { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var string[] */ @@ -133,7 +132,7 @@ private function matchIdenticalOrNotIdenticalToFalse($expr) : ?FuncCall } private function isIntegerZero(Expr $expr) : bool { - if (!$expr instanceof LNumber) { + if (!$expr instanceof Int_) { return \false; } return $expr->value === 0; diff --git a/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php b/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php index fc2dae064..c880b6d7c 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php @@ -30,7 +30,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php80\Rector\Property\NestedAnnotationToAttributeRector\NestedAnnotationToAttributeRectorTest */ @@ -38,38 +38,32 @@ final class NestedAnnotationToAttributeRector extends AbstractRector implements { /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Php80\NodeFactory\NestedAttrGroupsFactory */ - private $nestedAttrGroupsFactory; + private NestedAttrGroupsFactory $nestedAttrGroupsFactory; /** * @readonly - * @var \Rector\PostRector\Collector\UseNodesToAddCollector */ - private $useNodesToAddCollector; + private UseNodesToAddCollector $useNodesToAddCollector; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var NestedAnnotationToAttribute[] */ - private $nestedAnnotationsToAttributes = []; + private array $nestedAnnotationsToAttributes = []; public function __construct(UseImportsResolver $useImportsResolver, PhpDocTagRemover $phpDocTagRemover, NestedAttrGroupsFactory $nestedAttrGroupsFactory, UseNodesToAddCollector $useNodesToAddCollector, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->useImportsResolver = $useImportsResolver; @@ -81,7 +75,7 @@ public function __construct(UseImportsResolver $useImportsResolver, PhpDocTagRem } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Changed nested annotations to attributes', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change nested annotations to attributes', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' use Doctrine\ORM\Mapping as ORM; class SomeEntity diff --git a/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php b/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php index 5b3a489c0..bc9a1d3a9 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php @@ -15,11 +15,13 @@ use PhpParser\Node\Stmt\Switch_; use PHPStan\Type\ObjectType; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\Php80\NodeAnalyzer\MatchSwitchAnalyzer; use Rector\Php80\NodeFactory\MatchFactory; use Rector\Php80\NodeResolver\SwitchExprsResolver; use Rector\Php80\ValueObject\CondAndExpr; use Rector\Php80\ValueObject\MatchResult; +use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -32,28 +34,35 @@ final class ChangeSwitchToMatchRector extends AbstractRector implements MinPhpVe { /** * @readonly - * @var \Rector\Php80\NodeResolver\SwitchExprsResolver */ - private $switchExprsResolver; + private SwitchExprsResolver $switchExprsResolver; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\MatchSwitchAnalyzer */ - private $matchSwitchAnalyzer; + private MatchSwitchAnalyzer $matchSwitchAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeFactory\MatchFactory */ - private $matchFactory; - public function __construct(SwitchExprsResolver $switchExprsResolver, MatchSwitchAnalyzer $matchSwitchAnalyzer, MatchFactory $matchFactory) + private MatchFactory $matchFactory; + /** + * @readonly + */ + private ValueResolver $valueResolver; + /** + * @readonly + */ + private ExprAnalyzer $exprAnalyzer; + public function __construct(SwitchExprsResolver $switchExprsResolver, MatchSwitchAnalyzer $matchSwitchAnalyzer, MatchFactory $matchFactory, ValueResolver $valueResolver, ExprAnalyzer $exprAnalyzer) { $this->switchExprsResolver = $switchExprsResolver; $this->matchSwitchAnalyzer = $matchSwitchAnalyzer; $this->matchFactory = $matchFactory; + $this->valueResolver = $valueResolver; + $this->exprAnalyzer = $exprAnalyzer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change switch() to match()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `switch()` to `match()`', [new CodeSample(<<<'CODE_SAMPLE' switch ($input) { case Lexer::T_SELECT: $statement = 'select'; @@ -112,22 +121,12 @@ public function refactor(Node $node) : ?Node } $match = $matchResult->getMatch(); if ($matchResult->shouldRemoveNextStmt() && $isReturn) { - /** @var Return_ $returnStatement */ - $returnStatement = $node->stmts[$key + 1]; - $returnComment = $returnStatement->getComments(); - if ($returnComment !== []) { - foreach ($match->arms as $arm) { - if ($arm->conds === null) { - $this->mirrorComments($arm, $returnStatement); - break; - } - } - } unset($node->stmts[$key + 1]); } $assignVar = $this->resolveAssignVar($condAndExprs); $hasDefaultValue = $this->matchSwitchAnalyzer->hasDefaultValue($match); $this->castMatchCond($match); + $this->mirrorDynamicBoolExpr($match); if ($assignVar instanceof Expr) { if (!$hasDefaultValue) { continue; @@ -141,6 +140,12 @@ public function refactor(Node $node) : ?Node if (!$hasDefaultValue) { continue; } + foreach ($match->arms as $arm) { + if ($arm->conds === null) { + continue; + } + $arm->conds = \array_values($arm->conds); + } $node->stmts[$key] = $isReturn ? new Return_($match) : new Expression($match); $this->mirrorComments($node->stmts[$key], $stmt); $hasChanged = \true; @@ -184,6 +189,34 @@ private function castMatchCond(Match_ $match) : void $match->cond = $newMatchCond; } } + private function mirrorDynamicBoolExpr(Match_ $match) : void + { + // switch(true) already just use + // switch(false) is dead code that can be on purpose + if ($this->valueResolver->isTrueOrFalse($match->cond)) { + return; + } + $isChanged = \false; + foreach ($match->arms as $arm) { + if ($arm->conds === null) { + continue; + } + foreach ($arm->conds as $cond) { + if ($this->exprAnalyzer->isBoolExpr($cond) || $this->exprAnalyzer->isCallLikeReturnNativeBool($cond)) { + // dont' stop lookup for dynamic conditions + // continue verify other condition, in case of mixed condition + $isChanged = \true; + continue; + } + // return early here, as condition is mixed + // we need another real use case for mixed conditions of dynamic + non-dynamic case expr + return; + } + } + if ($isChanged) { + $match->cond = $this->nodeFactory->createTrue(); + } + } /** * @param CondAndExpr[] $condAndExprs */ diff --git a/vendor/rector/rector/rules/Php80/Rector/Ternary/GetDebugTypeRector.php b/vendor/rector/rector/rules/Php80/Rector/Ternary/GetDebugTypeRector.php index 6b72ebc31..57ba17e08 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Ternary/GetDebugTypeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Ternary/GetDebugTypeRector.php @@ -85,7 +85,7 @@ private function shouldSkip(Ternary $ternary) : bool if (!isset($ternary->cond->getArgs()[0])) { return \true; } - if (!$this->nodeNameResolver->isName($ternary->cond, 'is_object')) { + if (!$this->isName($ternary->cond, 'is_object')) { return \true; } if (!$ternary->if instanceof FuncCall) { @@ -94,7 +94,7 @@ private function shouldSkip(Ternary $ternary) : bool } return $this->shouldSkipClassConstFetch($ternary->if); } - if (!$this->nodeNameResolver->isName($ternary->if, 'get_class')) { + if (!$this->isName($ternary->if, 'get_class')) { return \true; } if (!$ternary->else instanceof FuncCall) { @@ -103,7 +103,7 @@ private function shouldSkip(Ternary $ternary) : bool if ($ternary->else->isFirstClassCallable()) { return \true; } - return !$this->nodeNameResolver->isName($ternary->else, 'gettype'); + return !$this->isName($ternary->else, 'gettype'); } private function shouldSkipClassConstFetch(ClassConstFetch $classConstFetch) : bool { diff --git a/vendor/rector/rector/rules/Php80/ValueObject/AnnotationPropertyToAttributeClass.php b/vendor/rector/rector/rules/Php80/ValueObject/AnnotationPropertyToAttributeClass.php index 856ac834c..faec5fe48 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/AnnotationPropertyToAttributeClass.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/AnnotationPropertyToAttributeClass.php @@ -8,9 +8,8 @@ final class AnnotationPropertyToAttributeClass { /** * @readonly - * @var string */ - private $attributeClass; + private string $attributeClass; /** * @readonly * @var int|string|null @@ -18,9 +17,8 @@ final class AnnotationPropertyToAttributeClass private $annotationProperty = null; /** * @readonly - * @var bool */ - private $doesNeedNewImport = \false; + private bool $doesNeedNewImport = \false; /** * @param string|int|null $annotationProperty */ diff --git a/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php b/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php index c53430308..235d6e874 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/AnnotationToAttribute.php @@ -5,32 +5,35 @@ use Rector\Php80\Contract\ValueObject\AnnotationToAttributeInterface; use Rector\Validation\RectorAssert; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class AnnotationToAttribute implements AnnotationToAttributeInterface { /** * @readonly - * @var string */ - private $tag; + private string $tag; /** * @readonly - * @var string|null */ - private $attributeClass; + private ?string $attributeClass = null; /** * @var string[] * @readonly */ - private $classReferenceFields = []; + private array $classReferenceFields = []; + /** + * @readonly + */ + private bool $useValueAsAttributeArgument = \false; /** * @param string[] $classReferenceFields */ - public function __construct(string $tag, ?string $attributeClass = null, array $classReferenceFields = []) + public function __construct(string $tag, ?string $attributeClass = null, array $classReferenceFields = [], bool $useValueAsAttributeArgument = \false) { $this->tag = $tag; $this->attributeClass = $attributeClass; $this->classReferenceFields = $classReferenceFields; + $this->useValueAsAttributeArgument = $useValueAsAttributeArgument; RectorAssert::className($tag); if (\is_string($attributeClass)) { RectorAssert::className($attributeClass); @@ -55,4 +58,8 @@ public function getClassReferenceFields() : array { return $this->classReferenceFields; } + public function getUseValueAsAttributeArgument() : bool + { + return $this->useValueAsAttributeArgument; + } } diff --git a/vendor/rector/rector/rules/Php80/ValueObject/AttributeValueAndDocComment.php b/vendor/rector/rector/rules/Php80/ValueObject/AttributeValueAndDocComment.php new file mode 100644 index 000000000..d6948d1d0 --- /dev/null +++ b/vendor/rector/rector/rules/Php80/ValueObject/AttributeValueAndDocComment.php @@ -0,0 +1,21 @@ +attributeValue = $attributeValue; + $this->docComment = $docComment; + } +} diff --git a/vendor/rector/rector/rules/Php80/ValueObject/CondAndExpr.php b/vendor/rector/rector/rules/Php80/ValueObject/CondAndExpr.php index 214e4da73..7314316bd 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/CondAndExpr.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/CondAndExpr.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\Php80\ValueObject; +use PhpParser\Comment; use PhpParser\Node\Expr; use Rector\Php80\Enum\MatchKind; final class CondAndExpr @@ -14,23 +15,29 @@ final class CondAndExpr private $condExprs; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $expr; + private Expr $expr; /** * @var MatchKind::* * @readonly */ - private $matchKind; + private string $matchKind; + /** + * @var Comment[] + * @readonly + */ + private array $comments = []; /** * @param Expr[]|null $condExprs * @param MatchKind::* $matchKind + * @param Comment[] $comments */ - public function __construct(?array $condExprs, Expr $expr, string $matchKind) + public function __construct(?array $condExprs, Expr $expr, string $matchKind, array $comments = []) { $this->condExprs = $condExprs; $this->expr = $expr; $this->matchKind = $matchKind; + $this->comments = $comments; } public function getExpr() : Expr { @@ -45,7 +52,10 @@ public function getCondExprs() : ?array if ($this->condExprs === []) { return null; } - return $this->condExprs; + if ($this->condExprs === null) { + return null; + } + return \array_values($this->condExprs); } /** * @return MatchKind::* @@ -61,4 +71,11 @@ public function equalsMatchKind(string $matchKind) : bool { return $this->matchKind === $matchKind; } + /** + * @return Comment[] + */ + public function getComments() : array + { + return $this->comments; + } } diff --git a/vendor/rector/rector/rules/Php80/ValueObject/DoctrineTagAndAnnotationToAttribute.php b/vendor/rector/rector/rules/Php80/ValueObject/DoctrineTagAndAnnotationToAttribute.php index b65c78d15..7df25a0de 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/DoctrineTagAndAnnotationToAttribute.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/DoctrineTagAndAnnotationToAttribute.php @@ -8,14 +8,12 @@ final class DoctrineTagAndAnnotationToAttribute { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode */ - private $doctrineAnnotationTagValueNode; + private DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode; /** * @readonly - * @var \Rector\Php80\ValueObject\AnnotationToAttribute */ - private $annotationToAttribute; + private \Rector\Php80\ValueObject\AnnotationToAttribute $annotationToAttribute; public function __construct(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode, \Rector\Php80\ValueObject\AnnotationToAttribute $annotationToAttribute) { $this->doctrineAnnotationTagValueNode = $doctrineAnnotationTagValueNode; diff --git a/vendor/rector/rector/rules/Php80/ValueObject/MatchResult.php b/vendor/rector/rector/rules/Php80/ValueObject/MatchResult.php index 9dfa1131b..4f3ff80c5 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/MatchResult.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/MatchResult.php @@ -8,14 +8,12 @@ final class MatchResult { /** * @readonly - * @var \PhpParser\Node\Expr\Match_ */ - private $match; + private Match_ $match; /** * @readonly - * @var bool */ - private $shouldRemoveNextStmt; + private bool $shouldRemoveNextStmt; public function __construct(Match_ $match, bool $shouldRemoveNextStmt) { $this->match = $match; diff --git a/vendor/rector/rector/rules/Php80/ValueObject/NestedAnnotationToAttribute.php b/vendor/rector/rector/rules/Php80/ValueObject/NestedAnnotationToAttribute.php index de17df860..45e34e773 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/NestedAnnotationToAttribute.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/NestedAnnotationToAttribute.php @@ -9,18 +9,16 @@ final class NestedAnnotationToAttribute implements AnnotationToAttributeInterfac { /** * @readonly - * @var string */ - private $tag; + private string $tag; /** * @readonly - * @var bool */ - private $removeOriginal = \false; + private bool $removeOriginal = \false; /** * @var AnnotationPropertyToAttributeClass[] */ - private $annotationPropertiesToAttributeClasses = []; + private array $annotationPropertiesToAttributeClasses = []; /** * @param array|string[]|AnnotationPropertyToAttributeClass[] $annotationPropertiesToAttributeClasses */ diff --git a/vendor/rector/rector/rules/Php80/ValueObject/NestedDoctrineTagAndAnnotationToAttribute.php b/vendor/rector/rector/rules/Php80/ValueObject/NestedDoctrineTagAndAnnotationToAttribute.php index adea5de65..561ac54a4 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/NestedDoctrineTagAndAnnotationToAttribute.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/NestedDoctrineTagAndAnnotationToAttribute.php @@ -8,14 +8,12 @@ final class NestedDoctrineTagAndAnnotationToAttribute { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode */ - private $doctrineAnnotationTagValueNode; + private DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode; /** * @readonly - * @var \Rector\Php80\ValueObject\NestedAnnotationToAttribute */ - private $nestedAnnotationToAttribute; + private \Rector\Php80\ValueObject\NestedAnnotationToAttribute $nestedAnnotationToAttribute; public function __construct(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode, \Rector\Php80\ValueObject\NestedAnnotationToAttribute $nestedAnnotationToAttribute) { $this->doctrineAnnotationTagValueNode = $doctrineAnnotationTagValueNode; diff --git a/vendor/rector/rector/rules/Php80/ValueObject/PropertyPromotionCandidate.php b/vendor/rector/rector/rules/Php80/ValueObject/PropertyPromotionCandidate.php index 2854d883d..a1bcafe83 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/PropertyPromotionCandidate.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/PropertyPromotionCandidate.php @@ -13,19 +13,16 @@ final class PropertyPromotionCandidate { /** * @readonly - * @var \PhpParser\Node\Stmt\Property */ - private $property; + private Property $property; /** * @readonly - * @var \PhpParser\Node\Param */ - private $param; + private Param $param; /** * @readonly - * @var \PhpParser\Node\Stmt\Expression */ - private $expression; + private Expression $expression; public function __construct(Property $property, Param $param, Expression $expression) { $this->property = $property; diff --git a/vendor/rector/rector/rules/Php80/ValueObject/StrStartsWith.php b/vendor/rector/rector/rules/Php80/ValueObject/StrStartsWith.php index 90ececd2f..db70edab6 100644 --- a/vendor/rector/rector/rules/Php80/ValueObject/StrStartsWith.php +++ b/vendor/rector/rector/rules/Php80/ValueObject/StrStartsWith.php @@ -9,24 +9,20 @@ final class StrStartsWith { /** * @readonly - * @var \PhpParser\Node\Expr\FuncCall */ - private $funcCall; + private FuncCall $funcCall; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $haystackExpr; + private Expr $haystackExpr; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $needleExpr; + private Expr $needleExpr; /** * @readonly - * @var bool */ - private $isPositive; + private bool $isPositive; public function __construct(FuncCall $funcCall, Expr $haystackExpr, Expr $needleExpr, bool $isPositive) { $this->funcCall = $funcCall; diff --git a/vendor/rector/rector/rules/Php81/NodeAnalyzer/CoalesePropertyAssignMatcher.php b/vendor/rector/rector/rules/Php81/NodeAnalyzer/CoalescePropertyAssignMatcher.php similarity index 89% rename from vendor/rector/rector/rules/Php81/NodeAnalyzer/CoalesePropertyAssignMatcher.php rename to vendor/rector/rector/rules/Php81/NodeAnalyzer/CoalescePropertyAssignMatcher.php index 3e1667eff..2a5b4f470 100644 --- a/vendor/rector/rector/rules/Php81/NodeAnalyzer/CoalesePropertyAssignMatcher.php +++ b/vendor/rector/rector/rules/Php81/NodeAnalyzer/CoalescePropertyAssignMatcher.php @@ -11,18 +11,16 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use Rector\NodeNameResolver\NodeNameResolver; -final class CoalesePropertyAssignMatcher +final class CoalescePropertyAssignMatcher { /** * @readonly - * @var \Rector\Php81\NodeAnalyzer\ComplexNewAnalyzer */ - private $complexNewAnalyzer; + private \Rector\Php81\NodeAnalyzer\ComplexNewAnalyzer $complexNewAnalyzer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(\Rector\Php81\NodeAnalyzer\ComplexNewAnalyzer $complexNewAnalyzer, NodeNameResolver $nodeNameResolver) { $this->complexNewAnalyzer = $complexNewAnalyzer; diff --git a/vendor/rector/rector/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php b/vendor/rector/rector/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php index 599a9f4c1..43254ba49 100644 --- a/vendor/rector/rector/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php +++ b/vendor/rector/rector/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\Php81\NodeAnalyzer; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name\FullyQualified; use Rector\NodeAnalyzer\ExprAnalyzer; @@ -13,9 +13,8 @@ final class ComplexNewAnalyzer { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; diff --git a/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php b/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php index ad71d2996..994866358 100644 --- a/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php +++ b/vendor/rector/rector/rules/Php81/NodeFactory/EnumFactory.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\Php81\NodeFactory; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\BuilderFactory; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassConst; @@ -26,29 +26,24 @@ final class EnumFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \PhpParser\BuilderFactory */ - private $builderFactory; + private BuilderFactory $builderFactory; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @var string * @see https://stackoverflow.com/a/2560017 @@ -163,10 +158,10 @@ private function collectMappings(array $items, array $mapping) : array if (!$item instanceof ArrayItem) { continue; } - if (!$item->key instanceof LNumber && !$item->key instanceof String_) { + if (!$item->key instanceof Int_ && !$item->key instanceof String_) { continue; } - if (!$item->value instanceof LNumber && !$item->value instanceof String_) { + if (!$item->value instanceof Int_ && !$item->value instanceof String_) { continue; } $mapping[$item->key->value] = $item->value->value; @@ -178,9 +173,7 @@ private function collectMappings(array $items, array $mapping) : array */ private function getIdentifierTypeFromMappings(array $mapping) : string { - $callableGetType = static function ($value) : string { - return \gettype($value); - }; + $callableGetType = static fn($value): string => \gettype($value); $valueTypes = \array_map($callableGetType, $mapping); $uniqueValueTypes = \array_unique($valueTypes); if (\count($uniqueValueTypes) === 1) { diff --git a/vendor/rector/rector/rules/Php81/NodeManipulator/AttributeGroupNewLiner.php b/vendor/rector/rector/rules/Php81/NodeManipulator/AttributeGroupNewLiner.php new file mode 100644 index 000000000..17b5c307d --- /dev/null +++ b/vendor/rector/rector/rules/Php81/NodeManipulator/AttributeGroupNewLiner.php @@ -0,0 +1,49 @@ +getOldTokens(); + $startTokenPos = $node->getStartTokenPos(); + if (!isset($oldTokens[$startTokenPos])) { + return; + } + if ($oldTokens[$startTokenPos]->text !== '#[') { + return; + } + $iteration = 1; + $lastKey = \array_key_last($node->attrGroups); + if ($lastKey === null) { + return; + } + $lastAttributeTokenPos = $node->attrGroups[$lastKey]->getEndTokenPos(); + while (isset($oldTokens[$startTokenPos + $iteration])) { + if ($startTokenPos + $iteration === $lastAttributeTokenPos) { + if ($oldTokens[$startTokenPos + $iteration]->text !== ']') { + break; + } + if (\trim($oldTokens[$startTokenPos + $iteration + 1]->text ?? '') === '') { + $space = \ltrim($oldTokens[$startTokenPos + $iteration + 1]->text ?? '', "\r\n"); + } elseif (\trim($oldTokens[$startTokenPos - 1]->text ?? '') === '') { + $space = \ltrim($oldTokens[$startTokenPos - 1]->text ?? '', "\r\n"); + } else { + $space = ''; + } + $oldTokens[$startTokenPos + $iteration]->text = "]\n" . $space; + break; + } + ++$iteration; + } + } +} diff --git a/vendor/rector/rector/rules/Php81/Rector/Array_/FirstClassCallableRector.php b/vendor/rector/rector/rules/Php81/Rector/Array_/FirstClassCallableRector.php index 4ef676e4e..19ba1adac 100644 --- a/vendor/rector/rector/rules/Php81/Rector/Array_/FirstClassCallableRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/Array_/FirstClassCallableRector.php @@ -13,13 +13,14 @@ use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\Property; use PhpParser\Node\VariadicPlaceholder; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use Rector\NodeCollector\NodeAnalyzer\ArrayCallableMethodMatcher; use Rector\NodeCollector\ValueObject\ArrayCallable; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; use Rector\ValueObject\PhpVersion; @@ -29,23 +30,20 @@ /** * @see \Rector\Tests\Php81\Rector\Array_\FirstClassCallableRector\FirstClassCallableRectorTest */ -final class FirstClassCallableRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class FirstClassCallableRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeCollector\NodeAnalyzer\ArrayCallableMethodMatcher */ - private $arrayCallableMethodMatcher; + private ArrayCallableMethodMatcher $arrayCallableMethodMatcher; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ArrayCallableMethodMatcher $arrayCallableMethodMatcher, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver) { $this->arrayCallableMethodMatcher = $arrayCallableMethodMatcher; @@ -94,11 +92,12 @@ public function getNodeTypes() : array * @param Property|ClassConst|Array_ $node * @return int|null|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall */ - public function refactorWithScope(Node $node, Scope $scope) + public function refactor(Node $node) { if ($node instanceof Property || $node instanceof ClassConst) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } + $scope = ScopeFetcher::fetch($node); $arrayCallable = $this->arrayCallableMethodMatcher->match($node, $scope); if (!$arrayCallable instanceof ArrayCallable) { return null; diff --git a/vendor/rector/rector/rules/Php81/Rector/ClassMethod/NewInInitializerRector.php b/vendor/rector/rector/rules/Php81/Rector/ClassMethod/NewInInitializerRector.php index 3108c5c42..065a2913e 100644 --- a/vendor/rector/rector/rules/Php81/Rector/ClassMethod/NewInInitializerRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/ClassMethod/NewInInitializerRector.php @@ -4,6 +4,7 @@ namespace Rector\Php81\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Coalesce; use PhpParser\Node\NullableType; use PhpParser\Node\Param; @@ -13,7 +14,7 @@ use PHPStan\Reflection\ClassReflection; use Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer; use Rector\NodeManipulator\StmtsManipulator; -use Rector\Php81\NodeAnalyzer\CoalesePropertyAssignMatcher; +use Rector\Php81\NodeAnalyzer\CoalescePropertyAssignMatcher; use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\MethodName; @@ -28,29 +29,25 @@ final class NewInInitializerRector extends AbstractRector implements MinPhpVersi { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer */ - private $classChildAnalyzer; + private ClassChildAnalyzer $classChildAnalyzer; /** * @readonly - * @var \Rector\Php81\NodeAnalyzer\CoalesePropertyAssignMatcher */ - private $coalesePropertyAssignMatcher; + private CoalescePropertyAssignMatcher $coalescePropertyAssignMatcher; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; - public function __construct(ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, CoalesePropertyAssignMatcher $coalesePropertyAssignMatcher, StmtsManipulator $stmtsManipulator) + private StmtsManipulator $stmtsManipulator; + public function __construct(ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, CoalescePropertyAssignMatcher $coalescePropertyAssignMatcher, StmtsManipulator $stmtsManipulator) { $this->reflectionResolver = $reflectionResolver; $this->classChildAnalyzer = $classChildAnalyzer; - $this->coalesePropertyAssignMatcher = $coalesePropertyAssignMatcher; + $this->coalescePropertyAssignMatcher = $coalescePropertyAssignMatcher; $this->stmtsManipulator = $stmtsManipulator; } public function getRuleDefinition() : RuleDefinition @@ -105,19 +102,14 @@ public function refactor(Node $node) : ?Node return null; } $hasChanged = \false; - // stmts variable defined to avoid unset overlap when used via array_slice() on - // StmtsManipulator::isVariableUsedInNextStmt() - // @see https://github.com/rectorphp/rector-src/pull/5968 - // @see https://3v4l.org/eojhk - $stmts = (array) $constructClassMethod->stmts; foreach ((array) $constructClassMethod->stmts as $key => $stmt) { foreach ($params as $param) { $paramName = $this->getName($param); - $coalesce = $this->coalesePropertyAssignMatcher->matchCoalesceAssignsToLocalPropertyNamed($stmt, $paramName); + $coalesce = $this->coalescePropertyAssignMatcher->matchCoalesceAssignsToLocalPropertyNamed($stmt, $paramName); if (!$coalesce instanceof Coalesce) { continue; } - if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmts, $key + 1, $paramName)) { + if ($this->stmtsManipulator->isVariableUsedInNextStmt($constructClassMethod, $key + 1, $paramName)) { continue; } /** @var NullableType $currentParamType */ @@ -155,7 +147,7 @@ private function resolveParams(ClassMethod $classMethod) : array private function isOverrideAbstractMethod(ClassMethod $classMethod) : bool { $classReflection = $this->reflectionResolver->resolveClassReflection($classMethod); - $methodName = $this->nodeNameResolver->getName($classMethod); + $methodName = $this->getName($classMethod); return $classReflection instanceof ClassReflection && $this->classChildAnalyzer->hasAbstractParentClassMethod($classReflection, $methodName); } private function processPropertyPromotion(Class_ $class, Param $param, string $paramName) : void @@ -182,8 +174,18 @@ private function matchConstructorParams(ClassMethod $classMethod) : array if ($classMethod->stmts === null || $classMethod->stmts === []) { return []; } - return \array_filter($classMethod->params, static function (Param $param) : bool { - return $param->type instanceof NullableType; - }); + $params = \array_filter($classMethod->params, static fn(Param $param): bool => $param->type instanceof NullableType); + if ($params === []) { + return $params; + } + $totalParams = \count($classMethod->params); + foreach (\array_keys($params) as $key) { + for ($iteration = $key + 1; $iteration < $totalParams; ++$iteration) { + if (isset($classMethod->params[$iteration]) && !$classMethod->params[$iteration]->default instanceof Expr) { + return []; + } + } + } + return $params; } } diff --git a/vendor/rector/rector/rules/Php81/Rector/Class_/MyCLabsClassToEnumRector.php b/vendor/rector/rector/rules/Php81/Rector/Class_/MyCLabsClassToEnumRector.php index 79547d9b9..2972a8e64 100644 --- a/vendor/rector/rector/rules/Php81/Rector/Class_/MyCLabsClassToEnumRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/Class_/MyCLabsClassToEnumRector.php @@ -19,9 +19,8 @@ final class MyCLabsClassToEnumRector extends AbstractRector implements MinPhpVer { /** * @readonly - * @var \Rector\Php81\NodeFactory\EnumFactory */ - private $enumFactory; + private EnumFactory $enumFactory; public function __construct(EnumFactory $enumFactory) { $this->enumFactory = $enumFactory; diff --git a/vendor/rector/rector/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php b/vendor/rector/rector/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php index 6bba6f0ee..2e6e6471f 100644 --- a/vendor/rector/rector/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php @@ -21,17 +21,13 @@ final class SpatieEnumClassToEnumRector extends AbstractRector implements MinPhp { /** * @readonly - * @var \Rector\Php81\NodeFactory\EnumFactory */ - private $enumFactory; + private EnumFactory $enumFactory; /** * @var string */ public const TO_UPPER_SNAKE_CASE = 'toUpperSnakeCase'; - /** - * @var bool - */ - private $toUpperSnakeCase = \false; + private bool $toUpperSnakeCase = \false; public function __construct(EnumFactory $enumFactory) { $this->enumFactory = $enumFactory; diff --git a/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php b/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php index 93ef873e6..906a1bbe2 100644 --- a/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php @@ -11,13 +11,13 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\FunctionReflection; +use PHPStan\Reflection\Native\ExtendedNativeParameterReflection; use PHPStan\Reflection\Native\NativeFunctionReflection; -use PHPStan\Reflection\Native\NativeParameterWithPhpDocsReflection; use PHPStan\Reflection\ParametersAcceptor; use PHPStan\Type\ErrorType; use PHPStan\Type\MixedType; @@ -43,24 +43,20 @@ final class NullToStrictStringFuncCallArgRector extends AbstractRector implement { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ReflectionResolver $reflectionResolver, ArgsAnalyzer $argsAnalyzer, PropertyFetchAnalyzer $propertyFetchAnalyzer, ValueResolver $valueResolver) { $this->reflectionResolver = $reflectionResolver; @@ -144,14 +140,14 @@ public function provideMinPhpVersion() : int */ private function resolveNamedPositions(FuncCall $funcCall, array $args) : array { - $functionName = $this->nodeNameResolver->getName($funcCall); + $functionName = $this->getName($funcCall); $argNames = NameNullToStrictNullFunctionMap::FUNCTION_TO_PARAM_NAMES[$functionName]; $positions = []; foreach ($args as $position => $arg) { if (!$arg->name instanceof Identifier) { continue; } - if (!$this->nodeNameResolver->isNames($arg->name, $argNames)) { + if (!$this->isNames($arg->name, $argNames)) { continue; } $positions[] = $position; @@ -184,7 +180,7 @@ private function processNullToStrictStringOnNodePosition(FuncCall $funcCall, arr if ($this->shouldSkipType($type)) { return null; } - if ($argValue instanceof Encapsed) { + if ($argValue instanceof InterpolatedString) { return null; } if ($this->isAnErrorType($argValue, $nativeType, $scope)) { @@ -194,7 +190,7 @@ private function processNullToStrictStringOnNodePosition(FuncCall $funcCall, arr return null; } $parameter = $parametersAcceptor->getParameters()[$position] ?? null; - if ($parameter instanceof NativeParameterWithPhpDocsReflection && $parameter->getType() instanceof UnionType) { + if ($parameter instanceof ExtendedNativeParameterReflection && $parameter->getType() instanceof UnionType) { $parameterType = $parameter->getType(); if (!$this->isValidUnionType($parameterType)) { return null; @@ -222,7 +218,7 @@ private function isValidUnionType(Type $type) : bool } private function shouldSkipType(Type $type) : bool { - return !$type instanceof MixedType && !$type instanceof NullType && !$this->isValidUnionType($type); + return !$type instanceof MixedType && !$type->isNull()->yes() && !$this->isValidUnionType($type); } private function shouldSkipTrait(Expr $expr, Type $type, bool $isTrait) : bool { @@ -249,7 +245,7 @@ private function isAnErrorType(Expr $expr, Type $type, Scope $scope) : bool if ($parentScope instanceof Scope) { return $parentScope->getType($expr) instanceof ErrorType; } - return \false; + return $type instanceof MixedType && !$type->isExplicitMixed() && $type->getSubtractedType() instanceof NullType; } /** * @return int[]|string[] @@ -274,7 +270,7 @@ private function resolveOriginalPositions(FuncCall $funcCall, Scope $scope) : ar private function shouldSkip(FuncCall $funcCall) : bool { $functionNames = \array_keys(NameNullToStrictNullFunctionMap::FUNCTION_TO_PARAM_NAMES); - if (!$this->nodeNameResolver->isNames($funcCall, $functionNames)) { + if (!$this->isNames($funcCall, $functionNames)) { return \true; } return $funcCall->isFirstClassCallable(); diff --git a/vendor/rector/rector/rules/Php81/Rector/MethodCall/MyCLabsMethodCallToEnumConstRector.php b/vendor/rector/rector/rules/Php81/Rector/MethodCall/MyCLabsMethodCallToEnumConstRector.php index c1d0d4e8f..29c564a20 100644 --- a/vendor/rector/rector/rules/Php81/Rector/MethodCall/MyCLabsMethodCallToEnumConstRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/MethodCall/MyCLabsMethodCallToEnumConstRector.php @@ -26,9 +26,8 @@ final class MyCLabsMethodCallToEnumConstRector extends AbstractRector implements { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var string[] */ @@ -43,7 +42,7 @@ public function getRuleDefinition() : RuleDefinition $name = SomeEnum::VALUE()->getKey(); CODE_SAMPLE , <<<'CODE_SAMPLE' -$name = SomeEnum::VALUE; +$name = SomeEnum::VALUE->name; CODE_SAMPLE )]); } @@ -90,13 +89,16 @@ public function provideMinPhpVersion() : int } private function isEnumConstant(string $className, string $constant) : bool { + if (!$this->reflectionProvider->hasClass($className)) { + return \false; + } $classReflection = $this->reflectionProvider->getClass($className); return $classReflection->hasConstant($constant); } - private function refactorGetKeyMethodCall(MethodCall $methodCall) : ?ClassConstFetch + private function refactorGetKeyMethodCall(MethodCall $methodCall) : ?PropertyFetch { if (!$methodCall->var instanceof StaticCall) { - return null; + return $this->nodeFactory->createPropertyFetch($methodCall->var, 'name'); } $staticCall = $methodCall->var; $className = $this->getName($staticCall->class); @@ -110,12 +112,13 @@ private function refactorGetKeyMethodCall(MethodCall $methodCall) : ?ClassConstF if ($this->shouldOmitEnumCase($enumCaseName)) { return null; } - return $this->nodeFactory->createClassConstFetch($className, $enumCaseName); + $classConstFetch = $this->nodeFactory->createClassConstFetch($className, $enumCaseName); + return new PropertyFetch($classConstFetch, 'name'); } private function refactorGetValueMethodCall(MethodCall $methodCall) : ?PropertyFetch { if (!$methodCall->var instanceof StaticCall) { - return null; + return $this->nodeFactory->createPropertyFetch($methodCall->var, 'value'); } $staticCall = $methodCall->var; $className = $this->getName($staticCall->class); @@ -236,7 +239,7 @@ private function getEnumConstFetch(StaticCall $staticCall) : ?\PhpParser\Node\Ex return $this->nodeFactory->createClassConstFetch($className, $enumCaseName); } /** - * @return null|\PhpParser\Node\Expr\ClassConstFetch|\PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\BinaryOp\Identical + * @return null|\PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\BinaryOp\Identical */ private function refactorMethodCall(MethodCall $methodCall, string $methodName) { diff --git a/vendor/rector/rector/rules/Php81/Rector/New_/MyCLabsConstructorCallToEnumFromRector.php b/vendor/rector/rector/rules/Php81/Rector/New_/MyCLabsConstructorCallToEnumFromRector.php new file mode 100644 index 000000000..b2af37339 --- /dev/null +++ b/vendor/rector/rector/rules/Php81/Rector/New_/MyCLabsConstructorCallToEnumFromRector.php @@ -0,0 +1,88 @@ +reflectionProvider = $reflectionProvider; + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [New_::class]; + } + /** + * @param New_ $node + */ + public function refactor(Node $node) : ?Node + { + return $this->refactorConstructorCallToStaticFromCall($node); + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::ENUM; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Refactor MyCLabs Enum using constructor for instantiation', [new CodeSample(<<<'CODE_SAMPLE' +$enum = new Enum($args); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +$enum = Enum::from($args); +CODE_SAMPLE +)]); + } + private function refactorConstructorCallToStaticFromCall(New_ $new) : ?StaticCall + { + if (!$this->isObjectType($new->class, new ObjectType(self::MY_C_LABS_CLASS))) { + return null; + } + $classname = $this->getName($new->class); + if (\in_array($classname, [ObjectReference::SELF, ObjectReference::STATIC], \true)) { + $classname = ($nullsafeVariable1 = ScopeFetcher::fetch($new)->getClassReflection()) ? $nullsafeVariable1->getName() : null; + } + if ($classname === null) { + return null; + } + if (!$this->isMyCLabsConstructor($new, $classname)) { + return null; + } + return new StaticCall(new FullyQualified($classname), self::DEFAULT_ENUM_CONSTRUCTOR, $new->args); + } + private function isMyCLabsConstructor(New_ $new, string $classname) : bool + { + $classReflection = $this->reflectionProvider->getClass($classname); + if (!$classReflection->hasMethod(MethodName::CONSTRUCT)) { + return \true; + } + return $classReflection->getMethod(MethodName::CONSTRUCT, ScopeFetcher::fetch($new))->getDeclaringClass()->getName() === self::MY_C_LABS_CLASS; + } +} diff --git a/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php b/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php index 0fcf2aa06..0f01cac38 100644 --- a/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php @@ -13,7 +13,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\Scope; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; @@ -22,10 +22,11 @@ use Rector\NodeAnalyzer\ParamAnalyzer; use Rector\NodeManipulator\PropertyFetchAssignManipulator; use Rector\NodeManipulator\PropertyManipulator; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Php81\NodeManipulator\AttributeGroupNewLiner; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\Privatization\NodeManipulator\VisibilityManipulator; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\ValueObject\MethodName; use Rector\ValueObject\PhpVersionFeature; use Rector\ValueObject\Visibility; @@ -35,44 +36,41 @@ /** * @see \Rector\Tests\Php81\Rector\Property\ReadOnlyPropertyRector\ReadOnlyPropertyRectorTest */ -final class ReadOnlyPropertyRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReadOnlyPropertyRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeManipulator\PropertyManipulator */ - private $propertyManipulator; + private PropertyManipulator $propertyManipulator; /** * @readonly - * @var \Rector\NodeManipulator\PropertyFetchAssignManipulator */ - private $propertyFetchAssignManipulator; + private PropertyFetchAssignManipulator $propertyFetchAssignManipulator; /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; - public function __construct(PropertyManipulator $propertyManipulator, PropertyFetchAssignManipulator $propertyFetchAssignManipulator, ParamAnalyzer $paramAnalyzer, VisibilityManipulator $visibilityManipulator, BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) + private DocBlockUpdater $docBlockUpdater; + /** + * @readonly + */ + private AttributeGroupNewLiner $attributeGroupNewLiner; + public function __construct(PropertyManipulator $propertyManipulator, PropertyFetchAssignManipulator $propertyFetchAssignManipulator, ParamAnalyzer $paramAnalyzer, VisibilityManipulator $visibilityManipulator, BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater, AttributeGroupNewLiner $attributeGroupNewLiner) { $this->propertyManipulator = $propertyManipulator; $this->propertyFetchAssignManipulator = $propertyFetchAssignManipulator; @@ -81,6 +79,7 @@ public function __construct(PropertyManipulator $propertyManipulator, PropertyFe $this->betterNodeFinder = $betterNodeFinder; $this->phpDocInfoFactory = $phpDocInfoFactory; $this->docBlockUpdater = $docBlockUpdater; + $this->attributeGroupNewLiner = $attributeGroupNewLiner; } public function getRuleDefinition() : RuleDefinition { @@ -124,8 +123,9 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node)) { return null; } @@ -161,10 +161,13 @@ private function refactorProperty(Class_ $class, Property $property, Scope $scop if ($property->isReadonly()) { return null; } + if ($property->hooks !== []) { + return null; + } if ($property->props[0]->default instanceof Expr) { return null; } - if ($property->type === null) { + if (!$property->type instanceof Node) { return null; } if ($property->isStatic()) { @@ -182,7 +185,7 @@ private function refactorProperty(Class_ $class, Property $property, Scope $scop $this->visibilityManipulator->makeReadonly($property); $attributeGroups = $property->attrGroups; if ($attributeGroups !== []) { - $property->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $this->attributeGroupNewLiner->newLine($this->file, $property); } $this->removeReadOnlyDoc($property); return $property; @@ -211,16 +214,19 @@ private function refactorParam(Class_ $class, ClassMethod $classMethod, Param $p if (!$this->visibilityManipulator->hasVisibility($param, Visibility::PRIVATE)) { return null; } - if ($param->type === null) { + if (!$param->type instanceof Node) { return null; } // early check not property promotion and already readonly - if ($param->flags === 0 || $this->visibilityManipulator->isReadonly($param)) { + if (!$param->isPromoted() || $this->visibilityManipulator->isReadonly($param)) { return null; } if ($this->propertyManipulator->isPropertyChangeableExceptConstructor($class, $param, $scope)) { return null; } + if ($param->byRef) { + return null; + } if ($this->paramAnalyzer->isParamReassign($classMethod, $param)) { return null; } @@ -228,7 +234,7 @@ private function refactorParam(Class_ $class, ClassMethod $classMethod, Param $p return null; } if ($param->attrGroups !== []) { - $param->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $this->attributeGroupNewLiner->newLine($this->file, $param); } $this->visibilityManipulator->makeReadonly($param); $this->removeReadOnlyDoc($param); @@ -240,7 +246,7 @@ private function isPromotedPropertyAssigned(Class_ $class, Param $param) : bool if (!$constructClassMethod instanceof ClassMethod) { return \false; } - if ($param->flags === 0) { + if (!$param->isPromoted()) { return \false; } $propertyFetch = new PropertyFetch(new Variable('this'), $this->getName($param)); @@ -251,7 +257,7 @@ private function isPromotedPropertyAssigned(Class_ $class, Param $param) : bool } if ($this->nodeComparator->areNodesEqual($propertyFetch, $node->var)) { $isAssigned = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; }); diff --git a/vendor/rector/rector/rules/Php82/NodeManipulator/ReadonlyClassManipulator.php b/vendor/rector/rector/rules/Php82/NodeManipulator/ReadonlyClassManipulator.php new file mode 100644 index 000000000..89febab80 --- /dev/null +++ b/vendor/rector/rector/rules/Php82/NodeManipulator/ReadonlyClassManipulator.php @@ -0,0 +1,222 @@ +visibilityManipulator = $visibilityManipulator; + $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; + $this->reflectionProvider = $reflectionProvider; + $this->attributeGroupNewLiner = $attributeGroupNewLiner; + } + public function process(Class_ $class, File $file) : ?\PhpParser\Node\Stmt\Class_ + { + $scope = ScopeFetcher::fetch($class); + if ($this->shouldSkip($class, $scope)) { + return null; + } + $this->visibilityManipulator->makeReadonly($class); + $constructClassMethod = $class->getMethod(MethodName::CONSTRUCT); + if ($constructClassMethod instanceof ClassMethod) { + foreach ($constructClassMethod->getParams() as $param) { + $this->visibilityManipulator->removeReadonly($param); + if ($param->attrGroups !== []) { + $this->attributeGroupNewLiner->newLine($file, $param); + } + } + } + foreach ($class->getProperties() as $property) { + $this->visibilityManipulator->removeReadonly($property); + if ($property->attrGroups !== []) { + $this->attributeGroupNewLiner->newLine($file, $property); + } + } + if ($class->attrGroups !== []) { + $this->attributeGroupNewLiner->newLine($file, $class); + } + return $class; + } + /** + * @return ClassReflection[] + */ + private function resolveParentClassReflections(Scope $scope) : array + { + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return []; + } + return $classReflection->getParents(); + } + /** + * @param Property[] $properties + */ + private function hasNonTypedProperty(array $properties) : bool + { + foreach ($properties as $property) { + // properties of readonly class must always have type + if ($property->type === null) { + return \true; + } + } + return \false; + } + private function shouldSkip(Class_ $class, Scope $scope) : bool + { + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \true; + } + if ($this->shouldSkipClass($class)) { + return \true; + } + $parents = $this->resolveParentClassReflections($scope); + if (!$class->isAnonymous() && !$class->isFinal()) { + return !$this->isExtendsReadonlyClass($parents); + } + foreach ($parents as $parent) { + if (!$parent->isReadOnly()) { + return \true; + } + } + $properties = $class->getProperties(); + if ($this->hasWritableProperty($properties)) { + return \true; + } + if ($this->hasNonTypedProperty($properties)) { + return \true; + } + if ($this->shouldSkipConsumeTraitProperty($class)) { + return \true; + } + $constructClassMethod = $class->getMethod(MethodName::CONSTRUCT); + if (!$constructClassMethod instanceof ClassMethod) { + // no __construct means no property promotion, skip if class has no property defined + return $properties === []; + } + $params = $constructClassMethod->getParams(); + if ($params === []) { + // no params means no property promotion, skip if class has no property defined + return $properties === []; + } + return $this->shouldSkipParams($params); + } + private function shouldSkipConsumeTraitProperty(Class_ $class) : bool + { + $traitUses = $class->getTraitUses(); + foreach ($traitUses as $traitUse) { + foreach ($traitUse->traits as $trait) { + $traitName = $trait->toString(); + // trait not autoloaded + if (!$this->reflectionProvider->hasClass($traitName)) { + return \true; + } + $traitClassReflection = $this->reflectionProvider->getClass($traitName); + $nativeReflection = $traitClassReflection->getNativeReflection(); + if ($this->hasReadonlyProperty($nativeReflection->getProperties())) { + return \true; + } + } + } + return \false; + } + /** + * @param ReflectionProperty[] $properties + */ + private function hasReadonlyProperty(array $properties) : bool + { + foreach ($properties as $property) { + if (!$property->isReadOnly()) { + return \true; + } + } + return \false; + } + /** + * @param ClassReflection[] $parents + */ + private function isExtendsReadonlyClass(array $parents) : bool + { + foreach ($parents as $parent) { + if ($parent->isReadOnly()) { + return \true; + } + } + return \false; + } + /** + * @param Property[] $properties + */ + private function hasWritableProperty(array $properties) : bool + { + foreach ($properties as $property) { + if (!$property->isReadonly()) { + return \true; + } + } + return \false; + } + private function shouldSkipClass(Class_ $class) : bool + { + // need to have test fixture once feature added to nikic/PHP-Parser + if ($this->visibilityManipulator->hasVisibility($class, Visibility::READONLY)) { + return \true; + } + if ($this->phpAttributeAnalyzer->hasPhpAttribute($class, AttributeName::ALLOW_DYNAMIC_PROPERTIES)) { + return \true; + } + return $class->extends instanceof FullyQualified && !$this->reflectionProvider->hasClass($class->extends->toString()); + } + /** + * @param Param[] $params + */ + private function shouldSkipParams(array $params) : bool + { + foreach ($params as $param) { + // has non-readonly property promotion + if (!$this->visibilityManipulator->hasVisibility($param, Visibility::READONLY) && $param->isPromoted()) { + return \true; + } + // type is missing, invalid syntax + if ($param->type === null) { + return \true; + } + } + return \false; + } +} diff --git a/vendor/rector/rector/rules/Php82/Rector/Class_/ReadOnlyClassRector.php b/vendor/rector/rector/rules/Php82/Rector/Class_/ReadOnlyClassRector.php index a4d64529b..33400bdc0 100644 --- a/vendor/rector/rector/rules/Php82/Rector/Class_/ReadOnlyClassRector.php +++ b/vendor/rector/rector/rules/Php82/Rector/Class_/ReadOnlyClassRector.php @@ -4,58 +4,25 @@ namespace Rector\Php82\Rector\Class_; use PhpParser\Node; -use PhpParser\Node\Name\FullyQualified; -use PhpParser\Node\Param; use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Property; -use PHPStan\Analyser\Scope; -use PHPStan\BetterReflection\Reflection\Adapter\ReflectionProperty; -use PHPStan\Reflection\ClassReflection; -use PHPStan\Reflection\ReflectionProvider; -use Rector\NodeAnalyzer\ClassAnalyzer; -use Rector\NodeTypeResolver\Node\AttributeKey; -use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; -use Rector\Php81\Enum\AttributeName; -use Rector\Privatization\NodeManipulator\VisibilityManipulator; -use Rector\Rector\AbstractScopeAwareRector; -use Rector\ValueObject\MethodName; +use Rector\Php82\NodeManipulator\ReadonlyClassManipulator; +use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; -use Rector\ValueObject\Visibility; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php82\Rector\Class_\ReadOnlyClassRector\ReadOnlyClassRectorTest */ -final class ReadOnlyClassRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReadOnlyClassRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; - /** - * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator - */ - private $visibilityManipulator; - /** - * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer - */ - private $phpAttributeAnalyzer; - /** - * @readonly - * @var \PHPStan\Reflection\ReflectionProvider - */ - private $reflectionProvider; - public function __construct(ClassAnalyzer $classAnalyzer, VisibilityManipulator $visibilityManipulator, PhpAttributeAnalyzer $phpAttributeAnalyzer, ReflectionProvider $reflectionProvider) + private ReadonlyClassManipulator $readonlyClassManipulator; + public function __construct(ReadonlyClassManipulator $readonlyClassManipulator) { - $this->classAnalyzer = $classAnalyzer; - $this->visibilityManipulator = $visibilityManipulator; - $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; - $this->reflectionProvider = $reflectionProvider; + $this->readonlyClassManipulator = $readonlyClassManipulator; } public function getRuleDefinition() : RuleDefinition { @@ -89,187 +56,15 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { - if ($this->shouldSkip($node, $scope)) { + if ($node->isAnonymous()) { return null; } - $this->visibilityManipulator->makeReadonly($node); - $constructClassMethod = $node->getMethod(MethodName::CONSTRUCT); - if ($constructClassMethod instanceof ClassMethod) { - foreach ($constructClassMethod->getParams() as $param) { - $this->visibilityManipulator->removeReadonly($param); - if ($param->attrGroups !== []) { - // invoke reprint with correct newline - $param->setAttribute(AttributeKey::ORIGINAL_NODE, null); - } - } - } - foreach ($node->getProperties() as $property) { - $this->visibilityManipulator->removeReadonly($property); - if ($property->attrGroups !== []) { - // invoke reprint with correct newline - $property->setAttribute(AttributeKey::ORIGINAL_NODE, null); - } - } - if ($node->attrGroups !== []) { - // invoke reprint with correct readonly newline - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); - } - return $node; + return $this->readonlyClassManipulator->process($node, $this->file); } public function provideMinPhpVersion() : int { return PhpVersionFeature::READONLY_CLASS; } - /** - * @return ClassReflection[] - */ - private function resolveParentClassReflections(Scope $scope) : array - { - $classReflection = $scope->getClassReflection(); - if (!$classReflection instanceof ClassReflection) { - return []; - } - return $classReflection->getParents(); - } - /** - * @param Property[] $properties - */ - private function hasNonTypedProperty(array $properties) : bool - { - foreach ($properties as $property) { - // properties of readonly class must always have type - if ($property->type === null) { - return \true; - } - } - return \false; - } - private function shouldSkip(Class_ $class, Scope $scope) : bool - { - $classReflection = $scope->getClassReflection(); - if (!$classReflection instanceof ClassReflection) { - return \true; - } - if ($this->shouldSkipClass($class)) { - return \true; - } - $parents = $this->resolveParentClassReflections($scope); - if (!$class->isFinal()) { - return !$this->isExtendsReadonlyClass($parents); - } - foreach ($parents as $parent) { - if (!$parent->isReadOnly()) { - return \true; - } - } - $properties = $class->getProperties(); - if ($this->hasWritableProperty($properties)) { - return \true; - } - if ($this->hasNonTypedProperty($properties)) { - return \true; - } - if ($this->shouldSkipConsumeTraitProperty($class)) { - return \true; - } - $constructClassMethod = $class->getMethod(MethodName::CONSTRUCT); - if (!$constructClassMethod instanceof ClassMethod) { - // no __construct means no property promotion, skip if class has no property defined - return $properties === []; - } - $params = $constructClassMethod->getParams(); - if ($params === []) { - // no params means no property promotion, skip if class has no property defined - return $properties === []; - } - return $this->shouldSkipParams($params); - } - private function shouldSkipConsumeTraitProperty(Class_ $class) : bool - { - $traitUses = $class->getTraitUses(); - foreach ($traitUses as $traitUse) { - foreach ($traitUse->traits as $trait) { - $traitName = $trait->toString(); - // trait not autoloaded - if (!$this->reflectionProvider->hasClass($traitName)) { - return \true; - } - $traitClassReflection = $this->reflectionProvider->getClass($traitName); - $nativeReflection = $traitClassReflection->getNativeReflection(); - if ($this->hasReadonlyProperty($nativeReflection->getProperties())) { - return \true; - } - } - } - return \false; - } - /** - * @param ReflectionProperty[] $properties - */ - private function hasReadonlyProperty(array $properties) : bool - { - foreach ($properties as $property) { - if (!$property->isReadOnly()) { - return \true; - } - } - return \false; - } - /** - * @param ClassReflection[] $parents - */ - private function isExtendsReadonlyClass(array $parents) : bool - { - foreach ($parents as $parent) { - if ($parent->isReadOnly()) { - return \true; - } - } - return \false; - } - /** - * @param Property[] $properties - */ - private function hasWritableProperty(array $properties) : bool - { - foreach ($properties as $property) { - if (!$property->isReadonly()) { - return \true; - } - } - return \false; - } - private function shouldSkipClass(Class_ $class) : bool - { - // need to have test fixture once feature added to nikic/PHP-Parser - if ($this->visibilityManipulator->hasVisibility($class, Visibility::READONLY)) { - return \true; - } - if ($this->classAnalyzer->isAnonymousClass($class)) { - return \true; - } - if ($this->phpAttributeAnalyzer->hasPhpAttribute($class, AttributeName::ALLOW_DYNAMIC_PROPERTIES)) { - return \true; - } - return $class->extends instanceof FullyQualified && !$this->reflectionProvider->hasClass($class->extends->toString()); - } - /** - * @param Param[] $params - */ - private function shouldSkipParams(array $params) : bool - { - foreach ($params as $param) { - // has non-readonly property promotion - if (!$this->visibilityManipulator->hasVisibility($param, Visibility::READONLY) && $param->flags !== 0) { - return \true; - } - // type is missing, invalid syntax - if ($param->type === null) { - return \true; - } - } - return \false; - } } diff --git a/vendor/rector/rector/rules/Php82/Rector/Encapsed/VariableInStringInterpolationFixerRector.php b/vendor/rector/rector/rules/Php82/Rector/Encapsed/VariableInStringInterpolationFixerRector.php index 7798055e8..a70501b33 100644 --- a/vendor/rector/rector/rules/Php82/Rector/Encapsed/VariableInStringInterpolationFixerRector.php +++ b/vendor/rector/rector/rules/Php82/Rector/Encapsed/VariableInStringInterpolationFixerRector.php @@ -5,7 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; @@ -19,7 +19,7 @@ final class VariableInStringInterpolationFixerRector extends AbstractRector impl { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replace deprecated "${var}" to "{$var}"', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace deprecated `${var}` to `{$var}`', [new CodeSample(<<<'CODE_SAMPLE' $c = "football"; echo "I like playing ${c}"; CODE_SAMPLE @@ -34,10 +34,10 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [Encapsed::class]; + return [InterpolatedString::class]; } /** - * @param Encapsed $node + * @param InterpolatedString $node */ public function refactor(Node $node) : ?Node { @@ -51,10 +51,7 @@ public function refactor(Node $node) : ?Node if (!isset($oldTokens[$startTokenPos])) { continue; } - if (!\is_array($oldTokens[$startTokenPos])) { - continue; - } - if ($oldTokens[$startTokenPos][1] !== '${') { + if ((string) $oldTokens[$startTokenPos] !== '${') { continue; } $part->setAttribute(AttributeKey::ORIGINAL_NODE, null); diff --git a/vendor/rector/rector/rules/Php82/Rector/FuncCall/Utf8DecodeEncodeToMbConvertEncodingRector.php b/vendor/rector/rector/rules/Php82/Rector/FuncCall/Utf8DecodeEncodeToMbConvertEncodingRector.php index 284eecaab..883133284 100644 --- a/vendor/rector/rector/rules/Php82/Rector/FuncCall/Utf8DecodeEncodeToMbConvertEncodingRector.php +++ b/vendor/rector/rector/rules/Php82/Rector/FuncCall/Utf8DecodeEncodeToMbConvertEncodingRector.php @@ -21,7 +21,7 @@ final class Utf8DecodeEncodeToMbConvertEncodingRector extends AbstractRector imp { public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change deprecated utf8_decode and utf8_encode to mb_convert_encoding', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change deprecated `utf8_decode()` and `utf8_encode()` to `mb_convert_encoding()`', [new CodeSample(<<<'CODE_SAMPLE' utf8_decode($value); utf8_encode($value); CODE_SAMPLE diff --git a/vendor/rector/rector/rules/Php82/Rector/New_/FilesystemIteratorSkipDotsRector.php b/vendor/rector/rector/rules/Php82/Rector/New_/FilesystemIteratorSkipDotsRector.php index 60b382356..f4e931c9e 100644 --- a/vendor/rector/rector/rules/Php82/Rector/New_/FilesystemIteratorSkipDotsRector.php +++ b/vendor/rector/rector/rules/Php82/Rector/New_/FilesystemIteratorSkipDotsRector.php @@ -24,9 +24,8 @@ final class FilesystemIteratorSkipDotsRector extends AbstractRector implements M { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php b/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php index ad98331bf..e914fe26e 100644 --- a/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php +++ b/vendor/rector/rector/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php @@ -15,7 +15,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Php82\Rector\Param\AddSensitiveParameterAttributeRector\AddSensitiveParameterAttributeRectorTest */ @@ -23,14 +23,13 @@ final class AddSensitiveParameterAttributeRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; public const SENSITIVE_PARAMETERS = 'sensitive_parameters'; /** * @var string[] */ - private $sensitiveParameters = []; + private array $sensitiveParameters = []; public function __construct(PhpAttributeAnalyzer $phpAttributeAnalyzer) { $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; diff --git a/vendor/rector/rector/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php b/vendor/rector/rector/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php index 2783a1fe5..2d72eb046 100644 --- a/vendor/rector/rector/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php +++ b/vendor/rector/rector/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php @@ -13,8 +13,8 @@ use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Expr\UnaryPlus; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassConst; @@ -34,14 +34,12 @@ final class AddTypeToConstRector extends AbstractRector implements MinPhpVersion { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ReflectionProvider $reflectionProvider, StaticTypeMapper $staticTypeMapper) { $this->reflectionProvider = $reflectionProvider; @@ -147,10 +145,10 @@ private function findValueType(Expr $expr) : ?Identifier if ($expr instanceof String_) { return new Identifier('string'); } - if ($expr instanceof LNumber) { + if ($expr instanceof Int_) { return new Identifier('int'); } - if ($expr instanceof DNumber) { + if ($expr instanceof Float_) { return new Identifier('float'); } if ($expr instanceof ConstFetch || $expr instanceof ClassConstFetch) { @@ -181,9 +179,7 @@ private function getParentReflections(string $className) : array return []; } $currentClassReflection = $this->reflectionProvider->getClass($className); - return \array_filter($currentClassReflection->getAncestors(), static function (ClassReflection $classReflection) use($currentClassReflection) : bool { - return $currentClassReflection !== $classReflection; - }); + return \array_filter($currentClassReflection->getAncestors(), static fn(ClassReflection $classReflection): bool => $currentClassReflection !== $classReflection); } private function canBeInherited(ClassConst $classConst, Class_ $class) : bool { diff --git a/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php b/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php index 92a0b9ec6..7c8a21bac 100644 --- a/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php +++ b/vendor/rector/rector/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php @@ -6,62 +6,90 @@ use PhpParser\Node; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; +use PhpParser\Node\Expr; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Name\FullyQualified; +use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassLike; +use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Expression; +use PhpParser\Node\Stmt\Return_; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; +use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\NodeAnalyzer\ClassAnalyzer; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; +use Rector\PhpParser\AstResolver; +use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; +use Rector\ValueObject\MethodName; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see https://wiki.php.net/rfc/marking_overriden_methods + * * @see \Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\AddOverrideAttributeToOverriddenMethodsRectorTest */ -final class AddOverrideAttributeToOverriddenMethodsRector extends AbstractRector implements MinPhpVersionInterface +final class AddOverrideAttributeToOverriddenMethodsRector extends AbstractRector implements MinPhpVersionInterface, ConfigurableRectorInterface { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** - * @var bool + * @readonly */ - private $hasChanged = \false; - public function __construct(ReflectionProvider $reflectionProvider, ClassAnalyzer $classAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer) + private AstResolver $astResolver; + /** + * @readonly + */ + private ValueResolver $valueResolver; + /** + * @api + * @var string + */ + public const ALLOW_OVERRIDE_EMPTY_METHOD = 'allow_override_empty_method'; + /** + * @var string + */ + private const OVERRIDE_CLASS = 'Override'; + private bool $allowOverrideEmptyMethod = \false; + private bool $hasChanged = \false; + public function __construct(ReflectionProvider $reflectionProvider, ClassAnalyzer $classAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer, AstResolver $astResolver, ValueResolver $valueResolver) { $this->reflectionProvider = $reflectionProvider; $this->classAnalyzer = $classAnalyzer; $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; + $this->astResolver = $astResolver; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Add override attribute to overridden methods', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Add override attribute to overridden methods', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class ParentClass { public function foo() { + echo 'default'; } } -class ChildClass extends ParentClass +final class ChildClass extends ParentClass { public function foo() { + echo 'override default'; } } CODE_SAMPLE @@ -70,18 +98,20 @@ class ParentClass { public function foo() { + echo 'default'; } } -class ChildClass extends ParentClass +final class ChildClass extends ParentClass { #[\Override] public function foo() { + echo 'override default'; } } CODE_SAMPLE -)]); +, [self::ALLOW_OVERRIDE_EMPTY_METHOD => \false])]); } /** * @return array> @@ -90,6 +120,13 @@ public function getNodeTypes() : array { return [Class_::class]; } + /** + * @param mixed[] $configuration + */ + public function configure(array $configuration) : void + { + $this->allowOverrideEmptyMethod = $configuration[self::ALLOW_OVERRIDE_EMPTY_METHOD] ?? \false; + } /** * @param Class_ $node */ @@ -104,8 +141,22 @@ public function refactor(Node $node) : ?Node return null; } $classReflection = $this->reflectionProvider->getClass($className); - $parentClassReflections = \array_merge($classReflection->getParents(), $classReflection->getInterfaces(), $classReflection->getTraits()); - $this->processAddOverrideAttribute($node, $parentClassReflections); + $parentClassReflections = $classReflection->getParents(); + if ($this->allowOverrideEmptyMethod) { + $parentClassReflections = \array_merge( + $parentClassReflections, + $classReflection->getInterfaces(), + // place on last to ensure verify method exists on parent early + // for non abstract method from trait + $classReflection->getTraits() + ); + } + if ($parentClassReflections === []) { + return null; + } + foreach ($node->getMethods() as $classMethod) { + $this->processAddOverrideAttribute($classMethod, $parentClassReflections); + } if (!$this->hasChanged) { return null; } @@ -118,39 +169,89 @@ public function provideMinPhpVersion() : int /** * @param ClassReflection[] $parentClassReflections */ - private function processAddOverrideAttribute(Class_ $class, array $parentClassReflections) : void + private function processAddOverrideAttribute(ClassMethod $classMethod, array $parentClassReflections) : void { - if ($parentClassReflections === []) { + if ($this->shouldSkipClassMethod($classMethod)) { return; } - foreach ($class->getMethods() as $classMethod) { - if ($classMethod->name->toString() === '__construct') { + /** @var string $classMethodName */ + $classMethodName = $this->getName($classMethod->name); + // Private methods should be ignored + $shouldAddOverride = \false; + foreach ($parentClassReflections as $parentClassReflection) { + if (!$parentClassReflection->hasNativeMethod($classMethod->name->toString())) { continue; } - if ($classMethod->isPrivate()) { + // ignore if it is a private method on the parent + if (!$parentClassReflection->hasNativeMethod($classMethodName)) { continue; } - // ignore if it already uses the attribute - if ($this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, 'Override')) { + $parentMethod = $parentClassReflection->getNativeMethod($classMethodName); + if ($parentMethod->isPrivate()) { + break; + } + if ($this->shouldSkipParentClassMethod($parentClassReflection, $classMethod)) { continue; } - // Private methods should be ignored - foreach ($parentClassReflections as $parentClassReflection) { - if (!$parentClassReflection->hasNativeMethod($classMethod->name->toString())) { - continue; - } - // ignore if it is a private method on the parent - $parentMethod = $parentClassReflection->getNativeMethod($classMethod->name->toString()); - if ($parentMethod->isPrivate()) { - continue; - } - if ($parentClassReflection->isTrait() && !$parentMethod->isAbstract()) { - continue; - } - $classMethod->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified('Override'))]); - $this->hasChanged = \true; - continue 2; + if ($parentClassReflection->isTrait() && !$parentMethod->isAbstract()) { + break; + } + $shouldAddOverride = \true; + break; + } + if ($shouldAddOverride) { + $classMethod->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified(self::OVERRIDE_CLASS))]); + $this->hasChanged = \true; + } + } + private function shouldSkipClassMethod(ClassMethod $classMethod) : bool + { + if ($this->isName($classMethod->name, MethodName::CONSTRUCT)) { + return \true; + } + if ($classMethod->isPrivate()) { + return \true; + } + // ignore if it already uses the attribute + return $this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, self::OVERRIDE_CLASS); + } + private function shouldSkipParentClassMethod(ClassReflection $parentClassReflection, ClassMethod $classMethod) : bool + { + if ($this->allowOverrideEmptyMethod && $parentClassReflection->isBuiltIn()) { + return \false; + } + // parse parent method, if it has some contents or not + $parentClass = $this->astResolver->resolveClassFromClassReflection($parentClassReflection); + if (!$parentClass instanceof ClassLike) { + return \true; + } + $parentClassMethod = $parentClass->getMethod($classMethod->name->toString()); + if (!$parentClassMethod instanceof ClassMethod) { + return \true; + } + if ($this->allowOverrideEmptyMethod) { + return \false; + } + // just override abstract method also skipped on purpose + // only grand child of abstract method that parent has content will have + if ($parentClassMethod->isAbstract()) { + return \true; + } + // has any stmts? + if ($parentClassMethod->stmts === null || $parentClassMethod->stmts === []) { + return \true; + } + if (\count($parentClassMethod->stmts) === 1) { + /** @var Stmt $soleStmt */ + $soleStmt = $parentClassMethod->stmts[0]; + // most likely, return null; is interface to be designed to override + if ($soleStmt instanceof Return_ && $soleStmt->expr instanceof Expr && $this->valueResolver->isNull($soleStmt->expr)) { + return \true; + } + if ($soleStmt instanceof Expression && $soleStmt->expr instanceof Throw_) { + return \true; } } + return \false; } } diff --git a/vendor/rector/rector/rules/Php83/Rector/Class_/ReadOnlyAnonymousClassRector.php b/vendor/rector/rector/rules/Php83/Rector/Class_/ReadOnlyAnonymousClassRector.php new file mode 100644 index 000000000..6dc5cdaa9 --- /dev/null +++ b/vendor/rector/rector/rules/Php83/Rector/Class_/ReadOnlyAnonymousClassRector.php @@ -0,0 +1,70 @@ +readonlyClassManipulator = $readonlyClassManipulator; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Decorate read-only anonymous class with `readonly` attribute', [new CodeSample(<<<'CODE_SAMPLE' +new class +{ + public function __construct( + private readonly string $name + ) { + } +}; +CODE_SAMPLE +, <<<'CODE_SAMPLE' +new readonly class +{ + public function __construct( + private string $name + ) { + } +}; +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$node->isAnonymous()) { + return null; + } + return $this->readonlyClassManipulator->process($node, $this->file); + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::READONLY_ANONYMOUS_CLASS; + } +} diff --git a/vendor/rector/rector/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php b/vendor/rector/rector/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php index 2586bbc11..329b04c88 100644 --- a/vendor/rector/rector/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php +++ b/vendor/rector/rector/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php @@ -4,10 +4,11 @@ namespace Rector\Php83\Rector\FuncCall; use PhpParser\Node; +use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Scalar\Encapsed; -use PhpParser\Node\Scalar\EncapsedStringPart; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\InterpolatedStringPart; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\Rector\AbstractRector; @@ -23,9 +24,8 @@ final class CombineHostPortLdapUriRector extends AbstractRector implements MinPh { /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; public function __construct(ExprAnalyzer $exprAnalyzer) { $this->exprAnalyzer = $exprAnalyzer; @@ -64,10 +64,15 @@ public function refactor(Node $node) : ?Node } $firstArg = $args[0]->value; $secondArg = $args[1]->value; - if ($firstArg instanceof String_ && $secondArg instanceof LNumber) { + if ($firstArg instanceof String_ && $secondArg instanceof Int_) { $args[0]->value = new String_($firstArg->value . ':' . $secondArg->value); } elseif ($this->exprAnalyzer->isDynamicExpr($firstArg) && $this->exprAnalyzer->isDynamicExpr($secondArg)) { - $args[0]->value = new Encapsed([$firstArg, new EncapsedStringPart(':'), $secondArg]); + if ($firstArg instanceof Concat && !$secondArg instanceof Concat) { + $args[0]->value = new Concat($firstArg, new String_(':')); + $args[0]->value = new Concat($args[0]->value, $secondArg); + } else { + $args[0]->value = new InterpolatedString([$firstArg, new InterpolatedStringPart(':'), $secondArg]); + } } else { return null; } diff --git a/vendor/rector/rector/rules/Php83/Rector/FuncCall/DynamicClassConstFetchRector.php b/vendor/rector/rector/rules/Php83/Rector/FuncCall/DynamicClassConstFetchRector.php new file mode 100644 index 000000000..38a26b891 --- /dev/null +++ b/vendor/rector/rector/rules/Php83/Rector/FuncCall/DynamicClassConstFetchRector.php @@ -0,0 +1,73 @@ +isName($node, 'constant')) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $args = $node->getArgs(); + if (\count($args) !== 1) { + return null; + } + $value = $args[0]->value; + if (!$value instanceof Concat) { + return null; + } + if (!$value->left instanceof Concat) { + return null; + } + if (!$value->left->left instanceof ClassConstFetch) { + return null; + } + if (!$value->left->left->name instanceof Identifier || $value->left->left->name->toString() !== 'class') { + return null; + } + if (!$value->left->right instanceof String_ || $value->left->right->value !== '::') { + return null; + } + return new ClassConstFetch($value->left->left->class, $value->right); + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::DYNAMIC_CLASS_CONST_FETCH; + } +} diff --git a/vendor/rector/rector/rules/Php84/Rector/Class_/DeprecatedAnnotationToDeprecatedAttributeRector.php b/vendor/rector/rector/rules/Php84/Rector/Class_/DeprecatedAnnotationToDeprecatedAttributeRector.php new file mode 100644 index 000000000..248c9b9dc --- /dev/null +++ b/vendor/rector/rector/rules/Php84/Rector/Class_/DeprecatedAnnotationToDeprecatedAttributeRector.php @@ -0,0 +1,149 @@ +phpDocTagRemover = $phpDocTagRemover; + $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; + $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change @deprecated annotation to Deprecated attribute', [new CodeSample(<<<'CODE_SAMPLE' +/** + * @deprecated 1.0.0 Use SomeOtherClass instead + */ +class SomeClass +{ +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +#[\Deprecated(message: 'Use SomeOtherClass instead', since: '1.0.0')] +class SomeClass +{ +} +CODE_SAMPLE +), new CodeSample(<<<'CODE_SAMPLE' +/** + * @deprecated 1.0.0 Use SomeOtherFunction instead + */ +function someFunction() +{ +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +#[\Deprecated(message: 'Use SomeOtherFunction instead', since: '1.0.0')] +function someFunction() +{ +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Function_::class, ClassMethod::class, ClassConst::class]; + } + /** + * @param ClassConst|Function_|ClassMethod $node + */ + public function refactor(Node $node) : ?Node + { + $hasChanged = \false; + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + if ($phpDocInfo instanceof PhpDocInfo) { + $deprecatedAttributeGroup = $this->handleDeprecated($phpDocInfo); + if ($deprecatedAttributeGroup instanceof AttributeGroup) { + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + $node->attrGroups = \array_merge($node->attrGroups, [$deprecatedAttributeGroup]); + $this->removeDeprecatedAnnotations($phpDocInfo); + $hasChanged = \true; + } + } + return $hasChanged ? $node : null; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::DEPRECATED_ATTRIBUTE; + } + private function handleDeprecated(PhpDocInfo $phpDocInfo) : ?AttributeGroup + { + $attributeGroup = null; + $desiredTagValueNodes = $phpDocInfo->getTagsByName('deprecated'); + foreach ($desiredTagValueNodes as $desiredTagValueNode) { + if (!$desiredTagValueNode->value instanceof DeprecatedTagValueNode) { + continue; + } + $attributeGroup = $this->createAttributeGroup($desiredTagValueNode->value->description); + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); + break; + } + return $attributeGroup; + } + private function createAttributeGroup(string $annotationValue) : AttributeGroup + { + $matches = Strings::match($annotationValue, self::VERSION_MATCH_REGEX); + $since = $matches[1] ?? null; + $message = $matches[2] ?? null; + return $this->phpAttributeGroupFactory->createFromClassWithItems('Deprecated', \array_filter(['message' => $message, 'since' => $since])); + } + private function removeDeprecatedAnnotations(PhpDocInfo $phpDocInfo) : bool + { + $hasChanged = \false; + $desiredTagValueNodes = $phpDocInfo->getTagsByName('deprecated'); + foreach ($desiredTagValueNodes as $desiredTagValueNode) { + if (!$desiredTagValueNode->value instanceof GenericTagValueNode) { + continue; + } + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); + $hasChanged = \true; + } + return $hasChanged; + } +} diff --git a/vendor/rector/rector/rules/Php84/Rector/FuncCall/AddEscapeArgumentRector.php b/vendor/rector/rector/rules/Php84/Rector/FuncCall/AddEscapeArgumentRector.php new file mode 100644 index 000000000..353cfbbd7 --- /dev/null +++ b/vendor/rector/rector/rules/Php84/Rector/FuncCall/AddEscapeArgumentRector.php @@ -0,0 +1,99 @@ +isFirstClassCallable()) { + return null; + } + if ($node instanceof FuncCall) { + if (!$this->isNames($node, ['fputcsv', 'fgetcsv', 'str_getcsv'])) { + return null; + } + if ($this->shouldSkipNamedArg($node)) { + return null; + } + $name = $this->getName($node); + if (\in_array($name, ['fputcsv', 'fgetcsv'], \true) && isset($node->getArgs()[4])) { + return null; + } + if ($name === 'str_getcsv' && isset($node->getArgs()[3])) { + return null; + } + $node->args[\count($node->getArgs())] = new Arg(new String_('\\'), \false, \false, [], new Identifier('escape')); + return $node; + } + if (!$this->isObjectType($node->var, new ObjectType('SplFileObject'))) { + return null; + } + $name = $this->getName($node->name); + if (!\in_array($name, ['setCsvControl', 'fputcsv', 'fgetcsv'], \true)) { + return null; + } + if ($this->shouldSkipNamedArg($node)) { + return null; + } + if (\in_array($name, ['setCsvControl', 'fgetcsv'], \true) && isset($node->getArgs()[2])) { + return null; + } + if ($name === 'fputcsv' && isset($node->getArgs()[3])) { + return null; + } + $node->args[\count($node->getArgs())] = new Arg(new String_('\\'), \false, \false, [], new Identifier('escape')); + return $node; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::REQUIRED_ESCAPE_PARAMETER; + } + /** + * @param \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\MethodCall $node + */ + private function shouldSkipNamedArg($node) : bool + { + foreach ($node->getArgs() as $arg) { + // already defined in named arg + if ($arg->name instanceof Identifier && $arg->name->toString() === 'escape') { + return \true; + } + } + return \false; + } +} diff --git a/vendor/rector/rector/rules/Php84/Rector/FuncCall/RoundingModeEnumRector.php b/vendor/rector/rector/rules/Php84/Rector/FuncCall/RoundingModeEnumRector.php new file mode 100644 index 000000000..458ab8296 --- /dev/null +++ b/vendor/rector/rector/rules/Php84/Rector/FuncCall/RoundingModeEnumRector.php @@ -0,0 +1,88 @@ +isName($node, 'round')) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $args = $node->getArgs(); + if (\count($args) !== 3) { + return null; + } + if (!isset($args[2])) { + return null; + } + $modeArg = $args[2]->value; + $hasChanged = \false; + if ($modeArg instanceof ConstFetch) { + switch ($modeArg->name->toString()) { + case 'PHP_ROUND_HALF_UP': + $enumCase = 'HalfAwayFromZero'; + break; + case 'PHP_ROUND_HALF_DOWN': + $enumCase = 'HalfTowardsZero'; + break; + case 'PHP_ROUND_HALF_EVEN': + $enumCase = 'HalfEven'; + break; + case 'PHP_ROUND_HALF_ODD': + $enumCase = 'HalfOdd'; + break; + default: + $enumCase = null; + break; + } + if ($enumCase === null) { + return null; + } + $args[2]->value = new ClassConstFetch(new FullyQualified('RoundingMode'), $enumCase); + $hasChanged = \true; + } + if ($hasChanged) { + return $node; + } + return null; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::ROUNDING_MODES; + } +} diff --git a/vendor/rector/rector/rules/Php84/Rector/MethodCall/NewMethodCallWithoutParenthesesRector.php b/vendor/rector/rector/rules/Php84/Rector/MethodCall/NewMethodCallWithoutParenthesesRector.php new file mode 100644 index 000000000..122be9ec4 --- /dev/null +++ b/vendor/rector/rector/rules/Php84/Rector/MethodCall/NewMethodCallWithoutParenthesesRector.php @@ -0,0 +1,75 @@ +> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove parentheses on new method call with parentheses', [new CodeSample(<<<'CODE_SAMPLE' +(new Request())->withMethod('GET')->withUri('/hello-world'); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +new Request()->withMethod('GET')->withUri('/hello-world'); +CODE_SAMPLE +)]); + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?Node + { + if (!$node->var instanceof New_) { + return null; + } + $oldTokens = $this->file->getOldTokens(); + $loop = 1; + while (isset($oldTokens[$node->var->getStartTokenPos() + $loop])) { + if (\trim((string) $oldTokens[$node->var->getStartTokenPos() + $loop]) === '') { + ++$loop; + continue; + } + if ((string) $oldTokens[$node->var->getStartTokenPos() + $loop] !== '(') { + break; + } + return null; + } + // start node + if (!isset($oldTokens[$node->getStartTokenPos()])) { + return null; + } + // end of "var" node + if (!isset($oldTokens[$node->var->getEndTokenPos()])) { + return null; + } + if ((string) $oldTokens[$node->getStartTokenPos()] === '(' && (string) $oldTokens[$node->var->getEndTokenPos()] === ')') { + $oldTokens[$node->getStartTokenPos()]->text = ''; + $oldTokens[$node->var->getEndTokenPos()]->text = ''; + return $node; + } + return null; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::NEW_METHOD_CALL_WITHOUT_PARENTHESES; + } +} diff --git a/vendor/rector/rector/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php b/vendor/rector/rector/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php index e7bd64115..dfc775a29 100644 --- a/vendor/rector/rector/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php +++ b/vendor/rector/rector/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php @@ -28,14 +28,12 @@ final class ExplicitNullableParamTypeRector extends AbstractRector implements Mi { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ValueResolver $valueResolver, StaticTypeMapper $staticTypeMapper) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/Php85/Rector/ArrayDimFetch/ArrayFirstLastRector.php b/vendor/rector/rector/rules/Php85/Rector/ArrayDimFetch/ArrayFirstLastRector.php new file mode 100644 index 000000000..0532f1b4c --- /dev/null +++ b/vendor/rector/rector/rules/Php85/Rector/ArrayDimFetch/ArrayFirstLastRector.php @@ -0,0 +1,74 @@ +> + */ + public function getNodeTypes() : array + { + return [ArrayDimFetch::class]; + } + /** + * @param ArrayDimFetch $node + */ + public function refactor(Node $node) : ?FuncCall + { + if (!$node->dim instanceof FuncCall) { + return null; + } + if (!$this->isNames($node->dim, [self::ARRAY_KEY_FIRST, self::ARRAY_KEY_LAST])) { + return null; + } + if ($node->dim->isFirstClassCallable()) { + return null; + } + if (\count($node->dim->getArgs()) !== 1) { + return null; + } + if (!$this->nodeComparator->areNodesEqual($node->var, $node->dim->getArgs()[0]->value)) { + return null; + } + $functionName = $this->isName($node->dim, self::ARRAY_KEY_FIRST) ? 'array_first' : 'array_last'; + return $this->nodeFactory->createFuncCall($functionName, [$node->var]); + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::ARRAY_FIRST_LAST; + } +} diff --git a/vendor/rector/rector/rules/Privatization/Guard/OverrideByParentClassGuard.php b/vendor/rector/rector/rules/Privatization/Guard/OverrideByParentClassGuard.php index b55155439..6d3992297 100644 --- a/vendor/rector/rector/rules/Privatization/Guard/OverrideByParentClassGuard.php +++ b/vendor/rector/rector/rules/Privatization/Guard/OverrideByParentClassGuard.php @@ -13,9 +13,8 @@ final class OverrideByParentClassGuard { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php b/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php index dacfb2f9d..2e3d75851 100644 --- a/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php +++ b/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php @@ -21,34 +21,28 @@ final class ParentPropertyLookupGuard { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\NodeManipulator\PropertyManipulator */ - private $propertyManipulator; + private PropertyManipulator $propertyManipulator; /** * @readonly - * @var \Rector\Reflection\ClassReflectionAnalyzer */ - private $classReflectionAnalyzer; + private ClassReflectionAnalyzer $classReflectionAnalyzer; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer, AstResolver $astResolver, PropertyManipulator $propertyManipulator, ClassReflectionAnalyzer $classReflectionAnalyzer) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php b/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php index 6ef5b4cfb..5a24e532d 100644 --- a/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php +++ b/vendor/rector/rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php @@ -3,13 +3,14 @@ declare (strict_types=1); namespace Rector\Privatization\NodeManipulator; +use PhpParser\Modifiers; use PhpParser\Node\Param; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use Rector\ValueObject\Visibility; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Privatization\NodeManipulator\VisibilityManipulatorTest */ @@ -39,7 +40,7 @@ public function makeNonStatic($node) : void if (!$node->isStatic()) { return; } - $node->flags -= Class_::MODIFIER_STATIC; + $node->flags -= Modifiers::STATIC; } /** * @api @@ -50,7 +51,7 @@ public function makeNonAbstract($node) : void if (!$node->isAbstract()) { return; } - $node->flags -= Class_::MODIFIER_ABSTRACT; + $node->flags -= Modifiers::ABSTRACT; } /** * @api @@ -69,7 +70,7 @@ public function makeNonFinal($node) : void if (!$node->isFinal()) { return; } - $node->flags -= Class_::MODIFIER_FINAL; + $node->flags -= Modifiers::FINAL; } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $node @@ -80,7 +81,7 @@ public function changeNodeVisibility($node, int $visibility) : void $this->replaceVisibilityFlag($node, $visibility); } /** - * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst $node + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Param $node */ public function makePublic($node) : void { @@ -107,7 +108,7 @@ public function makePrivate($node) : void */ public function removeFinal($node) : void { - $node->flags -= Class_::MODIFIER_FINAL; + $node->flags -= Modifiers::FINAL; } /** * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $node @@ -129,11 +130,19 @@ public function isReadonly($node) : bool */ public function removeReadonly($node) : void { - $this->removeVisibilityFlag($node, Visibility::READONLY); + $isConstructorPromotionBefore = $node instanceof Param && $node->isPromoted(); + $node->flags &= ~Modifiers::READONLY; + $isConstructorPromotionAfter = $node instanceof Param && $node->isPromoted(); + if ($node instanceof Param && $isConstructorPromotionBefore && !$isConstructorPromotionAfter) { + $this->makePublic($node); + } + if ($node instanceof Property) { + $this->publicize($node); + } } /** - * @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod $node - * @return \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|null + * @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node + * @return \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|null */ public function publicize($node) { @@ -163,14 +172,14 @@ private function removeVisibility($node) : void return; } if ($node->isPublic()) { - $node->flags |= Class_::MODIFIER_PUBLIC; - $node->flags -= Class_::MODIFIER_PUBLIC; + $node->flags |= Modifiers::PUBLIC; + $node->flags -= Modifiers::PUBLIC; } if ($node->isProtected()) { - $node->flags -= Class_::MODIFIER_PROTECTED; + $node->flags -= Modifiers::PROTECTED; } if ($node->isPrivate()) { - $node->flags -= Class_::MODIFIER_PRIVATE; + $node->flags -= Modifiers::PRIVATE; } } /** @@ -181,13 +190,6 @@ private function addVisibilityFlag($node, int $visibility) : void { $node->flags |= $visibility; } - /** - * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Param $node - */ - private function removeVisibilityFlag($node, int $visibility) : void - { - $node->flags &= ~$visibility; - } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Param $node */ diff --git a/vendor/rector/rector/rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.php b/vendor/rector/rector/rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.php index b8af8fa78..b5187f030 100644 --- a/vendor/rector/rector/rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.php +++ b/vendor/rector/rector/rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.php @@ -7,40 +7,36 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\Privatization\Guard\OverrideByParentClassGuard; use Rector\Privatization\NodeManipulator\VisibilityManipulator; use Rector\Privatization\VisibilityGuard\ClassMethodVisibilityGuard; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Privatization\Rector\ClassMethod\PrivatizeFinalClassMethodRector\PrivatizeFinalClassMethodRectorTest */ -final class PrivatizeFinalClassMethodRector extends AbstractScopeAwareRector +final class PrivatizeFinalClassMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\Privatization\VisibilityGuard\ClassMethodVisibilityGuard */ - private $classMethodVisibilityGuard; + private ClassMethodVisibilityGuard $classMethodVisibilityGuard; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\Privatization\Guard\OverrideByParentClassGuard */ - private $overrideByParentClassGuard; + private OverrideByParentClassGuard $overrideByParentClassGuard; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(ClassMethodVisibilityGuard $classMethodVisibilityGuard, VisibilityManipulator $visibilityManipulator, OverrideByParentClassGuard $overrideByParentClassGuard, BetterNodeFinder $betterNodeFinder) { $this->classMethodVisibilityGuard = $classMethodVisibilityGuard; @@ -78,8 +74,9 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if (!$node->isFinal()) { return null; } @@ -120,6 +117,9 @@ private function shouldSkipClassMethod(ClassMethod $classMethod) : bool if (!$classMethod->isProtected()) { return \true; } + if ($classMethod->isMagic()) { + return \true; + } // if has parent call, its probably overriding parent one → skip it $hasParentCall = (bool) $this->betterNodeFinder->findFirst((array) $classMethod->stmts, function (Node $node) : bool { if (!$node instanceof StaticCall) { diff --git a/vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php b/vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php index 4b50a4af5..4f09ba31c 100644 --- a/vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php +++ b/vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PHPStan\Reflection\ReflectionProvider; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Php81\NodeManipulator\AttributeGroupNewLiner; use Rector\Privatization\NodeManipulator\VisibilityManipulator; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -18,22 +18,25 @@ final class FinalizeTestCaseClassRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; - public function __construct(ReflectionProvider $reflectionProvider, VisibilityManipulator $visibilityManipulator) + private VisibilityManipulator $visibilityManipulator; + /** + * @readonly + */ + private AttributeGroupNewLiner $attributeGroupNewLiner; + public function __construct(ReflectionProvider $reflectionProvider, VisibilityManipulator $visibilityManipulator, AttributeGroupNewLiner $attributeGroupNewLiner) { $this->reflectionProvider = $reflectionProvider; $this->visibilityManipulator = $visibilityManipulator; + $this->attributeGroupNewLiner = $attributeGroupNewLiner; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('PHPUnit test case will be finalized', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Make PHPUnit test case final', [new CodeSample(<<<'CODE_SAMPLE' use PHPUnit\Framework\TestCase; class SomeClass extends TestCase @@ -76,11 +79,11 @@ public function refactor(Node $node) : ?Node return null; } $classReflection = $this->reflectionProvider->getClass($className); - if (!$classReflection->isSubclassOf('PHPUnit\\Framework\\TestCase')) { + if (!$classReflection->is('PHPUnit\\Framework\\TestCase')) { return null; } if ($node->attrGroups !== []) { - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $this->attributeGroupNewLiner->newLine($this->file, $node); } $this->visibilityManipulator->makeFinal($node); return $node; diff --git a/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php b/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php index 4ba350b5d..9c4492693 100644 --- a/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php +++ b/vendor/rector/rector/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php @@ -79,7 +79,7 @@ public function refactor(Node $node) : ?Node if (!$node->var instanceof Variable) { return null; } - if (!$this->nodeNameResolver->isName($node->var, 'this')) { + if (!$this->isName($node->var, 'this')) { return null; } $methodName = $this->getName($node->name); diff --git a/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php b/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php index 7773af165..f76cb7c44 100644 --- a/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php +++ b/vendor/rector/rector/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php @@ -23,19 +23,16 @@ final class PrivatizeFinalClassPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\Privatization\Guard\ParentPropertyLookupGuard */ - private $parentPropertyLookupGuard; + private ParentPropertyLookupGuard $parentPropertyLookupGuard; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(VisibilityManipulator $visibilityManipulator, ParentPropertyLookupGuard $parentPropertyLookupGuard, ReflectionResolver $reflectionResolver) { $this->visibilityManipulator = $visibilityManipulator; @@ -91,7 +88,7 @@ public function refactor(Node $node) : ?Node $construct = $node->getMethod(MethodName::CONSTRUCT); if ($construct instanceof ClassMethod) { foreach ($construct->params as $param) { - if ($param->flags === 0) { + if (!$param->isPromoted()) { continue; } if (!$this->visibilityManipulator->hasVisibility($param, Visibility::PROTECTED)) { diff --git a/vendor/rector/rector/rules/Privatization/VisibilityGuard/ClassMethodVisibilityGuard.php b/vendor/rector/rector/rules/Privatization/VisibilityGuard/ClassMethodVisibilityGuard.php index 41c36d90c..5dc1d3fa7 100644 --- a/vendor/rector/rector/rules/Privatization/VisibilityGuard/ClassMethodVisibilityGuard.php +++ b/vendor/rector/rector/rules/Privatization/VisibilityGuard/ClassMethodVisibilityGuard.php @@ -10,9 +10,8 @@ final class ClassMethodVisibilityGuard { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/Removing/NodeManipulator/ComplexNodeRemover.php b/vendor/rector/rector/rules/Removing/NodeManipulator/ComplexNodeRemover.php index 7f924a6c8..03858c47d 100644 --- a/vendor/rector/rector/rules/Removing/NodeManipulator/ComplexNodeRemover.php +++ b/vendor/rector/rector/rules/Removing/NodeManipulator/ComplexNodeRemover.php @@ -13,24 +13,20 @@ final class ComplexNodeRemover { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, PhpDocTagRemover $phpDocTagRemover, NodeNameResolver $nodeNameResolver, DocBlockUpdater $docBlockUpdater) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php b/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php index 076c75965..899bf9dd3 100644 --- a/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php @@ -15,7 +15,7 @@ use Rector\Removing\ValueObject\ArgumentRemover; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\ClassMethod\ArgumentRemoverRector\ArgumentRemoverRectorTest */ @@ -23,17 +23,13 @@ final class ArgumentRemoverRector extends AbstractRector implements Configurable { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var ArgumentRemover[] */ - private $removedArguments = []; - /** - * @var bool - */ - private $hasChanged = \false; + private array $removedArguments = []; + private bool $hasChanged = \false; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php index 55c4e8f6d..bc3ca9e79 100644 --- a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveInterfacesRector.php @@ -5,11 +5,12 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Interface_; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\Class_\RemoveInterfacesRector\RemoveInterfacesRectorTest */ @@ -18,10 +19,10 @@ final class RemoveInterfacesRector extends AbstractRector implements Configurabl /** * @var string[] */ - private $interfacesToRemove = []; + private array $interfacesToRemove = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Removes interfaces usage from class.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Remove interfaces from class', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class SomeClass implements SomeInterface { } @@ -38,35 +39,57 @@ class SomeClass */ public function getNodeTypes() : array { - return [Class_::class]; + return [Class_::class, Interface_::class]; } /** - * @param Class_ $node + * @param Class_|Interface_ $node */ public function refactor(Node $node) : ?Node { - if ($node->implements === []) { + if ($node instanceof Class_) { + return $this->refactorClass($node); + } + return $this->refactorInterface($node); + } + /** + * @param mixed[] $configuration + */ + public function configure(array $configuration) : void + { + Assert::allString($configuration); + /** @var string[] $configuration */ + $this->interfacesToRemove = $configuration; + } + private function refactorClass(Class_ $class) : ?Class_ + { + if ($class->implements === []) { return null; } $isInterfacesRemoved = \false; - foreach ($node->implements as $key => $implement) { + foreach ($class->implements as $key => $implement) { if ($this->isNames($implement, $this->interfacesToRemove)) { - unset($node->implements[$key]); + unset($class->implements[$key]); $isInterfacesRemoved = \true; } } if (!$isInterfacesRemoved) { return null; } - return $node; + return $class; } - /** - * @param mixed[] $configuration - */ - public function configure(array $configuration) : void + private function refactorInterface(Interface_ $interface) : ?\PhpParser\Node\Stmt\Interface_ { - Assert::allString($configuration); - /** @var string[] $configuration */ - $this->interfacesToRemove = $configuration; + $isInterfacesRemoved = \false; + foreach ($interface->extends as $key => $extend) { + if (!$this->isNames($extend, $this->interfacesToRemove)) { + continue; + } + unset($interface->extends[$key]); + $isInterfacesRemoved = \true; + } + if (!$isInterfacesRemoved) { + return null; + } + return $interface; } } diff --git a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php index b19c00a08..0249b8381 100644 --- a/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/Class_/RemoveTraitUseRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\Class_\RemoveTraitUseRector\RemoveTraitUseRectorTest */ @@ -20,7 +20,7 @@ final class RemoveTraitUseRector extends AbstractRector implements ConfigurableR /** * @var string[] */ - private $traitsToRemove = []; + private array $traitsToRemove = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove specific traits from code', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php index a756702fe..aea2f315a 100644 --- a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallArgRector.php @@ -11,7 +11,7 @@ use Rector\Removing\ValueObject\RemoveFuncCallArg; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\FuncCall\RemoveFuncCallArgRector\RemoveFuncCallArgRectorTest */ @@ -20,7 +20,7 @@ final class RemoveFuncCallArgRector extends AbstractRector implements Configurab /** * @var RemoveFuncCallArg[] */ - private $removedFunctionArguments = []; + private array $removedFunctionArguments = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove argument by position by function name', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php index d63475e9c..3090d9444 100644 --- a/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/FuncCall/RemoveFuncCallRector.php @@ -6,12 +6,12 @@ use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Stmt\Expression; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Removing\Rector\FuncCall\RemoveFuncCallRector\RemoveFuncCallRectorTest */ @@ -20,7 +20,7 @@ final class RemoveFuncCallRector extends AbstractRector implements ConfigurableR /** * @var string[] */ - private $removedFunctions = []; + private array $removedFunctions = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove function', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' @@ -52,7 +52,7 @@ public function refactor(Node $node) : ?int if (!$this->isName($expr->name, $removedFunction)) { continue; } - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return null; } diff --git a/vendor/rector/rector/rules/Removing/ValueObject/ArgumentRemover.php b/vendor/rector/rector/rules/Removing/ValueObject/ArgumentRemover.php index 1d7403f80..4163cc0a4 100644 --- a/vendor/rector/rector/rules/Removing/ValueObject/ArgumentRemover.php +++ b/vendor/rector/rector/rules/Removing/ValueObject/ArgumentRemover.php @@ -9,19 +9,16 @@ final class ArgumentRemover { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var int */ - private $position; + private int $position; /** * @readonly * @var mixed diff --git a/vendor/rector/rector/rules/Removing/ValueObject/RemoveFuncCallArg.php b/vendor/rector/rector/rules/Removing/ValueObject/RemoveFuncCallArg.php index a36e29210..4abe53977 100644 --- a/vendor/rector/rector/rules/Removing/ValueObject/RemoveFuncCallArg.php +++ b/vendor/rector/rector/rules/Removing/ValueObject/RemoveFuncCallArg.php @@ -8,14 +8,12 @@ final class RemoveFuncCallArg { /** * @readonly - * @var string */ - private $function; + private string $function; /** * @readonly - * @var int */ - private $argumentPosition; + private int $argumentPosition; public function __construct(string $function, int $argumentPosition) { $this->function = $function; diff --git a/vendor/rector/rector/rules/Renaming/Collector/RenamedNameCollector.php b/vendor/rector/rector/rules/Renaming/Collector/RenamedNameCollector.php index 753acc8d8..956e84042 100644 --- a/vendor/rector/rector/rules/Renaming/Collector/RenamedNameCollector.php +++ b/vendor/rector/rector/rules/Renaming/Collector/RenamedNameCollector.php @@ -8,7 +8,7 @@ final class RenamedNameCollector /** * @var string[] */ - private $names = []; + private array $names = []; public function add(string $name) : void { $this->names[] = $name; diff --git a/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php b/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php index f6f896ad9..494048a35 100644 --- a/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php +++ b/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\AttributeGroup; +use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassLike; @@ -27,43 +28,36 @@ final class ClassRenamer { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocClassRenamer */ - private $phpDocClassRenamer; + private PhpDocClassRenamer $phpDocClassRenamer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockClassRenamer */ - private $docBlockClassRenamer; + private DocBlockClassRenamer $docBlockClassRenamer; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Util\FileHasher */ - private $fileHasher; + private FileHasher $fileHasher; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\Renaming\Collector\RenamedNameCollector */ - private $renamedNameCollector; + private RenamedNameCollector $renamedNameCollector; /** * @var array */ - private $oldToNewTypesByCacheKey = []; + private array $oldToNewTypesByCacheKey = []; public function __construct(PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFactory $phpDocInfoFactory, DocBlockClassRenamer $docBlockClassRenamer, ReflectionProvider $reflectionProvider, FileHasher $fileHasher, DocBlockUpdater $docBlockUpdater, RenamedNameCollector $renamedNameCollector) { $this->phpDocClassRenamer = $phpDocClassRenamer; @@ -81,9 +75,18 @@ public function __construct(PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFa public function renameNode(Node $node, array $oldToNewClasses, ?Scope $scope) : ?Node { $oldToNewTypes = $this->createOldToNewTypes($oldToNewClasses); + // execute FullyQualified before Name on purpose so next Name check is pure Name node if ($node instanceof FullyQualified) { return $this->refactorName($node, $oldToNewClasses); } + // Name as parent of FullyQualified executed for fallback annotation to attribute rename to Name + if ($node instanceof Name) { + $phpAttributeName = $node->getAttribute(AttributeKey::PHP_ATTRIBUTE_NAME); + if (\is_string($phpAttributeName)) { + return $this->refactorName(new FullyQualified($phpAttributeName), $oldToNewClasses); + } + return null; + } $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); if ($phpDocInfo instanceof PhpDocInfo) { $hasPhpDocChanged = $this->refactorPhpDoc($node, $oldToNewTypes, $oldToNewClasses, $phpDocInfo); diff --git a/vendor/rector/rector/rules/Renaming/NodeManipulator/SwitchManipulator.php b/vendor/rector/rector/rules/Renaming/NodeManipulator/SwitchManipulator.php index 37b7bff1c..49c4c0995 100644 --- a/vendor/rector/rector/rules/Renaming/NodeManipulator/SwitchManipulator.php +++ b/vendor/rector/rector/rules/Renaming/NodeManipulator/SwitchManipulator.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Renaming\NodeManipulator; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Break_; final class SwitchManipulator @@ -18,11 +18,11 @@ public function removeBreakNodes(array $stmts) : array if (!$node instanceof Break_) { continue; } - if (!$node->num instanceof LNumber || $node->num->value === 1) { + if (!$node->num instanceof Int_ || $node->num->value === 1) { unset($stmts[$key]); continue; } - $node->num = $node->num->value === 2 ? null : new LNumber($node->num->value - 1); + $node->num = $node->num->value === 2 ? null : new Int_($node->num->value - 1); } return $stmts; } diff --git a/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php b/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php index 84335ab62..6ce5ecb5f 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php @@ -14,7 +14,7 @@ use Rector\Renaming\ValueObject\RenameClassConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\ClassConstFetch\RenameClassConstFetchRector\RenameClassConstFetchRectorTest */ @@ -23,7 +23,7 @@ final class RenameClassConstFetchRector extends AbstractRector implements Config /** * @var RenameClassConstFetchInterface[] */ - private $renameClassConstFetches = []; + private array $renameClassConstFetches = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Replaces defined class constants in their calls.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php b/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php index 357ca9614..dda7ca7bb 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php @@ -18,7 +18,7 @@ use Rector\Renaming\ValueObject\RenameAnnotationByType; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\ClassMethod\RenameAnnotationRector\RenameAnnotationRectorTest */ @@ -26,23 +26,20 @@ final class RenameAnnotationRector extends AbstractRector implements Configurabl { /** * @readonly - * @var \Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockTagReplacer */ - private $docBlockTagReplacer; + private DocBlockTagReplacer $docBlockTagReplacer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var RenameAnnotationInterface[] */ - private $renameAnnotations = []; + private array $renameAnnotations = []; public function __construct(DocBlockTagReplacer $docBlockTagReplacer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->docBlockTagReplacer = $docBlockTagReplacer; diff --git a/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php b/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php index 8a524171d..f8c87d16b 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/Class_/RenameAttributeRector.php @@ -16,7 +16,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\Class_\RenameAttributeRector\RenameAttributeRectorTest */ @@ -25,7 +25,7 @@ final class RenameAttributeRector extends AbstractRector implements Configurable /** * @var RenameAttribute[] */ - private $renameAttributes = []; + private array $renameAttributes = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Rename attribute class names', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php b/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php index d04db27b2..acac5b92b 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/ConstFetch/RenameConstantRector.php @@ -11,7 +11,7 @@ use Rector\Validation\RectorAssert; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\ConstFetch\RenameConstantRector\RenameConstantRectorTest */ @@ -20,7 +20,7 @@ final class RenameConstantRector extends AbstractRector implements ConfigurableR /** * @var array */ - private $oldToNewConstants = []; + private array $oldToNewConstants = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Replace constant by new ones', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php b/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php index 10f23a5e4..94537d0c8 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/FuncCall/RenameFunctionRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\FuncCall\RenameFunctionRector\RenameFunctionRectorTest */ @@ -20,10 +20,10 @@ final class RenameFunctionRector extends AbstractRector implements ConfigurableR /** * @var array */ - private $oldFunctionToNewFunction = []; + private array $oldFunctionToNewFunction = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns defined function call new one.', [new ConfiguredCodeSample('view("...", []);', 'Laravel\\Templating\\render("...", []);', ['view' => 'Laravel\\Templating\\render'])]); + return new RuleDefinition('Turn defined function call new one', [new ConfiguredCodeSample('view("...", []);', 'Laravel\\Templating\\render("...", []);', ['view' => 'Laravel\\Templating\\render'])]); } /** * @return array> diff --git a/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php b/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php index ab734a101..444f5c9e0 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/FunctionLike/RenameFunctionLikeParamWithinCallLikeArgRector.php @@ -23,7 +23,7 @@ use Rector\Renaming\ValueObject\RenameFunctionLikeParamWithinCallLikeArg; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\FunctionLike\RenameFunctionLikeParamWithinCallLikeArgRector\RenameFunctionLikeParamWithinCallLikeArgRectorTest */ @@ -31,23 +31,20 @@ final class RenameFunctionLikeParamWithinCallLikeArgRector extends AbstractRecto { /** * @readonly - * @var \Rector\Naming\Guard\BreakingVariableRenameGuard */ - private $breakingVariableRenameGuard; + private BreakingVariableRenameGuard $breakingVariableRenameGuard; /** * @readonly - * @var \Rector\Naming\ParamRenamer\ParamRenamer */ - private $paramRenamer; + private ParamRenamer $paramRenamer; /** * @readonly - * @var \Rector\Naming\ValueObjectFactory\ParamRenameFactory */ - private $paramRenameFactory; + private ParamRenameFactory $paramRenameFactory; /** * @var RenameFunctionLikeParamWithinCallLikeArg[] */ - private $renameFunctionLikeParamWithinCallLikeArgs = []; + private array $renameFunctionLikeParamWithinCallLikeArgs = []; public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ParamRenamer $paramRenamer, ParamRenameFactory $paramRenameFactory) { $this->breakingVariableRenameGuard = $breakingVariableRenameGuard; @@ -92,9 +89,6 @@ public function refactor(Node $node) : ?Node if (!$this->isObjectType($type, $renameFunctionLikeParamWithinCallLikeArg->getObjectType())) { continue; } - if (($node->name ?? null) === null) { - continue; - } if (!$node->name instanceof Identifier) { continue; } @@ -116,7 +110,7 @@ public function refactor(Node $node) : ?Node if (!$param->var instanceof Variable) { continue; } - if (($functionLike instanceof Closure || $functionLike instanceof ArrowFunction) && $this->breakingVariableRenameGuard->shouldSkipVariable((string) $this->nodeNameResolver->getName($param->var), $renameFunctionLikeParamWithinCallLikeArg->getNewParamName(), $functionLike, $param->var)) { + if (($functionLike instanceof Closure || $functionLike instanceof ArrowFunction) && $this->breakingVariableRenameGuard->shouldSkipVariable((string) $this->getName($param->var), $renameFunctionLikeParamWithinCallLikeArg->getNewParamName(), $functionLike, $param->var)) { continue; } $paramRename = $this->paramRenameFactory->createFromResolvedExpectedName($functionLike, $param, $renameFunctionLikeParamWithinCallLikeArg->getNewParamName()); @@ -167,7 +161,7 @@ private function processPositionalArg(CallLike $callLike, RenameFunctionLikePara return null; } // int positions shouldn't have names - if ($arg->name !== null) { + if ($arg->name instanceof Identifier) { return null; } return $arg; @@ -175,7 +169,7 @@ private function processPositionalArg(CallLike $callLike, RenameFunctionLikePara private function processNamedArg(CallLike $callLike, RenameFunctionLikeParamWithinCallLikeArg $renameFunctionLikeParamWithinCallLikeArg) : ?Arg { $args = \array_filter($callLike->getArgs(), static function (Arg $arg) use($renameFunctionLikeParamWithinCallLikeArg) : bool { - if ($arg->name === null) { + if (!$arg->name instanceof Identifier) { return \false; } return $arg->name->name === $renameFunctionLikeParamWithinCallLikeArg->getCallLikePosition(); diff --git a/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php b/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php index 752f5b3b5..5a7c55100 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/MethodCall/RenameMethodRector.php @@ -13,43 +13,42 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Interface_; +use PhpParser\Node\Stmt\Trait_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\NodeManipulator\ClassManipulator; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\Renaming\Contract\MethodCallRenameInterface; use Rector\Renaming\ValueObject\MethodCallRename; use Rector\Renaming\ValueObject\MethodCallRenameWithArrayKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\MethodCall\RenameMethodRector\RenameMethodRectorTest */ -final class RenameMethodRector extends AbstractScopeAwareRector implements ConfigurableRectorInterface +final class RenameMethodRector extends AbstractRector implements ConfigurableRectorInterface { /** * @readonly - * @var \Rector\NodeManipulator\ClassManipulator */ - private $classManipulator; + private ClassManipulator $classManipulator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var MethodCallRenameInterface[] */ - private $methodCallRenames = []; + private array $methodCallRenames = []; public function __construct(ClassManipulator $classManipulator, ReflectionResolver $reflectionResolver, ReflectionProvider $reflectionProvider) { $this->classManipulator = $classManipulator; @@ -58,7 +57,7 @@ public function __construct(ClassManipulator $classManipulator, ReflectionResolv } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns method names to new ones.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Turn method names to new ones', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' $someObject = new SomeExampleClass; $someObject->oldMethod(); CODE_SAMPLE @@ -73,14 +72,15 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [MethodCall::class, NullsafeMethodCall::class, StaticCall::class, Class_::class, Interface_::class]; + return [MethodCall::class, NullsafeMethodCall::class, StaticCall::class, Class_::class, Trait_::class, Interface_::class]; } /** - * @param MethodCall|NullsafeMethodCall|StaticCall|Class_|Interface_ $node + * @param MethodCall|NullsafeMethodCall|StaticCall|Class_|Interface_|Trait_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { - if ($node instanceof Class_ || $node instanceof Interface_) { + $scope = ScopeFetcher::fetch($node); + if ($node instanceof Class_ || $node instanceof Trait_ || $node instanceof Interface_) { return $this->refactorClass($node, $scope); } return $this->refactorMethodCallAndStaticCall($node); @@ -117,7 +117,7 @@ private function shouldSkipClassMethod($call, MethodCallRenameInterface $methodC return $classReflection->hasMethod($methodCallRename->getNewMethod()); } /** - * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_ $classOrInterface + * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Interface_ $classOrInterface */ private function hasClassNewClassMethod($classOrInterface, MethodCallRenameInterface $methodCallRename) : bool { @@ -135,14 +135,11 @@ private function shouldKeepForParentInterface(MethodCallRenameInterface $methodC return $this->classManipulator->hasParentMethodOrInterface($methodCallRename->getObjectType(), $methodCallRename->getOldMethod()); } /** - * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_ $classOrInterface - * @return \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|null + * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Interface_ $classOrInterface + * @return \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Interface_|null */ private function refactorClass($classOrInterface, Scope $scope) { - if (!$scope->isInClass()) { - return null; - } $classReflection = $scope->getClassReflection(); $hasChanged = \false; foreach ($classOrInterface->getMethods() as $classMethod) { @@ -165,13 +162,16 @@ private function refactorClass($classOrInterface, Scope $scope) return null; } /** - * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_ $classOrInterface + * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Interface_ $classOrInterface */ private function shouldSkipRename(string $methodName, ClassMethod $classMethod, MethodCallRenameInterface $methodCallRename, $classOrInterface, ?ClassReflection $classReflection) : bool { if (!$this->nodeNameResolver->isStringName($methodName, $methodCallRename->getOldMethod())) { return \true; } + if (!$classReflection instanceof ClassReflection && $classOrInterface instanceof Trait_) { + return $this->hasClassNewClassMethod($classOrInterface, $methodCallRename); + } if (!$this->nodeTypeResolver->isMethodStaticCallOrClassMethodObjectType($classMethod, $methodCallRename->getObjectType())) { return \true; } diff --git a/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php b/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php index 728c9865b..6de3d21a6 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/Name/RenameClassRector.php @@ -4,13 +4,17 @@ namespace Rector\Renaming\Rector\Name; use PhpParser\Node; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\FunctionLike; +use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; -use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\Property; +use PhpParser\NodeVisitor; +use PHPStan\Reflection\ReflectionProvider; use Rector\Configuration\RenamedClassesDataCollector; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -18,7 +22,7 @@ use Rector\Renaming\NodeManipulator\ClassRenamer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\Name\RenameClassRector\RenameClassRectorTest */ @@ -26,22 +30,25 @@ final class RenameClassRector extends AbstractRector implements ConfigurableRect { /** * @readonly - * @var \Rector\Configuration\RenamedClassesDataCollector */ - private $renamedClassesDataCollector; + private RenamedClassesDataCollector $renamedClassesDataCollector; /** * @readonly - * @var \Rector\Renaming\NodeManipulator\ClassRenamer */ - private $classRenamer; - public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, ClassRenamer $classRenamer) + private ClassRenamer $classRenamer; + /** + * @readonly + */ + private ReflectionProvider $reflectionProvider; + public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, ClassRenamer $classRenamer, ReflectionProvider $reflectionProvider) { $this->renamedClassesDataCollector = $renamedClassesDataCollector; $this->classRenamer = $classRenamer; + $this->reflectionProvider = $reflectionProvider; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replaces defined classes by new ones.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace defined classes by new ones', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' namespace App; use SomeOldClass; @@ -72,19 +79,34 @@ function someFunction(SomeNewClass $someOldClass): SomeNewClass */ public function getNodeTypes() : array { - return [FullyQualified::class, Property::class, FunctionLike::class, Expression::class, ClassLike::class, If_::class]; + return [ + ClassConstFetch::class, + // place FullyQualified before Name on purpose executed early before the Name as parent + FullyQualified::class, + // Name as parent of FullyQualified executed later for fallback annotation to attribute rename to Name + Name::class, + Property::class, + FunctionLike::class, + Expression::class, + ClassLike::class, + If_::class, + ]; } /** - * @param FunctionLike|FullyQualified|ClassLike|Expression|Namespace_|Property|If_ $node + * @param ClassConstFetch|FunctionLike|FullyQualified|Name|ClassLike|Expression|Property|If_ $node + * @return int|null|\PhpParser\Node */ - public function refactor(Node $node) : ?Node + public function refactor(Node $node) { $oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses(); - if ($oldToNewClasses !== []) { - $scope = $node->getAttribute(AttributeKey::SCOPE); - return $this->classRenamer->renameNode($node, $oldToNewClasses, $scope); + if ($oldToNewClasses === []) { + return null; } - return null; + if ($node instanceof ClassConstFetch) { + return $this->processClassConstFetch($node, $oldToNewClasses); + } + $scope = $node->getAttribute(AttributeKey::SCOPE); + return $this->classRenamer->renameNode($node, $oldToNewClasses, $scope); } /** * @param mixed[] $configuration @@ -95,4 +117,32 @@ public function configure(array $configuration) : void Assert::allString(\array_keys($configuration)); $this->renamedClassesDataCollector->addOldToNewClasses($configuration); } + /** + * @param array $oldToNewClasses + */ + private function processClassConstFetch(ClassConstFetch $classConstFetch, array $oldToNewClasses) : ?int + { + if (!$classConstFetch->class instanceof FullyQualified || !$classConstFetch->name instanceof Identifier || !$this->reflectionProvider->hasClass($classConstFetch->class->toString())) { + return null; + } + foreach ($oldToNewClasses as $oldClass => $newClass) { + if (!$this->isName($classConstFetch->class, $oldClass)) { + continue; + } + if (!$this->reflectionProvider->hasClass($newClass)) { + continue; + } + $classReflection = $this->reflectionProvider->getClass($newClass); + if (!$classReflection->isInterface()) { + continue; + } + $oldClassReflection = $this->reflectionProvider->getClass($oldClass); + if ($oldClassReflection->hasConstant($classConstFetch->name->toString()) && !$classReflection->hasConstant($classConstFetch->name->toString())) { + // no constant found on new interface? skip node below ClassConstFetch on this rule + return NodeVisitor::DONT_TRAVERSE_CHILDREN; + } + } + // continue to next Name usage + return null; + } } diff --git a/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php b/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php index 981bac4de..aff333ed3 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php @@ -15,7 +15,7 @@ use Rector\Renaming\ValueObject\RenameProperty; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\PropertyFetch\RenamePropertyRector\RenamePropertyRectorTest */ @@ -24,14 +24,11 @@ final class RenamePropertyRector extends AbstractRector implements ConfigurableR /** * @var RenameProperty[] */ - private $renamedProperties = []; - /** - * @var bool - */ - private $hasChanged = \false; + private array $renamedProperties = []; + private bool $hasChanged = \false; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replaces defined old properties by new ones.', [new ConfiguredCodeSample('$someObject->someOldProperty;', '$someObject->someNewProperty;', [new RenameProperty('SomeClass', 'someOldProperty', 'someNewProperty')])]); + return new RuleDefinition('Replace defined old properties by new ones', [new ConfiguredCodeSample('$someObject->someOldProperty;', '$someObject->someNewProperty;', [new RenameProperty('SomeClass', 'someOldProperty', 'someNewProperty')])]); } /** * @return array> @@ -67,7 +64,7 @@ public function configure(array $configuration) : void } private function renameProperty(ClassLike $classLike, RenameProperty $renameProperty) : void { - $classLikeName = (string) $this->nodeNameResolver->getName($classLike); + $classLikeName = (string) $this->getName($classLike); $renamePropertyObjectType = $renameProperty->getObjectType(); $className = $renamePropertyObjectType->getClassName(); $classLikeNameObjectType = new ObjectType($classLikeName); diff --git a/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php b/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php index 74c6d1e95..9cac19cb3 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/StaticCall/RenameStaticMethodRector.php @@ -12,7 +12,7 @@ use Rector\Renaming\ValueObject\RenameStaticMethod; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\StaticCall\RenameStaticMethodRector\RenameStaticMethodRectorTest */ @@ -21,10 +21,10 @@ final class RenameStaticMethodRector extends AbstractRector implements Configura /** * @var RenameStaticMethod[] */ - private $staticMethodRenames = []; + private array $staticMethodRenames = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns method names to new ones.', [new ConfiguredCodeSample('SomeClass::oldStaticMethod();', 'AnotherExampleClass::newStaticMethod();', [new RenameStaticMethod('SomeClass', 'oldMethod', 'AnotherExampleClass', 'newStaticMethod')])]); + return new RuleDefinition('Turn method names to new ones', [new ConfiguredCodeSample('SomeClass::oldStaticMethod();', 'AnotherExampleClass::newStaticMethod();', [new RenameStaticMethod('SomeClass', 'oldMethod', 'AnotherExampleClass', 'newStaticMethod')])]); } /** * @return array> diff --git a/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php b/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php index 728b3c03c..3b3a7929f 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php @@ -10,7 +10,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Renaming\Rector\String_\RenameStringRector\RenameStringRectorTest */ @@ -18,13 +18,12 @@ final class RenameStringRector extends AbstractRector implements ConfigurableRec { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var array */ - private $stringChanges = []; + private array $stringChanges = []; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRename.php b/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRename.php index 4d74239f0..cbd65bbd8 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRename.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRename.php @@ -10,19 +10,16 @@ final class MethodCallRename implements MethodCallRenameInterface { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $oldMethod; + private string $oldMethod; /** * @readonly - * @var string */ - private $newMethod; + private string $newMethod; public function __construct(string $class, string $oldMethod, string $newMethod) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRenameWithArrayKey.php b/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRenameWithArrayKey.php index cf46490bf..620850062 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRenameWithArrayKey.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/MethodCallRenameWithArrayKey.php @@ -10,19 +10,16 @@ final class MethodCallRenameWithArrayKey implements MethodCallRenameInterface { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $oldMethod; + private string $oldMethod; /** * @readonly - * @var string */ - private $newMethod; + private string $newMethod; /** * @readonly * @var mixed diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotation.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotation.php index 396c0d88f..fd5f4ef7e 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotation.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotation.php @@ -11,14 +11,12 @@ final class RenameAnnotation implements RenameAnnotationInterface { /** * @readonly - * @var string */ - private $oldAnnotation; + private string $oldAnnotation; /** * @readonly - * @var string */ - private $newAnnotation; + private string $newAnnotation; public function __construct(string $oldAnnotation, string $newAnnotation) { $this->oldAnnotation = $oldAnnotation; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotationByType.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotationByType.php index d2a4bfa1b..a95cf1dea 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotationByType.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameAnnotationByType.php @@ -10,19 +10,16 @@ final class RenameAnnotationByType implements RenameAnnotationInterface { /** * @readonly - * @var string */ - private $type; + private string $type; /** * @readonly - * @var string */ - private $oldAnnotation; + private string $oldAnnotation; /** * @readonly - * @var string */ - private $newAnnotation; + private string $newAnnotation; public function __construct(string $type, string $oldAnnotation, string $newAnnotation) { $this->type = $type; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameAttribute.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameAttribute.php index 1bf73addc..4a644c5ed 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameAttribute.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameAttribute.php @@ -10,14 +10,12 @@ final class RenameAttribute { /** * @readonly - * @var string */ - private $oldAttribute; + private string $oldAttribute; /** * @readonly - * @var string */ - private $newAttribute; + private string $newAttribute; public function __construct(string $oldAttribute, string $newAttribute) { $this->oldAttribute = $oldAttribute; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassAndConstFetch.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassAndConstFetch.php index a798f8cd0..9db205ba7 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassAndConstFetch.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassAndConstFetch.php @@ -10,24 +10,20 @@ final class RenameClassAndConstFetch implements RenameClassConstFetchInterface { /** * @readonly - * @var string */ - private $oldClass; + private string $oldClass; /** * @readonly - * @var string */ - private $oldConstant; + private string $oldConstant; /** * @readonly - * @var string */ - private $newClass; + private string $newClass; /** * @readonly - * @var string */ - private $newConstant; + private string $newConstant; public function __construct(string $oldClass, string $oldConstant, string $newClass, string $newConstant) { $this->oldClass = $oldClass; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassConstFetch.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassConstFetch.php index 0b24c6624..3f425caf1 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassConstFetch.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameClassConstFetch.php @@ -10,19 +10,16 @@ final class RenameClassConstFetch implements RenameClassConstFetchInterface { /** * @readonly - * @var string */ - private $oldClass; + private string $oldClass; /** * @readonly - * @var string */ - private $oldConstant; + private string $oldConstant; /** * @readonly - * @var string */ - private $newConstant; + private string $newConstant; public function __construct(string $oldClass, string $oldConstant, string $newConstant) { $this->oldClass = $oldClass; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameFunctionLikeParamWithinCallLikeArg.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameFunctionLikeParamWithinCallLikeArg.php index 71b28ae21..8c5a9a110 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameFunctionLikeParamWithinCallLikeArg.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameFunctionLikeParamWithinCallLikeArg.php @@ -9,14 +9,12 @@ final class RenameFunctionLikeParamWithinCallLikeArg { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @var int<0, max>|string * @readonly @@ -26,12 +24,11 @@ final class RenameFunctionLikeParamWithinCallLikeArg * @var int<0, max> * @readonly */ - private $functionLikePosition; + private int $functionLikePosition; /** * @readonly - * @var string */ - private $newParamName; + private string $newParamName; /** * @param int<0, max>|string $callLikePosition * @param int<0, max> $functionLikePosition diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameProperty.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameProperty.php index fd146c1bc..1af746b8c 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameProperty.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameProperty.php @@ -9,19 +9,16 @@ final class RenameProperty { /** * @readonly - * @var string */ - private $type; + private string $type; /** * @readonly - * @var string */ - private $oldProperty; + private string $oldProperty; /** * @readonly - * @var string */ - private $newProperty; + private string $newProperty; public function __construct(string $type, string $oldProperty, string $newProperty) { $this->type = $type; diff --git a/vendor/rector/rector/rules/Renaming/ValueObject/RenameStaticMethod.php b/vendor/rector/rector/rules/Renaming/ValueObject/RenameStaticMethod.php index c41ffb27c..668adef0c 100644 --- a/vendor/rector/rector/rules/Renaming/ValueObject/RenameStaticMethod.php +++ b/vendor/rector/rector/rules/Renaming/ValueObject/RenameStaticMethod.php @@ -9,24 +9,20 @@ final class RenameStaticMethod { /** * @readonly - * @var string */ - private $oldClass; + private string $oldClass; /** * @readonly - * @var string */ - private $oldMethod; + private string $oldMethod; /** * @readonly - * @var string */ - private $newClass; + private string $newClass; /** * @readonly - * @var string */ - private $newMethod; + private string $newMethod; public function __construct(string $oldClass, string $oldMethod, string $newClass, string $newMethod) { $this->oldClass = $oldClass; diff --git a/vendor/rector/rector/rules/Strict/NodeAnalyzer/UnitializedPropertyAnalyzer.php b/vendor/rector/rector/rules/Strict/NodeAnalyzer/UninitializedPropertyAnalyzer.php similarity index 78% rename from vendor/rector/rector/rules/Strict/NodeAnalyzer/UnitializedPropertyAnalyzer.php rename to vendor/rector/rector/rules/Strict/NodeAnalyzer/UninitializedPropertyAnalyzer.php index a4de880db..4e4e106bc 100644 --- a/vendor/rector/rector/rules/Strict/NodeAnalyzer/UnitializedPropertyAnalyzer.php +++ b/vendor/rector/rector/rules/Strict/NodeAnalyzer/UninitializedPropertyAnalyzer.php @@ -9,33 +9,29 @@ use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Property; use PHPStan\Type\ThisType; -use PHPStan\Type\TypeWithClassName; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\AstResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector; -final class UnitializedPropertyAnalyzer +final class UninitializedPropertyAnalyzer { /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; + private ConstructorAssignDetector $constructorAssignDetector; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(AstResolver $astResolver, NodeTypeResolver $nodeTypeResolver, ConstructorAssignDetector $constructorAssignDetector, NodeNameResolver $nodeNameResolver) { $this->astResolver = $astResolver; @@ -43,7 +39,7 @@ public function __construct(AstResolver $astResolver, NodeTypeResolver $nodeType $this->constructorAssignDetector = $constructorAssignDetector; $this->nodeNameResolver = $nodeNameResolver; } - public function isUnitialized(Expr $expr) : bool + public function isUninitialized(Expr $expr) : bool { if (!$expr instanceof PropertyFetch && !$expr instanceof StaticPropertyFetch) { return \false; @@ -52,10 +48,10 @@ public function isUnitialized(Expr $expr) : bool if ($varType instanceof ThisType) { $varType = $varType->getStaticObjectType(); } - if (!$varType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($varType); + if ($className === null) { return \false; } - $className = $varType->getClassName(); $classLike = $this->astResolver->resolveClassFromName($className); if (!$classLike instanceof ClassLike) { return \false; diff --git a/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php b/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php index d386ad691..83d69d30e 100644 --- a/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php +++ b/vendor/rector/rector/rules/Strict/NodeFactory/ExactCompareFactory.php @@ -4,9 +4,9 @@ namespace Rector\Strict\NodeFactory; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BinaryOp\Identical; @@ -18,27 +18,25 @@ use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; -use PHPStan\Type\NullType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; -use PHPStan\Type\TypeWithClassName; use PHPStan\Type\UnionType; use Rector\PhpParser\Node\NodeFactory; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class ExactCompareFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; } /** - * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BooleanNot|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|null|\PhpParser\Node\Expr\FuncCall + * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BooleanNot|null|\PhpParser\Node\Expr\FuncCall */ public function createIdenticalFalsyCompare(Type $exprType, Expr $expr, bool $treatAsNonEmpty, bool $isOnlyString = \true) { @@ -49,12 +47,12 @@ public function createIdenticalFalsyCompare(Type $exprType, Expr $expr, bool $tr } $result = new BooleanOr(new Identical($expr, new String_('')), new Identical($expr, new String_('0'))); } elseif ($exprType->isInteger()->yes()) { - return new Identical($expr, new LNumber(0)); + return new Identical($expr, new Int_(0)); } elseif ($exprType->isBoolean()->yes()) { return new Identical($expr, $this->nodeFactory->createFalse()); } elseif ($exprType->isArray()->yes()) { return new Identical($expr, new Array_([])); - } elseif ($exprType instanceof NullType) { + } elseif ($exprType->isNull()->yes()) { return new Identical($expr, $this->nodeFactory->createNull()); } elseif (!$exprType instanceof UnionType) { return null; @@ -64,10 +62,13 @@ public function createIdenticalFalsyCompare(Type $exprType, Expr $expr, bool $tr if ($result instanceof BooleanOr && $expr instanceof CallLike && $result->left instanceof Identical && $result->right instanceof Identical) { return new FuncCall(new Name('in_array'), [new Arg($expr), new Arg(new Array_([new ArrayItem($result->left->right), new ArrayItem($result->right->right)])), new Arg(new ConstFetch(new Name('true')))]); } + if ($result instanceof BooleanOr && $expr instanceof CallLike && $result->left instanceof BooleanOr && $result->left->left instanceof Identical && $result->left->right instanceof Identical && $result->right instanceof Identical) { + return new FuncCall(new Name('in_array'), [new Arg($expr), new Arg(new Array_([new ArrayItem($result->left->left->right), new ArrayItem($result->left->right->right), new ArrayItem($result->right->right)])), new Arg(new ConstFetch(new Name('true')))]); + } return $result; } /** - * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\BooleanOr|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BooleanNot|null + * @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BinaryOp\NotIdentical|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BooleanNot|null */ public function createNotIdenticalFalsyCompare(Type $exprType, Expr $expr, bool $treatAsNotEmpty, bool $isOnlyString = \true) { @@ -78,7 +79,7 @@ public function createNotIdenticalFalsyCompare(Type $exprType, Expr $expr, bool } $result = new BooleanAnd(new NotIdentical($expr, new String_('')), new NotIdentical($expr, new String_('0'))); } elseif ($exprType->isInteger()->yes()) { - return new NotIdentical($expr, new LNumber(0)); + return new NotIdentical($expr, new Int_(0)); } elseif ($exprType->isArray()->yes()) { return new NotIdentical($expr, new Array_([])); } elseif (!$exprType instanceof UnionType) { @@ -89,6 +90,9 @@ public function createNotIdenticalFalsyCompare(Type $exprType, Expr $expr, bool if ($result instanceof BooleanAnd && $expr instanceof CallLike && $result->left instanceof NotIdentical && $result->right instanceof NotIdentical) { return new BooleanNot(new FuncCall(new Name('in_array'), [new Arg($expr), new Arg(new Array_([new ArrayItem($result->left->right), new ArrayItem($result->right->right)])), new Arg(new ConstFetch(new Name('true')))])); } + if ($result instanceof BooleanAnd && $expr instanceof CallLike && $result->left instanceof BooleanAnd && $result->left->left instanceof NotIdentical && $result->left->right instanceof NotIdentical && $result->right instanceof NotIdentical) { + return new BooleanNot(new FuncCall(new Name('in_array'), [new Arg($expr), new Arg(new Array_([new ArrayItem($result->left->left->right), new ArrayItem($result->left->right->right), new ArrayItem($result->right->right)])), new Arg(new ConstFetch(new Name('true')))])); + } return $result; } /** @@ -100,8 +104,9 @@ private function createFromUnionType(UnionType $unionType, Expr $expr, bool $tre if ($unionType->isBoolean()->yes()) { return new Identical($expr, $this->nodeFactory->createTrue()); } - if ($unionType instanceof TypeWithClassName) { - return new Instanceof_($expr, new FullyQualified($unionType->getClassName())); + $className = ClassNameFromObjectTypeResolver::resolve($unionType); + if ($className !== null) { + return new Instanceof_($expr, new FullyQualified($className)); } $nullConstFetch = $this->nodeFactory->createNull(); $toNullNotIdentical = new NotIdentical($expr, $nullConstFetch); @@ -190,8 +195,9 @@ private function createTruthyFromUnionType(UnionType $unionType, Expr $expr, boo if ($unionType->isBoolean()->yes()) { return new NotIdentical($expr, $this->nodeFactory->createTrue()); } - if ($unionType instanceof TypeWithClassName) { - return new BooleanNot(new Instanceof_($expr, new FullyQualified($unionType->getClassName()))); + $className = ClassNameFromObjectTypeResolver::resolve($unionType); + if ($className !== null) { + return new BooleanNot(new Instanceof_($expr, new FullyQualified($className))); } $toNullIdentical = new Identical($expr, $this->nodeFactory->createNull()); if ($treatAsNonEmpty) { diff --git a/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php index 886e0c319..285fb14ac 100644 --- a/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php @@ -4,24 +4,21 @@ namespace Rector\Strict\Rector; use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractScopeAwareRector; -use RectorPrefix202411\Webmozart\Assert\Assert; +use Rector\Rector\AbstractRector; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Strict\Rector\BooleanNot\BooleanInBooleanNotRuleFixerRector\BooleanInBooleanNotRuleFixerRectorTest * * @internal */ -abstract class AbstractFalsyScalarRuleFixerRector extends AbstractScopeAwareRector implements ConfigurableRectorInterface +abstract class AbstractFalsyScalarRuleFixerRector extends AbstractRector implements ConfigurableRectorInterface { /** * @api * @var string */ public const TREAT_AS_NON_EMPTY = 'treat_as_non_empty'; - /** - * @var bool - */ - protected $treatAsNonEmpty = \false; + protected bool $treatAsNonEmpty = \false; /** * @param mixed[] $configuration */ diff --git a/vendor/rector/rector/rules/Strict/Rector/BooleanNot/BooleanInBooleanNotRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/BooleanNot/BooleanInBooleanNotRuleFixerRector.php index 94c5b8dbb..45203cc6d 100644 --- a/vendor/rector/rector/rules/Strict/Rector/BooleanNot/BooleanInBooleanNotRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/BooleanNot/BooleanInBooleanNotRuleFixerRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BooleanNot; -use PHPStan\Analyser\Scope; +use Rector\PHPStan\ScopeFetcher; use Rector\Strict\NodeFactory\ExactCompareFactory; use Rector\Strict\Rector\AbstractFalsyScalarRuleFixerRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -21,9 +21,8 @@ final class BooleanInBooleanNotRuleFixerRector extends AbstractFalsyScalarRuleFi { /** * @readonly - * @var \Rector\Strict\NodeFactory\ExactCompareFactory */ - private $exactCompareFactory; + private ExactCompareFactory $exactCompareFactory; public function __construct(ExactCompareFactory $exactCompareFactory) { $this->exactCompareFactory = $exactCompareFactory; @@ -69,8 +68,9 @@ public function getNodeTypes() : array /** * @param BooleanNot $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Expr + public function refactor(Node $node) : ?Expr { + $scope = ScopeFetcher::fetch($node); $exprType = $scope->getNativeType($node->expr); if ($exprType->isBoolean()->yes()) { return null; diff --git a/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php index b7c9df1b1..279edbe54 100644 --- a/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php @@ -14,7 +14,8 @@ use PHPStan\Analyser\Scope; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\NodeAnalyzer\ExprAnalyzer; -use Rector\Strict\NodeAnalyzer\UnitializedPropertyAnalyzer; +use Rector\PHPStan\ScopeFetcher; +use Rector\Strict\NodeAnalyzer\UninitializedPropertyAnalyzer; use Rector\Strict\NodeFactory\ExactCompareFactory; use Rector\Strict\Rector\AbstractFalsyScalarRuleFixerRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -26,24 +27,21 @@ final class DisallowedEmptyRuleFixerRector extends AbstractFalsyScalarRuleFixerR { /** * @readonly - * @var \Rector\Strict\NodeFactory\ExactCompareFactory */ - private $exactCompareFactory; + private ExactCompareFactory $exactCompareFactory; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @readonly - * @var \Rector\Strict\NodeAnalyzer\UnitializedPropertyAnalyzer */ - private $unitializedPropertyAnalyzer; - public function __construct(ExactCompareFactory $exactCompareFactory, ExprAnalyzer $exprAnalyzer, UnitializedPropertyAnalyzer $unitializedPropertyAnalyzer) + private UninitializedPropertyAnalyzer $uninitializedPropertyAnalyzer; + public function __construct(ExactCompareFactory $exactCompareFactory, ExprAnalyzer $exprAnalyzer, UninitializedPropertyAnalyzer $uninitializedPropertyAnalyzer) { $this->exactCompareFactory = $exactCompareFactory; $this->exprAnalyzer = $exprAnalyzer; - $this->unitializedPropertyAnalyzer = $unitializedPropertyAnalyzer; + $this->uninitializedPropertyAnalyzer = $uninitializedPropertyAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -78,8 +76,9 @@ public function getNodeTypes() : array /** * @param Empty_|BooleanNot $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?\PhpParser\Node\Expr + public function refactor(Node $node) : ?\PhpParser\Node\Expr { + $scope = ScopeFetcher::fetch($node); if ($node instanceof BooleanNot) { return $this->refactorBooleanNot($node, $scope); } @@ -105,7 +104,7 @@ private function refactorBooleanNot(BooleanNot $booleanNot, Scope $scope) : ?\Ph if (!$result instanceof Expr) { return null; } - if ($this->unitializedPropertyAnalyzer->isUnitialized($empty->expr)) { + if ($this->uninitializedPropertyAnalyzer->isUninitialized($empty->expr)) { return new BooleanAnd(new Isset_([$empty->expr]), $result); } return $result; @@ -120,7 +119,7 @@ private function refactorEmpty(Empty_ $empty, Scope $scope, bool $treatAsNonEmpt if (!$result instanceof Expr) { return null; } - if ($this->unitializedPropertyAnalyzer->isUnitialized($empty->expr)) { + if ($this->uninitializedPropertyAnalyzer->isUninitialized($empty->expr)) { return new BooleanOr(new BooleanNot(new Isset_([$empty->expr])), $result); } return $result; diff --git a/vendor/rector/rector/rules/Strict/Rector/If_/BooleanInIfConditionRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/If_/BooleanInIfConditionRuleFixerRector.php index 054512b63..4cf2dd73b 100644 --- a/vendor/rector/rector/rules/Strict/Rector/If_/BooleanInIfConditionRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/If_/BooleanInIfConditionRuleFixerRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Stmt\If_; -use PHPStan\Analyser\Scope; +use Rector\PHPStan\ScopeFetcher; use Rector\Strict\NodeFactory\ExactCompareFactory; use Rector\Strict\Rector\AbstractFalsyScalarRuleFixerRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -22,9 +22,8 @@ final class BooleanInIfConditionRuleFixerRector extends AbstractFalsyScalarRuleF { /** * @readonly - * @var \Rector\Strict\NodeFactory\ExactCompareFactory */ - private $exactCompareFactory; + private ExactCompareFactory $exactCompareFactory; public function __construct(ExactCompareFactory $exactCompareFactory) { $this->exactCompareFactory = $exactCompareFactory; @@ -70,9 +69,10 @@ public function getNodeTypes() : array /** * @param If_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?If_ + public function refactor(Node $node) : ?If_ { $hasChanged = \false; + $scope = ScopeFetcher::fetch($node); // 1. if $ifCondExprType = $scope->getNativeType($node->cond); $notIdentical = $this->exactCompareFactory->createNotIdenticalFalsyCompare($ifCondExprType, $node->cond, $this->treatAsNonEmpty); diff --git a/vendor/rector/rector/rules/Strict/Rector/Ternary/BooleanInTernaryOperatorRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/Ternary/BooleanInTernaryOperatorRuleFixerRector.php index e665a3951..838ee301f 100644 --- a/vendor/rector/rector/rules/Strict/Rector/Ternary/BooleanInTernaryOperatorRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/Ternary/BooleanInTernaryOperatorRuleFixerRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Ternary; -use PHPStan\Analyser\Scope; +use Rector\PHPStan\ScopeFetcher; use Rector\Strict\NodeFactory\ExactCompareFactory; use Rector\Strict\Rector\AbstractFalsyScalarRuleFixerRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -21,9 +21,8 @@ final class BooleanInTernaryOperatorRuleFixerRector extends AbstractFalsyScalarR { /** * @readonly - * @var \Rector\Strict\NodeFactory\ExactCompareFactory */ - private $exactCompareFactory; + private ExactCompareFactory $exactCompareFactory; public function __construct(ExactCompareFactory $exactCompareFactory) { $this->exactCompareFactory = $exactCompareFactory; @@ -61,12 +60,13 @@ public function getNodeTypes() : array /** * @param Ternary $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Ternary + public function refactor(Node $node) : ?Ternary { // skip short ternary if (!$node->if instanceof Expr) { return null; } + $scope = ScopeFetcher::fetch($node); $exprType = $scope->getNativeType($node->cond); $expr = $this->exactCompareFactory->createNotIdenticalFalsyCompare($exprType, $node->cond, $this->treatAsNonEmpty); if (!$expr instanceof Expr) { diff --git a/vendor/rector/rector/rules/Strict/Rector/Ternary/DisallowedShortTernaryRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/Ternary/DisallowedShortTernaryRuleFixerRector.php index 8c62c7153..370a3fbbd 100644 --- a/vendor/rector/rector/rules/Strict/Rector/Ternary/DisallowedShortTernaryRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/Ternary/DisallowedShortTernaryRuleFixerRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; use PHPStan\Analyser\Scope; +use Rector\PHPStan\ScopeFetcher; use Rector\Strict\NodeFactory\ExactCompareFactory; use Rector\Strict\Rector\AbstractFalsyScalarRuleFixerRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -22,13 +23,9 @@ final class DisallowedShortTernaryRuleFixerRector extends AbstractFalsyScalarRul { /** * @readonly - * @var \Rector\Strict\NodeFactory\ExactCompareFactory */ - private $exactCompareFactory; - /** - * @var bool - */ - private $hasChanged = \false; + private ExactCompareFactory $exactCompareFactory; + private bool $hasChanged = \false; public function __construct(ExactCompareFactory $exactCompareFactory) { $this->exactCompareFactory = $exactCompareFactory; @@ -66,13 +63,14 @@ public function getNodeTypes() : array /** * @param Ternary $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Ternary + public function refactor(Node $node) : ?Ternary { $this->hasChanged = \false; // skip non-short ternary if ($node->if instanceof Expr) { return null; } + $scope = ScopeFetcher::fetch($node); // special case for reset() function if ($node->cond instanceof FuncCall && $this->isName($node->cond, 'reset')) { $this->refactorResetFuncCall($node, $node->cond, $scope); diff --git a/vendor/rector/rector/rules/Transform/NodeAnalyzer/FuncCallStaticCallToMethodCallAnalyzer.php b/vendor/rector/rector/rules/Transform/NodeAnalyzer/FuncCallStaticCallToMethodCallAnalyzer.php index 9d61adee5..1ecab243a 100644 --- a/vendor/rector/rector/rules/Transform/NodeAnalyzer/FuncCallStaticCallToMethodCallAnalyzer.php +++ b/vendor/rector/rector/rules/Transform/NodeAnalyzer/FuncCallStaticCallToMethodCallAnalyzer.php @@ -22,34 +22,28 @@ final class FuncCallStaticCallToMethodCallAnalyzer { /** * @readonly - * @var \Rector\Transform\NodeTypeAnalyzer\TypeProvidingExprFromClassResolver */ - private $typeProvidingExprFromClassResolver; + private TypeProvidingExprFromClassResolver $typeProvidingExprFromClassResolver; /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\Transform\NodeFactory\PropertyFetchFactory */ - private $propertyFetchFactory; + private PropertyFetchFactory $propertyFetchFactory; /** * @readonly - * @var \Rector\NodeManipulator\ClassDependencyManipulator */ - private $classDependencyManipulator; + private ClassDependencyManipulator $classDependencyManipulator; public function __construct(TypeProvidingExprFromClassResolver $typeProvidingExprFromClassResolver, PropertyNaming $propertyNaming, NodeNameResolver $nodeNameResolver, NodeFactory $nodeFactory, PropertyFetchFactory $propertyFetchFactory, ClassDependencyManipulator $classDependencyManipulator) { $this->typeProvidingExprFromClassResolver = $typeProvidingExprFromClassResolver; diff --git a/vendor/rector/rector/rules/Transform/NodeFactory/PropertyFetchFactory.php b/vendor/rector/rector/rules/Transform/NodeFactory/PropertyFetchFactory.php index 8db027020..af6936edf 100644 --- a/vendor/rector/rector/rules/Transform/NodeFactory/PropertyFetchFactory.php +++ b/vendor/rector/rector/rules/Transform/NodeFactory/PropertyFetchFactory.php @@ -11,9 +11,8 @@ final class PropertyFetchFactory { /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; public function __construct(PropertyNaming $propertyNaming) { $this->propertyNaming = $propertyNaming; diff --git a/vendor/rector/rector/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php b/vendor/rector/rector/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php index b8c354fca..9d18f3db6 100644 --- a/vendor/rector/rector/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php +++ b/vendor/rector/rector/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php @@ -18,27 +18,24 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; -use PHPStan\Type\TypeWithClassName; use Rector\Naming\Naming\PropertyNaming; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\ValueObject\MethodName; final class TypeProvidingExprFromClassResolver { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; public function __construct(ReflectionProvider $reflectionProvider, NodeNameResolver $nodeNameResolver, PropertyNaming $propertyNaming) { $this->reflectionProvider = $reflectionProvider; @@ -107,7 +104,8 @@ private function isMatchingType(Type $readableType, ObjectType $objectType) : bo return \false; } $readableType = TypeCombinator::removeNull($readableType); - if (!$readableType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($readableType); + if ($className === null) { return \false; } return $readableType->equals($objectType); diff --git a/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php index d38d0c975..25269d947 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ArrayDimFetch/ArrayDimFetchToMethodCallRector.php @@ -13,7 +13,7 @@ use Rector\Transform\ValueObject\ArrayDimFetchToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\ArrayDimFetch\ArrayDimFetchToMethodCallRector\ArrayDimFetchToMethodCallRectorTest */ @@ -22,7 +22,7 @@ class ArrayDimFetchToMethodCallRector extends AbstractRector implements Configur /** * @var ArrayDimFetchToMethodCall[] */ - private $arrayDimFetchToMethodCalls; + private array $arrayDimFetchToMethodCalls; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change array dim fetch to method call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php index fa14360fc..bc975d8e8 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\PropertyAssignToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\Assign\PropertyAssignToMethodCallRector\PropertyAssignToMethodCallRectorTest */ @@ -21,10 +21,10 @@ final class PropertyAssignToMethodCallRector extends AbstractRector implements C /** * @var PropertyAssignToMethodCall[] */ - private $propertyAssignsToMethodCalls = []; + private array $propertyAssignsToMethodCalls = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns property assign of specific type and property name to method call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Turn property assign of specific type and property name to method call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' $someObject = new SomeClass; $someObject->oldProperty = false; CODE_SAMPLE diff --git a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php index e0b5fb787..1aec40b42 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Assign/PropertyFetchToMethodCallRector.php @@ -13,7 +13,7 @@ use Rector\Transform\ValueObject\PropertyFetchToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\Assign\PropertyFetchToMethodCallRector\PropertyFetchToMethodCallRectorTest */ @@ -22,10 +22,10 @@ final class PropertyFetchToMethodCallRector extends AbstractRector implements Co /** * @var PropertyFetchToMethodCall[] */ - private $propertiesToMethodCalls = []; + private array $propertiesToMethodCalls = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replaces properties assign calls be defined methods.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace properties assign calls be defined methods', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' $result = $object->property; $object->property = $value; diff --git a/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php index c2e23ab77..3f60366fe 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php @@ -22,7 +22,7 @@ use Rector\Transform\ValueObject\AttributeKeyToClassConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api used in rector-doctrine * @see \Rector\Tests\Transform\Rector\Attribute\AttributeKeyToClassConstFetchRector\AttributeKeyToClassConstFetchRectorTest @@ -31,13 +31,12 @@ final class AttributeKeyToClassConstFetchRector extends AbstractRector implement { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var AttributeKeyToClassConstFetch[] */ - private $attributeKeysToClassConstFetches = []; + private array $attributeKeysToClassConstFetches = []; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php index 8b096a17a..a1b1ea7c8 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php @@ -17,7 +17,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\ClassMethod\ReturnTypeWillChangeRector\ReturnTypeWillChangeRectorTest */ @@ -25,23 +25,20 @@ final class ReturnTypeWillChangeRector extends AbstractRector implements MinPhpV { /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @var ClassMethodReference[] */ - private $returnTypeChangedClassMethodReferences = []; + private array $returnTypeChangedClassMethodReferences = []; public function __construct(PhpAttributeAnalyzer $phpAttributeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, ReflectionResolver $reflectionResolver) { $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; @@ -93,7 +90,7 @@ public function refactor(Node $node) : ?Node continue; } foreach ($this->returnTypeChangedClassMethodReferences as $returnTypeChangedClassMethodReference) { - if (!$classReflection->isSubclassOf($returnTypeChangedClassMethodReference->getClass())) { + if (!$classReflection->is($returnTypeChangedClassMethodReference->getClass())) { continue; } if (!$this->isName($classMethod, $returnTypeChangedClassMethodReference->getMethod())) { diff --git a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php index 965b7a219..754899787 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ClassMethod/WrapReturnRector.php @@ -4,9 +4,9 @@ namespace Rector\Transform\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; @@ -15,7 +15,7 @@ use Rector\Transform\ValueObject\WrapReturn; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\ClassMethod\WrapReturnRector\WrapReturnRectorTest */ @@ -24,7 +24,7 @@ final class WrapReturnRector extends AbstractRector implements ConfigurableRecto /** * @var WrapReturn[] */ - private $typeMethodWraps = []; + private array $typeMethodWraps = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Wrap return value of specific method', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' @@ -71,8 +71,9 @@ public function refactor(Node $node) : ?Node if ($node->stmts === null) { continue; } - $this->wrap($classMethod, $typeMethodWrap->isArrayWrap()); - $hasChanged = \true; + if ($typeMethodWrap->isArrayWrap() && $this->wrap($classMethod)) { + $hasChanged = \true; + } } } if ($hasChanged) { @@ -88,19 +89,18 @@ public function configure(array $configuration) : void Assert::allIsAOf($configuration, WrapReturn::class); $this->typeMethodWraps = $configuration; } - private function wrap(ClassMethod $classMethod, bool $isArrayWrap) : ?ClassMethod + private function wrap(ClassMethod $classMethod) : bool { if (!\is_iterable($classMethod->stmts)) { - return null; + return \false; } - foreach ($classMethod->stmts as $key => $stmt) { - if ($stmt instanceof Return_ && $stmt->expr instanceof Expr) { - if ($isArrayWrap && !$stmt->expr instanceof Array_) { - $stmt->expr = new Array_([new ArrayItem($stmt->expr)]); - } - $classMethod->stmts[$key] = $stmt; + $hasChanged = \false; + foreach ($classMethod->stmts as $stmt) { + if ($stmt instanceof Return_ && $stmt->expr instanceof Expr && !$stmt->expr instanceof Array_) { + $stmt->expr = new Array_([new ArrayItem($stmt->expr)]); + $hasChanged = \true; } } - return $classMethod; + return $hasChanged; } } diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php index 40e47d9ae..da7d86511 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/AddAllowDynamicPropertiesAttributeRector.php @@ -18,7 +18,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\Class_\AddAllowDynamicPropertiesAttributeRector\AddAllowDynamicPropertiesAttributeRectorTest */ @@ -26,28 +26,24 @@ final class AddAllowDynamicPropertiesAttributeRector extends AbstractRector impl { /** * @readonly - * @var \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer */ - private $familyRelationsAnalyzer; + private FamilyRelationsAnalyzer $familyRelationsAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var array */ - private $transformOnNamespaces = []; + private array $transformOnNamespaces = []; public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, ReflectionProvider $reflectionProvider) { $this->familyRelationsAnalyzer = $familyRelationsAnalyzer; @@ -144,9 +140,7 @@ private function shouldSkip(Class_ $class) : bool } private function isExistsWithWildCards(string $className) : bool { - $wildcardTransformOnNamespaces = \array_filter($this->transformOnNamespaces, static function (string $transformOnNamespace) : bool { - return \strpos($transformOnNamespace, '*') !== \false; - }); + $wildcardTransformOnNamespaces = \array_filter($this->transformOnNamespaces, static fn(string $transformOnNamespace): bool => \strpos($transformOnNamespace, '*') !== \false); foreach ($wildcardTransformOnNamespaces as $wildcardTransformOnNamespace) { if (!\fnmatch($wildcardTransformOnNamespace, $className, \FNM_NOESCAPE)) { continue; @@ -157,9 +151,7 @@ private function isExistsWithWildCards(string $className) : bool } private function isExistsWithClassName(string $className) : bool { - $transformedClassNames = \array_filter($this->transformOnNamespaces, static function (string $transformOnNamespace) : bool { - return \strpos($transformOnNamespace, '*') === \false; - }); + $transformedClassNames = \array_filter($this->transformOnNamespaces, static fn(string $transformOnNamespace): bool => \strpos($transformOnNamespace, '*') === \false); foreach ($transformedClassNames as $transformedClassName) { if (!$this->nodeNameResolver->isStringName($className, $transformedClassName)) { continue; diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php index ec5679d33..4df06bf65 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php @@ -6,23 +6,23 @@ use PhpParser\Node; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api used in rector-doctrine * @see \Rector\Tests\Transform\Rector\Class_\AddInterfaceByTraitRector\AddInterfaceByTraitRectorTest */ -final class AddInterfaceByTraitRector extends AbstractScopeAwareRector implements ConfigurableRectorInterface +final class AddInterfaceByTraitRector extends AbstractRector implements ConfigurableRectorInterface { /** * @var array */ - private $interfaceByTrait = []; + private array $interfaceByTrait = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Add interface by used trait', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' @@ -49,8 +49,9 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); $classReflection = $scope->getClassReflection(); if (!$classReflection instanceof ClassReflection) { return null; diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php index f74e91a6f..40aadab69 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/MergeInterfacesRector.php @@ -4,14 +4,14 @@ namespace Rector\Transform\Rector\Class_; use PhpParser\Node; -use PhpParser\Node\Name; +use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Interface_; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * Covers cases like * - https://github.com/FriendsOfPHP/PHP-CS-Fixer/commit/a1cdb4d2dd8f45d731244eed406e1d537218cc66 @@ -24,10 +24,10 @@ final class MergeInterfacesRector extends AbstractRector implements Configurable /** * @var array */ - private $oldToNewInterfaces = []; + private array $oldToNewInterfaces = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Merges old interface to a new one, that already has its methods', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Merge old interface to a new one, that already has its methods', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class SomeClass implements SomeInterface, SomeOldInterface { } @@ -61,7 +61,7 @@ public function refactor(Node $node) : ?Node continue; } $interface = $this->getName($implement); - $node->implements[$key] = new Name($this->oldToNewInterfaces[$interface]); + $node->implements[$key] = new FullyQualified($this->oldToNewInterfaces[$interface]); $hasChanged = \true; } if (!$hasChanged) { diff --git a/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php b/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php index 0361e115f..fdaeb56a6 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Class_/ParentClassToTraitsRector.php @@ -14,7 +14,7 @@ use Rector\Transform\ValueObject\ParentClassToTraits; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * Can handle cases like: * - https://doc.nette.org/en/2.4/migration-2-4#toc-nette-smartobject @@ -26,20 +26,19 @@ final class ParentClassToTraitsRector extends AbstractRector implements Configur { /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @var ParentClassToTraits[] */ - private $parentClassToTraits = []; + private array $parentClassToTraits = []; public function __construct(ClassAnalyzer $classAnalyzer) { $this->classAnalyzer = $classAnalyzer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replaces parent class to specific traits', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace parent class to specific traits', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class SomeClass extends Nette\Object { } diff --git a/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php index 33d5bc447..1d7df1ffe 100644 --- a/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php @@ -11,7 +11,7 @@ use Rector\Transform\ValueObject\ConstFetchToClassConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see Rector\Tests\Transform\Rector\ConstFetch\ConstFetchToClassConstFetchRector\ConstFetchToClassConstFetchTest */ @@ -20,7 +20,7 @@ final class ConstFetchToClassConstFetchRector extends AbstractRector implements /** * @var ConstFetchToClassConstFetch[] */ - private $constFetchToClassConsts = []; + private array $constFetchToClassConsts = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change const fetch to class const fetch', [new ConfiguredCodeSample('$x = CONTEXT_COURSE', '$x = course::LEVEL', [new ConstFetchToClassConstFetch('CONTEXT_COURSE', 'course', 'LEVEL')])]); diff --git a/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php b/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php index 017107dd6..b64d5ebcf 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FileWithoutNamespace/RectorConfigBuilderRector.php @@ -4,8 +4,8 @@ namespace Rector\Transform\Rector\FileWithoutNamespace; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; @@ -18,7 +18,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FileWithoutNamespace\RectorConfigBuilderRector\RectorConfigBuilderRectorTest */ diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php index cea9ec905..384cce689 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToConstFetchRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToConstFetchRector\FunctionCallToConstantRectorTest */ @@ -20,7 +20,7 @@ final class FuncCallToConstFetchRector extends AbstractRector implements Configu /** * @var string[] */ - private $functionsToConstants = []; + private array $functionsToConstants = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes use of function calls to use constants', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php index 3d7aa9878..e62ff2b76 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\FuncCallToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToMethodCallRector\FuncCallToMethodCallRectorTest */ @@ -20,20 +20,19 @@ final class FuncCallToMethodCallRector extends AbstractRector implements Configu { /** * @readonly - * @var \Rector\Transform\NodeAnalyzer\FuncCallStaticCallToMethodCallAnalyzer */ - private $funcCallStaticCallToMethodCallAnalyzer; + private FuncCallStaticCallToMethodCallAnalyzer $funcCallStaticCallToMethodCallAnalyzer; /** * @var FuncCallToMethodCall[] */ - private $funcNameToMethodCallNames = []; + private array $funcNameToMethodCallNames = []; public function __construct(FuncCallStaticCallToMethodCallAnalyzer $funcCallStaticCallToMethodCallAnalyzer) { $this->funcCallStaticCallToMethodCallAnalyzer = $funcCallStaticCallToMethodCallAnalyzer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns defined function calls to local method calls.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Turn defined function calls to local method calls', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php index 1a21066b5..0b45084e7 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToNewRector.php @@ -11,7 +11,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToNewRector\FuncCallToNewRectorTest */ @@ -20,7 +20,7 @@ final class FuncCallToNewRector extends AbstractRector implements ConfigurableRe /** * @var string[] */ - private $functionToNew = []; + private array $functionToNew = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change configured function calls to new Instance', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php index 6cb07932a..0e768dcae 100644 --- a/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/FuncCall/FuncCallToStaticCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\FuncCallToStaticCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\FuncCall\FuncCallToStaticCallRector\FuncCallToStaticCallRectorTest */ @@ -19,10 +19,10 @@ final class FuncCallToStaticCallRector extends AbstractRector implements Configu /** * @var FuncCallToStaticCall[] */ - private $funcCallsToStaticCalls = []; + private array $funcCallsToStaticCalls = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns defined function call to static method call.', [new ConfiguredCodeSample('view("...", []);', 'SomeClass::render("...", []);', [new FuncCallToStaticCall('view', 'SomeStaticClass', 'render')])]); + return new RuleDefinition('Turn defined function call to static method call', [new ConfiguredCodeSample('view("...", []);', 'SomeClass::render("...", []);', [new FuncCallToStaticCall('view', 'SomeStaticClass', 'render')])]); } /** * @return array> diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php index 495a77681..5fece55e3 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToFuncCallRector.php @@ -13,7 +13,7 @@ use Rector\Transform\ValueObject\MethodCallToFuncCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\MethodCallToFuncCallRector\MethodCallToFuncCallRectorTest */ @@ -22,7 +22,7 @@ final class MethodCallToFuncCallRector extends AbstractRector implements Configu /** * @var MethodCallToFuncCall[] */ - private $methodCallsToFuncCalls = []; + private array $methodCallsToFuncCalls = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change method call to function call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php index 72cac86ab..5d0772d10 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToNewRector.php @@ -13,7 +13,7 @@ use Rector\Transform\ValueObject\MethodCallToNew; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\MethodCallToNewRector\MethodCallToNewRectorTest */ @@ -22,7 +22,7 @@ class MethodCallToNewRector extends AbstractRector implements ConfigurableRector /** * @var MethodCallToNew[] */ - private $methodCallToNew; + private array $methodCallToNew; /** * @param MethodCallToNew[] $configuration */ diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php index 83bfba916..fb1d36925 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToPropertyFetchRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\MethodCallToPropertyFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\MethodCallToPropertyFetchRector\MethodCallToPropertyFetchRectorTest */ @@ -19,10 +19,10 @@ final class MethodCallToPropertyFetchRector extends AbstractRector implements Co /** * @var MethodCallToPropertyFetch[] */ - private $methodCallsToPropertyFetches = []; + private array $methodCallsToPropertyFetches = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns method call "$this->getFirstname()" to property fetch "$this->firstname"', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Turn method call `$this->getFirstname()` to property fetch `$this->firstname`', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run() diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php index 0f9d1f82d..97974e25a 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/MethodCallToStaticCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\MethodCallToStaticCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\MethodCallToStaticCallRector\MethodCallToStaticCallRectorTest */ @@ -19,7 +19,7 @@ final class MethodCallToStaticCallRector extends AbstractRector implements Confi /** * @var MethodCallToStaticCall[] */ - private $methodCallsToStaticCalls = []; + private array $methodCallsToStaticCalls = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change method call to desired static call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php b/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php index 1edd7dd0c..7783a0636 100644 --- a/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/MethodCall/ReplaceParentCallByPropertyCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\ReplaceParentCallByPropertyCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\MethodCall\ReplaceParentCallByPropertyCallRector\ReplaceParentCallByPropertyCallRectorTest */ @@ -19,7 +19,7 @@ final class ReplaceParentCallByPropertyCallRector extends AbstractRector impleme /** * @var ReplaceParentCallByPropertyCall[] */ - private $parentCallToProperties = []; + private array $parentCallToProperties = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes method calls in child of specific types to defined property method call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php b/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php index bce70c9fe..ef720617a 100644 --- a/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/New_/NewToStaticCallRector.php @@ -10,7 +10,7 @@ use Rector\Transform\ValueObject\NewToStaticCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\New_\NewToStaticCallRector\NewToStaticCallRectorTest */ @@ -19,7 +19,7 @@ final class NewToStaticCallRector extends AbstractRector implements Configurable /** * @var NewToStaticCall[] */ - private $typeToStaticCalls = []; + private array $typeToStaticCalls = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change new Object to static call', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php index b16f0ea57..d27c9757b 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Scalar/ScalarValueToConstFetchRector.php @@ -8,15 +8,15 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Rector\AbstractRector; use Rector\Transform\ValueObject\ScalarValueToConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see Rector\Tests\Transform\Rector\Scalar\ScalarValueToConstFetchRector\ScalarValueToConstFetchRectorTest */ @@ -25,7 +25,7 @@ class ScalarValueToConstFetchRector extends AbstractRector implements Configurab /** * @var ScalarValueToConstFetch[] */ - private $scalarValueToConstFetches; + private array $scalarValueToConstFetches; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Replaces Scalar values with a ConstFetch or ClassConstFetch', [new ConfiguredCodeSample(<<<'SAMPLE' @@ -34,14 +34,14 @@ public function getRuleDefinition() : RuleDefinition , <<<'SAMPLE' $var = \SomeClass::FOOBAR_INT; SAMPLE -, [new ScalarValueToConstFetch(new LNumber(10), new ClassConstFetch(new FullyQualified('SomeClass'), new Identifier('FOOBAR_INT')))])]); +, [new ScalarValueToConstFetch(new Int_(10), new ClassConstFetch(new FullyQualified('SomeClass'), new Identifier('FOOBAR_INT')))])]); } public function getNodeTypes() : array { - return [String_::class, DNumber::class, LNumber::class]; + return [String_::class, Float_::class, Int_::class]; } /** - * @param String_|DNumber|LNumber $node + * @param String_|Float_|Int_ $node * @return \PhpParser\Node\Expr\ConstFetch|\PhpParser\Node\Expr\ClassConstFetch|null */ public function refactor(Node $node) diff --git a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php index e95923044..618ae7623 100644 --- a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToFuncCallRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\StaticCallToFuncCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\StaticCall\StaticCallToFuncCallRector\StaticCallToFuncCallRectorTest */ @@ -21,10 +21,10 @@ final class StaticCallToFuncCallRector extends AbstractRector implements Configu /** * @var StaticCallToFuncCall[] */ - private $staticCallsToFunctions = []; + private array $staticCallsToFunctions = []; public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns static call to function call.', [new ConfiguredCodeSample('OldClass::oldMethod("args");', 'new_function("args");', [new StaticCallToFuncCall('OldClass', 'oldMethod', 'new_function')])]); + return new RuleDefinition('Turn static call to function call', [new ConfiguredCodeSample('OldClass::oldMethod("args");', 'new_function("args");', [new StaticCallToFuncCall('OldClass', 'oldMethod', 'new_function')])]); } /** * @return array> diff --git a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php index 06e68a5cd..1bb6cbe2e 100644 --- a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php @@ -9,29 +9,27 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; -use PHPStan\Analyser\Scope; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Exception\ShouldNotHappenException; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\Transform\NodeAnalyzer\FuncCallStaticCallToMethodCallAnalyzer; use Rector\Transform\ValueObject\StaticCallToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\StaticCall\StaticCallToMethodCallRector\StaticCallToMethodCallRectorTest */ -final class StaticCallToMethodCallRector extends AbstractScopeAwareRector implements ConfigurableRectorInterface +final class StaticCallToMethodCallRector extends AbstractRector implements ConfigurableRectorInterface { /** * @readonly - * @var \Rector\Transform\NodeAnalyzer\FuncCallStaticCallToMethodCallAnalyzer */ - private $funcCallStaticCallToMethodCallAnalyzer; + private FuncCallStaticCallToMethodCallAnalyzer $funcCallStaticCallToMethodCallAnalyzer; /** * @var StaticCallToMethodCall[] */ - private $staticCallsToMethodCalls = []; + private array $staticCallsToMethodCalls = []; public function __construct(FuncCallStaticCallToMethodCallAnalyzer $funcCallStaticCallToMethodCallAnalyzer) { $this->funcCallStaticCallToMethodCallAnalyzer = $funcCallStaticCallToMethodCallAnalyzer; @@ -82,7 +80,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { $class = $node; $hasChanged = \false; @@ -99,14 +97,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node return $this->refactorToInstanceCall($node, $staticCallToMethodCall); } $expr = $this->funcCallStaticCallToMethodCallAnalyzer->matchTypeProvidingExpr($class, $classMethod, $staticCallToMethodCall->getClassObjectType()); - if ($staticCallToMethodCall->getMethodName() === '*') { - $methodName = $this->getName($node->name); - } else { - $methodName = $staticCallToMethodCall->getMethodName(); - } - if (!\is_string($methodName)) { - throw new ShouldNotHappenException(); - } + $methodName = $this->getMethodName($node, $staticCallToMethodCall); $hasChanged = \true; return new MethodCall($expr, $methodName, $node->args); } @@ -126,9 +117,22 @@ public function configure(array $configuration) : void Assert::allIsAOf($configuration, StaticCallToMethodCall::class); $this->staticCallsToMethodCalls = $configuration; } + private function getMethodName(StaticCall $staticCall, StaticCallToMethodCall $staticCallToMethodCall) : string + { + if ($staticCallToMethodCall->getMethodName() === '*') { + $methodName = $this->getName($staticCall->name); + } else { + $methodName = $staticCallToMethodCall->getMethodName(); + } + if (!\is_string($methodName)) { + throw new ShouldNotHappenException(); + } + return $methodName; + } private function refactorToInstanceCall(StaticCall $staticCall, StaticCallToMethodCall $staticCallToMethodCall) : MethodCall { $new = new New_(new FullyQualified($staticCallToMethodCall->getClassType())); - return new MethodCall($new, $staticCallToMethodCall->getMethodName(), $staticCall->args); + $methodName = $this->getMethodName($staticCall, $staticCallToMethodCall); + return new MethodCall($new, $methodName, $staticCall->args); } } diff --git a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php index 987098c0c..fb3f127a9 100644 --- a/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/StaticCall/StaticCallToNewRector.php @@ -12,7 +12,7 @@ use Rector\Transform\ValueObject\StaticCallToNew; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\StaticCall\StaticCallToNewRector\StaticCallToNewRectorTest */ @@ -21,7 +21,7 @@ final class StaticCallToNewRector extends AbstractRector implements Configurable /** * @var StaticCallToNew[] */ - private $staticCallsToNews = []; + private array $staticCallsToNews = []; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change static call to new instance', [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 52a2105ef..2d843a5b0 100644 --- a/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php @@ -11,7 +11,7 @@ use Rector\Transform\ValueObject\StringToClassConstant; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Transform\Rector\String_\StringToClassConstantRector\StringToClassConstantRectorTest */ @@ -19,20 +19,19 @@ final class StringToClassConstantRector extends AbstractRector implements Config { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var StringToClassConstant[] */ - private $stringsToClassConstants = []; + private array $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' + return new RuleDefinition('Change strings to specific constants', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' final class SomeSubscriber { public static function getSubscribedEvents() @@ -70,7 +69,7 @@ public function refactor(Node $node) : ?Node } return $this->nodeFactory->createClassConstFetch($stringToClassConstant->getClass(), $stringToClassConstant->getConstant()); } - return $node; + return null; } /** * @param mixed[] $configuration diff --git a/vendor/rector/rector/rules/Transform/ValueObject/ArrayDimFetchToMethodCall.php b/vendor/rector/rector/rules/Transform/ValueObject/ArrayDimFetchToMethodCall.php index c0850b344..3c6051d5a 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/ArrayDimFetchToMethodCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/ArrayDimFetchToMethodCall.php @@ -8,14 +8,12 @@ class ArrayDimFetchToMethodCall { /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $objectType; + private ObjectType $objectType; /** * @readonly - * @var string */ - private $method; + private string $method; public function __construct(ObjectType $objectType, string $method) { $this->objectType = $objectType; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/AttributeKeyToClassConstFetch.php b/vendor/rector/rector/rules/Transform/ValueObject/AttributeKeyToClassConstFetch.php index 8ace35526..d444ee0ba 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/AttributeKeyToClassConstFetch.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/AttributeKeyToClassConstFetch.php @@ -7,24 +7,21 @@ final class AttributeKeyToClassConstFetch { /** * @readonly - * @var string */ - private $attributeClass; + private string $attributeClass; /** * @readonly - * @var string */ - private $attributeKey; + private string $attributeKey; /** * @readonly - * @var string */ - private $constantClass; + private string $constantClass; /** * @var array * @readonly */ - private $valuesToConstantsMap; + private array $valuesToConstantsMap; /** * @param array $valuesToConstantsMap */ diff --git a/vendor/rector/rector/rules/Transform/ValueObject/ClassMethodReference.php b/vendor/rector/rector/rules/Transform/ValueObject/ClassMethodReference.php index 1e13bc810..47f6512d6 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/ClassMethodReference.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/ClassMethodReference.php @@ -8,14 +8,12 @@ final class ClassMethodReference { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; public function __construct(string $class, string $method) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php b/vendor/rector/rector/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php index bd42f267b..919b0e0cf 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php @@ -8,19 +8,16 @@ final class ConstFetchToClassConstFetch { /** * @readonly - * @var string */ - private $oldConstName; + private string $oldConstName; /** * @readonly - * @var string */ - private $newClassName; + private string $newClassName; /** * @readonly - * @var string */ - private $newConstName; + private string $newConstName; public function __construct(string $oldConstName, string $newClassName, string $newConstName) { $this->oldConstName = $oldConstName; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToMethodCall.php b/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToMethodCall.php index aba2a1d42..61297ec5a 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToMethodCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToMethodCall.php @@ -9,19 +9,16 @@ final class FuncCallToMethodCall { /** * @readonly - * @var string */ - private $oldFuncName; + private string $oldFuncName; /** * @readonly - * @var string */ - private $newClassName; + private string $newClassName; /** * @readonly - * @var string */ - private $newMethodName; + private string $newMethodName; public function __construct(string $oldFuncName, string $newClassName, string $newMethodName) { $this->oldFuncName = $oldFuncName; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToStaticCall.php b/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToStaticCall.php index 6cc9c9739..bfa4e5d64 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToStaticCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/FuncCallToStaticCall.php @@ -8,19 +8,16 @@ final class FuncCallToStaticCall { /** * @readonly - * @var string */ - private $oldFuncName; + private string $oldFuncName; /** * @readonly - * @var string */ - private $newClassName; + private string $newClassName; /** * @readonly - * @var string */ - private $newMethodName; + private string $newMethodName; public function __construct(string $oldFuncName, string $newClassName, string $newMethodName) { $this->oldFuncName = $oldFuncName; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToFuncCall.php b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToFuncCall.php index 58f13b664..ac0676542 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToFuncCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToFuncCall.php @@ -7,19 +7,16 @@ final class MethodCallToFuncCall { /** * @readonly - * @var string */ - private $objectType; + private string $objectType; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @readonly - * @var string */ - private $functionName; + private string $functionName; public function __construct(string $objectType, string $methodName, string $functionName) { $this->objectType = $objectType; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php index 16081016e..140cc21ed 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToNew.php @@ -8,19 +8,17 @@ final class MethodCallToNew { /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $objectType; + private ObjectType $objectType; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @var class-string * @readonly */ - private $newClassString; + private string $newClassString; /** * @param class-string $newClassString */ diff --git a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToPropertyFetch.php b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToPropertyFetch.php index ae6d49ebf..44b613d89 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToPropertyFetch.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToPropertyFetch.php @@ -9,19 +9,16 @@ final class MethodCallToPropertyFetch { /** * @readonly - * @var string */ - private $oldType; + private string $oldType; /** * @readonly - * @var string */ - private $oldMethod; + private string $oldMethod; /** * @readonly - * @var string */ - private $newProperty; + private string $newProperty; public function __construct(string $oldType, string $oldMethod, string $newProperty) { $this->oldType = $oldType; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToStaticCall.php b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToStaticCall.php index 20d4ca8b7..32a1db799 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToStaticCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/MethodCallToStaticCall.php @@ -9,24 +9,20 @@ final class MethodCallToStaticCall { /** * @readonly - * @var string */ - private $oldClass; + private string $oldClass; /** * @readonly - * @var string */ - private $oldMethod; + private string $oldMethod; /** * @readonly - * @var string */ - private $newClass; + private string $newClass; /** * @readonly - * @var string */ - private $newMethod; + private string $newMethod; public function __construct(string $oldClass, string $oldMethod, string $newClass, string $newMethod) { $this->oldClass = $oldClass; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/NewToStaticCall.php b/vendor/rector/rector/rules/Transform/ValueObject/NewToStaticCall.php index e29c271d5..5f27e332d 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/NewToStaticCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/NewToStaticCall.php @@ -9,19 +9,16 @@ final class NewToStaticCall { /** * @readonly - * @var string */ - private $type; + private string $type; /** * @readonly - * @var string */ - private $staticCallClass; + private string $staticCallClass; /** * @readonly - * @var string */ - private $staticCallMethod; + private string $staticCallMethod; public function __construct(string $type, string $staticCallClass, string $staticCallMethod) { $this->type = $type; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php b/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php index 05aa6aafa..1649b9423 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/ParentClassToTraits.php @@ -4,19 +4,18 @@ namespace Rector\Transform\ValueObject; use Rector\Validation\RectorAssert; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class ParentClassToTraits { /** * @readonly - * @var string */ - private $parentType; + private string $parentType; /** * @var string[] * @readonly */ - private $traitNames; + private array $traitNames; /** * @param string[] $traitNames */ diff --git a/vendor/rector/rector/rules/Transform/ValueObject/PropertyAssignToMethodCall.php b/vendor/rector/rector/rules/Transform/ValueObject/PropertyAssignToMethodCall.php index c39c95184..a66e9e3c5 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/PropertyAssignToMethodCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/PropertyAssignToMethodCall.php @@ -9,19 +9,16 @@ final class PropertyAssignToMethodCall { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $oldPropertyName; + private string $oldPropertyName; /** * @readonly - * @var string */ - private $newMethodName; + private string $newMethodName; public function __construct(string $class, string $oldPropertyName, string $newMethodName) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/PropertyFetchToMethodCall.php b/vendor/rector/rector/rules/Transform/ValueObject/PropertyFetchToMethodCall.php index f15fda481..2aa1925c7 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/PropertyFetchToMethodCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/PropertyFetchToMethodCall.php @@ -9,29 +9,25 @@ final class PropertyFetchToMethodCall { /** * @readonly - * @var string */ - private $oldType; + private string $oldType; /** * @readonly - * @var string */ - private $oldProperty; + private string $oldProperty; /** * @readonly - * @var string */ - private $newGetMethod; + private string $newGetMethod; /** * @readonly - * @var string|null */ - private $newSetMethod; + private ?string $newSetMethod = null; /** * @var mixed[] * @readonly */ - private $newGetArguments = []; + private array $newGetArguments = []; /** * @param mixed[] $newGetArguments */ diff --git a/vendor/rector/rector/rules/Transform/ValueObject/ReplaceParentCallByPropertyCall.php b/vendor/rector/rector/rules/Transform/ValueObject/ReplaceParentCallByPropertyCall.php index c5f5cf8d0..7ab9ef8ca 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/ReplaceParentCallByPropertyCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/ReplaceParentCallByPropertyCall.php @@ -9,19 +9,16 @@ final class ReplaceParentCallByPropertyCall { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var string */ - private $property; + private string $property; public function __construct(string $class, string $method, string $property) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/ScalarValueToConstFetch.php b/vendor/rector/rector/rules/Transform/ValueObject/ScalarValueToConstFetch.php index 14a839a8d..d21a64e48 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/ScalarValueToConstFetch.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/ScalarValueToConstFetch.php @@ -5,14 +5,14 @@ use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\ConstFetch; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; final class ScalarValueToConstFetch { /** * @readonly - * @var \PhpParser\Node\Scalar\DNumber|\PhpParser\Node\Scalar\String_|\PhpParser\Node\Scalar\LNumber + * @var \PhpParser\Node\Scalar\Float_|\PhpParser\Node\Scalar\String_|\PhpParser\Node\Scalar\Int_ */ private $scalar; /** @@ -21,7 +21,7 @@ final class ScalarValueToConstFetch */ private $constFetch; /** - * @param \PhpParser\Node\Scalar\DNumber|\PhpParser\Node\Scalar\String_|\PhpParser\Node\Scalar\LNumber $scalar + * @param \PhpParser\Node\Scalar\Float_|\PhpParser\Node\Scalar\String_|\PhpParser\Node\Scalar\Int_ $scalar * @param \PhpParser\Node\Expr\ConstFetch|\PhpParser\Node\Expr\ClassConstFetch $constFetch */ public function __construct($scalar, $constFetch) @@ -30,7 +30,7 @@ public function __construct($scalar, $constFetch) $this->constFetch = $constFetch; } /** - * @return \PhpParser\Node\Scalar\DNumber|\PhpParser\Node\Scalar\String_|\PhpParser\Node\Scalar\LNumber + * @return \PhpParser\Node\Scalar\Float_|\PhpParser\Node\Scalar\String_|\PhpParser\Node\Scalar\Int_ */ public function getScalar() { diff --git a/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToFuncCall.php b/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToFuncCall.php index dbe2948a8..eeef7454e 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToFuncCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToFuncCall.php @@ -9,19 +9,16 @@ final class StaticCallToFuncCall { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var string */ - private $function; + private string $function; public function __construct(string $class, string $method, string $function) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToMethodCall.php b/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToMethodCall.php index 1946a6239..663576533 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToMethodCall.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToMethodCall.php @@ -12,24 +12,20 @@ final class StaticCallToMethodCall { /** * @readonly - * @var string */ - private $staticClass; + private string $staticClass; /** * @readonly - * @var string */ - private $staticMethod; + private string $staticMethod; /** * @readonly - * @var string */ - private $classType; + private string $classType; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; public function __construct(string $staticClass, string $staticMethod, string $classType, string $methodName) { $this->staticClass = $staticClass; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToNew.php b/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToNew.php index 9906b95dd..526a5acfb 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToNew.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/StaticCallToNew.php @@ -8,14 +8,12 @@ final class StaticCallToNew { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; public function __construct(string $class, string $method) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/StringToClassConstant.php b/vendor/rector/rector/rules/Transform/ValueObject/StringToClassConstant.php index 9aa0d4d44..5d299b3bd 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/StringToClassConstant.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/StringToClassConstant.php @@ -8,19 +8,16 @@ final class StringToClassConstant { /** * @readonly - * @var string */ - private $string; + private string $string; /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $constant; + private string $constant; public function __construct(string $string, string $class, string $constant) { $this->string = $string; diff --git a/vendor/rector/rector/rules/Transform/ValueObject/WrapReturn.php b/vendor/rector/rector/rules/Transform/ValueObject/WrapReturn.php index e386759db..a082975a2 100644 --- a/vendor/rector/rector/rules/Transform/ValueObject/WrapReturn.php +++ b/vendor/rector/rector/rules/Transform/ValueObject/WrapReturn.php @@ -9,19 +9,16 @@ final class WrapReturn { /** * @readonly - * @var string */ - private $type; + private string $type; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var bool */ - private $isArrayWrap; + private bool $isArrayWrap; public function __construct(string $type, string $method, bool $isArrayWrap) { $this->type = $type; diff --git a/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php b/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php index cbc133477..903ccd7b1 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php @@ -9,15 +9,18 @@ use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use PhpParser\NodeFinder; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\ObjectType; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; +use Rector\NodeDecorator\StatementDepthAttributeDecorator; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Comparing\NodeComparator; @@ -28,38 +31,28 @@ final class ConstructorAssignDetector { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\TypeDeclaration\Matcher\PropertyAssignMatcher */ - private $propertyAssignMatcher; + private PropertyAssignMatcher $propertyAssignMatcher; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer */ - private $autowiredClassMethodOrPropertyAnalyzer; + private AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; - /** - * @var string - */ - private const IS_FIRST_LEVEL_STATEMENT = 'first_level_stmt'; + private NodeComparator $nodeComparator; public function __construct(NodeTypeResolver $nodeTypeResolver, PropertyAssignMatcher $propertyAssignMatcher, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, PropertyFetchAnalyzer $propertyFetchAnalyzer, NodeComparator $nodeComparator) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -69,19 +62,23 @@ public function __construct(NodeTypeResolver $nodeTypeResolver, PropertyAssignMa $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; $this->nodeComparator = $nodeComparator; } - public function isPropertyAssigned(ClassLike $classLike, string $propertyName) : bool + public function isPropertyAssignedConditionally(Class_ $class, string $propertyName) : bool + { + return $this->isPropertyAssigned($class, $propertyName, \true); + } + public function isPropertyAssigned(ClassLike $classLike, string $propertyName, bool $allowConditional = \false) : bool { $initializeClassMethods = $this->matchInitializeClassMethod($classLike); if ($initializeClassMethods === []) { return \false; } $isAssignedInConstructor = \false; - $this->decorateFirstLevelStatementAttribute($initializeClassMethods); + StatementDepthAttributeDecorator::decorateClassMethods($initializeClassMethods); foreach ($initializeClassMethods as $initializeClassMethod) { - $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $initializeClassMethod->stmts, function (Node $node) use($propertyName, &$isAssignedInConstructor) : ?int { + $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $initializeClassMethod->stmts, function (Node $node) use($propertyName, &$isAssignedInConstructor, $allowConditional) : ?int { if ($this->isIfElseAssign($node, $propertyName)) { $isAssignedInConstructor = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } $expr = $this->matchAssignExprToPropertyName($node, $propertyName); if (!$expr instanceof Expr) { @@ -92,15 +89,19 @@ public function isPropertyAssigned(ClassLike $classLike, string $propertyName) : // is merged in assign? if ($this->isPropertyUsedInAssign($assign, $propertyName)) { $isAssignedInConstructor = \false; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } - $isFirstLevelStatement = $assign->getAttribute(self::IS_FIRST_LEVEL_STATEMENT); + $isFirstLevelStatement = $assign->getAttribute(AttributeKey::IS_FIRST_LEVEL_STATEMENT); // cannot be nested if ($isFirstLevelStatement !== \true) { + if ($allowConditional) { + $isAssignedInConstructor = \true; + return NodeVisitor::STOP_TRAVERSAL; + } return null; } $isAssignedInConstructor = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); } if (!$isAssignedInConstructor) { @@ -140,20 +141,6 @@ private function matchAssignExprToPropertyName(Node $node, string $propertyName) } return $this->propertyAssignMatcher->matchPropertyAssignExpr($node, $propertyName); } - /** - * @param ClassMethod[] $classMethods - */ - private function decorateFirstLevelStatementAttribute(array $classMethods) : void - { - foreach ($classMethods as $classMethod) { - foreach ((array) $classMethod->stmts as $methodStmt) { - $methodStmt->setAttribute(self::IS_FIRST_LEVEL_STATEMENT, \true); - if ($methodStmt instanceof Expression) { - $methodStmt->expr->setAttribute(self::IS_FIRST_LEVEL_STATEMENT, \true); - } - } - } - } /** * @return ClassMethod[] */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/NullTypeAssignDetector.php b/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/NullTypeAssignDetector.php index 8727467f0..10a91c270 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/NullTypeAssignDetector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/AlreadyAssignDetector/NullTypeAssignDetector.php @@ -7,7 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Stmt\ClassLike; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer; @@ -19,24 +19,20 @@ final class NullTypeAssignDetector { /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer */ - private $doctrineTypeAnalyzer; + private DoctrineTypeAnalyzer $doctrineTypeAnalyzer; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\TypeDeclaration\Matcher\PropertyAssignMatcher */ - private $propertyAssignMatcher; + private PropertyAssignMatcher $propertyAssignMatcher; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(DoctrineTypeAnalyzer $doctrineTypeAnalyzer, NodeTypeResolver $nodeTypeResolver, PropertyAssignMatcher $propertyAssignMatcher, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->doctrineTypeAnalyzer = $doctrineTypeAnalyzer; @@ -56,7 +52,7 @@ public function detect(ClassLike $classLike, string $propertyName) : bool $staticType = $this->nodeTypeResolver->getType($expr); if ($this->doctrineTypeAnalyzer->isDoctrineCollectionWithIterableUnionType($staticType)) { $needsNullType = \false; - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } return null; }); diff --git a/vendor/rector/rector/rules/TypeDeclaration/FunctionLikeReturnTypeResolver.php b/vendor/rector/rector/rules/TypeDeclaration/FunctionLikeReturnTypeResolver.php index 959dd00d8..ef0c2436b 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/FunctionLikeReturnTypeResolver.php +++ b/vendor/rector/rector/rules/TypeDeclaration/FunctionLikeReturnTypeResolver.php @@ -11,9 +11,8 @@ final class FunctionLikeReturnTypeResolver { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(StaticTypeMapper $staticTypeMapper) { $this->staticTypeMapper = $staticTypeMapper; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php b/vendor/rector/rector/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php index 22fe6e310..4534d2bc0 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php @@ -10,7 +10,7 @@ use PhpParser\Node\Param; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\If_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Node\BetterNodeFinder; @@ -18,19 +18,16 @@ final class ParamTypeAddGuard { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(NodeNameResolver $nodeNameResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, BetterNodeFinder $betterNodeFinder) { $this->nodeNameResolver = $nodeNameResolver; @@ -47,19 +44,15 @@ public function isLegal(Param $param, ClassMethod $classMethod) : bool $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $subNode) use(&$isLegal, $paramName) : ?int { if ($subNode instanceof Assign && $subNode->var instanceof Variable && $this->nodeNameResolver->isName($subNode->var, $paramName)) { $isLegal = \false; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } - if ($subNode instanceof If_ && (bool) $this->betterNodeFinder->findFirst($subNode->cond, function (Node $node) use($paramName) : bool { - return $node instanceof Variable && $this->nodeNameResolver->isName($node, $paramName); - })) { + if ($subNode instanceof If_ && (bool) $this->betterNodeFinder->findFirst($subNode->cond, fn(Node $node): bool => $node instanceof Variable && $this->nodeNameResolver->isName($node, $paramName))) { $isLegal = \false; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } - if ($subNode instanceof Ternary && (bool) $this->betterNodeFinder->findFirst($subNode, function (Node $node) use($paramName) : bool { - return $node instanceof Variable && $this->nodeNameResolver->isName($node, $paramName); - })) { + if ($subNode instanceof Ternary && (bool) $this->betterNodeFinder->findFirst($subNode, fn(Node $node): bool => $node instanceof Variable && $this->nodeNameResolver->isName($node, $paramName))) { $isLegal = \false; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; }); diff --git a/vendor/rector/rector/rules/TypeDeclaration/Guard/PropertyTypeOverrideGuard.php b/vendor/rector/rector/rules/TypeDeclaration/Guard/PropertyTypeOverrideGuard.php index af9b54894..f5f4a276a 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Guard/PropertyTypeOverrideGuard.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Guard/PropertyTypeOverrideGuard.php @@ -11,14 +11,12 @@ final class PropertyTypeOverrideGuard { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Php74\Guard\MakePropertyTypedGuard */ - private $makePropertyTypedGuard; + private MakePropertyTypedGuard $makePropertyTypedGuard; public function __construct(NodeNameResolver $nodeNameResolver, MakePropertyTypedGuard $makePropertyTypedGuard) { $this->nodeNameResolver = $nodeNameResolver; @@ -37,7 +35,7 @@ public function isLegal(Property $property, ClassReflection $classReflection) : } $parentPropertyReflection = $nativeReflectionClass->getProperty($propertyName); // empty type override is not allowed - return (\method_exists($parentPropertyReflection, 'getType') ? $parentPropertyReflection->getType() : null) !== null; + return $parentPropertyReflection->getType() !== null; } return \true; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Matcher/PropertyAssignMatcher.php b/vendor/rector/rector/rules/TypeDeclaration/Matcher/PropertyAssignMatcher.php index e6063d1f3..c33e3c09b 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Matcher/PropertyAssignMatcher.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Matcher/PropertyAssignMatcher.php @@ -11,9 +11,8 @@ final class PropertyAssignMatcher { /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; public function __construct(PropertyFetchAnalyzer $propertyFetchAnalyzer) { $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php index 29e8cd199..7b2530d5f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/AutowiredClassMethodOrPropertyAnalyzer.php @@ -4,6 +4,7 @@ namespace Rector\TypeDeclaration\NodeAnalyzer; use PhpParser\Node\Param; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; @@ -12,19 +13,33 @@ final class AutowiredClassMethodOrPropertyAnalyzer { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, PhpAttributeAnalyzer $phpAttributeAnalyzer) { $this->phpDocInfoFactory = $phpDocInfoFactory; $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; } + public function matchAutowiredMethodInClass(Class_ $class) : ?ClassMethod + { + foreach ($class->getMethods() as $classMethod) { + if (!$classMethod->isPublic()) { + continue; + } + if ($classMethod->isMagic()) { + continue; + } + if (!$this->detect($classMethod)) { + continue; + } + return $classMethod; + } + return null; + } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Param|\PhpParser\Node\Stmt\Property $node */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index 69d2eb702..43a583fbb 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -9,37 +9,32 @@ use PhpParser\Node\Identifier; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\MixedType; -use PHPStan\Type\NullType; use PHPStan\Type\ObjectType; use PHPStan\Type\ThisType; use PHPStan\Type\Type; -use PHPStan\Type\TypeWithClassName; use PHPStan\Type\UnionType; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class CallTypesResolver { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; public function __construct(NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory, ReflectionProvider $reflectionProvider, TypeComparator $typeComparator) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -107,7 +102,7 @@ private function unionToSingleType(array $staticTypesByArgumentPosition) : array if (\count($staticTypeByArgumentPosition) !== 1) { return $staticTypeByArgumentPosition; } - if (!$staticTypeByArgumentPosition[0] instanceof NullType) { + if (!$staticTypeByArgumentPosition[0]->isNull()->yes()) { return $staticTypeByArgumentPosition; } return [new MixedType()]; @@ -120,10 +115,10 @@ private function narrowParentObjectTreeToSingleObjectChildType(Type $type) : Typ if (!$this->isTypeWithClassNameOnly($type)) { return $type; } - /** @var TypeWithClassName $firstUnionedType */ $firstUnionedType = $type->getTypes()[0]; foreach ($type->getTypes() as $unionedType) { - if (!$unionedType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($unionedType); + if ($className === null) { return $type; } if ($unionedType->isSuperTypeOf($firstUnionedType)->yes()) { @@ -135,7 +130,8 @@ private function narrowParentObjectTreeToSingleObjectChildType(Type $type) : Typ private function isTypeWithClassNameOnly(UnionType $unionType) : bool { foreach ($unionType->getTypes() as $unionedType) { - if (!$unionedType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($unionedType); + if ($className === null) { return \false; } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallerParamMatcher.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallerParamMatcher.php index 11b5fc488..fb44e3188 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallerParamMatcher.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/CallerParamMatcher.php @@ -21,7 +21,6 @@ use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\MixedType; -use PHPStan\Type\NullType; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; use Rector\PhpParser\AstResolver; @@ -30,24 +29,20 @@ final class CallerParamMatcher { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; public function __construct(NodeNameResolver $nodeNameResolver, AstResolver $astResolver, StaticTypeMapper $staticTypeMapper, TypeComparator $typeComparator) { $this->nodeNameResolver = $nodeNameResolver; @@ -82,7 +77,7 @@ public function matchCallParamType(Param $param, Param $callParam) if ($this->typeComparator->isSubtype($defaultType, $callParamType)) { return $callParam->type; } - if (!$defaultType instanceof NullType) { + if (!$defaultType->isNull()->yes()) { return null; } if ($callParam->type instanceof Name || $callParam->type instanceof Identifier) { @@ -109,13 +104,13 @@ public function matchParentParam(StaticCall $parentStaticCall, Param $param, Sco /** * @param \PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\FuncCall $call */ - public function matchCallParam($call, Param $param, Scope $scope) : ?Param + public function matchCallParam($call, Param $param) : ?Param { $callArgPosition = $this->matchCallArgPosition($call, $param); if ($callArgPosition === null) { return null; } - $classMethodOrFunction = $this->astResolver->resolveClassMethodOrFunctionFromCall($call, $scope); + $classMethodOrFunction = $this->astResolver->resolveClassMethodOrFunctionFromCall($call); if ($classMethodOrFunction === null) { return null; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodAndPropertyAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodAndPropertyAnalyzer.php index 675cfc511..2acc6507c 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodAndPropertyAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodAndPropertyAnalyzer.php @@ -14,9 +14,8 @@ final class ClassMethodAndPropertyAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodParamTypeCompleter.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodParamTypeCompleter.php index 36f381016..1fbcabcb7 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodParamTypeCompleter.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ClassMethodParamTypeCompleter.php @@ -8,7 +8,6 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Param; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Type\CallableType; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; @@ -20,14 +19,12 @@ final class ClassMethodParamTypeCompleter { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodParamVendorLockResolver */ - private $classMethodParamVendorLockResolver; + private ClassMethodParamVendorLockResolver $classMethodParamVendorLockResolver; public function __construct(StaticTypeMapper $staticTypeMapper, ClassMethodParamVendorLockResolver $classMethodParamVendorLockResolver) { $this->staticTypeMapper = $staticTypeMapper; @@ -106,10 +103,10 @@ private function shouldSkipArgumentStaticType(ClassMethod $classMethod, Type $ar } private function isClosureAndCallableType(Type $parameterStaticType, Type $argumentStaticType) : bool { - if ($parameterStaticType instanceof CallableType && $this->isClosureObjectType($argumentStaticType)) { + if ($parameterStaticType->isCallable()->yes() && $this->isClosureObjectType($argumentStaticType)) { return \true; } - return $argumentStaticType instanceof CallableType && $this->isClosureObjectType($parameterStaticType); + return $argumentStaticType->isCallable()->yes() && $this->isClosureObjectType($parameterStaticType); } private function isClosureObjectType(Type $type) : bool { diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/NeverFuncCallAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/NeverFuncCallAnalyzer.php index 59aadaf90..13dc045ea 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/NeverFuncCallAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/NeverFuncCallAnalyzer.php @@ -14,9 +14,8 @@ final class NeverFuncCallAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php index 0839eea67..1bcc3939c 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php @@ -10,9 +10,8 @@ final class ParamAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php index 548deec22..210c42ee4 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php @@ -12,9 +12,8 @@ final class ReturnAnalyzer { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SilentVoidResolver */ - private $silentVoidResolver; + private SilentVoidResolver $silentVoidResolver; public function __construct(SilentVoidResolver $silentVoidResolver) { $this->silentVoidResolver = $silentVoidResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnFilter/ExclusiveNativeCallLikeReturnMatcher.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnFilter/ExclusiveNativeCallLikeReturnMatcher.php index ce3c33ef3..1919dfd7f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnFilter/ExclusiveNativeCallLikeReturnMatcher.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnFilter/ExclusiveNativeCallLikeReturnMatcher.php @@ -14,9 +14,8 @@ final class ExclusiveNativeCallLikeReturnMatcher { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php index daf0d0c34..2e98a7f6c 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php @@ -13,19 +13,16 @@ final class StrictNativeFunctionReturnTypeAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnFilter\ExclusiveNativeCallLikeReturnMatcher */ - private $exclusiveNativeCallLikeReturnMatcher; + private ExclusiveNativeCallLikeReturnMatcher $exclusiveNativeCallLikeReturnMatcher; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(BetterNodeFinder $betterNodeFinder, ExclusiveNativeCallLikeReturnMatcher $exclusiveNativeCallLikeReturnMatcher, ReturnAnalyzer $returnAnalyzer) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php index f17183f5e..72e20a303 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php @@ -21,24 +21,20 @@ final class StrictReturnNewAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, ReturnAnalyzer $returnAnalyzer) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/TypeNodeUnwrapper.php b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/TypeNodeUnwrapper.php index 5625a5a5c..36f3456a4 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/TypeNodeUnwrapper.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeAnalyzer/TypeNodeUnwrapper.php @@ -14,9 +14,8 @@ final class TypeNodeUnwrapper { /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; public function __construct(NodeComparator $nodeComparator) { $this->nodeComparator = $nodeComparator; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddNeverReturnType.php b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddNeverReturnType.php index 285a93f40..f513e6d0b 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddNeverReturnType.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddNeverReturnType.php @@ -5,13 +5,14 @@ use PhpParser\Node; use PhpParser\Node\Expr\Closure; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Expr\Yield_; use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PhpParser\Node\Stmt\Throw_; use PHPStan\Analyser\Scope; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeNestingScope\ValueObject\ControlStructure; @@ -23,29 +24,24 @@ final class AddNeverReturnType { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\Reflection\ClassModifierChecker */ - private $classModifierChecker; + private ClassModifierChecker $classModifierChecker; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\NeverFuncCallAnalyzer */ - private $neverFuncCallAnalyzer; + private NeverFuncCallAnalyzer $neverFuncCallAnalyzer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ClassModifierChecker $classModifierChecker, BetterNodeFinder $betterNodeFinder, NeverFuncCallAnalyzer $neverFuncCallAnalyzer, NodeNameResolver $nodeNameResolver) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -103,7 +99,7 @@ private function hasReturnOrYields($node) : bool */ private function hasNeverNodesOrNeverFuncCalls($node) : bool { - $hasNeverNodes = $this->betterNodeFinder->hasInstancesOfInFunctionLikeScoped($node, [Throw_::class]); + $hasNeverNodes = (bool) $this->betterNodeFinder->findFirstInFunctionLikeScoped($node, fn(Node $subNode): bool => $subNode instanceof Expression && $subNode->expr instanceof Throw_); if ($hasNeverNodes) { return \true; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromCast.php b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromCast.php index 023d08925..b05b4a790 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromCast.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromCast.php @@ -19,24 +19,20 @@ final class AddReturnTypeFromCast { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; public function __construct(BetterNodeFinder $betterNodeFinder, ReturnTypeInferer $returnTypeInferer, StaticTypeMapper $staticTypeMapper, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) { $this->betterNodeFinder = $betterNodeFinder; @@ -56,9 +52,7 @@ public function add($functionLike, Scope $scope) if ($functionLike instanceof ClassMethod && $this->classMethodReturnTypeOverrideGuard->shouldSkipClassMethod($functionLike, $scope)) { return null; } - $hasNonCastReturn = (bool) $this->betterNodeFinder->findFirstInFunctionLikeScoped($functionLike, static function (Node $subNode) : bool { - return $subNode instanceof Return_ && !$subNode->expr instanceof Cast; - }); + $hasNonCastReturn = (bool) $this->betterNodeFinder->findFirstInFunctionLikeScoped($functionLike, static fn(Node $subNode): bool => $subNode instanceof Return_ && !$subNode->expr instanceof Cast); if ($hasNonCastReturn) { return null; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromParam.php b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromParam.php index 540a6addf..3eede9513 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromParam.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromParam.php @@ -15,7 +15,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\Scope; use PHPStan\Type\MixedType; use PHPStan\Type\TypeCombinator; @@ -28,24 +28,20 @@ final class AddReturnTypeFromParam { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; public function __construct(NodeNameResolver $nodeNameResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer) { $this->nodeNameResolver = $nodeNameResolver; @@ -97,14 +93,14 @@ private function findCurrentScopeReturn(array $stmts) : ?Return_ // skip scope nesting if ($node instanceof Class_ || $node instanceof FunctionLike) { $return = null; - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Return_) { return null; } if (!$node->expr instanceof Variable) { $return = null; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } $return = $node; return null; @@ -121,11 +117,11 @@ private function shouldSkipParam(Param $param, array $stmts) : bool $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, function (Node $node) use($paramName, &$isParamModified) : ?int { // skip scope nesting if ($node instanceof Class_ || $node instanceof FunctionLike) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($node instanceof AssignRef && $this->nodeNameResolver->isName($node->expr, $paramName)) { $isParamModified = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if (!$node instanceof Assign) { return null; @@ -137,7 +133,7 @@ private function shouldSkipParam(Param $param, array $stmts) : bool return null; } $isParamModified = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); return $isParamModified; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromStrictNativeCall.php b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromStrictNativeCall.php index 871ad5be5..0bedd5d24 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromStrictNativeCall.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddReturnTypeFromStrictNativeCall.php @@ -18,29 +18,24 @@ final class AddReturnTypeFromStrictNativeCall { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnTypeAnalyzer\StrictNativeFunctionReturnTypeAnalyzer */ - private $strictNativeFunctionReturnTypeAnalyzer; + private StrictNativeFunctionReturnTypeAnalyzer $strictNativeFunctionReturnTypeAnalyzer; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; public function __construct(StaticTypeMapper $staticTypeMapper, StrictNativeFunctionReturnTypeAnalyzer $strictNativeFunctionReturnTypeAnalyzer, NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) { $this->staticTypeMapper = $staticTypeMapper; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddUnionReturnType.php b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddUnionReturnType.php index 2617cc55c..8c8cc68f7 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddUnionReturnType.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeManipulator/AddUnionReturnType.php @@ -17,19 +17,16 @@ final class AddUnionReturnType { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeMapper\UnionTypeMapper */ - private $unionTypeMapper; + private UnionTypeMapper $unionTypeMapper; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; public function __construct(ReturnTypeInferer $returnTypeInferer, UnionTypeMapper $unionTypeMapper, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) { $this->returnTypeInferer = $returnTypeInferer; diff --git a/vendor/rector/rector/rules/TypeDeclaration/NodeTypeAnalyzer/PropertyTypeDecorator.php b/vendor/rector/rector/rules/TypeDeclaration/NodeTypeAnalyzer/PropertyTypeDecorator.php index 1ca17e59d..cc31bad4d 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/NodeTypeAnalyzer/PropertyTypeDecorator.php +++ b/vendor/rector/rector/rules/TypeDeclaration/NodeTypeAnalyzer/PropertyTypeDecorator.php @@ -20,24 +20,20 @@ final class PropertyTypeDecorator { /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeAnalyzer */ - private $unionTypeAnalyzer; + private UnionTypeAnalyzer $unionTypeAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(UnionTypeAnalyzer $unionTypeAnalyzer, PhpDocTypeChanger $phpDocTypeChanger, PhpVersionProvider $phpVersionProvider, NodeFactory $nodeFactory) { $this->unionTypeAnalyzer = $unionTypeAnalyzer; diff --git a/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php b/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php index cb69562c4..636f5e8ad 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php +++ b/vendor/rector/rector/rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\TypeDeclaration\PHPStan; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; @@ -31,19 +31,16 @@ final class ObjectTypeSpecifier { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\Naming\NameScopeFactory */ - private $nameScopeFactory; + private NameScopeFactory $nameScopeFactory; public function __construct(ReflectionProvider $reflectionProvider, UseImportsResolver $useImportsResolver, NameScopeFactory $nameScopeFactory) { $this->reflectionProvider = $reflectionProvider; @@ -53,8 +50,12 @@ public function __construct(ReflectionProvider $reflectionProvider, UseImportsRe /** * @return \PHPStan\Type\TypeWithClassName|\Rector\StaticTypeMapper\ValueObject\Type\NonExistingObjectType|\PHPStan\Type\UnionType|\PHPStan\Type\MixedType|\PHPStan\Type\Generic\TemplateType */ - public function narrowToFullyQualifiedOrAliasedObjectType(Node $node, ObjectType $objectType, ?\PHPStan\Analyser\Scope $scope) + public function narrowToFullyQualifiedOrAliasedObjectType(Node $node, ObjectType $objectType, ?\PHPStan\Analyser\Scope $scope, bool $withPreslash = \false) { + $className = \ltrim($objectType->getClassName(), '\\'); + if (\strncmp($objectType->getClassName(), '\\', \strlen('\\')) === 0) { + return new FullyQualifiedObjectType($className); + } $uses = $this->useImportsResolver->resolve(); $aliasedObjectType = $this->matchAliasedObjectType($objectType, $uses); if ($aliasedObjectType instanceof AliasedObjectType) { @@ -64,11 +65,11 @@ public function narrowToFullyQualifiedOrAliasedObjectType(Node $node, ObjectType if ($shortenedObjectType !== null) { return $shortenedObjectType; } - $className = \ltrim($objectType->getClassName(), '\\'); if ($this->reflectionProvider->hasClass($className)) { return new FullyQualifiedObjectType($className); } // probably in same namespace + $namespaceName = null; if ($scope instanceof Scope) { $namespaceName = $scope->getNamespace(); if ($namespaceName !== null) { @@ -77,8 +78,6 @@ public function narrowToFullyQualifiedOrAliasedObjectType(Node $node, ObjectType return new FullyQualifiedObjectType($newClassName); } } - } - if ($scope instanceof Scope) { $classReflection = $scope->getClassReflection(); if ($classReflection instanceof ClassReflection) { $templateTags = $classReflection->getTemplateTags(); @@ -86,18 +85,31 @@ public function narrowToFullyQualifiedOrAliasedObjectType(Node $node, ObjectType $templateTypeScope = $nameScope->getTemplateTypeScope(); if (!$templateTypeScope instanceof TemplateTypeScope) { // invalid type - return new NonExistingObjectType($className); + return $this->resolveNamespacedNonExistingObjectType($namespaceName, $className, $withPreslash); } $currentTemplateTag = $templateTags[$className] ?? null; if ($currentTemplateTag === null) { // invalid type - return new NonExistingObjectType($className); + return $this->resolveNamespacedNonExistingObjectType($namespaceName, $className, $withPreslash); } return TemplateTypeFactory::create($templateTypeScope, $currentTemplateTag->getName(), $currentTemplateTag->getBound(), $currentTemplateTag->getVariance()); } } // invalid type - return new NonExistingObjectType($className); + return $this->resolveNamespacedNonExistingObjectType($namespaceName, $className, $withPreslash); + } + private function resolveNamespacedNonExistingObjectType(?string $namespacedName, string $className, bool $withPreslash) : NonExistingObjectType + { + if ($namespacedName === null) { + return new NonExistingObjectType($className); + } + if ($withPreslash) { + return new NonExistingObjectType($className); + } + if (\strpos($className, '\\') !== \false) { + return new NonExistingObjectType($className); + } + return new NonExistingObjectType($namespacedName . '\\' . $className); } /** * @param array $uses @@ -129,11 +141,14 @@ private function processAliasedObject(string $alias, string $className, string $ { // A. is alias in use statement matching this class alias if ($alias === $className) { - return new AliasedObjectType($alias, $fullyQualifiedName); + return new AliasedObjectType($className, $fullyQualifiedName); } // B. is aliased classes matching the class name if ($useName === $className) { - return new AliasedObjectType($alias, $fullyQualifiedName); + return new AliasedObjectType($className, $fullyQualifiedName); + } + if (\strncmp($className, $alias . '\\', \strlen($alias . '\\')) === 0) { + return new AliasedObjectType($className, $fullyQualifiedName . \ltrim($className, $alias)); } return null; } @@ -171,17 +186,17 @@ private function matchShortenedObjectType(ObjectType $objectType, array $uses) } return null; } - private function matchPartialNamespaceObjectType(string $prefix, ObjectType $objectType, UseUse $useUse) : ?ShortenedObjectType + private function matchPartialNamespaceObjectType(string $prefix, ObjectType $objectType, UseItem $useItem) : ?ShortenedObjectType { + if ($objectType->getClassName() === $useItem->name->getLast()) { + return new ShortenedObjectType($objectType->getClassName(), $prefix . $useItem->name->toString()); + } // partial namespace - if (\strncmp($objectType->getClassName(), $useUse->name->getLast() . '\\', \strlen($useUse->name->getLast() . '\\')) !== 0) { + if (\strncmp($objectType->getClassName(), $useItem->name->getLast() . '\\', \strlen($useItem->name->getLast() . '\\')) !== 0) { return null; } $classNameWithoutLastUsePart = Strings::after($objectType->getClassName(), '\\', 1); - $connectedClassName = $prefix . $useUse->name->toString() . '\\' . $classNameWithoutLastUsePart; - if (!$this->reflectionProvider->hasClass($connectedClassName)) { - return null; - } + $connectedClassName = $prefix . $useItem->name->toString() . '\\' . $classNameWithoutLastUsePart; if ($objectType->getClassName() === $connectedClassName) { return null; } @@ -190,17 +205,17 @@ private function matchPartialNamespaceObjectType(string $prefix, ObjectType $obj /** * @return FullyQualifiedObjectType|ShortenedObjectType|null */ - private function matchClassWithLastUseImportPart(string $prefix, ObjectType $objectType, UseUse $useUse) : ?ObjectType + private function matchClassWithLastUseImportPart(string $prefix, ObjectType $objectType, UseItem $useItem) : ?ObjectType { - if ($useUse->name->getLast() !== $objectType->getClassName()) { + if ($useItem->name->getLast() !== $objectType->getClassName()) { return null; } - if (!$this->reflectionProvider->hasClass($prefix . $useUse->name->toString())) { + if (!$this->reflectionProvider->hasClass($prefix . $useItem->name->toString())) { return null; } - if ($objectType->getClassName() === $prefix . $useUse->name->toString()) { + if ($objectType->getClassName() === $prefix . $useItem->name->toString()) { return new FullyQualifiedObjectType($objectType->getClassName()); } - return new ShortenedObjectType($objectType->getClassName(), $prefix . $useUse->name->toString()); + return new ShortenedObjectType($objectType->getClassName(), $prefix . $useItem->name->toString()); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/ParamPhpDocNodeFactory.php b/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/ParamPhpDocNodeFactory.php index eb0aae5e0..003504740 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/ParamPhpDocNodeFactory.php +++ b/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/ParamPhpDocNodeFactory.php @@ -11,15 +11,14 @@ final class ParamPhpDocNodeFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; } public function create(TypeNode $typeNode, Param $param) : ParamTagValueNode { - return new ParamTagValueNode($typeNode, $param->variadic, '$' . $this->nodeNameResolver->getName($param), ''); + return new ParamTagValueNode($typeNode, $param->variadic, '$' . $this->nodeNameResolver->getName($param), '', \false); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/TypeExpressionFromVarTagResolver.php b/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/TypeExpressionFromVarTagResolver.php index b43d86f44..f2ebe0e48 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/TypeExpressionFromVarTagResolver.php +++ b/vendor/rector/rector/rules/TypeDeclaration/PhpDocParser/TypeExpressionFromVarTagResolver.php @@ -24,7 +24,6 @@ use PHPStan\Type\IntegerType; use PHPStan\Type\IterableType; use PHPStan\Type\MixedType; -use PHPStan\Type\NullType; use PHPStan\Type\ObjectWithoutClassType; use PHPStan\Type\StringType; use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareIntersectionTypeNode; @@ -34,9 +33,8 @@ final class TypeExpressionFromVarTagResolver { /** * @readonly - * @var \Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper */ - private $scalarStringToTypeMapper; + private ScalarStringToTypeMapper $scalarStringToTypeMapper; public function __construct(ScalarStringToTypeMapper $scalarStringToTypeMapper) { $this->scalarStringToTypeMapper = $scalarStringToTypeMapper; @@ -50,7 +48,7 @@ public function resolveTypeExpressionFromVarTag(TypeNode $typeNode, Variable $va $arg = new Arg($variable); return new FuncCall(new Name($scalarTypeFunction), [$arg]); } - if ($scalarType instanceof NullType) { + if ($scalarType->isNull()->yes()) { return new Identical($variable, new ConstFetch(new Name('null'))); } if ($scalarType instanceof ConstantBooleanType) { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php index 322748495..424ab12ac 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php @@ -5,6 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Expr\ArrowFunction; +use PHPStan\Type\MixedType; +use PHPStan\Type\NullType; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -19,9 +21,8 @@ final class AddArrowFunctionReturnTypeRector extends AbstractRector implements M { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(StaticTypeMapper $staticTypeMapper) { $this->staticTypeMapper = $staticTypeMapper; @@ -56,6 +57,10 @@ public function refactor(Node $node) : ?Node if ($type->isVoid()->yes()) { return null; } + $docblockType = $this->getType($node->expr); + if ($type instanceof MixedType && $docblockType instanceof NullType) { + return null; + } $returnTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::RETURN); if (!$returnTypeNode instanceof Node) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/BooleanAnd/BinaryOpNullableToInstanceofRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/BooleanAnd/BinaryOpNullableToInstanceofRector.php index 692891aff..a20a43dfd 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/BooleanAnd/BinaryOpNullableToInstanceofRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/BooleanAnd/BinaryOpNullableToInstanceofRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BooleanNot; @@ -22,9 +23,8 @@ final class BinaryOpNullableToInstanceofRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer */ - private $nullableTypeAnalyzer; + private NullableTypeAnalyzer $nullableTypeAnalyzer; public function __construct(NullableTypeAnalyzer $nullableTypeAnalyzer) { $this->nullableTypeAnalyzer = $nullableTypeAnalyzer; @@ -65,16 +65,19 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { + if ($node->left instanceof Assign || $node->right instanceof Assign) { + return null; + } if ($node instanceof BooleanOr) { return $this->processNegationBooleanOr($node); } - return $this->processsNullableInstance($node); + return $this->processNullableInstance($node); } /** * @param \PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BinaryOp\BooleanOr $node * @return null|\PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BinaryOp\BooleanOr */ - private function processsNullableInstance($node) + private function processNullableInstance($node) { $nullableObjectType = $this->nullableTypeAnalyzer->resolveNullableObjectType($node->left); $hasChanged = \false; @@ -113,7 +116,7 @@ private function processNegationBooleanOr(BooleanOr $booleanOr) : ?BooleanOr return $booleanOr; } /** @var BooleanOr|null $result */ - $result = $this->processsNullableInstance($booleanOr); + $result = $this->processNullableInstance($booleanOr); return $result; } private function createExprInstanceof(Expr $expr, ObjectType $objectType) : Instanceof_ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php index fb1572d89..fd0c36ff7 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php @@ -20,19 +20,16 @@ final class AddMethodCallBasedStrictParamTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\CallTypesResolver */ - private $callTypesResolver; + private CallTypesResolver $callTypesResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ClassMethodParamTypeCompleter */ - private $classMethodParamTypeCompleter; + private ClassMethodParamTypeCompleter $classMethodParamTypeCompleter; /** * @readonly - * @var \Rector\PhpParser\NodeFinder\LocalMethodCallFinder */ - private $localMethodCallFinder; + private LocalMethodCallFinder $localMethodCallFinder; /** * @var int */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamArrayDocblockBasedOnCallableNativeFuncCallRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamArrayDocblockBasedOnCallableNativeFuncCallRector.php index c8291a813..ff3ca10bc 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamArrayDocblockBasedOnCallableNativeFuncCallRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamArrayDocblockBasedOnCallableNativeFuncCallRector.php @@ -13,7 +13,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; @@ -33,24 +33,20 @@ final class AddParamArrayDocblockBasedOnCallableNativeFuncCallRector extends Abs { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var array> */ @@ -112,7 +108,7 @@ public function refactor(Node $node) $paramsWithType = []; $this->traverseNodesWithCallable($node->stmts, function (Node $subNode) use($variableNamesWithArrayType, $node, &$paramsWithType) : ?int { if ($subNode instanceof Class_ || $subNode instanceof Function_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof FuncCall) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php index c5be54715..61be8231e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\TypeDeclaration\Rector\ClassMethod; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Yield_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; @@ -22,7 +22,6 @@ use PHPStan\Type\TypeCombinator; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Exception\ShouldNotHappenException; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; @@ -39,29 +38,24 @@ final class AddParamTypeBasedOnPHPUnitDataProviderRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var string */ @@ -144,7 +138,7 @@ public function refactor(Node $node) : ?Node } $dataProviderNodes = $this->resolveDataProviderNodes($classMethod); if ($dataProviderNodes->isEmpty()) { - return null; + continue; } $hasClassMethodChanged = $this->refactorClassMethod($classMethod, $node, $dataProviderNodes->nodes); if ($hasClassMethodChanged) { @@ -257,7 +251,7 @@ private function resolveParamOnPositionTypes(Array_ $array, int $parameterPositi $paramOnPositionTypes = []; foreach ($array->items as $singleDataProvidedSet) { if (!$singleDataProvidedSet instanceof ArrayItem || !$singleDataProvidedSet->value instanceof Array_) { - throw new ShouldNotHappenException(); + return []; } foreach ($singleDataProvidedSet->value->items as $position => $singleDataProvidedSetItem) { if ($position !== $parameterPosition) { @@ -289,7 +283,7 @@ private function getPhpDataProviderAttributes(ClassMethod $classMethod) : array $dataProviders = []; foreach ($attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attribute) { - if (!$this->nodeNameResolver->isName($attribute->name, $attributeName)) { + if (!$this->isName($attribute->name, $attributeName)) { continue; } $dataProviders[] = $attribute; @@ -318,8 +312,11 @@ private function refactorClassMethod(ClassMethod $classMethod, Class_ $class, ar if ($paramTypeDeclaration instanceof MixedType) { continue; } - $param->type = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($paramTypeDeclaration, TypeKind::PARAM); - $hasChanged = \true; + $type = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($paramTypeDeclaration, TypeKind::PARAM); + if ($type instanceof Node) { + $param->type = $type; + $hasChanged = \true; + } } return $hasChanged; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php index 5d5081916..2e54b1404 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php @@ -21,7 +21,7 @@ use Rector\ValueObject\PhpVersionFeature; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamTypeDeclarationRector\AddParamTypeDeclarationRectorTest */ @@ -29,27 +29,21 @@ final class AddParamTypeDeclarationRector extends AbstractRector implements Conf { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var AddParamTypeDeclaration[] */ - private $addParamTypeDeclarations = []; - /** - * @var bool - */ - private $hasChanged = \false; + private array $addParamTypeDeclarations = []; + private bool $hasChanged = \false; public function __construct(TypeComparator $typeComparator, PhpVersionProvider $phpVersionProvider, StaticTypeMapper $staticTypeMapper) { $this->typeComparator = $typeComparator; @@ -143,7 +137,7 @@ private function refactorClassMethodWithTypehintByParameterPosition(ClassMethod private function refactorParameter(Param $param, AddParamTypeDeclaration $addParamTypeDeclaration) : void { // already set → no change - if ($param->type !== null) { + if ($param->type instanceof Node) { $currentParamType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); if ($this->typeComparator->areTypesEqual($currentParamType, $addParamTypeDeclaration->getParamType())) { return; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeFromPropertyTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeFromPropertyTypeRector.php index caca58cc7..115a85feb 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeFromPropertyTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeFromPropertyTypeRector.php @@ -8,7 +8,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\Type; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; @@ -29,38 +29,32 @@ final class AddParamTypeFromPropertyTypeRector extends AbstractRector implements { /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\Guard\ParamTypeAddGuard */ - private $paramTypeAddGuard; + private ParamTypeAddGuard $paramTypeAddGuard; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var string */ - private const ERROR_MESSAGE = 'Adds param type declaration based on property type the value is assigned to PHPUnit provider return type declaration'; + private const ERROR_MESSAGE = 'Add param type declaration based on property type'; public function __construct(PropertyFetchAnalyzer $propertyFetchAnalyzer, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, TypeFactory $typeFactory, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, ParamTypeAddGuard $paramTypeAddGuard, StaticTypeMapper $staticTypeMapper) { $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; @@ -151,7 +145,7 @@ private function resolvePropertyStaticTypesByParamName(ClassMethod $classMethod, $this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (Node $node) use($paramName, &$propertyStaticTypes) : ?int { if ($node instanceof Class_ || $node instanceof Function_) { // skip anonymous classes and inner function - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Assign) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php index f6a031e5d..7e6fa7192 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnArrayDocblockBasedOnArrayMapRector.php @@ -29,34 +29,28 @@ final class AddReturnArrayDocblockBasedOnArrayMapRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer, StaticTypeMapper $staticTypeMapper, TypeFactory $typeFactory, PhpDocTypeChanger $phpDocTypeChanger, PhpDocInfoFactory $phpDocInfoFactory) { $this->betterNodeFinder = $betterNodeFinder; @@ -136,9 +130,9 @@ public function refactor(Node $node) $functionLikePhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); $hasChanged = $this->phpDocTypeChanger->changeReturnType($node, $functionLikePhpDocInfo, $arrayType); if ($hasChanged) { - return null; + return $node; } - return $node; + return null; } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_ $functionLike diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php index ea1ccd4c3..87efbf839 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php @@ -28,19 +28,16 @@ final class AddReturnTypeDeclarationBasedOnParentClassMethodRector extends Abstr { /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, PhpVersionProvider $phpVersionProvider, StaticTypeMapper $staticTypeMapper) { $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; @@ -97,7 +94,7 @@ public function refactor(Node $node) : ?Node { $hasChanged = \false; foreach ($node->getMethods() as $classMethod) { - if ($this->isName($classMethod, MethodName::CONSTRUCT)) { + if ($this->isNames($classMethod, [MethodName::CONSTRUCT, MethodName::DESCTRUCT])) { continue; } $parentClassMethodReturnType = $this->getReturnTypeRecursive($classMethod); @@ -141,7 +138,7 @@ private function getReturnTypeRecursive(ClassMethod $classMethod) : ?Type private function processClassMethodReturnType(Class_ $class, ClassMethod $classMethod, Type $parentType) : ?ClassMethod { if ($parentType instanceof MixedType) { - $className = (string) $this->nodeNameResolver->getName($class); + $className = (string) $this->getName($class); $currentObjectType = new ObjectType($className); if (!$parentType->equals($currentObjectType) && $classMethod->returnType instanceof Node) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php index f5eb3833f..42a6cef1e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php @@ -6,21 +6,25 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; +use PHPStan\Type\StaticType; use PHPStan\Type\Type; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Php\PhpVersionProvider; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\Rector\AbstractRector; +use Rector\Reflection\ReflectionResolver; use Rector\StaticTypeMapper\StaticTypeMapper; +use Rector\StaticTypeMapper\ValueObject\Type\SimpleStaticType; use Rector\TypeDeclaration\ValueObject\AddReturnTypeDeclaration; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\ParentClassMethodTypeOverrideGuard; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddReturnTypeDeclarationRector\AddReturnTypeDeclarationRectorTest */ @@ -28,36 +32,35 @@ final class AddReturnTypeDeclarationRector extends AbstractRector implements Con { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** - * @var AddReturnTypeDeclaration[] + * @readonly */ - private $methodReturnTypes = []; + private ReflectionResolver $reflectionResolver; /** - * @var bool + * @var AddReturnTypeDeclaration[] */ - private $hasChanged = \false; - public function __construct(PhpVersionProvider $phpVersionProvider, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, StaticTypeMapper $staticTypeMapper) + private array $methodReturnTypes = []; + private bool $hasChanged = \false; + public function __construct(PhpVersionProvider $phpVersionProvider, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, StaticTypeMapper $staticTypeMapper, ReflectionResolver $reflectionResolver) { $this->phpVersionProvider = $phpVersionProvider; $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; $this->staticTypeMapper = $staticTypeMapper; + $this->reflectionResolver = $reflectionResolver; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Changes defined return typehint of method and class.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change defined return typehint of method and class', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' class SomeClass { public function getData() @@ -116,7 +119,7 @@ public function configure(array $configuration) : void private function processClassMethodNodeWithTypehints(ClassMethod $classMethod, Class_ $class, Type $newType, ObjectType $objectType) : void { if ($newType instanceof MixedType) { - $className = (string) $this->nodeNameResolver->getName($class); + $className = (string) $this->getName($class); $currentObjectType = new ObjectType($className); if (!$objectType->equals($currentObjectType) && $classMethod->returnType instanceof Node) { return; @@ -127,6 +130,13 @@ private function processClassMethodNodeWithTypehints(ClassMethod $classMethod, C $classMethod->returnType = null; return; } + $classReflection = $this->reflectionResolver->resolveClassReflection($classMethod); + if ($classMethod->returnType instanceof Node && $newType instanceof SimpleStaticType) { + if (!$classReflection instanceof ClassReflection) { + return; + } + $newType = new StaticType($classReflection); + } // already set and sub type or equal → no change if ($this->parentClassMethodTypeOverrideGuard->shouldSkipReturnTypeChange($classMethod, $newType)) { return; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php index 3678461ad..60be24054 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddTypeFromResourceDocblockRector.php @@ -24,7 +24,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddTypeFromResourceDocblockRector\AddTypeFromResourceDocblockRectorTest */ @@ -32,33 +32,25 @@ final class AddTypeFromResourceDocblockRector extends AbstractRector implements { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; - /** - * @var string - */ - private $newTypeFromResourceDoc; + private PhpDocTagRemover $phpDocTagRemover; + private string $newTypeFromResourceDoc; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, PhpDocTypeChanger $phpDocTypeChanger, DocBlockUpdater $docBlockUpdater, StaticTypeMapper $staticTypeMapper, PhpDocTagRemover $phpDocTagRemover) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector.php index b26b9bc4d..f885efd19 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector.php @@ -4,9 +4,10 @@ namespace Rector\TypeDeclaration\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Throw_; +use PhpParser\Node\Stmt\Expression; use Rector\Rector\AbstractRector; use Rector\Reflection\ClassModifierChecker; use Rector\TypeDeclaration\TypeInferer\SilentVoidResolver; @@ -22,19 +23,16 @@ final class AddVoidReturnTypeWhereNoReturnRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SilentVoidResolver */ - private $silentVoidResolver; + private SilentVoidResolver $silentVoidResolver; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnVendorLockResolver */ - private $classMethodReturnVendorLockResolver; + private ClassMethodReturnVendorLockResolver $classMethodReturnVendorLockResolver; /** * @readonly - * @var \Rector\Reflection\ClassModifierChecker */ - private $classModifierChecker; + private ClassModifierChecker $classModifierChecker; public function __construct(SilentVoidResolver $silentVoidResolver, ClassMethodReturnVendorLockResolver $classMethodReturnVendorLockResolver, ClassModifierChecker $classModifierChecker) { $this->silentVoidResolver = $silentVoidResolver; @@ -124,7 +122,7 @@ private function isNotFinalAndHasExceptionOnly(ClassMethod $classMethod) : bool return \false; } $onlyStmt = $classMethod->stmts[0] ?? null; - return $onlyStmt instanceof Throw_; + return $onlyStmt instanceof Expression && $onlyStmt->expr instanceof Throw_; } private function isNotFinalAndEmpty(ClassMethod $classMethod) : bool { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanConstReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanConstReturnsRector.php index 3e51b0c2a..0ada028b1 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanConstReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanConstReturnsRector.php @@ -13,7 +13,8 @@ use PHPStan\Analyser\Scope; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\Node\Value\ValueResolver; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -23,28 +24,24 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\BoolReturnTypeFromBooleanConstReturnsRector\BoolReturnTypeFromBooleanConstReturnsRectorTest */ -final class BoolReturnTypeFromBooleanConstReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class BoolReturnTypeFromBooleanConstReturnsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnAnalyzer $returnAnalyzer) { $this->valueResolver = $valueResolver; @@ -92,8 +89,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node, $scope)) { return null; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanStrictReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanStrictReturnsRector.php index b6ad26ef7..4d5f8dbeb 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanStrictReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromBooleanStrictReturnsRector.php @@ -5,22 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Expr; -use PhpParser\Node\Expr\BinaryOp\BooleanAnd; -use PhpParser\Node\Expr\BinaryOp\BooleanOr; -use PhpParser\Node\Expr\BinaryOp\Equal; -use PhpParser\Node\Expr\BinaryOp\Greater; -use PhpParser\Node\Expr\BinaryOp\GreaterOrEqual; -use PhpParser\Node\Expr\BinaryOp\Identical; -use PhpParser\Node\Expr\BinaryOp\NotEqual; -use PhpParser\Node\Expr\BinaryOp\NotIdentical; -use PhpParser\Node\Expr\BinaryOp\Smaller; -use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual; -use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\ConstFetch; -use PhpParser\Node\Expr\Empty_; use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Expr\Isset_; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassMethod; @@ -28,10 +15,11 @@ use PhpParser\Node\Stmt\Return_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ReflectionProvider; -use PHPStan\Type\BooleanType; +use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\Node\Value\ValueResolver; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -41,40 +29,40 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\BoolReturnTypeFromBooleanStrictReturnsRector\BoolReturnTypeFromBooleanStrictReturnsRectorTest */ -final class BoolReturnTypeFromBooleanStrictReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class BoolReturnTypeFromBooleanStrictReturnsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; - public function __construct(ReflectionProvider $reflectionProvider, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnAnalyzer $returnAnalyzer) + private ReturnAnalyzer $returnAnalyzer; + /** + * @readonly + */ + private ExprAnalyzer $exprAnalyzer; + public function __construct(ReflectionProvider $reflectionProvider, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnAnalyzer $returnAnalyzer, ExprAnalyzer $exprAnalyzer) { $this->reflectionProvider = $reflectionProvider; $this->valueResolver = $valueResolver; $this->betterNodeFinder = $betterNodeFinder; $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; $this->returnAnalyzer = $returnAnalyzer; + $this->exprAnalyzer = $exprAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -108,8 +96,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node, $scope)) { return null; } @@ -152,7 +141,7 @@ private function hasOnlyBoolScalarReturnExprs(array $returns) : bool if (!$return->expr instanceof Expr) { return \false; } - if ($this->isBooleanOp($return->expr)) { + if ($this->exprAnalyzer->isBoolExpr($return->expr)) { continue; } if ($return->expr instanceof FuncCall && $this->isNativeBooleanReturnTypeFuncCall($return->expr)) { @@ -176,50 +165,12 @@ private function isNativeBooleanReturnTypeFuncCall(FuncCall $funcCall) : bool if (!$functionReflection->isBuiltin()) { return \false; } - foreach ($functionReflection->getVariants() as $parametersAcceptorWithPhpDoc) { - return $parametersAcceptorWithPhpDoc->getNativeReturnType() instanceof BooleanType; - } - return \false; - } - private function isBooleanOp(Expr $expr) : bool - { - if ($expr instanceof Smaller) { - return \true; - } - if ($expr instanceof SmallerOrEqual) { - return \true; - } - if ($expr instanceof Greater) { - return \true; - } - if ($expr instanceof GreaterOrEqual) { - return \true; - } - if ($expr instanceof BooleanOr) { - return \true; - } - if ($expr instanceof BooleanAnd) { - return \true; - } - if ($expr instanceof Identical) { - return \true; - } - if ($expr instanceof NotIdentical) { - return \true; - } - if ($expr instanceof Equal) { - return \true; - } - if ($expr instanceof NotEqual) { - return \true; - } - if ($expr instanceof Empty_) { - return \true; - } - if ($expr instanceof Isset_) { - return \true; + foreach ($functionReflection->getVariants() as $variant) { + if (!$variant->getNativeReturnType()->isBoolean()->yes()) { + return \false; + } } - return $expr instanceof BooleanNot; + return \true; } /** * @param Return_[] $returns diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictReturnsRector.php index 900bff35e..b5031d36d 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictReturnsRector.php @@ -7,14 +7,15 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; use PHPStan\Analyser\Scope; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -24,23 +25,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\NumericReturnTypeFromStrictReturnsRector\NumericReturnTypeFromStrictReturnsRectorTest */ -final class NumericReturnTypeFromStrictReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class NumericReturnTypeFromStrictReturnsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -79,8 +77,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node, $scope)) { return null; } @@ -150,10 +149,10 @@ private function isAlwaysNumeric(array $returns) : bool if ($epxr instanceof UnaryMinus) { $epxr = $epxr->expr; } - if (!$epxr instanceof DNumber) { + if (!$epxr instanceof Float_) { $isAlwaysFloat = \false; } - if (!$epxr instanceof LNumber) { + if (!$epxr instanceof Int_) { $isAlwaysInt = \false; } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php index 28c63012b..13b8d9d30 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php @@ -6,13 +6,14 @@ use PhpParser\Node; use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PHPStan\Analyser\Scope; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -22,23 +23,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\NumericReturnTypeFromStrictScalarReturnsRector\NumericReturnTypeFromStrictScalarReturnsRectorTest */ -final class NumericReturnTypeFromStrictScalarReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class NumericReturnTypeFromStrictScalarReturnsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -77,8 +75,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node, $scope)) { return null; } @@ -93,10 +92,10 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node if ($expr instanceof UnaryMinus) { $expr = $expr->expr; } - if (!$expr instanceof DNumber) { + if (!$expr instanceof Float_) { $isAlwaysFloat = \false; } - if (!$expr instanceof LNumber) { + if (!$expr instanceof Int_) { $isAlwaysInt = \false; } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php index 4d9e5e08f..74c91c591 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php @@ -10,11 +10,11 @@ use PhpParser\Node\Param; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\Mapper\PhpParserNodeMapper; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\Guard\ParamTypeAddGuard; @@ -25,43 +25,36 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ParamTypeByMethodCallTypeRector\ParamTypeByMethodCallTypeRectorTest */ -final class ParamTypeByMethodCallTypeRector extends AbstractScopeAwareRector +final class ParamTypeByMethodCallTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\CallerParamMatcher */ - private $callerParamMatcher; + private CallerParamMatcher $callerParamMatcher; /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\Guard\ParamTypeAddGuard */ - private $paramTypeAddGuard; + private ParamTypeAddGuard $paramTypeAddGuard; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\StaticTypeMapper\Mapper\PhpParserNodeMapper */ - private $phpParserNodeMapper; + private PhpParserNodeMapper $phpParserNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; public function __construct(CallerParamMatcher $callerParamMatcher, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, ParamTypeAddGuard $paramTypeAddGuard, BetterNodeFinder $betterNodeFinder, PhpParserNodeMapper $phpParserNodeMapper, StaticTypeMapper $staticTypeMapper, TypeFactory $typeFactory) { $this->callerParamMatcher = $callerParamMatcher; @@ -128,7 +121,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { $hasChanged = \false; foreach ($node->getMethods() as $classMethod) { @@ -137,7 +130,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } /** @var array $callers */ $callers = $this->betterNodeFinder->findInstancesOf($classMethod, [StaticCall::class, MethodCall::class, FuncCall::class]); - $hasClassMethodChanged = $this->refactorClassMethod($classMethod, $callers, $scope); + $hasClassMethodChanged = $this->refactorClassMethod($classMethod, $callers); if ($hasClassMethodChanged) { $hasChanged = \true; } @@ -157,7 +150,7 @@ private function shouldSkipClassMethod(ClassMethod $classMethod) : bool private function shouldSkipParam(Param $param, ClassMethod $classMethod) : bool { // already has type, skip - if ($param->type !== null) { + if ($param->type instanceof Node) { return \true; } if ($param->variadic) { @@ -168,7 +161,7 @@ private function shouldSkipParam(Param $param, ClassMethod $classMethod) : bool /** * @param array $callers */ - private function refactorClassMethod(ClassMethod $classMethod, array $callers, Scope $scope) : bool + private function refactorClassMethod(ClassMethod $classMethod, array $callers) : bool { $hasChanged = \false; foreach ($classMethod->params as $param) { @@ -177,7 +170,7 @@ private function refactorClassMethod(ClassMethod $classMethod, array $callers, S } $paramTypes = []; foreach ($callers as $caller) { - $matchCallParam = $this->callerParamMatcher->matchCallParam($caller, $param, $scope); + $matchCallParam = $this->callerParamMatcher->matchCallParam($caller, $param); // nothing to do with param, continue if (!$matchCallParam instanceof Param) { continue; @@ -187,8 +180,11 @@ private function refactorClassMethod(ClassMethod $classMethod, array $callers, S $paramTypes = []; break; } + if ($caller->getAttribute(AttributeKey::IS_RIGHT_AND)) { + $paramTypes = []; + break; + } $paramTypes[] = $this->phpParserNodeMapper->mapToPHPStanType($paramType); - $hasChanged = \true; } if ($paramTypes === []) { continue; @@ -197,6 +193,7 @@ private function refactorClassMethod(ClassMethod $classMethod, array $callers, S $paramNodeType = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::PARAM); if ($paramNodeType instanceof Node) { $param->type = $paramNodeType; + $hasChanged = \true; } } return $hasChanged; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php index 00d685ba3..0aa801882 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php @@ -7,12 +7,12 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Param; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use Rector\Enum\ObjectReference; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\TypeDeclaration\NodeAnalyzer\CallerParamMatcher; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -20,23 +20,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ParamTypeByParentCallTypeRector\ParamTypeByParentCallTypeRectorTest */ -final class ParamTypeByParentCallTypeRector extends AbstractScopeAwareRector +final class ParamTypeByParentCallTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\CallerParamMatcher */ - private $callerParamMatcher; + private CallerParamMatcher $callerParamMatcher; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(CallerParamMatcher $callerParamMatcher, ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder) { $this->callerParamMatcher = $callerParamMatcher; @@ -89,8 +86,9 @@ public function getNodeTypes() : array /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node)) { return null; } @@ -108,7 +106,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node if (!$parentParam instanceof Param) { continue; } - if ($parentParam->type === null) { + if (!$parentParam->type instanceof Node) { continue; } // mimic type diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php index da7587c2c..49e8d0be5 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php @@ -6,8 +6,9 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeManipulator\AddNeverReturnType; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -16,16 +17,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnNeverTypeRector\ReturnNeverTypeRectorTest */ -final class ReturnNeverTypeRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnNeverTypeRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeManipulator\AddNeverReturnType */ - private $addNeverReturnType; - public function __construct(AddNeverReturnType $addNeverReturnType) + private AddNeverReturnType $addNeverReturnType; + /** + * @readonly + */ + private TestsNodeAnalyzer $testsNodeAnalyzer; + public function __construct(AddNeverReturnType $addNeverReturnType, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->addNeverReturnType = $addNeverReturnType; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -59,12 +64,32 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); + if ($this->isTestClassMethodWithFilledReturnType($node)) { + return null; + } return $this->addNeverReturnType->add($node, $scope); } public function provideMinPhpVersion() : int { return PhpVersionFeature::NEVER_TYPE; } + /** + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_ $callLike + */ + private function isTestClassMethodWithFilledReturnType($callLike) : bool + { + if (!$callLike instanceof ClassMethod) { + return \false; + } + if (!$callLike->isPublic()) { + return \false; + } + if (!$this->testsNodeAnalyzer->isInTestClass($callLike)) { + return \false; + } + return $callLike->returnType instanceof Node; + } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNullableTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNullableTypeRector.php index 2b5a3b6a7..0acd658a7 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNullableTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNullableTypeRector.php @@ -7,11 +7,11 @@ use PhpParser\Node\NullableType; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PHPStan\Analyser\Scope; use PHPStan\Type\UnionType; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\PHPStanStaticTypeMapper\TypeMapper\UnionTypeMapper; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -21,23 +21,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnNullableTypeRector\ReturnNullableTypeRectorTest */ -final class ReturnNullableTypeRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnNullableTypeRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeMapper\UnionTypeMapper */ - private $unionTypeMapper; + private UnionTypeMapper $unionTypeMapper; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; public function __construct(UnionTypeMapper $unionTypeMapper, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer) { $this->unionTypeMapper = $unionTypeMapper; @@ -88,8 +85,9 @@ public function provideMinPhpVersion() : int /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // empty body, nothing to resolve if ($node->stmts === null || $node->stmts === []) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php index bc30c5a06..107ab2e1c 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromMockObjectRector.php @@ -14,7 +14,8 @@ use PHPStan\Type\Type; use Rector\Enum\ClassName; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -24,27 +25,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromMockObjectRector\ReturnTypeFromMockObjectRectorTest */ -final class ReturnTypeFromMockObjectRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromMockObjectRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; - /** - * @var string - */ - private const MOCK_OBJECT_CLASS = 'PHPUnit\\Framework\\MockObject\\MockObject'; + private ReturnAnalyzer $returnAnalyzer; public function __construct(BetterNodeFinder $betterNodeFinder, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnAnalyzer $returnAnalyzer) { $this->betterNodeFinder = $betterNodeFinder; @@ -82,8 +76,9 @@ public function getNodeTypes() : array /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // type is already known if ($node->returnType instanceof Node) { return null; @@ -108,7 +103,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node if (!$this->isMockObjectType($returnType)) { return null; } - $node->returnType = new FullyQualified(self::MOCK_OBJECT_CLASS); + $node->returnType = new FullyQualified(ClassName::MOCK_OBJECT); return $node; } public function provideMinPhpVersion() : int @@ -123,11 +118,11 @@ private function isIntersectionWithMockObjectType(Type $type) : bool if (\count($type->getTypes()) !== 2) { return \false; } - return \in_array(self::MOCK_OBJECT_CLASS, $type->getObjectClassNames()); + return \in_array(ClassName::MOCK_OBJECT, $type->getObjectClassNames()); } private function isMockObjectType(Type $returnType) : bool { - if ($returnType instanceof ObjectType && $returnType->isInstanceOf(self::MOCK_OBJECT_CLASS)->yes()) { + if ($returnType instanceof ObjectType && $returnType->isInstanceOf(ClassName::MOCK_OBJECT)->yes()) { return \true; } return $this->isIntersectionWithMockObjectType($returnType); @@ -139,6 +134,6 @@ private function isInsideTestCaseClass(Scope $scope) : bool return \false; } // is phpunit test case? - return $classReflection->isSubclassOf(ClassName::TEST_CASE_CLASS); + return $classReflection->is(ClassName::TEST_CASE_CLASS); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnCastRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnCastRector.php index 03c9758e1..b268bdd7f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnCastRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnCastRector.php @@ -6,8 +6,8 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeManipulator\AddReturnTypeFromCast; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -16,13 +16,12 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnCastRector\ReturnTypeFromReturnCastRectorTest */ -final class ReturnTypeFromReturnCastRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromReturnCastRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeManipulator\AddReturnTypeFromCast */ - private $addReturnTypeFromCast; + private AddReturnTypeFromCast $addReturnTypeFromCast; public function __construct(AddReturnTypeFromCast $addReturnTypeFromCast) { $this->addReturnTypeFromCast = $addReturnTypeFromCast; @@ -69,8 +68,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); return $this->addReturnTypeFromCast->add($node, $scope); } public function provideMinPhpVersion() : int diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnDirectArrayRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnDirectArrayRector.php index 1909d5659..56eef299d 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnDirectArrayRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnDirectArrayRector.php @@ -9,8 +9,8 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -20,18 +20,16 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnDirectArrayRector\ReturnTypeFromReturnDirectArrayRectorTest */ -final class ReturnTypeFromReturnDirectArrayRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromReturnDirectArrayRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -69,8 +67,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // already has return type, skip if ($node->returnType instanceof Node) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php index 82edaf3c6..9ec42622e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php @@ -10,7 +10,6 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ObjectType; @@ -23,8 +22,9 @@ use Rector\NodeTypeResolver\NodeTypeResolver\NewTypeResolver; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\StaticTypeMapper\ValueObject\Type\SelfStaticType; @@ -40,63 +40,52 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnNewRector\ReturnTypeFromReturnNewRectorTest */ -final class ReturnTypeFromReturnNewRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromReturnNewRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnTypeAnalyzer\StrictReturnNewAnalyzer */ - private $strictReturnNewAnalyzer; + private StrictReturnNewAnalyzer $strictReturnNewAnalyzer; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver\NewTypeResolver */ - private $newTypeResolver; + private NewTypeResolver $newTypeResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; public function __construct(TypeFactory $typeFactory, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, StrictReturnNewAnalyzer $strictReturnNewAnalyzer, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ClassAnalyzer $classAnalyzer, NewTypeResolver $newTypeResolver, BetterNodeFinder $betterNodeFinder, StaticTypeMapper $staticTypeMapper, ReturnAnalyzer $returnAnalyzer, ControllerAnalyzer $controllerAnalyzer) { $this->typeFactory = $typeFactory; @@ -143,8 +132,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // already filled if ($node->returnType instanceof Node) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictConstantReturnRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictConstantReturnRector.php index 7a84591e7..60acae2cd 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictConstantReturnRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictConstantReturnRector.php @@ -8,12 +8,12 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; -use PHPStan\Analyser\Scope; use PHPStan\Type\Type; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersion; @@ -24,33 +24,28 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictConstantReturnRector\ReturnTypeFromStrictConstantReturnRectorTest */ -final class ReturnTypeFromStrictConstantReturnRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictConstantReturnRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, StaticTypeMapper $staticTypeMapper, BetterNodeFinder $betterNodeFinder, TypeFactory $typeFactory, ReturnAnalyzer $returnAnalyzer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -95,8 +90,9 @@ public function getNodeTypes() : array /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($node->returnType instanceof Node) { return null; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictFluentReturnRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictFluentReturnRector.php index ccf618836..59036856a 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictFluentReturnRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictFluentReturnRector.php @@ -6,13 +6,13 @@ use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; use PHPStan\Type\StaticType; use PHPStan\Type\ThisType; use Rector\Php\PhpVersionProvider; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer; use Rector\ValueObject\PhpVersionFeature; @@ -23,28 +23,24 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictFluentReturnRector\ReturnTypeFromStrictFluentReturnRectorTest */ -final class ReturnTypeFromStrictFluentReturnRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictFluentReturnRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReflectionResolver $reflectionResolver, ReturnTypeInferer $returnTypeInferer, PhpVersionProvider $phpVersionProvider) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -88,8 +84,9 @@ public function provideMinPhpVersion() : int /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // already typed → skip if ($node->returnType instanceof Node) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNativeCallRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNativeCallRector.php index 6b45e1821..d5c1aff69 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNativeCallRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNativeCallRector.php @@ -6,8 +6,8 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeManipulator\AddReturnTypeFromStrictNativeCall; use Rector\ValueObject\PhpVersion; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -16,13 +16,12 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictNativeCallRector\ReturnTypeFromStrictNativeCallRectorTest */ -final class ReturnTypeFromStrictNativeCallRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictNativeCallRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeManipulator\AddReturnTypeFromStrictNativeCall */ - private $addReturnTypeFromStrictNativeCall; + private AddReturnTypeFromStrictNativeCall $addReturnTypeFromStrictNativeCall; public function __construct(AddReturnTypeFromStrictNativeCall $addReturnTypeFromStrictNativeCall) { $this->addReturnTypeFromStrictNativeCall = $addReturnTypeFromStrictNativeCall; @@ -59,8 +58,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); return $this->addReturnTypeFromStrictNativeCall->add($node, $scope); } public function provideMinPhpVersion() : int diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php index 1332e25f0..f7a427c15 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php @@ -14,17 +14,19 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use PHPStan\Analyser\Scope; +use PHPStan\Type\Accessory\AccessoryArrayListType; use PHPStan\Type\ArrayType; use PHPStan\Type\Constant\ConstantArrayType; -use PHPStan\Type\IntegerType; use PHPStan\Type\IntersectionType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; +use PHPStan\Type\TypeCombinator; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer; use Rector\ValueObject\PhpVersion; @@ -35,38 +37,32 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictNewArrayRector\ReturnTypeFromStrictNewArrayRectorTest */ -final class ReturnTypeFromStrictNewArrayRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictNewArrayRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer) { $this->phpDocTypeChanger = $phpDocTypeChanger; @@ -112,8 +108,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node, $scope)) { return null; } @@ -164,7 +161,7 @@ private function processAddArrayReturnType($node, Type $returnType) // always returns array $node->returnType = new Identifier('array'); // add more precise array type if suitable - if ($returnType instanceof ArrayType && $this->shouldAddReturnArrayDocType($returnType)) { + if ($this->shouldAddReturnArrayDocType($returnType)) { $this->changeReturnType($node, $returnType); } return $node; @@ -182,7 +179,7 @@ private function shouldSkip($node, Scope $scope) : bool /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $node */ - private function changeReturnType($node, ArrayType $arrayType) : void + private function changeReturnType($node, Type $arrayType) : void { $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); // skip already filled type, on purpose @@ -193,12 +190,15 @@ private function changeReturnType($node, ArrayType $arrayType) : void if ($arrayType instanceof ConstantArrayType && \count($arrayType->getValueTypes()) !== 1) { return; } - $itemType = $arrayType->getItemType(); + $itemType = $arrayType->getIterableValueType(); if ($itemType instanceof IntersectionType) { $narrowArrayType = $arrayType; } else { $narrowArrayType = new ArrayType(new MixedType(), $itemType); } + if ($arrayType->isList()->yes()) { + $narrowArrayType = TypeCombinator::intersect($narrowArrayType, new AccessoryArrayListType()); + } $this->phpDocTypeChanger->changeReturnType($node, $phpDocInfo, $narrowArrayType); } /** @@ -208,7 +208,7 @@ private function changeReturnType($node, ArrayType $arrayType) : void */ private function matchVariableNotOverriddenByNonArray($functionLike, array $variables) : array { - // is variable overriden? + // is variable overridden? /** @var Assign[] $assigns */ $assigns = $this->betterNodeFinder->findInstancesOfInFunctionLikeScoped($functionLike, Assign::class); foreach ($assigns as $assign) { @@ -255,14 +255,14 @@ private function matchArrayAssignedVariable(array $stmts) : array } return $variables; } - private function shouldAddReturnArrayDocType(ArrayType $arrayType) : bool + private function shouldAddReturnArrayDocType(Type $arrayType) : bool { if ($arrayType instanceof ConstantArrayType) { - if ($arrayType->getItemType() instanceof NeverType) { + if ($arrayType->getIterableValueType() instanceof NeverType) { return \false; } // handle only simple arrays - if (!$arrayType->getKeyType() instanceof IntegerType) { + if (!$arrayType->getIterableKeyType()->isInteger()->yes()) { return \false; } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictParamRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictParamRector.php index e03b5f9f0..1991ae756 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictParamRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictParamRector.php @@ -6,8 +6,8 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeManipulator\AddReturnTypeFromParam; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -16,13 +16,12 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictParamRector\ReturnTypeFromStrictParamRectorTest */ -final class ReturnTypeFromStrictParamRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictParamRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeManipulator\AddReturnTypeFromParam */ - private $addReturnTypeFromParam; + private AddReturnTypeFromParam $addReturnTypeFromParam; public function __construct(AddReturnTypeFromParam $addReturnTypeFromParam) { $this->addReturnTypeFromParam = $addReturnTypeFromParam; @@ -63,8 +62,9 @@ public function provideMinPhpVersion() : int /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); return $this->addReturnTypeFromParam->add($node, $scope); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedCallRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedCallRector.php index d795a1712..50908191e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedCallRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedCallRector.php @@ -15,13 +15,13 @@ use PhpParser\Node\Stmt\Return_; use PhpParser\Node\UnionType as PhpParserUnionType; use PHPStan\Analyser\Scope; -use PHPStan\Type\NullType; use PHPStan\Type\ObjectType; use PHPStan\Type\UnionType; use Rector\Php\PhpVersionProvider; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\TypeDeclaration\NodeAnalyzer\TypeNodeUnwrapper; @@ -35,48 +35,40 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictTypedCallRector\ReturnTypeFromStrictTypedCallRectorTest */ -final class ReturnTypeFromStrictTypedCallRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictTypedCallRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\TypeNodeUnwrapper */ - private $typeNodeUnwrapper; + private TypeNodeUnwrapper $typeNodeUnwrapper; /** * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\ReturnStrictTypeAnalyzer */ - private $returnStrictTypeAnalyzer; + private ReturnStrictTypeAnalyzer $returnStrictTypeAnalyzer; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(TypeNodeUnwrapper $typeNodeUnwrapper, ReturnStrictTypeAnalyzer $returnStrictTypeAnalyzer, ReturnTypeInferer $returnTypeInferer, BetterNodeFinder $betterNodeFinder, PhpVersionProvider $phpVersionProvider, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnAnalyzer $returnAnalyzer, StaticTypeMapper $staticTypeMapper) { $this->typeNodeUnwrapper = $typeNodeUnwrapper; @@ -134,8 +126,9 @@ public function provideMinPhpVersion() : int /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // already filled → skip if ($node->returnType instanceof Node) { return null; @@ -194,7 +187,7 @@ private function isUnionPossibleReturnsVoid($node) : bool private function processSingleUnionType($node, UnionType $unionType, NullableType $nullableType) { $types = $unionType->getTypes(); - $returnType = $types[0] instanceof ObjectType && $types[1] instanceof NullType ? new NullableType(new FullyQualified($types[0]->getClassName())) : $nullableType; + $returnType = $types[0] instanceof ObjectType && $types[1]->isNull()->yes() ? new NullableType(new FullyQualified($types[0]->getClassName())) : $nullableType; $node->returnType = $returnType; return $node; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php index 37c8a913f..e6131fe72 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php @@ -8,14 +8,14 @@ use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; @@ -27,38 +27,32 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictTypedPropertyRector\ReturnTypeFromStrictTypedPropertyRectorTest */ -final class ReturnTypeFromStrictTypedPropertyRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictTypedPropertyRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(TypeFactory $typeFactory, ReflectionResolver $reflectionResolver, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, BetterNodeFinder $betterNodeFinder, StaticTypeMapper $staticTypeMapper, ReturnAnalyzer $returnAnalyzer) { $this->typeFactory = $typeFactory; @@ -104,8 +98,9 @@ public function getNodeTypes() : array /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($node->returnType instanceof Node) { return null; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromSymfonySerializerRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromSymfonySerializerRector.php index b66ceed70..515f61c62 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromSymfonySerializerRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromSymfonySerializerRector.php @@ -8,11 +8,11 @@ use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; -use PHPStan\Analyser\Scope; use PHPStan\Type\ObjectType; use Rector\NodeAnalyzer\ArgsAnalyzer; use Rector\PhpParser\Node\Value\ValueResolver; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -21,23 +21,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromSymfonySerializerRector\ReturnTypeFromSymfonySerializerRectorTest */ -final class ReturnTypeFromSymfonySerializerRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromSymfonySerializerRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ValueResolver $valueResolver, ArgsAnalyzer $argsAnalyzer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -84,8 +81,9 @@ public function provideMinPhpVersion() : int /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($node->stmts === null) { return null; } @@ -103,7 +101,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } /** @var MethodCall $returnExpr */ $returnExpr = $node->stmts[0]->expr; - if (!$this->nodeNameResolver->isName($returnExpr->name, 'deserialize')) { + if (!$this->isName($returnExpr->name, 'deserialize')) { return null; } if ($returnExpr->isFirstClassCallable()) { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnUnionTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnUnionTypeRector.php index 506faea95..a5884789c 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnUnionTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnUnionTypeRector.php @@ -6,8 +6,8 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeManipulator\AddUnionReturnType; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -16,13 +16,12 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnUnionTypeRector\ReturnUnionTypeRectorTest */ -final class ReturnUnionTypeRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnUnionTypeRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeManipulator\AddUnionReturnType */ - private $addUnionReturnType; + private AddUnionReturnType $addUnionReturnType; public function __construct(AddUnionReturnType $addUnionReturnType) { $this->addUnionReturnType = $addUnionReturnType; @@ -79,8 +78,9 @@ public function provideMinPhpVersion() : int /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); return $this->addUnionReturnType->add($node, $scope); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictArrayParamDimFetchRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictArrayParamDimFetchRector.php index 170d94e7d..82cd323d2 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictArrayParamDimFetchRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictArrayParamDimFetchRector.php @@ -25,7 +25,7 @@ use PhpParser\Node\Stmt\Echo_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\Rector\AbstractRector; use Rector\VendorLocker\ParentClassMethodTypeOverrideGuard; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -37,9 +37,8 @@ final class StrictArrayParamDimFetchRector extends AbstractRector { /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard) { $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; @@ -115,12 +114,12 @@ private function isParamAccessedArrayDimFetch(Param $param, $functionLike) : boo $isParamAccessedArrayDimFetch = \false; $this->traverseNodesWithCallable($functionLike->stmts, function (Node $node) use($param, $paramName, &$isParamAccessedArrayDimFetch) : ?int { if ($node instanceof Class_ || $node instanceof FunctionLike) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($this->shouldStop($node, $param, $paramName)) { // force set to false to avoid too early replaced $isParamAccessedArrayDimFetch = \false; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if (!$node instanceof ArrayDimFetch) { return null; @@ -139,7 +138,7 @@ private function isParamAccessedArrayDimFetch(Param $param, $functionLike) : boo if ($variableType->isString()->yes()) { // force set to false to avoid too early replaced $isParamAccessedArrayDimFetch = \false; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } // skip integer in possibly string type as string can be accessed via int $dimType = $this->getType($node->dim); diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php index b6407b5d4..75a7b1f91 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php @@ -16,7 +16,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; @@ -32,14 +32,12 @@ final class StrictStringParamConcatRector extends AbstractRector { /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, PhpDocInfoFactory $phpDocInfoFactory) { $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; @@ -132,11 +130,11 @@ private function resolveVariableConcattedFromParam(Param $param, $functionLike) $this->traverseNodesWithCallable($functionLike->stmts, function (Node $node) use($paramName, &$variableConcatted) : ?int { // skip nested class and function nodes if ($node instanceof FunctionLike || $node instanceof Class_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($node instanceof Assign && $node->var instanceof Variable && $this->isName($node->var, $paramName)) { $variableConcatted = null; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } $expr = $this->resolveAssignConcatVariable($node, $paramName); if ($expr instanceof Variable) { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictScalarReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictScalarReturnsRector.php index bad1e2cdb..14431c110 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictScalarReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictScalarReturnsRector.php @@ -5,13 +5,14 @@ use PhpParser\Node; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PHPStan\Analyser\Scope; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersion; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -21,23 +22,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\StringReturnTypeFromStrictScalarReturnsRector\StringReturnTypeFromStrictScalarReturnsRectorTest */ -final class StringReturnTypeFromStrictScalarReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class StringReturnTypeFromStrictScalarReturnsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -84,8 +82,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // already added → skip if ($node->returnType instanceof Node) { return null; @@ -96,7 +95,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } foreach ($returns as $return) { // we need exact string "value" return - if (!$return->expr instanceof String_ && !$return->expr instanceof Encapsed) { + if (!$return->expr instanceof String_ && !$return->expr instanceof InterpolatedString) { return null; } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictStringReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictStringReturnsRector.php index 25566a180..f6b2cc0dc 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictStringReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StringReturnTypeFromStrictStringReturnsRector.php @@ -6,14 +6,15 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; use PHPStan\Analyser\Scope; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\ValueObject\PhpVersion; use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; @@ -23,23 +24,20 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\StringReturnTypeFromStrictStringReturnsRector\StringReturnTypeFromStrictStringReturnsRectorTest */ -final class StringReturnTypeFromStrictStringReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class StringReturnTypeFromStrictStringReturnsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -86,8 +84,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // already added → skip if ($node->returnType instanceof Node) { return null; @@ -131,7 +130,7 @@ private function hasAlwaysStringScalarReturn(array $returns) : bool { foreach ($returns as $return) { // we need exact string "value" return - if (!$return->expr instanceof String_ && !$return->expr instanceof Encapsed) { + if (!$return->expr instanceof String_ && !$return->expr instanceof InterpolatedString) { return \false; } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/AddTestsVoidReturnTypeWhereNoReturnRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/AddTestsVoidReturnTypeWhereNoReturnRector.php index a91ba1eef..1e06c00d3 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/AddTestsVoidReturnTypeWhereNoReturnRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/AddTestsVoidReturnTypeWhereNoReturnRector.php @@ -20,14 +20,12 @@ final class AddTestsVoidReturnTypeWhereNoReturnRector extends AbstractRector imp { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SilentVoidResolver */ - private $silentVoidResolver; + private SilentVoidResolver $silentVoidResolver; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, SilentVoidResolver $silentVoidResolver) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ChildDoctrineRepositoryClassTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ChildDoctrineRepositoryClassTypeRector.php index f765b42f9..16396a0a9 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ChildDoctrineRepositoryClassTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ChildDoctrineRepositoryClassTypeRector.php @@ -14,7 +14,6 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ExtendsTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; -use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Type\ObjectType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; @@ -30,19 +29,16 @@ final class ChildDoctrineRepositoryClassTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \PhpParser\NodeFinder */ - private $nodeFinder; + private NodeFinder $nodeFinder; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, NodeFinder $nodeFinder, DocBlockUpdater $docBlockUpdater) { $this->phpDocInfoFactory = $phpDocInfoFactory; @@ -145,10 +141,6 @@ private function resolveEntityClassnameFromPhpDoc(Class_ $class) : ?string if (!$extendsTagValueNode instanceof ExtendsTagValueNode) { return null; } - // we look for generic type class - if (!$extendsTagValueNode->type instanceof GenericTypeNode) { - return null; - } $genericTypeNode = $extendsTagValueNode->type; if ($genericTypeNode->type->name !== 'EntityRepository') { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/MergeDateTimePropertyTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/MergeDateTimePropertyTypeDeclarationRector.php index 00c769ecb..07c4900ec 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/MergeDateTimePropertyTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/MergeDateTimePropertyTypeDeclarationRector.php @@ -23,14 +23,12 @@ final class MergeDateTimePropertyTypeDeclarationRector extends AbstractRector im { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/PropertyTypeFromStrictSetterGetterRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/PropertyTypeFromStrictSetterGetterRector.php index e07438994..7833f0ca1 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/PropertyTypeFromStrictSetterGetterRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/PropertyTypeFromStrictSetterGetterRector.php @@ -31,29 +31,24 @@ final class PropertyTypeFromStrictSetterGetterRector extends AbstractRector impl { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\GetterTypeDeclarationPropertyTypeInferer */ - private $getterTypeDeclarationPropertyTypeInferer; + private GetterTypeDeclarationPropertyTypeInferer $getterTypeDeclarationPropertyTypeInferer; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\SetterTypeDeclarationPropertyTypeInferer */ - private $setterTypeDeclarationPropertyTypeInferer; + private SetterTypeDeclarationPropertyTypeInferer $setterTypeDeclarationPropertyTypeInferer; /** * @readonly - * @var \Rector\Php74\Guard\MakePropertyTypedGuard */ - private $makePropertyTypedGuard; + private MakePropertyTypedGuard $makePropertyTypedGuard; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(GetterTypeDeclarationPropertyTypeInferer $getterTypeDeclarationPropertyTypeInferer, SetterTypeDeclarationPropertyTypeInferer $setterTypeDeclarationPropertyTypeInferer, MakePropertyTypedGuard $makePropertyTypedGuard, ReflectionResolver $reflectionResolver, StaticTypeMapper $staticTypeMapper) { $this->getterTypeDeclarationPropertyTypeInferer = $getterTypeDeclarationPropertyTypeInferer; @@ -172,7 +167,12 @@ private function matchGetterSetterIdenticalType(Property $property, Class_ $clas } else { $getterBasedStrictTypes = [$getterBasedStrictType]; } - return new UnionType(\array_merge([$setterBasedStrictType], $getterBasedStrictTypes)); + if ($setterBasedStrictType instanceof UnionType) { + $setterBasedStrictTypes = $setterBasedStrictType->getTypes(); + } else { + $setterBasedStrictTypes = [$setterBasedStrictType]; + } + return new UnionType(\array_merge($setterBasedStrictTypes, $getterBasedStrictTypes)); } private function isDefaultExprTypeCompatible(Property $property, Type $getterSetterPropertyType) : bool { @@ -189,7 +189,7 @@ private function decorateDefaultExpr(Type $getterSetterPropertyType, Property $p { if (!TypeCombinator::containsNull($getterSetterPropertyType)) { if ($hasPropertyDefaultNull) { - // reset to nothign + // reset to nothing $property->props[0]->default = null; } return; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php index 2781e8fb8..29f3638fd 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php @@ -13,8 +13,9 @@ use PHPStan\Type\UnionType; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer; @@ -26,33 +27,28 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\Class_\ReturnTypeFromStrictTernaryRector\ReturnTypeFromStrictTernaryRectorTest */ -final class ReturnTypeFromStrictTernaryRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class ReturnTypeFromStrictTernaryRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer, BetterNodeFinder $betterNodeFinder, StaticTypeMapper $staticTypeMapper, ReturnAnalyzer $returnAnalyzer) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; @@ -93,8 +89,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->shouldSkip($node, $scope)) { return null; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php index 3e0f9f6e2..aee8073af 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromCreateMockAssignRector.php @@ -4,8 +4,10 @@ namespace Rector\TypeDeclaration\Rector\Class_; use PhpParser\Node; +use PhpParser\Node\IntersectionType; use PhpParser\Node\NullableType; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Property; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use Rector\Enum\ClassName; @@ -25,23 +27,16 @@ final class TypedPropertyFromCreateMockAssignRector extends AbstractRector imple { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer */ - private $assignToPropertyTypeInferer; + private AssignToPropertyTypeInferer $assignToPropertyTypeInferer; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; - /** - * @var string - */ - private const MOCK_OBJECT_CLASS = 'PHPUnit\\Framework\\MockObject\\MockObject'; + private ConstructorAssignDetector $constructorAssignDetector; public function __construct(AssignToPropertyTypeInferer $assignToPropertyTypeInferer, StaticTypeMapper $staticTypeMapper, ConstructorAssignDetector $constructorAssignDetector) { $this->assignToPropertyTypeInferer = $assignToPropertyTypeInferer; @@ -50,7 +45,7 @@ public function __construct(AssignToPropertyTypeInferer $assignToPropertyTypeInf } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Add typed property from assigned mock', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Add "PHPUnit\\Framework\\MockObject\\MockObject" typed property from assigned mock to clearly separate from real objects', [new CodeSample(<<<'CODE_SAMPLE' use PHPUnit\Framework\TestCase; final class SomeTest extends TestCase @@ -65,10 +60,11 @@ protected function setUp(): void CODE_SAMPLE , <<<'CODE_SAMPLE' use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\MockObject\MockObject; final class SomeTest extends TestCase { - private \PHPUnit\Framework\MockObject\MockObject $someProperty; + private MockObject $someProperty; protected function setUp(): void { @@ -91,12 +87,13 @@ public function refactor(Node $node) : ?Node return null; } $hasChanged = \false; + $mockObjectType = new ObjectType(ClassName::MOCK_OBJECT); foreach ($node->getProperties() as $property) { - // already typed - if ($property->type instanceof Node) { + if (\count($property->props) !== 1) { continue; } - if (\count($property->props) !== 1) { + // already use PHPUnit\Framework\MockObject\MockObject type + if ($this->isAlreadyTypedWithMockObject($property, $mockObjectType)) { continue; } $propertyName = (string) $this->getName($property); @@ -108,7 +105,7 @@ public function refactor(Node $node) : ?Node if (!$propertyType instanceof Node) { continue; } - if (!$this->isObjectType($propertyType, new ObjectType(self::MOCK_OBJECT_CLASS))) { + if (!$this->isObjectType($propertyType, $mockObjectType)) { continue; } if (!$this->constructorAssignDetector->isPropertyAssigned($node, $propertyName)) { @@ -129,4 +126,15 @@ public function provideMinPhpVersion() : int { return PhpVersionFeature::TYPED_PROPERTIES; } + private function isAlreadyTypedWithMockObject(Property $property, ObjectType $mockObjectType) : bool + { + if (!$property->type instanceof Node) { + return \false; + } + // complex type, used on purpose + if ($property->type instanceof IntersectionType) { + return \true; + } + return $this->isObjectType($property->type, $mockObjectType); + } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php index 675df860e..3081045b6 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/TypedPropertyFromJMSSerializerAttributeTypeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\TypeDeclaration\Rector\Class_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Identifier; @@ -24,6 +24,7 @@ use Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector; +use Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer; use Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\AllAssignNodePropertyTypeInferer; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -36,48 +37,36 @@ final class TypedPropertyFromJMSSerializerAttributeTypeRector extends AbstractRe { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\AllAssignNodePropertyTypeInferer */ - private $allAssignNodePropertyTypeInferer; + private AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer; /** * @readonly - * @var \Rector\Php74\Guard\MakePropertyTypedGuard */ - private $makePropertyTypedGuard; + private MakePropertyTypedGuard $makePropertyTypedGuard; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper */ - private $scalarStringToTypeMapper; + private ScalarStringToTypeMapper $scalarStringToTypeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; - /** - * @var string - */ - private const JMS_TYPE = 'JMS\\Serializer\\Annotation\\Type'; + private ConstructorAssignDetector $constructorAssignDetector; public function __construct(AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer, MakePropertyTypedGuard $makePropertyTypedGuard, ReflectionResolver $reflectionResolver, ValueResolver $valueResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, ScalarStringToTypeMapper $scalarStringToTypeMapper, StaticTypeMapper $staticTypeMapper, ConstructorAssignDetector $constructorAssignDetector) { $this->allAssignNodePropertyTypeInferer = $allAssignNodePropertyTypeInferer; @@ -132,7 +121,7 @@ public function refactor(Node $node) : ?Node if ($property->type instanceof Node) { continue; } - if (!$this->phpAttributeAnalyzer->hasPhpAttribute($property, self::JMS_TYPE)) { + if (!$this->phpAttributeAnalyzer->hasPhpAttribute($property, AssignToPropertyTypeInferer::JMS_TYPE)) { continue; } if (!$classReflection instanceof ClassReflection) { @@ -155,7 +144,7 @@ public function refactor(Node $node) : ?Node $typeValue = null; foreach ($property->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attr) { - if ($attr->name->toString() === self::JMS_TYPE) { + if ($attr->name->toString() === AssignToPropertyTypeInferer::JMS_TYPE) { $typeValue = $this->valueResolver->getValue($attr->args[0]->value); break; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureNeverReturnTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureNeverReturnTypeRector.php index 264def049..145811753 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureNeverReturnTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureNeverReturnTypeRector.php @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Expr\Closure; -use PHPStan\Analyser\Scope; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeManipulator\AddNeverReturnType; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -15,13 +15,12 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\Closure\AddClosureNeverReturnTypeRector\AddClosureNeverReturnTypeRectorTest */ -final class AddClosureNeverReturnTypeRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class AddClosureNeverReturnTypeRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeManipulator\AddNeverReturnType */ - private $addNeverReturnType; + private AddNeverReturnType $addNeverReturnType; public function __construct(AddNeverReturnType $addNeverReturnType) { $this->addNeverReturnType = $addNeverReturnType; @@ -50,8 +49,9 @@ public function getNodeTypes() : array /** * @param Closure $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); return $this->addNeverReturnType->add($node, $scope); } public function provideMinPhpVersion() : int diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureVoidReturnTypeWhereNoReturnRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureVoidReturnTypeWhereNoReturnRector.php index 21d5aaa87..bd8abc946 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureVoidReturnTypeWhereNoReturnRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/AddClosureVoidReturnTypeWhereNoReturnRector.php @@ -19,9 +19,8 @@ final class AddClosureVoidReturnTypeWhereNoReturnRector extends AbstractRector i { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SilentVoidResolver */ - private $silentVoidResolver; + private SilentVoidResolver $silentVoidResolver; public function __construct(SilentVoidResolver $silentVoidResolver) { $this->silentVoidResolver = $silentVoidResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/ClosureReturnTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/ClosureReturnTypeRector.php index 0da137c6d..d8ca65c3b 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/ClosureReturnTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Closure/ClosureReturnTypeRector.php @@ -21,14 +21,12 @@ final class ClosureReturnTypeRector extends AbstractRector implements MinPhpVers { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ReturnTypeInferer $returnTypeInferer, StaticTypeMapper $staticTypeMapper) { $this->returnTypeInferer = $returnTypeInferer; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php index 0a3a00366..89243ae39 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php @@ -9,32 +9,31 @@ use PhpParser\Node\Expr\Empty_; use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Name; -use PHPStan\Analyser\Scope; use PHPStan\Type\ObjectType; use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\TypeDeclaration\Rector\Empty_\EmptyOnNullableObjectToInstanceOfRector\EmptyOnNullableObjectToInstanceOfRectorTest */ -final class EmptyOnNullableObjectToInstanceOfRector extends AbstractScopeAwareRector +final class EmptyOnNullableObjectToInstanceOfRector extends AbstractRector { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(StaticTypeMapper $staticTypeMapper) { $this->staticTypeMapper = $staticTypeMapper; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change empty() on nullable object to instanceof check', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change `empty()` on nullable object to instanceof check', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run(?AnotherObject $anotherObject) @@ -73,7 +72,7 @@ public function getNodeTypes() : array * @param Empty_|BooleanNot $node * @return null|\PhpParser\Node\Expr\Instanceof_|\PhpParser\Node\Expr\BooleanNot */ - public function refactorWithScope(Node $node, Scope $scope) + public function refactor(Node $node) { if ($node instanceof BooleanNot) { if (!$node->expr instanceof Empty_) { @@ -88,6 +87,7 @@ public function refactorWithScope(Node $node, Scope $scope) if ($empty->expr instanceof ArrayDimFetch) { return null; } + $scope = ScopeFetcher::fetch($node); $exprType = $scope->getNativeType($empty->expr); if (!$exprType instanceof UnionType) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php index cfe783c86..052029768 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php @@ -29,19 +29,16 @@ final class InlineVarDocTagToAssertRector extends AbstractRector implements MinP { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\TypeDeclaration\PhpDocParser\TypeExpressionFromVarTagResolver */ - private $typeExpressionFromVarTagResolver; + private TypeExpressionFromVarTagResolver $typeExpressionFromVarTagResolver; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater, TypeExpressionFromVarTagResolver $typeExpressionFromVarTagResolver) { $this->phpDocInfoFactory = $phpDocInfoFactory; @@ -50,7 +47,7 @@ public function __construct(PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdate } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Convert inline @var tags to calls to assert()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Convert inline `@var` tags to calls to `assert()`', [new CodeSample(<<<'CODE_SAMPLE' /** @var Foo $foo */ $foo = createFoo(); CODE_SAMPLE diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FuncCall/AddArrowFunctionParamArrayWhereDimFetchRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FuncCall/AddArrowFunctionParamArrayWhereDimFetchRector.php new file mode 100644 index 000000000..0eaf108a5 --- /dev/null +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FuncCall/AddArrowFunctionParamArrayWhereDimFetchRector.php @@ -0,0 +1,80 @@ + 'John']]; + +$result = array_map(fn ($item) => $item['name'], $array); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +$array = [['name' => 'John']]; + +$result = array_map(fn (array $item) => $item['name'], $array); +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->isName($node, 'array_map')) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $firstArgExpr = $node->getArgs()[0]->value; + if (!$firstArgExpr instanceof ArrowFunction) { + return null; + } + $arrowFunction = $firstArgExpr; + $arrowFunctionParam = $arrowFunction->getParams()[0]; + // param is known already + if ($arrowFunctionParam->type instanceof Node) { + return null; + } + if (!$arrowFunction->expr instanceof ArrayDimFetch) { + return null; + } + $var = $arrowFunction->expr; + while ($var instanceof ArrayDimFetch) { + $var = $var->var; + } + if (!$this->nodeComparator->areNodesEqual($var, $arrowFunctionParam->var)) { + return null; + } + $arrowFunctionParam->type = new Identifier('array'); + return $node; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::SCALAR_TYPES; + } +} diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayMapRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayMapRector.php new file mode 100644 index 000000000..624d83e6a --- /dev/null +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayMapRector.php @@ -0,0 +1,176 @@ +typeComparator = $typeComparator; + $this->staticTypeMapper = $staticTypeMapper; + $this->reflectionResolver = $reflectionResolver; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Applies type hints to array_map closures', [new CodeSample(<<<'CODE_SAMPLE' +array_map(function ($value, $key): string { + return $value . $key; +}, $strings); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +array_map(function (string $value, int $key): bool { + return $value . $key; +}, $strings); +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?Node + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node, 'array_map')) { + return null; + } + $funcReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($node); + if (!$funcReflection instanceof NativeFunctionReflection) { + return null; + } + $args = $node->getArgs(); + if (!isset($args[0]) || !$args[0]->value instanceof Closure) { + return null; + } + /** @var ArrayType[] $types */ + $types = \array_filter(\array_map(function ($arg) : ?ArrayType { + if (!$arg instanceof Arg) { + return null; + } + $type = $this->getType($arg->value); + if ($type instanceof ArrayType) { + return $type; + } + return null; + }, \array_slice($node->args, 1))); + $values = []; + $keys = []; + foreach ($types as $type) { + $values[] = $type->getIterableValueType(); + $keys[] = $type->getIterableKeyType(); + } + foreach ($values as $value) { + if ($value instanceof MixedType) { + $values = []; + break; + } elseif ($value instanceof UnionType) { + $values = \array_merge($values, $value->getTypes()); + } + } + foreach ($keys as $key) { + if ($key instanceof MixedType) { + $keys = []; + break; + } elseif ($key instanceof UnionType) { + $keys = \array_merge($keys, $key->getTypes()); + } + } + $filter = fn(Type $type): bool => !$type instanceof UnionType; + $valueType = $this->combineTypes(\array_filter($values, $filter)); + $keyType = $this->combineTypes(\array_filter($keys, $filter)); + if (!$keyType instanceof Type && !$valueType instanceof Type) { + return null; + } + if ($this->updateClosureWithTypes($args[0]->value, $keyType, $valueType)) { + return $node; + } + return null; + } + private function updateClosureWithTypes(Closure $closure, ?Type $keyType, ?Type $valueType) : bool + { + $changes = \false; + $valueParam = $closure->params[0] ?? null; + $keyParam = $closure->params[1] ?? null; + if ($valueParam instanceof Param && $valueType instanceof Type && $this->refactorParameter($closure->params[0], $valueType)) { + $changes = \true; + } + if ($keyParam instanceof Param && $keyType instanceof Type && $this->refactorParameter($closure->params[1], $keyType)) { + return \true; + } + return $changes; + } + private function refactorParameter(Param $param, Type $type) : bool + { + // already set → no change + if ($param->type instanceof Node) { + return \false; + } + $paramTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::PARAM); + if (!$paramTypeNode instanceof Node) { + return \false; + } + $param->type = $paramTypeNode; + return \true; + } + /** + * @param Type[] $types + */ + private function combineTypes(array $types) : ?Type + { + if ($types === []) { + return null; + } + $types = \array_reduce($types, function (array $types, Type $type) : array { + foreach ($types as $previousType) { + if ($this->typeComparator->areTypesEqual($type, $previousType)) { + return $types; + } + } + $types[] = $type; + return $types; + }, []); + if (\count($types) === 1) { + return $types[0]; + } + return new UnionType(UnionTypeHelper::sortTypes($types)); + } +} diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayReduceRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayReduceRector.php new file mode 100644 index 000000000..41d2e2bf7 --- /dev/null +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayReduceRector.php @@ -0,0 +1,159 @@ +typeComparator = $typeComparator; + $this->staticTypeMapper = $staticTypeMapper; + $this->reflectionResolver = $reflectionResolver; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Applies type hints to array_map closures', [new CodeSample(<<<'CODE_SAMPLE' +array_reduce($strings, function ($carry, $value, $key): string { + return $carry . $value; +}, $initialString); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +array_reduce($strings, function (string $carry, string $value): string { + return $carry . $value; +}, $initialString); +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?Node + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node, 'array_reduce')) { + return null; + } + $funcReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($node); + if (!$funcReflection instanceof NativeFunctionReflection) { + return null; + } + $args = $node->getArgs(); + if (!isset($args[1]) || !$args[1]->value instanceof Closure) { + return null; + } + $closureType = $this->getType($args[1]->value); + if (!$closureType instanceof ClosureType) { + return null; + } + $carryType = $closureType->getReturnType(); + if (isset($args[2])) { + $carryType = $this->combineTypes([$this->getType($args[2]->value), $carryType]); + } + $type = $this->getType($args[0]->value); + $valueType = $type->getIterableValueType(); + if ($this->updateClosureWithTypes($args[1]->value, $valueType, $carryType)) { + return $node; + } + return null; + } + private function updateClosureWithTypes(Closure $closure, ?Type $valueType, ?Type $carryType) : bool + { + $changes = \false; + $carryParam = $closure->params[0] ?? null; + $valueParam = $closure->params[1] ?? null; + if ($valueParam instanceof Param && $valueType instanceof Type && $this->refactorParameter($valueParam, $valueType)) { + $changes = \true; + } + if ($carryParam instanceof Param && $carryType instanceof Type && $this->refactorParameter($carryParam, $carryType)) { + return \true; + } + return $changes; + } + private function refactorParameter(Param $param, Type $type) : bool + { + if ($type instanceof MixedType) { + return \false; + } + // already set → no change + if ($param->type instanceof Node) { + return \false; + } + $paramTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::PARAM); + if (!$paramTypeNode instanceof Node) { + return \false; + } + $param->type = $paramTypeNode; + return \true; + } + /** + * @param Type[] $types + */ + private function combineTypes(array $types) : ?Type + { + if ($types === []) { + return null; + } + $types = \array_reduce($types, function (array $types, Type $type) : array { + foreach ($types as $previousType) { + if ($this->typeComparator->areTypesEqual($type, $previousType)) { + return $types; + } + } + $types[] = $type; + return $types; + }, []); + if (\count($types) === 1) { + return $types[0]; + } + foreach ($types as $type) { + if ($type instanceof UnionType) { + foreach ($type->getTypes() as $unionedType) { + if ($unionedType instanceof IntersectionType) { + return null; + } + } + } + } + return new UnionType(UnionTypeHelper::sortTypes($types)); + } +} diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php index a27e1808a..efa96d81f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php @@ -27,7 +27,7 @@ use Rector\TypeDeclaration\ValueObject\AddClosureParamTypeFromArg; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddClosureParamTypeFromArgRector\AddClosureParamTypeFromArgRectorTest */ @@ -35,19 +35,16 @@ final class AddClosureParamTypeFromArgRector extends AbstractRector implements C { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var int */ @@ -55,7 +52,7 @@ final class AddClosureParamTypeFromArgRector extends AbstractRector implements C /** * @var AddClosureParamTypeFromArg[] */ - private $addClosureParamTypeFromArgs = []; + private array $addClosureParamTypeFromArgs = []; public function __construct(TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper, ReflectionProvider $reflectionProvider) { $this->typeComparator = $typeComparator; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php index 751ed4352..8df1cc472 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php @@ -31,24 +31,20 @@ final class AddClosureParamTypeFromIterableMethodCallRector extends AbstractRect { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\Reflection\MethodReflectionResolver */ - private $methodReflectionResolver; + private MethodReflectionResolver $methodReflectionResolver; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\Utils\TypeUnwrapper */ - private $typeUnwrapper; + private TypeUnwrapper $typeUnwrapper; public function __construct(TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper, MethodReflectionResolver $methodReflectionResolver, TypeUnwrapper $typeUnwrapper) { $this->typeComparator = $typeComparator; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php index f1d2aaa6f..aac42747e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php @@ -22,7 +22,7 @@ use Rector\TypeDeclaration\ValueObject\AddClosureParamTypeFromObject; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddClosureParamTypeFromObjectRector\AddClosureParamTypeFromObjectRectorTest */ @@ -30,14 +30,12 @@ final class AddClosureParamTypeFromObjectRector extends AbstractRector implement { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var int */ @@ -45,7 +43,7 @@ final class AddClosureParamTypeFromObjectRector extends AbstractRector implement /** * @var AddClosureParamTypeFromObject[] */ - private $addClosureParamTypeFromObjects = []; + private array $addClosureParamTypeFromObjects = []; public function __construct(TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper) { $this->typeComparator = $typeComparator; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php index 84b721fd4..960657e44 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector.php @@ -23,7 +23,7 @@ use Rector\ValueObject\PhpVersionFeature; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector\AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRectorTest */ @@ -31,27 +31,21 @@ final class AddParamTypeForFunctionLikeWithinCallLikeArgDeclarationRector extend { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var AddParamTypeForFunctionLikeWithinCallLikeArgDeclaration[] */ - private $addParamTypeForFunctionLikeParamDeclarations = []; - /** - * @var bool - */ - private $hasChanged = \false; + private array $addParamTypeForFunctionLikeParamDeclarations = []; + private bool $hasChanged = \false; public function __construct(TypeComparator $typeComparator, PhpVersionProvider $phpVersionProvider, StaticTypeMapper $staticTypeMapper) { $this->typeComparator = $typeComparator; @@ -93,7 +87,7 @@ public function refactor(Node $node) : ?Node $type = null; break; } - if ($type === null) { + if (!$type instanceof Node) { continue; } if (!$this->isObjectType($type, $addParamTypeForFunctionLikeParamDeclaration->getObjectType())) { @@ -134,12 +128,12 @@ private function processFunctionLike(CallLike $callLike, AddParamTypeForFunction return; } // int positions shouldn't have names - if ($arg->name !== null) { + if ($arg->name instanceof Identifier) { return; } } else { $args = \array_filter($callLike->getArgs(), static function (Arg $arg) use($addParamTypeForFunctionLikeWithinCallLikeArgDeclaration) : bool { - if ($arg->name === null) { + if (!$arg->name instanceof Identifier) { return \false; } return $arg->name->name === $addParamTypeForFunctionLikeWithinCallLikeArgDeclaration->getCallLikePosition(); @@ -162,7 +156,7 @@ private function refactorParameter(Param $param, AddParamTypeForFunctionLikeWith { $newParameterType = $addParamTypeForFunctionLikeWithinCallLikeArgDeclaration->getParamType(); // already set → no change - if ($param->type !== null) { + if ($param->type instanceof Node) { $currentParamType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); if ($this->typeComparator->areTypesEqual($currentParamType, $newParameterType)) { return; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php index b29ac0188..820964bdb 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php @@ -23,14 +23,12 @@ final class AddParamTypeSplFixedArrayRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var array */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php index e21f959cd..101bb1dce 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php @@ -16,14 +16,14 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; -use PHPStan\Analyser\Scope; +use PhpParser\NodeVisitor; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedGenericObjectType; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; @@ -35,28 +35,24 @@ /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddReturnTypeDeclarationFromYieldsRector\AddReturnTypeDeclarationFromYieldsRectorTest */ -final class AddReturnTypeDeclarationFromYieldsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class AddReturnTypeDeclarationFromYieldsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ - private $classMethodReturnTypeOverrideGuard; + private ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard; public function __construct(TypeFactory $typeFactory, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, StaticTypeMapper $staticTypeMapper, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) { $this->typeFactory = $typeFactory; @@ -99,8 +95,9 @@ public function getNodeTypes() : array /** * @param Function_|ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); $yieldNodes = $this->findCurrentScopeYieldNodes($node); if ($yieldNodes === []) { return null; @@ -133,15 +130,15 @@ private function findCurrentScopeYieldNodes(FunctionLike $functionLike) : array $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $functionLike->getStmts(), static function (Node $node) use(&$yieldNodes) : ?int { // skip anonymous class and inner function if ($node instanceof Class_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } // skip nested scope if ($node instanceof FunctionLike) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($node instanceof Stmt && !$node instanceof Expression) { $yieldNodes = []; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if (!$node instanceof Yield_ && !$node instanceof YieldFrom) { return null; @@ -206,8 +203,8 @@ private function resolveClassName($functionLike) : string if ($returnTypeNode instanceof Identifier && $returnTypeNode->name === 'iterable') { return 'Iterator'; } - if ($returnTypeNode instanceof Name && !$this->nodeNameResolver->isName($returnTypeNode, 'Generator')) { - return $this->nodeNameResolver->getName($returnTypeNode); + if ($returnTypeNode instanceof Name && !$this->isName($returnTypeNode, 'Generator')) { + return $this->getName($returnTypeNode); } return 'Generator'; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Function_/AddFunctionVoidReturnTypeWhereNoReturnRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Function_/AddFunctionVoidReturnTypeWhereNoReturnRector.php index 19b9eb850..4d1c2d42e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Function_/AddFunctionVoidReturnTypeWhereNoReturnRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Function_/AddFunctionVoidReturnTypeWhereNoReturnRector.php @@ -19,9 +19,8 @@ final class AddFunctionVoidReturnTypeWhereNoReturnRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SilentVoidResolver */ - private $silentVoidResolver; + private SilentVoidResolver $silentVoidResolver; public function __construct(SilentVoidResolver $silentVoidResolver) { $this->silentVoidResolver = $silentVoidResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php index a556d165a..d8cb8e4f8 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php @@ -5,32 +5,31 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Property; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\StringType; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Exception\ShouldNotHappenException; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\TypeDeclaration\ValueObject\AddPropertyTypeDeclaration; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\Property\AddPropertyTypeDeclarationRector\AddPropertyTypeDeclarationRectorTest */ -final class AddPropertyTypeDeclarationRector extends AbstractScopeAwareRector implements ConfigurableRectorInterface +final class AddPropertyTypeDeclarationRector extends AbstractRector implements ConfigurableRectorInterface { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @var AddPropertyTypeDeclaration[] */ - private $addPropertyTypeDeclarations = []; + private array $addPropertyTypeDeclarations = []; public function __construct(StaticTypeMapper $staticTypeMapper) { $this->staticTypeMapper = $staticTypeMapper; @@ -61,8 +60,9 @@ public function getNodeTypes() : array /** * @param Property $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); // type is already known if ($node->type !== null) { return null; @@ -101,6 +101,6 @@ private function isClassReflectionType(ClassReflection $classReflection, string if ($classReflection->hasTraitUse($type)) { return \true; } - return $classReflection->isSubclassOf($type); + return $classReflection->is($type); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php index ef501e75b..f49266cdc 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php @@ -39,49 +39,40 @@ final class TypedPropertyFromAssignsRector extends AbstractRector implements Min { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\AllAssignNodePropertyTypeInferer */ - private $allAssignNodePropertyTypeInferer; + private AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer; /** * @readonly - * @var \Rector\TypeDeclaration\NodeTypeAnalyzer\PropertyTypeDecorator */ - private $propertyTypeDecorator; + private PropertyTypeDecorator $propertyTypeDecorator; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ - private $varTagRemover; + private VarTagRemover $varTagRemover; /** * @readonly - * @var \Rector\Php74\Guard\MakePropertyTypedGuard */ - private $makePropertyTypedGuard; + private MakePropertyTypedGuard $makePropertyTypedGuard; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttrinationFinder */ - private $attrinationFinder; + private AttrinationFinder $attrinationFinder; /** * @api * @var string @@ -94,9 +85,8 @@ final class TypedPropertyFromAssignsRector extends AbstractRector implements Min * - protected modifier property on final class without extends or has extends but property and/or its usage only in current class * * Set to true will allow change other modifiers as well as far as not forbidden, eg: callable type, null type, etc. - * @var bool */ - private $inlinePublic = \false; + private bool $inlinePublic = \false; public function __construct(AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer, PropertyTypeDecorator $propertyTypeDecorator, VarTagRemover $varTagRemover, MakePropertyTypedGuard $makePropertyTypedGuard, ReflectionResolver $reflectionResolver, PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver, StaticTypeMapper $staticTypeMapper, AttrinationFinder $attrinationFinder) { $this->allAssignNodePropertyTypeInferer = $allAssignNodePropertyTypeInferer; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php index 1c0b34af6..c195134c2 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php @@ -33,54 +33,44 @@ final class TypedPropertyFromStrictConstructorRector extends AbstractRector impl { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\TrustedClassMethodPropertyTypeInferer */ - private $trustedClassMethodPropertyTypeInferer; + private TrustedClassMethodPropertyTypeInferer $trustedClassMethodPropertyTypeInferer; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ - private $varTagRemover; + private VarTagRemover $varTagRemover; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; + private ConstructorAssignDetector $constructorAssignDetector; /** * @readonly - * @var \Rector\TypeDeclaration\Guard\PropertyTypeOverrideGuard */ - private $propertyTypeOverrideGuard; + private PropertyTypeOverrideGuard $propertyTypeOverrideGuard; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer */ - private $doctrineTypeAnalyzer; + private DoctrineTypeAnalyzer $doctrineTypeAnalyzer; /** * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\PropertyTypeDefaultValueAnalyzer */ - private $propertyTypeDefaultValueAnalyzer; + private PropertyTypeDefaultValueAnalyzer $propertyTypeDefaultValueAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(TrustedClassMethodPropertyTypeInferer $trustedClassMethodPropertyTypeInferer, VarTagRemover $varTagRemover, PhpDocTypeChanger $phpDocTypeChanger, ConstructorAssignDetector $constructorAssignDetector, PropertyTypeOverrideGuard $propertyTypeOverrideGuard, ReflectionResolver $reflectionResolver, DoctrineTypeAnalyzer $doctrineTypeAnalyzer, PropertyTypeDefaultValueAnalyzer $propertyTypeDefaultValueAnalyzer, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper) { $this->trustedClassMethodPropertyTypeInferer = $trustedClassMethodPropertyTypeInferer; @@ -164,7 +154,7 @@ public function refactor(Node $node) : ?Node continue; } $propertyProperty = $property->props[0]; - $propertyName = $this->nodeNameResolver->getName($property); + $propertyName = $this->getName($property); if ($this->constructorAssignDetector->isPropertyAssigned($node, $propertyName)) { $propertyProperty->default = null; $hasChanged = \true; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictSetUpRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictSetUpRector.php index 98cc969d2..e123da341 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictSetUpRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictSetUpRector.php @@ -12,6 +12,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\ValueObject\Type\FullyQualifiedIdentifierTypeNode; use Rector\Comments\NodeDocBlock\DocBlockUpdater; +use Rector\Enum\ClassName; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -28,24 +29,20 @@ final class TypedPropertyFromStrictSetUpRector extends AbstractRector implements { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\TrustedClassMethodPropertyTypeInferer */ - private $trustedClassMethodPropertyTypeInferer; + private TrustedClassMethodPropertyTypeInferer $trustedClassMethodPropertyTypeInferer; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(TrustedClassMethodPropertyTypeInferer $trustedClassMethodPropertyTypeInferer, StaticTypeMapper $staticTypeMapper, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) { $this->trustedClassMethodPropertyTypeInferer = $trustedClassMethodPropertyTypeInferer; @@ -114,11 +111,11 @@ public function refactor(Node $node) : ?Node if (!$propertyTypeNode instanceof Node) { continue; } - if ($propertyType instanceof ObjectType && $propertyType->getClassName() === 'PHPUnit\\Framework\\MockObject\\MockObject') { + if ($propertyType instanceof ObjectType && $propertyType->getClassName() === ClassName::MOCK_OBJECT) { $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); $varTag = $phpDocInfo->getVarTagValueNode(); $varType = $phpDocInfo->getVarType(); - if ($varTag instanceof VarTagValueNode && $varType instanceof ObjectType && $varType->getClassName() !== 'PHPUnit\\Framework\\MockObject\\MockObject') { + if ($varTag instanceof VarTagValueNode && $varType instanceof ObjectType && $varType->getClassName() !== ClassName::MOCK_OBJECT) { $varTag->type = new IntersectionTypeNode([new FullyQualifiedIdentifierTypeNode($propertyType->getClassName()), new FullyQualifiedIdentifierTypeNode($varType->getClassName())]); $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($property); } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php index 4665cd37d..2569ac098 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php @@ -4,37 +4,37 @@ namespace Rector\TypeDeclaration\Rector\StmtsAwareInterface; use PhpParser\Node; +use PhpParser\Node\DeclareItem; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Declare_; -use PhpParser\Node\Stmt\DeclareDeclare; -use PhpParser\Node\Stmt\InlineHTML; use PhpParser\Node\Stmt\Nop; use Rector\ChangesReporting\ValueObject\RectorWithLineChange; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Contract\Rector\HTMLAverseRectorInterface; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\Rector\AbstractRector; use Rector\TypeDeclaration\NodeAnalyzer\DeclareStrictTypeFinder; +use Rector\ValueObject\Application\File; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\TypeDeclaration\Rector\StmtsAwareInterface\DeclareStrictTypesRector\DeclareStrictTypesRectorTest */ -final class DeclareStrictTypesRector extends AbstractRector +final class DeclareStrictTypesRector extends AbstractRector implements HTMLAverseRectorInterface { /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\DeclareStrictTypeFinder */ - private $declareStrictTypeFinder; + private DeclareStrictTypeFinder $declareStrictTypeFinder; public function __construct(DeclareStrictTypeFinder $declareStrictTypeFinder) { $this->declareStrictTypeFinder = $declareStrictTypeFinder; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Add declare(strict_types=1) if missing', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Add `declare(strict_types=1)` if missing', [new CodeSample(<<<'CODE_SAMPLE' function someFunction() { } @@ -59,6 +59,9 @@ public function beforeTraverse(array $nodes) : ?array if ($this->skipper->shouldSkipElementAndFilePath(self::class, $filePath)) { return null; } + if ($this->startsWithShebang($this->file)) { + return null; + } if ($nodes === []) { return null; } @@ -69,9 +72,6 @@ public function beforeTraverse(array $nodes) : ?array if (!$currentStmt instanceof Stmt) { return null; } - if ($currentStmt instanceof InlineHTML) { - return null; - } $nodes = $rootStmt->stmts; $stmt = $currentStmt; } @@ -80,9 +80,9 @@ public function beforeTraverse(array $nodes) : ?array if ($this->declareStrictTypeFinder->hasDeclareStrictTypes($stmt)) { return null; } - $declareDeclare = new DeclareDeclare(new Identifier('strict_types'), new LNumber(1)); - $strictTypesDeclare = new Declare_([$declareDeclare]); - $rectorWithLineChange = new RectorWithLineChange(self::class, $stmt->getLine()); + $declareItem = new DeclareItem(new Identifier('strict_types'), new Int_(1)); + $strictTypesDeclare = new Declare_([$declareItem]); + $rectorWithLineChange = new RectorWithLineChange(self::class, $stmt->getStartLine()); $this->file->addRectorClassWithLine($rectorWithLineChange); if ($rootStmt instanceof FileWithoutNamespace) { /** @var Stmt[] $nodes */ @@ -103,7 +103,11 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - // workaroudn, as Rector now only hooks to specific nodes, not arrays + // workaround, as Rector now only hooks to specific nodes, not arrays return null; } + private function startsWithShebang(File $file) : bool + { + return \strncmp($file->getFileContent(), '#!', \strlen('#!')) === 0; + } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php index 02b5ef8b6..ff6a77b7f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php @@ -4,11 +4,11 @@ namespace Rector\TypeDeclaration\Rector\StmtsAwareInterface; use PhpParser\Node; +use PhpParser\Node\DeclareItem; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Declare_; -use PhpParser\Node\Stmt\DeclareDeclare; use PhpParser\Node\Stmt\Nop; use Rector\ChangesReporting\ValueObject\RectorWithLineChange; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; @@ -18,7 +18,7 @@ use Rector\TypeDeclaration\NodeAnalyzer\DeclareStrictTypeFinder; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\TypeDeclaration\Rector\StmtsAwareInterface\IncreaseDeclareStrictTypesRector\IncreaseDeclareStrictTypesRectorTest */ @@ -26,18 +26,11 @@ final class IncreaseDeclareStrictTypesRector extends AbstractRector implements C { /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\DeclareStrictTypeFinder */ - private $declareStrictTypeFinder; + private DeclareStrictTypeFinder $declareStrictTypeFinder; private const LIMIT = 'limit'; - /** - * @var int - */ - private $limit = 10; - /** - * @var int - */ - private $changedItemCount = 0; + private int $limit = 10; + private int $changedItemCount = 0; public function __construct(DeclareStrictTypeFinder $declareStrictTypeFinder) { $this->declareStrictTypeFinder = $declareStrictTypeFinder; @@ -77,13 +70,13 @@ public function beforeTraverse(array $nodes) : ?array if ($this->declareStrictTypeFinder->hasDeclareStrictTypes($stmt)) { return null; } - // keep change withing a limit + // keep change within a limit if ($this->changedItemCount >= $this->limit) { return null; } ++$this->changedItemCount; $strictTypesDeclare = $this->creteStrictTypesDeclare(); - $rectorWithLineChange = new RectorWithLineChange(self::class, $stmt->getLine()); + $rectorWithLineChange = new RectorWithLineChange(self::class, $stmt->getStartLine()); $this->file->addRectorClassWithLine($rectorWithLineChange); return \array_merge([$strictTypesDeclare, new Nop()], $nodes); } @@ -109,7 +102,7 @@ public function configure(array $configuration) : void } private function creteStrictTypesDeclare() : Declare_ { - $declareDeclare = new DeclareDeclare(new Identifier('strict_types'), new LNumber(1)); - return new Declare_([$declareDeclare]); + $declareItem = new DeclareItem(new Identifier('strict_types'), new Int_(1)); + return new Declare_([$declareItem]); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php index 7da22284b..7c84c1acd 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Name\FullyQualified; @@ -24,14 +25,12 @@ final class WhileNullableToInstanceofRector extends AbstractRector { /** * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer */ - private $nullableTypeAnalyzer; + private NullableTypeAnalyzer $nullableTypeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(NullableTypeAnalyzer $nullableTypeAnalyzer, ValueResolver $valueResolver) { $this->nullableTypeAnalyzer = $nullableTypeAnalyzer; @@ -75,6 +74,9 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { + if ($node->cond instanceof Assign) { + return null; + } if ($node->cond instanceof NotIdentical) { return $this->refactorNotIdentical($node, $node->cond); } diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php index ebaa18fbf..b0982e6da 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php @@ -11,9 +11,8 @@ final class NullableTypeAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/PropertyTypeDefaultValueAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/PropertyTypeDefaultValueAnalyzer.php index 861fea028..2dc05eea1 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/PropertyTypeDefaultValueAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/PropertyTypeDefaultValueAnalyzer.php @@ -4,29 +4,27 @@ namespace Rector\TypeDeclaration\TypeAnalyzer; use PhpParser\Node\Expr; -use PhpParser\Node\Stmt\PropertyProperty; -use PHPStan\Type\ArrayType; +use PhpParser\Node\PropertyItem; use PHPStan\Type\Type; use Rector\StaticTypeMapper\StaticTypeMapper; final class PropertyTypeDefaultValueAnalyzer { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(StaticTypeMapper $staticTypeMapper) { $this->staticTypeMapper = $staticTypeMapper; } - public function doesConflictWithDefaultValue(PropertyProperty $propertyProperty, Type $propertyType) : bool + public function doesConflictWithDefaultValue(PropertyItem $propertyItem, Type $propertyType) : bool { - if (!$propertyProperty->default instanceof Expr) { + if (!$propertyItem->default instanceof Expr) { return \false; } // the defaults can be in conflict - $defaultType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($propertyProperty->default); - if ($defaultType instanceof ArrayType && $propertyType instanceof ArrayType) { + $defaultType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($propertyItem->default); + if ($defaultType->isArray()->yes() && $propertyType->isArray()->yes()) { return \false; } // type is not matching, skip it diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php index 0cc79cacf..d598bfef8 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php @@ -14,15 +14,15 @@ use PhpParser\Node\Name; use PhpParser\Node\NullableType; use PhpParser\Node\Scalar; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Return_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; +use PHPStan\Reflection\ExtendedParametersAcceptor; use PHPStan\Reflection\Native\NativeFunctionReflection; use PHPStan\Reflection\Native\NativeMethodReflection; -use PHPStan\Reflection\ParametersAcceptorWithPhpDocs; use PHPStan\Type\MixedType; use PHPStan\Type\StaticType; use PHPStan\Type\Type; @@ -38,19 +38,16 @@ final class ReturnStrictTypeAnalyzer { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\TypeNodeUnwrapper */ - private $typeNodeUnwrapper; + private TypeNodeUnwrapper $typeNodeUnwrapper; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ReflectionResolver $reflectionResolver, TypeNodeUnwrapper $typeNodeUnwrapper, StaticTypeMapper $staticTypeMapper) { $this->reflectionResolver = $reflectionResolver; @@ -75,7 +72,7 @@ public function collectStrictReturnTypes(array $returns, Scope $scope) : array $returnNode = $this->resolveMethodCallReturnNode($returnedExpr); } elseif ($returnedExpr instanceof ClassConstFetch) { $returnNode = $this->resolveConstFetchReturnNode($returnedExpr, $scope); - } elseif ($returnedExpr instanceof Array_ || $returnedExpr instanceof String_ || $returnedExpr instanceof LNumber || $returnedExpr instanceof DNumber) { + } elseif ($returnedExpr instanceof Array_ || $returnedExpr instanceof String_ || $returnedExpr instanceof Int_ || $returnedExpr instanceof Float_) { $returnNode = $this->resolveLiteralReturnNode($returnedExpr, $scope); } else { return []; @@ -120,7 +117,7 @@ public function resolveMethodCallReturnType($call) : ?Type $parametersAcceptorWithPhpDocs = ParametersAcceptorSelectorVariantsWrapper::select($methodReflection, $call, $scope); if ($methodReflection instanceof NativeFunctionReflection || $methodReflection instanceof NativeMethodReflection) { $returnType = $parametersAcceptorWithPhpDocs->getReturnType(); - } elseif ($parametersAcceptorWithPhpDocs instanceof ParametersAcceptorWithPhpDocs) { + } elseif ($parametersAcceptorWithPhpDocs instanceof ExtendedParametersAcceptor) { // native return type is needed, as docblock can be false $returnType = $parametersAcceptorWithPhpDocs->getNativeReturnType(); } else { diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/AssignToPropertyTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/AssignToPropertyTypeInferer.php index 1f7f2e46b..433fb122e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/AssignToPropertyTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/AssignToPropertyTypeInferer.php @@ -12,7 +12,7 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Property; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; use PHPStan\Type\NullType; @@ -21,6 +21,7 @@ use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; +use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector; @@ -34,55 +35,53 @@ final class AssignToPropertyTypeInferer { /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; + private ConstructorAssignDetector $constructorAssignDetector; /** * @readonly - * @var \Rector\TypeDeclaration\Matcher\PropertyAssignMatcher */ - private $propertyAssignMatcher; + private PropertyAssignMatcher $propertyAssignMatcher; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\PropertyDefaultAssignDetector */ - private $propertyDefaultAssignDetector; + private PropertyDefaultAssignDetector $propertyDefaultAssignDetector; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\NullTypeAssignDetector */ - private $nullTypeAssignDetector; + private NullTypeAssignDetector $nullTypeAssignDetector; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; - public function __construct(ConstructorAssignDetector $constructorAssignDetector, PropertyAssignMatcher $propertyAssignMatcher, PropertyDefaultAssignDetector $propertyDefaultAssignDetector, NullTypeAssignDetector $nullTypeAssignDetector, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, TypeFactory $typeFactory, NodeTypeResolver $nodeTypeResolver, ExprAnalyzer $exprAnalyzer, ValueResolver $valueResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer) + private PropertyFetchAnalyzer $propertyFetchAnalyzer; + /** + * @readonly + */ + private PhpAttributeAnalyzer $phpAttributeAnalyzer; + /** + * @var string + */ + public const JMS_TYPE = 'JMS\\Serializer\\Annotation\\Type'; + public function __construct(ConstructorAssignDetector $constructorAssignDetector, PropertyAssignMatcher $propertyAssignMatcher, PropertyDefaultAssignDetector $propertyDefaultAssignDetector, NullTypeAssignDetector $nullTypeAssignDetector, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, TypeFactory $typeFactory, NodeTypeResolver $nodeTypeResolver, ExprAnalyzer $exprAnalyzer, ValueResolver $valueResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer) { $this->constructorAssignDetector = $constructorAssignDetector; $this->propertyAssignMatcher = $propertyAssignMatcher; @@ -94,13 +93,14 @@ public function __construct(ConstructorAssignDetector $constructorAssignDetector $this->exprAnalyzer = $exprAnalyzer; $this->valueResolver = $valueResolver; $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; + $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; } public function inferPropertyInClassLike(Property $property, string $propertyName, ClassLike $classLike) : ?Type { if ($this->hasAssignDynamicPropertyValue($classLike, $propertyName)) { return null; } - $assignedExprTypes = $this->getAssignedExprTypes($classLike, $propertyName); + $assignedExprTypes = $this->getAssignedExprTypes($classLike, $property, $propertyName); if ($this->shouldAddNullType($classLike, $propertyName, $assignedExprTypes)) { $assignedExprTypes[] = new NullType(); } @@ -185,7 +185,7 @@ private function hasAssignDynamicPropertyValue(ClassLike $classLike, string $pro $assignVar = $node->var; if (!$assignVar->name instanceof Identifier) { $hasAssignDynamicPropertyValue = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; } @@ -196,10 +196,11 @@ private function hasAssignDynamicPropertyValue(ClassLike $classLike, string $pro /** * @return array */ - private function getAssignedExprTypes(ClassLike $classLike, string $propertyName) : array + private function getAssignedExprTypes(ClassLike $classLike, Property $property, string $propertyName) : array { $assignedExprTypes = []; - $this->simpleCallableNodeTraverser->traverseNodesWithCallable($classLike->stmts, function (Node $node) use($propertyName, &$assignedExprTypes) : ?int { + $hasJmsType = $this->phpAttributeAnalyzer->hasPhpAttribute($property, self::JMS_TYPE); + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($classLike->stmts, function (Node $node) use($propertyName, &$assignedExprTypes, $hasJmsType) : ?int { if (!$node instanceof Assign) { return null; } @@ -208,8 +209,8 @@ private function getAssignedExprTypes(ClassLike $classLike, string $propertyName return null; } if ($this->exprAnalyzer->isNonTypedFromParam($node->expr)) { - $assignedExprTypes = []; - return NodeTraverser::STOP_TRAVERSAL; + $assignedExprTypes = $hasJmsType ? [] : [new MixedType()]; + return NodeVisitor::STOP_TRAVERSAL; } $assignedExprTypes[] = $this->resolveExprStaticTypeIncludingDimFetch($node); return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php index 519c3f249..ca04ee0fd 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php @@ -17,24 +17,20 @@ final class AllAssignNodePropertyTypeInferer { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer */ - private $assignToPropertyTypeInferer; + private AssignToPropertyTypeInferer $assignToPropertyTypeInferer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(AssignToPropertyTypeInferer $assignToPropertyTypeInferer, NodeNameResolver $nodeNameResolver, AstResolver $astResolver, BetterNodeFinder $betterNodeFinder) { $this->assignToPropertyTypeInferer = $assignToPropertyTypeInferer; @@ -46,9 +42,7 @@ public function inferProperty(Property $property, ClassReflection $classReflecti { if ($classReflection->getFileName() === $file->getFilePath()) { $className = $classReflection->getName(); - $classLike = $this->betterNodeFinder->findFirst($file->getNewStmts(), function (Node $node) use($className) : bool { - return $node instanceof ClassLike && $this->nodeNameResolver->isName($node, $className); - }); + $classLike = $this->betterNodeFinder->findFirst($file->getNewStmts(), fn(Node $node): bool => $node instanceof ClassLike && $this->nodeNameResolver->isName($node, $className)); } else { $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); } diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterTypeDeclarationPropertyTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterTypeDeclarationPropertyTypeInferer.php index 6c561d69c..f39152985 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterTypeDeclarationPropertyTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterTypeDeclarationPropertyTypeInferer.php @@ -14,19 +14,16 @@ final class GetterTypeDeclarationPropertyTypeInferer { /** * @readonly - * @var \Rector\TypeDeclaration\FunctionLikeReturnTypeResolver */ - private $functionLikeReturnTypeResolver; + private FunctionLikeReturnTypeResolver $functionLikeReturnTypeResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ClassMethodAndPropertyAnalyzer */ - private $classMethodAndPropertyAnalyzer; + private ClassMethodAndPropertyAnalyzer $classMethodAndPropertyAnalyzer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(FunctionLikeReturnTypeResolver $functionLikeReturnTypeResolver, ClassMethodAndPropertyAnalyzer $classMethodAndPropertyAnalyzer, NodeNameResolver $nodeNameResolver) { $this->functionLikeReturnTypeResolver = $functionLikeReturnTypeResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/SetterTypeDeclarationPropertyTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/SetterTypeDeclarationPropertyTypeInferer.php index 82751ec5e..d7ef8b1bd 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/SetterTypeDeclarationPropertyTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/SetterTypeDeclarationPropertyTypeInferer.php @@ -15,19 +15,16 @@ final class SetterTypeDeclarationPropertyTypeInferer { /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ClassMethodAndPropertyAnalyzer */ - private $classMethodAndPropertyAnalyzer; + private ClassMethodAndPropertyAnalyzer $classMethodAndPropertyAnalyzer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ClassMethodAndPropertyAnalyzer $classMethodAndPropertyAnalyzer, NodeNameResolver $nodeNameResolver, StaticTypeMapper $staticTypeMapper) { $this->classMethodAndPropertyAnalyzer = $classMethodAndPropertyAnalyzer; diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php index 3580addf4..6452275ca 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php @@ -13,7 +13,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; @@ -40,54 +40,44 @@ final class TrustedClassMethodPropertyTypeInferer { /** * @readonly - * @var \Rector\NodeManipulator\ClassMethodPropertyFetchManipulator */ - private $classMethodPropertyFetchManipulator; + private ClassMethodPropertyFetchManipulator $classMethodPropertyFetchManipulator; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer */ - private $assignToPropertyTypeInferer; + private AssignToPropertyTypeInferer $assignToPropertyTypeInferer; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; public function __construct(ClassMethodPropertyFetchManipulator $classMethodPropertyFetchManipulator, ReflectionProvider $reflectionProvider, NodeNameResolver $nodeNameResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, TypeFactory $typeFactory, StaticTypeMapper $staticTypeMapper, NodeTypeResolver $nodeTypeResolver, ParamAnalyzer $paramAnalyzer, AssignToPropertyTypeInferer $assignToPropertyTypeInferer, TypeComparator $typeComparator) { $this->classMethodPropertyFetchManipulator = $classMethodPropertyFetchManipulator; @@ -153,7 +143,7 @@ private function resolveFromParamType(Param $param, ClassMethod $classMethod, st } private function resolveParamTypeToPHPStanType(Param $param) : Type { - if ($param->type === null) { + if (!$param->type instanceof Node) { return new MixedType(); } if ($this->paramAnalyzer->isNullable($param)) { @@ -184,7 +174,7 @@ private function getResolveParamStaticTypeAsPHPStanType(ClassMethod $classMethod return null; } $paramStaticType = $this->nodeTypeResolver->getType($node); - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); return $paramStaticType; } @@ -195,7 +185,7 @@ private function isParamNullable(Param $param) : bool } if ($param->default instanceof Expr) { $defaultValueStaticType = $this->nodeTypeResolver->getType($param->default); - if ($defaultValueStaticType instanceof NullType) { + if ($defaultValueStaticType->isNull()->yes()) { return \true; } } @@ -203,7 +193,7 @@ private function isParamNullable(Param $param) : bool } private function resolveFullyQualifiedOrAliasedObjectType(Param $param) : ?Type { - if ($param->type === null) { + if (!$param->type instanceof Node) { return null; } $fullyQualifiedName = $this->nodeNameResolver->getName($param->type); @@ -227,7 +217,7 @@ private function resolveFullyQualifiedOrAliasedObjectType(Param $param) : ?Type } private function resolveTypeFromParam(Param $param, ClassMethod $classMethod, string $propertyName, Property $property, Class_ $class) : Type { - if ($param->type === null) { + if (!$param->type instanceof Node) { return new MixedType(); } $resolvedType = $this->resolveFromParamType($param, $classMethod, $propertyName); diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php index 3b459b1ae..5ad5e8e6f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php @@ -9,7 +9,6 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer\ReturnedNodesReturnTypeInfererTypeInferer; -use Rector\TypeDeclaration\TypeNormalizer; /** * @internal */ @@ -17,17 +16,10 @@ final class ReturnTypeInferer { /** * @readonly - * @var \Rector\TypeDeclaration\TypeNormalizer */ - private $typeNormalizer; - /** - * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer\ReturnedNodesReturnTypeInfererTypeInferer - */ - private $returnedNodesReturnTypeInfererTypeInferer; - public function __construct(TypeNormalizer $typeNormalizer, ReturnedNodesReturnTypeInfererTypeInferer $returnedNodesReturnTypeInfererTypeInferer) + private ReturnedNodesReturnTypeInfererTypeInferer $returnedNodesReturnTypeInfererTypeInferer; + public function __construct(ReturnedNodesReturnTypeInfererTypeInferer $returnedNodesReturnTypeInfererTypeInferer) { - $this->typeNormalizer = $typeNormalizer; $this->returnedNodesReturnTypeInfererTypeInferer = $returnedNodesReturnTypeInfererTypeInferer; } /** @@ -39,6 +31,6 @@ public function inferFunctionLike($functionLike) : Type if ($originalType instanceof MixedType) { return new MixedType(); } - return $this->typeNormalizer->normalizeArrayTypeAndArrayNever($originalType); + return $originalType; } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php index 9e81c1fd9..f6d3f56f1 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php @@ -24,34 +24,28 @@ final class ReturnedNodesReturnTypeInfererTypeInferer { /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SilentVoidResolver */ - private $silentVoidResolver; + private SilentVoidResolver $silentVoidResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\SplArrayFixedTypeNarrower */ - private $splArrayFixedTypeNarrower; + private SplArrayFixedTypeNarrower $splArrayFixedTypeNarrower; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(SilentVoidResolver $silentVoidResolver, BetterNodeFinder $betterNodeFinder, NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory, SplArrayFixedTypeNarrower $splArrayFixedTypeNarrower, ReflectionResolver $reflectionResolver) { $this->silentVoidResolver = $silentVoidResolver; diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php index 1ab3fb983..1d89cb7ea 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\Exit_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Expr\Yield_; use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\FunctionLike; @@ -26,10 +27,9 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; -use PhpParser\Node\Stmt\Throw_; use PhpParser\Node\Stmt\TryCatch; use PhpParser\Node\Stmt\While_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ClassReflection; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Node\BetterNodeFinder; @@ -40,29 +40,24 @@ final class SilentVoidResolver { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\NeverFuncCallAnalyzer */ - private $neverFuncCallAnalyzer; + private NeverFuncCallAnalyzer $neverFuncCallAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(BetterNodeFinder $betterNodeFinder, ReflectionResolver $reflectionResolver, NeverFuncCallAnalyzer $neverFuncCallAnalyzer, ValueResolver $valueResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->betterNodeFinder = $betterNodeFinder; @@ -132,11 +127,11 @@ private function isFoundLoopControl($node) : bool $isFoundLoopControl = \false; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($node->stmts, static function (Node $subNode) use(&$isFoundLoopControl) { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Break_ || $subNode instanceof Continue_ || $subNode instanceof Goto_) { $isFoundLoopControl = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } }); return $isFoundLoopControl; @@ -195,9 +190,7 @@ private function isSwitchWithAlwaysReturnOrExit(Switch_ $switch) : bool return \false; } $casesWithReturnOrExitCount = $this->resolveReturnOrExitCount($switch); - $cases = \array_filter($switch->cases, static function (Case_ $case) : bool { - return $case->stmts !== []; - }); + $cases = \array_filter($switch->cases, static fn(Case_ $case): bool => $case->stmts !== []); // has same amount of first return or exit nodes as switches return \count($cases) === $casesWithReturnOrExitCount; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SplArrayFixedTypeNarrower.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SplArrayFixedTypeNarrower.php index 18b785038..30ba1aec0 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SplArrayFixedTypeNarrower.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/SplArrayFixedTypeNarrower.php @@ -6,7 +6,7 @@ use PHPStan\Type\Generic\GenericObjectType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; -use PHPStan\Type\TypeWithClassName; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class SplArrayFixedTypeNarrower { public function narrow(Type $paramType) : Type @@ -14,22 +14,23 @@ public function narrow(Type $paramType) : Type if ($paramType->isSuperTypeOf(new ObjectType('SplFixedArray'))->no()) { return $paramType; } - if (!$paramType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($paramType); + if ($className === null) { return $paramType; } if ($paramType instanceof GenericObjectType) { return $paramType; } $types = []; - if ($paramType->getClassName() === 'PhpCsFixer\\Tokenizer\\Tokens') { + if ($className === 'PhpCsFixer\\Tokenizer\\Tokens') { $types[] = new ObjectType('PhpCsFixer\\Tokenizer\\Token'); } - if ($paramType->getClassName() === 'PhpCsFixer\\Doctrine\\Annotation\\Tokens') { + if ($className === 'PhpCsFixer\\Doctrine\\Annotation\\Tokens') { $types[] = new ObjectType('PhpCsFixer\\Doctrine\\Annotation\\Token'); } if ($types === []) { return $paramType; } - return new GenericObjectType($paramType->getClassName(), $types); + return new GenericObjectType($className, $types); } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php deleted file mode 100644 index f07d6a0ba..000000000 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php +++ /dev/null @@ -1,117 +0,0 @@ -privatesAccessor = $privatesAccessor; - } - /** - * @api - * - * Turn nested array union types to unique ones: - * e.g. int[]|string[][]|bool[][]|string[][] - * ↓ - * int[]|string[][]|bool[][] - */ - public function normalizeArrayOfUnionToUnionArray(Type $type, int $arrayNesting = 1) : Type - { - if (!$type instanceof ArrayType) { - return $type; - } - if ($type instanceof ConstantArrayType && $arrayNesting === 1) { - return $type; - } - // first collection of types - if ($arrayNesting === 1) { - $this->collectedNestedArrayTypes = []; - } - if ($type->getItemType() instanceof ArrayType) { - ++$arrayNesting; - $this->normalizeArrayOfUnionToUnionArray($type->getItemType(), $arrayNesting); - } elseif ($type->getItemType() instanceof UnionType) { - $this->collectNestedArrayTypeFromUnionType($type->getItemType(), $arrayNesting); - } else { - $this->collectedNestedArrayTypes[] = new NestedArrayType($type->getItemType(), $arrayNesting, $type->getKeyType()); - } - return $this->createUnionedTypesFromArrayTypes($this->collectedNestedArrayTypes); - } - /** - * From "string[]|mixed[]" based on empty array to to "string[]" - */ - public function normalizeArrayTypeAndArrayNever(Type $type) : Type - { - return TypeTraverser::map($type, function (Type $traversedType, callable $traverserCallable) : Type { - if ($this->isConstantArrayNever($traversedType)) { - \assert($traversedType instanceof ConstantArrayType); - // not sure why, but with direct new node everything gets nulled to MixedType - $this->privatesAccessor->setPrivateProperty($traversedType, 'keyType', new MixedType()); - $this->privatesAccessor->setPrivateProperty($traversedType, 'itemType', new MixedType()); - return $traversedType; - } - if ($traversedType instanceof NeverType) { - return new MixedType(); - } - return $traverserCallable($traversedType, $traverserCallable); - }); - } - private function isConstantArrayNever(Type $type) : bool - { - return $type instanceof ConstantArrayType && $type->getKeyType() instanceof NeverType && $type->getItemType() instanceof NeverType; - } - private function collectNestedArrayTypeFromUnionType(UnionType $unionType, int $arrayNesting) : void - { - foreach ($unionType->getTypes() as $unionedType) { - if ($unionedType->isArray()->yes()) { - ++$arrayNesting; - $this->normalizeArrayOfUnionToUnionArray($unionedType, $arrayNesting); - } else { - $this->collectedNestedArrayTypes[] = new NestedArrayType($unionedType, $arrayNesting); - } - } - } - /** - * @param NestedArrayType[] $collectedNestedArrayTypes - * @return \PHPStan\Type\UnionType|\PHPStan\Type\ArrayType - */ - private function createUnionedTypesFromArrayTypes(array $collectedNestedArrayTypes) - { - $unionedTypes = []; - foreach ($collectedNestedArrayTypes as $collectedNestedArrayType) { - $arrayType = $collectedNestedArrayType->getType(); - for ($i = 0; $i < $collectedNestedArrayType->getArrayNestingLevel(); ++$i) { - $arrayType = new ArrayType($collectedNestedArrayType->getKeyType(), $arrayType); - } - /** @var ArrayType $arrayType */ - $unionedTypes[] = $arrayType; - } - if (\count($unionedTypes) > 1) { - return new UnionType($unionedTypes); - } - return $unionedTypes[0]; - } -} diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromArg.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromArg.php index b8ed12cbf..5dd941605 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromArg.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromArg.php @@ -9,24 +9,22 @@ final class AddClosureParamTypeFromArg { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @var int<0, max> * @readonly */ - private $callLikePosition; + private int $callLikePosition; /** * @var int<0, max> * @readonly */ - private $functionLikePosition; + private int $functionLikePosition; /** * @param int<0, max> $callLikePosition * @param int<0, max> $functionLikePosition diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromObject.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromObject.php index b9ad8b0f6..eae1bd67e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromObject.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromObject.php @@ -9,24 +9,22 @@ final class AddClosureParamTypeFromObject { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @var int<0, max> * @readonly */ - private $callLikePosition; + private int $callLikePosition; /** * @var int<0, max> * @readonly */ - private $functionLikePosition; + private int $functionLikePosition; /** * @param int<0, max> $callLikePosition * @param int<0, max> $functionLikePosition diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeDeclaration.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeDeclaration.php index d7aeef940..6a0c001ea 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeDeclaration.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeDeclaration.php @@ -10,24 +10,21 @@ final class AddParamTypeDeclaration { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @var int<0, max> * @readonly */ - private $position; + private int $position; /** * @readonly - * @var \PHPStan\Type\Type */ - private $paramType; + private Type $paramType; /** * @param int<0, max> $position */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeForFunctionLikeWithinCallLikeArgDeclaration.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeForFunctionLikeWithinCallLikeArgDeclaration.php index 82db11f60..c62788382 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeForFunctionLikeWithinCallLikeArgDeclaration.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddParamTypeForFunctionLikeWithinCallLikeArgDeclaration.php @@ -13,14 +13,12 @@ final class AddParamTypeForFunctionLikeWithinCallLikeArgDeclaration { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @var int<0, max>|string * @readonly @@ -30,12 +28,11 @@ final class AddParamTypeForFunctionLikeWithinCallLikeArgDeclaration * @var int<0, max> * @readonly */ - private $functionLikePosition; + private int $functionLikePosition; /** * @readonly - * @var \PHPStan\Type\Type */ - private $paramType; + private Type $paramType; /** * @param int<0, max>|string $callLikePosition * @param int<0, max> $functionLikePosition diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddPropertyTypeDeclaration.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddPropertyTypeDeclaration.php index 01f163704..d03f3490e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddPropertyTypeDeclaration.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddPropertyTypeDeclaration.php @@ -9,19 +9,16 @@ final class AddPropertyTypeDeclaration { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $propertyName; + private string $propertyName; /** * @readonly - * @var \PHPStan\Type\Type */ - private $type; + private Type $type; public function __construct(string $class, string $propertyName, Type $type) { $this->class = $class; diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddReturnTypeDeclaration.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddReturnTypeDeclaration.php index 00df440e5..01181f52c 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddReturnTypeDeclaration.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AddReturnTypeDeclaration.php @@ -13,19 +13,16 @@ final class AddReturnTypeDeclaration { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var \PHPStan\Type\Type */ - private $returnType; + private Type $returnType; public function __construct(string $class, string $method, Type $returnType) { $this->class = $class; diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AssignToVariable.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AssignToVariable.php index 7b0f71567..9cfb3a8e6 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AssignToVariable.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/AssignToVariable.php @@ -8,14 +8,12 @@ final class AssignToVariable { /** * @readonly - * @var string */ - private $variableName; + private string $variableName; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $assignedExpr; + private Expr $assignedExpr; public function __construct(string $variableName, Expr $assignedExpr) { $this->variableName = $variableName; diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/DataProviderNodes.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/DataProviderNodes.php index cffc4e58c..6c820689f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/DataProviderNodes.php +++ b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/DataProviderNodes.php @@ -8,10 +8,10 @@ final class DataProviderNodes { /** - * @var array + * @var array * @readonly */ - public $nodes; + public array $nodes; /** * @param array $nodes */ diff --git a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/NestedArrayType.php b/vendor/rector/rector/rules/TypeDeclaration/ValueObject/NestedArrayType.php deleted file mode 100644 index 67447090d..000000000 --- a/vendor/rector/rector/rules/TypeDeclaration/ValueObject/NestedArrayType.php +++ /dev/null @@ -1,46 +0,0 @@ -type = $type; - $this->arrayNestingLevel = $arrayNestingLevel; - $this->keyType = $keyType; - } - public function getType() : Type - { - return $this->type; - } - public function getArrayNestingLevel() : int - { - return $this->arrayNestingLevel; - } - public function getKeyType() : Type - { - if ($this->keyType instanceof Type) { - return $this->keyType; - } - return new MixedType(); - } -} diff --git a/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php b/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php index 93eaf29a4..4f66cec8c 100644 --- a/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php +++ b/vendor/rector/rector/rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php @@ -13,7 +13,7 @@ use Rector\Visibility\ValueObject\ChangeConstantVisibility; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Visibility\Rector\ClassConst\ChangeConstantVisibilityRector\ChangeConstantVisibilityRectorTest */ @@ -21,13 +21,12 @@ final class ChangeConstantVisibilityRector extends AbstractRector implements Con { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @var ChangeConstantVisibility[] */ - private $classConstantVisibilityChanges = []; + private array $classConstantVisibilityChanges = []; public function __construct(VisibilityManipulator $visibilityManipulator) { $this->visibilityManipulator = $visibilityManipulator; diff --git a/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php b/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php index 783bf83e3..012af0a81 100644 --- a/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php +++ b/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ChangeMethodVisibilityRector.php @@ -5,35 +5,33 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver; +use Rector\PHPStan\ScopeFetcher; use Rector\Privatization\NodeManipulator\VisibilityManipulator; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\Rector\AbstractRector; use Rector\ValueObject\Visibility; use Rector\Visibility\ValueObject\ChangeMethodVisibility; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Visibility\Rector\ClassMethod\ChangeMethodVisibilityRector\ChangeMethodVisibilityRectorTest */ -final class ChangeMethodVisibilityRector extends AbstractScopeAwareRector implements ConfigurableRectorInterface +final class ChangeMethodVisibilityRector extends AbstractRector implements ConfigurableRectorInterface { /** * @readonly - * @var \Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver */ - private $parentClassScopeResolver; + private ParentClassScopeResolver $parentClassScopeResolver; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @var ChangeMethodVisibility[] */ - private $methodVisibilities = []; + private array $methodVisibilities = []; public function __construct(ParentClassScopeResolver $parentClassScopeResolver, VisibilityManipulator $visibilityManipulator) { $this->parentClassScopeResolver = $parentClassScopeResolver; @@ -83,8 +81,9 @@ public function getNodeTypes() : array /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if ($this->methodVisibilities === []) { return null; } diff --git a/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ExplicitPublicClassMethodRector.php b/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ExplicitPublicClassMethodRector.php index 4ccd6e6e7..51f32ae29 100644 --- a/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ExplicitPublicClassMethodRector.php +++ b/vendor/rector/rector/rules/Visibility/Rector/ClassMethod/ExplicitPublicClassMethodRector.php @@ -16,9 +16,8 @@ final class ExplicitPublicClassMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; public function __construct(VisibilityManipulator $visibilityManipulator) { $this->visibilityManipulator = $visibilityManipulator; diff --git a/vendor/rector/rector/rules/Visibility/ValueObject/ChangeConstantVisibility.php b/vendor/rector/rector/rules/Visibility/ValueObject/ChangeConstantVisibility.php index 32d19dbb4..a99993dc7 100644 --- a/vendor/rector/rector/rules/Visibility/ValueObject/ChangeConstantVisibility.php +++ b/vendor/rector/rector/rules/Visibility/ValueObject/ChangeConstantVisibility.php @@ -9,19 +9,16 @@ final class ChangeConstantVisibility { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $constant; + private string $constant; /** * @readonly - * @var int */ - private $visibility; + private int $visibility; public function __construct(string $class, string $constant, int $visibility) { $this->class = $class; diff --git a/vendor/rector/rector/rules/Visibility/ValueObject/ChangeMethodVisibility.php b/vendor/rector/rector/rules/Visibility/ValueObject/ChangeMethodVisibility.php index 03f7b8e7d..c1cb529bc 100644 --- a/vendor/rector/rector/rules/Visibility/ValueObject/ChangeMethodVisibility.php +++ b/vendor/rector/rector/rules/Visibility/ValueObject/ChangeMethodVisibility.php @@ -8,19 +8,16 @@ final class ChangeMethodVisibility { /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; /** * @readonly - * @var int */ - private $visibility; + private int $visibility; public function __construct(string $class, string $method, int $visibility) { $this->class = $class; diff --git a/vendor/rector/rector/src/Application/ApplicationFileProcessor.php b/vendor/rector/rector/src/Application/ApplicationFileProcessor.php index 325c41b1e..6bd2e7017 100644 --- a/vendor/rector/rector/src/Application/ApplicationFileProcessor.php +++ b/vendor/rector/rector/src/Application/ApplicationFileProcessor.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Application; -use RectorPrefix202411\Nette\Utils\FileSystem as UtilsFileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem as UtilsFileSystem; use PHPStan\Parser\ParserErrorsException; use Rector\Application\Provider\CurrentFileProvider; use Rector\Caching\Detector\ChangedFilesDetector; @@ -21,64 +21,54 @@ use Rector\ValueObject\FileProcessResult; use Rector\ValueObject\ProcessResult; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202411\Symplify\EasyParallel\CpuCoreCountProvider; -use RectorPrefix202411\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; -use RectorPrefix202411\Symplify\EasyParallel\ScheduleFactory; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symplify\EasyParallel\CpuCoreCountProvider; +use RectorPrefix202506\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; +use RectorPrefix202506\Symplify\EasyParallel\ScheduleFactory; use Throwable; final class ApplicationFileProcessor { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @readonly - * @var \Rector\FileSystem\FilesFinder */ - private $filesFinder; + private FilesFinder $filesFinder; /** * @readonly - * @var \Rector\Parallel\Application\ParallelFileProcessor */ - private $parallelFileProcessor; + private ParallelFileProcessor $parallelFileProcessor; /** * @readonly - * @var \Symplify\EasyParallel\ScheduleFactory */ - private $scheduleFactory; + private ScheduleFactory $scheduleFactory; /** * @readonly - * @var \Symplify\EasyParallel\CpuCoreCountProvider */ - private $cpuCoreCountProvider; + private CpuCoreCountProvider $cpuCoreCountProvider; /** * @readonly - * @var \Rector\Caching\Detector\ChangedFilesDetector */ - private $changedFilesDetector; + private ChangedFilesDetector $changedFilesDetector; /** * @readonly - * @var \Rector\Application\Provider\CurrentFileProvider */ - private $currentFileProvider; + private CurrentFileProvider $currentFileProvider; /** * @readonly - * @var \Rector\Application\FileProcessor */ - private $fileProcessor; + private \Rector\Application\FileProcessor $fileProcessor; /** * @readonly - * @var \Rector\Util\ArrayParametersMerger */ - private $arrayParametersMerger; + private ArrayParametersMerger $arrayParametersMerger; /** * @readonly - * @var \Rector\Reporting\MissConfigurationReporter */ - private $missConfigurationReporter; + private MissConfigurationReporter $missConfigurationReporter; /** * @var string */ @@ -86,7 +76,7 @@ final class ApplicationFileProcessor /** * @var SystemError[] */ - private $systemErrors = []; + private array $systemErrors = []; public function __construct(SymfonyStyle $symfonyStyle, FilesFinder $filesFinder, ParallelFileProcessor $parallelFileProcessor, ScheduleFactory $scheduleFactory, CpuCoreCountProvider $cpuCoreCountProvider, ChangedFilesDetector $changedFilesDetector, CurrentFileProvider $currentFileProvider, \Rector\Application\FileProcessor $fileProcessor, ArrayParametersMerger $arrayParametersMerger, MissConfigurationReporter $missConfigurationReporter) { $this->symfonyStyle = $symfonyStyle; @@ -103,12 +93,12 @@ public function __construct(SymfonyStyle $symfonyStyle, FilesFinder $filesFinder public function run(Configuration $configuration, InputInterface $input) : ProcessResult { $filePaths = $this->filesFinder->findFilesInPaths($configuration->getPaths(), $configuration); - $this->missConfigurationReporter->reportVendorInPaths($filePaths); - $this->missConfigurationReporter->reportStartWithShortOpenTag(); // no files found if ($filePaths === []) { return new ProcessResult([], []); } + $this->missConfigurationReporter->reportVendorInPaths($filePaths); + $this->missConfigurationReporter->reportStartWithShortOpenTag(); $this->configureCustomErrorHandler(); /** * Mimic @see https://github.com/phpstan/phpstan-src/blob/ab154e1da54d42fec751e17a1199b3e07591e85e/src/Command/AnalyseApplication.php#L188C23-L244 diff --git a/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php b/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php index 313bcf179..3761fbfef 100644 --- a/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php +++ b/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php @@ -3,27 +3,34 @@ declare (strict_types=1); namespace Rector\Application; +use PhpParser\Modifiers; use PhpParser\Node; +use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; +use PhpParser\Node\Attribute; +use PhpParser\Node\AttributeGroup; +use PhpParser\Node\ClosureUse; +use PhpParser\Node\DeclareItem; use PhpParser\Node\Expr; -use PhpParser\Node\Expr\CallLike; +use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\FuncCall; -use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; -use PhpParser\Node\Expr\NullsafeMethodCall; -use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\FunctionLike; +use PhpParser\Node\Param; +use PhpParser\Node\PropertyItem; +use PhpParser\Node\StaticVar; use PhpParser\Node\Stmt; -use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Declare_; use PhpParser\Node\Stmt\Expression; -use PhpParser\Node\Stmt\Function_; -use PhpParser\Node\Stmt\If_; -use PhpParser\Node\Stmt\Switch_; -use PhpParser\Node\Stmt\TryCatch; +use PhpParser\Node\Stmt\Property; +use PhpParser\Node\Stmt\Static_; +use PhpParser\Node\Stmt\Use_; +use PhpParser\Node\UseItem; use PHPStan\Analyser\MutatingScope; use Rector\Exception\ShouldNotHappenException; use Rector\NodeAnalyzer\ScopeAnalyzer; use Rector\NodeTypeResolver\PHPStan\Scope\PHPStanNodeScopeResolver; +use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; /** * In case of changed node, we need to re-traverse the PHPStan Scope to make all the new nodes aware of what is going on. */ @@ -31,18 +38,21 @@ final class ChangedNodeScopeRefresher { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Scope\PHPStanNodeScopeResolver */ - private $phpStanNodeScopeResolver; + private PHPStanNodeScopeResolver $phpStanNodeScopeResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ScopeAnalyzer */ - private $scopeAnalyzer; - public function __construct(PHPStanNodeScopeResolver $phpStanNodeScopeResolver, ScopeAnalyzer $scopeAnalyzer) + private ScopeAnalyzer $scopeAnalyzer; + /** + * @readonly + */ + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; + public function __construct(PHPStanNodeScopeResolver $phpStanNodeScopeResolver, ScopeAnalyzer $scopeAnalyzer, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->phpStanNodeScopeResolver = $phpStanNodeScopeResolver; $this->scopeAnalyzer = $scopeAnalyzer; + $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; } public function refresh(Node $node, string $filePath, ?MutatingScope $mutatingScope) : void { @@ -54,32 +64,12 @@ public function refresh(Node $node, string $filePath, ?MutatingScope $mutatingSc $errorMessage = \sprintf('Node "%s" with is missing scope required for scope refresh', \get_class($node)); throw new ShouldNotHappenException($errorMessage); } + // reindex stmt_key already covered on StmtKeyNodeVisitor on next processNodes() + // so set flag $reIndexStmtKey to false to avoid double loop + \Rector\Application\NodeAttributeReIndexer::reIndexNodeAttributes($node, \false); $stmts = $this->resolveStmts($node); $this->phpStanNodeScopeResolver->processNodes($stmts, $filePath, $mutatingScope); } - public function reIndexNodeAttributes(Node $node) : void - { - if ($node instanceof FunctionLike) { - /** @var ClassMethod|Function_|Closure $node */ - $node->params = \array_values($node->params); - if ($node instanceof Closure) { - $node->uses = \array_values($node->uses); - } - } - if ($node instanceof CallLike) { - /** @var FuncCall|MethodCall|New_|NullsafeMethodCall|StaticCall $node */ - $node->args = \array_values($node->args); - } - if ($node instanceof If_) { - $node->elseifs = \array_values($node->elseifs); - } - if ($node instanceof TryCatch) { - $node->catches = \array_values($node->catches); - } - if ($node instanceof Switch_) { - $node->cases = \array_values($node->cases); - } - } /** * @return Stmt[] */ @@ -91,7 +81,60 @@ private function resolveStmts(Node $node) : array if ($node instanceof Expr) { return [new Expression($node)]; } + // moved from Expr/Stmt to directly under Node on PHPParser 5 + if ($node instanceof ArrayItem) { + return [new Expression(new Array_([$node]))]; + } + if ($node instanceof ClosureUse) { + $closure = new Closure(); + $closure->uses[] = $node; + return [new Expression($closure)]; + } + if ($node instanceof DeclareItem) { + return [new Declare_([$node])]; + } + if ($node instanceof PropertyItem) { + return [new Property(Modifiers::PUBLIC, [$node])]; + } + if ($node instanceof StaticVar) { + return [new Static_([$node])]; + } + if ($node instanceof UseItem) { + return [new Use_([$node])]; + } + if ($node instanceof Param) { + $closure = new Closure(); + $closure->params[] = $node; + return [new Expression($closure)]; + } + if ($node instanceof AttributeGroup) { + $class = new Class_(null); + $class->attrGroups[] = $node; + $this->setLineAttributesOnClass($class, $node); + return [$class]; + } + if ($node instanceof Attribute) { + $class = new Class_(null); + $class->attrGroups[] = new AttributeGroup([$node]); + $this->setLineAttributesOnClass($class, $node); + return [$class]; + } + if ($node instanceof Arg) { + $class = new Class_(null, [], ['startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine()]); + $new = new New_($class, [$node]); + return [new Expression($new)]; + } $errorMessage = \sprintf('Complete parent node of "%s" be a stmt.', \get_class($node)); throw new ShouldNotHappenException($errorMessage); } + /** + * @param \PhpParser\Node\Attribute|\PhpParser\Node\AttributeGroup $node + */ + private function setLineAttributesOnClass(Class_ $class, $node) : void + { + $this->simpleCallableNodeTraverser->traverseNodesWithCallable([$class], function (Node $subNode) use($node) : Node { + $subNode->setAttributes(['startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine()]); + return $subNode; + }); + } } diff --git a/vendor/rector/rector/src/Application/FileProcessor.php b/vendor/rector/rector/src/Application/FileProcessor.php index fc228d413..1177ffc23 100644 --- a/vendor/rector/rector/src/Application/FileProcessor.php +++ b/vendor/rector/rector/src/Application/FileProcessor.php @@ -3,8 +3,7 @@ declare (strict_types=1); namespace Rector\Application; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\FileSystem; use PHPStan\AnalysedCodeException; use PHPStan\Parser\ParserErrorsException; use Rector\Caching\Detector\ChangedFilesDetector; @@ -23,66 +22,50 @@ use Rector\ValueObject\Configuration; use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\FileProcessResult; -use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; use Throwable; final class FileProcessor { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @readonly - * @var \Rector\PhpParser\NodeTraverser\RectorNodeTraverser */ - private $rectorNodeTraverser; + private RectorNodeTraverser $rectorNodeTraverser; /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @readonly - * @var \Rector\ChangesReporting\ValueObjectFactory\FileDiffFactory */ - private $fileDiffFactory; + private FileDiffFactory $fileDiffFactory; /** * @readonly - * @var \Rector\Caching\Detector\ChangedFilesDetector */ - private $changedFilesDetector; + private ChangedFilesDetector $changedFilesDetector; /** * @readonly - * @var \Rector\ChangesReporting\ValueObjectFactory\ErrorFactory */ - private $errorFactory; + private ErrorFactory $errorFactory; /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; /** * @readonly - * @var \Rector\PostRector\Application\PostFileProcessor */ - private $postFileProcessor; + private PostFileProcessor $postFileProcessor; /** * @readonly - * @var \Rector\PhpParser\Parser\RectorParser */ - private $rectorParser; + private RectorParser $rectorParser; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator */ - private $nodeScopeAndMetadataDecorator; - /** - * @var string - * @see https://regex101.com/r/llm7XZ/1 - */ - private const OPEN_TAG_SPACED_REGEX = '#^[ \\t]+<\\?php#m'; + private NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator; public function __construct(BetterStandardPrinter $betterStandardPrinter, RectorNodeTraverser $rectorNodeTraverser, SymfonyStyle $symfonyStyle, FileDiffFactory $fileDiffFactory, ChangedFilesDetector $changedFilesDetector, ErrorFactory $errorFactory, FilePathHelper $filePathHelper, PostFileProcessor $postFileProcessor, RectorParser $rectorParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator) { $this->betterStandardPrinter = $betterStandardPrinter; @@ -106,31 +89,34 @@ public function processFile(File $file, Configuration $configuration) : FileProc } $fileHasChanged = \false; $filePath = $file->getFilePath(); - // 2. change nodes with Rectors - $rectorWithLineChanges = null; do { $file->changeHasChanged(\false); + // 1. change nodes with Rector Rules $newStmts = $this->rectorNodeTraverser->traverse($file->getNewStmts()); - // apply post rectors + // 2. apply post rectors $postNewStmts = $this->postFileProcessor->traverse($newStmts, $file); - // this is needed for new tokens added in "afterTraverse()" + // 3. this is needed for new tokens added in "afterTraverse()" $file->changeNewStmts($postNewStmts); - // 3. print to file or string + // 4. print to file or string // important to detect if file has changed $this->printFile($file, $configuration, $filePath); - $fileHasChangedInCurrentPass = $file->hasChanged(); - if ($fileHasChangedInCurrentPass) { - $file->setFileDiff($this->fileDiffFactory->createTempFileDiff($file)); - $rectorWithLineChanges = $file->getRectorWithLineChanges(); - $fileHasChanged = \true; + // no change in current iteration, stop + if (!$file->hasChanged()) { + break; } - } while ($fileHasChangedInCurrentPass); + $fileHasChanged = \true; + } while (\true); // 5. add as cacheable if not changed at all if (!$fileHasChanged) { - $this->changedFilesDetector->addCachableFile($filePath); + $this->changedFilesDetector->addCacheableFile($filePath); + } else { + // when changed, set final status changed to true + // to ensure it make sense to verify in next process when needed + $file->changeHasChanged(\true); } - if ($configuration->shouldShowDiffs() && $rectorWithLineChanges !== null) { - $currentFileDiff = $this->fileDiffFactory->createFileDiffWithLineChanges($file, $file->getOriginalFileContent(), $file->getFileContent(), $rectorWithLineChanges); + $rectorWithLineChanges = $file->getRectorWithLineChanges(); + if ($file->hasChanged() || $rectorWithLineChanges !== []) { + $currentFileDiff = $this->fileDiffFactory->createFileDiffWithLineChanges($configuration->shouldShowDiffs(), $file, $file->getOriginalFileContent(), $file->getFileContent(), $file->getRectorWithLineChanges()); $file->setFileDiff($currentFileDiff); } return new FileProcessResult([], $file->getFileDiff()); @@ -138,7 +124,11 @@ public function processFile(File $file, Configuration $configuration) : FileProc private function parseFileAndDecorateNodes(File $file) : ?SystemError { try { - $this->parseFileNodes($file); + try { + $this->parseFileNodes($file); + } catch (ParserErrorsException $exception) { + $this->parseFileNodes($file, \false); + } } catch (ShouldNotHappenException $shouldNotHappenException) { throw $shouldNotHappenException; } catch (AnalysedCodeException $analysedCodeException) { @@ -163,27 +153,6 @@ private function printFile(File $file, Configuration $configuration, string $fil { // only save to string first, no need to print to file when not needed $newContent = $this->betterStandardPrinter->printFormatPreserving($file->getNewStmts(), $file->getOldStmts(), $file->getOldTokens()); - /** - * When no diff applied, the PostRector may still change the content, that's why printing still needed - * On printing, the space may be wiped, these below check compare with original file content used to verify - * that no change actually needed - */ - if (!$file->getFileDiff() instanceof FileDiff) { - /** - * Handle new line or space before getOriginalFileContent()); - if ($ltrimOriginalFileContent === $newContent) { - return; - } - // handle space before hasChanged() based on new content $file->changeFileContent($newContent); if ($configuration->isDryRun()) { @@ -194,10 +163,10 @@ private function printFile(File $file, Configuration $configuration, string $fil } FileSystem::write($filePath, $newContent, null); } - private function parseFileNodes(File $file) : void + private function parseFileNodes(File $file, bool $forNewestSupportedVersion = \true) : void { // store tokens by original file content, so we don't have to print them right now - $stmtsAndTokens = $this->rectorParser->parseFileContentToStmtsAndTokens($file->getOriginalFileContent()); + $stmtsAndTokens = $this->rectorParser->parseFileContentToStmtsAndTokens($file->getOriginalFileContent(), $forNewestSupportedVersion); $oldStmts = $stmtsAndTokens->getStmts(); $oldTokens = $stmtsAndTokens->getTokens(); $newStmts = $this->nodeScopeAndMetadataDecorator->decorateNodesFromFile($file->getFilePath(), $oldStmts); diff --git a/vendor/rector/rector/src/Application/NodeAttributeReIndexer.php b/vendor/rector/rector/src/Application/NodeAttributeReIndexer.php new file mode 100644 index 000000000..3419556fb --- /dev/null +++ b/vendor/rector/rector/src/Application/NodeAttributeReIndexer.php @@ -0,0 +1,74 @@ +stmts === null) { + return null; + } + $node->stmts = \array_values($node->stmts); + // re-index stmt key under current node + foreach ($node->stmts as $key => $childStmt) { + $childStmt->setAttribute(AttributeKey::STMT_KEY, $key); + } + return $node; + } + public static function reIndexNodeAttributes(Node $node, bool $reIndexStmtKey = \true) : ?Node + { + if ($reIndexStmtKey) { + self::reIndexStmtKeyNodeAttributes($node); + } + if ($node instanceof If_) { + $node->elseifs = \array_values($node->elseifs); + return $node; + } + if ($node instanceof TryCatch) { + $node->catches = \array_values($node->catches); + return $node; + } + if ($node instanceof FunctionLike) { + /** @var ClassMethod|Function_|Closure $node */ + $node->params = \array_values($node->params); + if ($node instanceof Closure) { + $node->uses = \array_values($node->uses); + } + return $node; + } + if ($node instanceof CallLike) { + /** @var FuncCall|MethodCall|New_|NullsafeMethodCall|StaticCall $node */ + $node->args = \array_values($node->args); + return $node; + } + if ($node instanceof Switch_) { + $node->cases = \array_values($node->cases); + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/src/Application/Provider/CurrentFileProvider.php b/vendor/rector/rector/src/Application/Provider/CurrentFileProvider.php index 17536432d..1a97b9e33 100644 --- a/vendor/rector/rector/src/Application/Provider/CurrentFileProvider.php +++ b/vendor/rector/rector/src/Application/Provider/CurrentFileProvider.php @@ -9,10 +9,7 @@ */ final class CurrentFileProvider { - /** - * @var \Rector\ValueObject\Application\File|null - */ - private $file; + private ?File $file = null; public function setFile(File $file) : void { $this->file = $file; diff --git a/vendor/rector/rector/src/Application/VersionResolver.php b/vendor/rector/rector/src/Application/VersionResolver.php index 09b3d2333..d747a0bd3 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 = '1.2.10'; + public const PACKAGE_VERSION = '2.0.18'; /** * @api * @var string */ - public const RELEASE_DATE = '2024-11-08 14:55:18'; + public const RELEASE_DATE = '2025-06-10 19:22:47'; /** * @var int */ diff --git a/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php b/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php index 61477bc78..0c69c1c45 100644 --- a/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php +++ b/vendor/rector/rector/src/Autoloading/AdditionalAutoloader.php @@ -6,8 +6,8 @@ use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\StaticReflection\DynamicSourceLocatorDecorator; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * Should it pass autoload files/directories to PHPStan analyzer? */ @@ -15,9 +15,8 @@ final class AdditionalAutoloader { /** * @readonly - * @var \Rector\StaticReflection\DynamicSourceLocatorDecorator */ - private $dynamicSourceLocatorDecorator; + private DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator; public function __construct(DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator) { $this->dynamicSourceLocatorDecorator = $dynamicSourceLocatorDecorator; @@ -38,6 +37,8 @@ public function autoloadInput(InputInterface $input) : void public function autoloadPaths() : void { $autoloadPaths = SimpleParameterProvider::provideArrayParameter(Option::AUTOLOAD_PATHS); - $this->dynamicSourceLocatorDecorator->addPaths($autoloadPaths); + $autoloadPaths = $this->dynamicSourceLocatorDecorator->addPaths($autoloadPaths); + // set values of Option::AUTOLOAD_PATHS with transformed paths + SimpleParameterProvider::setParameter(Option::AUTOLOAD_PATHS, $autoloadPaths); } } diff --git a/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php b/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php index 3599bc676..5ed8f3511 100644 --- a/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php +++ b/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php @@ -9,7 +9,7 @@ use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SplFileInfo; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Autoloading\BootstrapFilesIncluderTest */ @@ -34,15 +34,14 @@ public function includeBootstrapFiles() : void } private function requireRectorStubs() : void { - /** @var false|string $stubsRectorDirectory */ $stubsRectorDirectory = \realpath(__DIR__ . '/../../stubs-rector'); if ($stubsRectorDirectory === \false) { return; } $dir = new RecursiveDirectoryIterator($stubsRectorDirectory, RecursiveDirectoryIterator::SKIP_DOTS); - /** @var SplFileInfo[] $stubs */ $stubs = new RecursiveIteratorIterator($dir); foreach ($stubs as $stub) { + /** @var SplFileInfo $stub */ require_once $stub->getRealPath(); } } diff --git a/vendor/rector/rector/src/BetterPhpDocParser/DataProvider/CurrentTokenIteratorProvider.php b/vendor/rector/rector/src/BetterPhpDocParser/DataProvider/CurrentTokenIteratorProvider.php index 80d849787..35ae3b8b7 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/DataProvider/CurrentTokenIteratorProvider.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/DataProvider/CurrentTokenIteratorProvider.php @@ -7,10 +7,7 @@ use Rector\Exception\ShouldNotHappenException; final class CurrentTokenIteratorProvider { - /** - * @var \Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator|null - */ - private $betterTokenIterator; + private ?BetterTokenIterator $betterTokenIterator = null; public function setBetterTokenIterator(BetterTokenIterator $betterTokenIterator) : void { $this->betterTokenIterator = $betterTokenIterator; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/DoctrineAnnotationTagValueNode.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/DoctrineAnnotationTagValueNode.php index 026c95842..6d919f4cf 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/DoctrineAnnotationTagValueNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/DoctrineAnnotationTagValueNode.php @@ -10,10 +10,7 @@ use Stringable; final class DoctrineAnnotationTagValueNode extends AbstractValuesAwareNode { - /** - * @var \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode - */ - public $identifierTypeNode; + public IdentifierTypeNode $identifierTypeNode; /** * @param ArrayItemNode[] $values */ diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/StringNode.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/StringNode.php index 9f34973c8..dfb68e975 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/StringNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDoc/StringNode.php @@ -10,10 +10,7 @@ use Stringable; final class StringNode implements PhpDocTagValueNode { - /** - * @var string - */ - public $value; + public string $value; use NodeAttributes; public function __construct(string $value) { diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php index 5bfa59413..c4b5d448e 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php @@ -41,47 +41,37 @@ final class PhpDocInfo { /** * @readonly - * @var \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode */ - private $phpDocNode; + private PhpDocNode $phpDocNode; /** * @readonly - * @var \Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator */ - private $betterTokenIterator; + private BetterTokenIterator $betterTokenIterator; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \PhpParser\Node */ - private $node; + private \PhpParser\Node $node; /** * @readonly - * @var \Rector\BetterPhpDocParser\Annotation\AnnotationNaming */ - private $annotationNaming; + private AnnotationNaming $annotationNaming; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocNodeFinder\PhpDocNodeByTypeFinder */ - private $phpDocNodeByTypeFinder; + private PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder; /** * @var array, string> */ private const TAGS_TYPES_TO_NAMES = [ReturnTagValueNode::class => '@return', ParamTagValueNode::class => '@param', VarTagValueNode::class => '@var', MethodTagValueNode::class => '@method', PropertyTagValueNode::class => '@property', ExtendsTagValueNode::class => '@extends', ImplementsTagValueNode::class => '@implements']; - /** - * @var bool - */ - private $isSingleLine = \false; + private bool $isSingleLine = \false; /** * @readonly - * @var \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode */ - private $originalPhpDocNode; + private PhpDocNode $originalPhpDocNode; public function __construct(PhpDocNode $phpDocNode, BetterTokenIterator $betterTokenIterator, StaticTypeMapper $staticTypeMapper, \PhpParser\Node $node, AnnotationNaming $annotationNaming, PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder) { $this->phpDocNode = $phpDocNode; @@ -138,9 +128,7 @@ public function getTagsByName(string $name) : array } $tags = $this->phpDocNode->getTags(); $name = $this->annotationNaming->normalizeName($name); - $tags = \array_filter($tags, static function (PhpDocTagNode $phpDocTagNode) use($name) : bool { - return $phpDocTagNode->name === $name; - }); + $tags = \array_filter($tags, static fn(PhpDocTagNode $phpDocTagNode): bool => $phpDocTagNode->name === $name); return \array_values($tags); } public function getParamType(string $name) : Type @@ -445,7 +433,7 @@ public function findByAnnotationClass(string $desiredClass) : array private function resolveNameForPhpDocTagValueNode(PhpDocTagValueNode $phpDocTagValueNode) : ?string { foreach (self::TAGS_TYPES_TO_NAMES as $tagValueNodeType => $name) { - /** @var class-string $tagValueNodeType */ + /** @var class-string $tagValueNodeType */ if ($phpDocTagValueNode instanceof $tagValueNodeType) { return $name; } diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php index 03aebdb67..b53f3f218 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php @@ -20,38 +20,32 @@ final class PhpDocInfoFactory { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocNodeMapper */ - private $phpDocNodeMapper; + private PhpDocNodeMapper $phpDocNodeMapper; /** * @readonly - * @var \PHPStan\PhpDocParser\Lexer\Lexer */ - private $lexer; + private Lexer $lexer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\BetterPhpDocParser */ - private $betterPhpDocParser; + private BetterPhpDocParser $betterPhpDocParser; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\Annotation\AnnotationNaming */ - private $annotationNaming; + private AnnotationNaming $annotationNaming; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocNodeFinder\PhpDocNodeByTypeFinder */ - private $phpDocNodeByTypeFinder; + private PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder; /** * @var array */ - private $phpDocInfosByObjectId = []; + private array $phpDocInfosByObjectId = []; public function __construct(PhpDocNodeMapper $phpDocNodeMapper, Lexer $lexer, BetterPhpDocParser $betterPhpDocParser, StaticTypeMapper $staticTypeMapper, AnnotationNaming $annotationNaming, PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder) { $this->phpDocNodeMapper = $phpDocNodeMapper; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/TokenIteratorFactory.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/TokenIteratorFactory.php index d06001ae4..62a06fcb5 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/TokenIteratorFactory.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocInfo/TokenIteratorFactory.php @@ -10,9 +10,8 @@ final class TokenIteratorFactory { /** * @readonly - * @var \PHPStan\PhpDocParser\Lexer\Lexer */ - private $lexer; + private Lexer $lexer; public function __construct(Lexer $lexer) { $this->lexer = $lexer; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php index 5af221efe..875ae2ba2 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocManipulator; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; @@ -17,14 +17,12 @@ final class PhpDocClassRenamer { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher */ - private $classAnnotationMatcher; + private ClassAnnotationMatcher $classAnnotationMatcher; /** * @readonly - * @var \Rector\Renaming\Collector\RenamedNameCollector */ - private $renamedNameCollector; + private RenamedNameCollector $renamedNameCollector; public function __construct(ClassAnnotationMatcher $classAnnotationMatcher, RenamedNameCollector $renamedNameCollector) { $this->classAnnotationMatcher = $classAnnotationMatcher; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php index 92f2d2b76..54f2d856f 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php @@ -34,29 +34,24 @@ final class PhpDocTypeChanger { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\TypeDeclaration\PhpDocParser\ParamPhpDocNodeFactory */ - private $paramPhpDocNodeFactory; + private ParamPhpDocNodeFactory $paramPhpDocNodeFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\Guard\NewPhpDocFromPHPStanTypeGuard */ - private $newPhpDocFromPHPStanTypeGuard; + private NewPhpDocFromPHPStanTypeGuard $newPhpDocFromPHPStanTypeGuard; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @var array> */ @@ -73,22 +68,22 @@ public function __construct(StaticTypeMapper $staticTypeMapper, TypeComparator $ $this->newPhpDocFromPHPStanTypeGuard = $newPhpDocFromPHPStanTypeGuard; $this->docBlockUpdater = $docBlockUpdater; } - public function changeVarType(Stmt $stmt, PhpDocInfo $phpDocInfo, Type $newType) : void + public function changeVarType(Stmt $stmt, PhpDocInfo $phpDocInfo, Type $newType) : bool { // better skip, could crash hard if ($phpDocInfo->hasInvalidTag('@var')) { - return; + return \false; } // make sure the tags are not identical, e.g imported class vs FQN class if ($this->typeComparator->areTypesEqual($phpDocInfo->getVarType(), $newType)) { - return; + return \false; } // prevent existing type override by mixed - if (!$phpDocInfo->getVarType() instanceof MixedType && $newType instanceof ConstantArrayType && $newType->getItemType() instanceof NeverType) { - return; + if (!$phpDocInfo->getVarType() instanceof MixedType && $newType instanceof ConstantArrayType && $newType->getIterableValueType() instanceof NeverType) { + return \false; } if (!$this->newPhpDocFromPHPStanTypeGuard->isLegal($newType)) { - return; + return \false; } // override existing type $newPHPStanPhpDocTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($newType); @@ -102,6 +97,7 @@ public function changeVarType(Stmt $stmt, PhpDocInfo $phpDocInfo, Type $newType) $phpDocInfo->addTagValueNode($varTagValueNode); } $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($stmt); + return \true; } public function changeReturnType(FunctionLike $functionLike, PhpDocInfo $phpDocInfo, Type $newType) : bool { diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php index cf71aff19..845884f1e 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeMapper.php @@ -10,7 +10,7 @@ use Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CloningPhpDocNodeVisitor; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\ParentConnectingPhpDocNodeVisitor; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\BetterPhpDocParser\PhpDocNodeMapperTest */ @@ -18,19 +18,17 @@ final class PhpDocNodeMapper { /** * @readonly - * @var \Rector\BetterPhpDocParser\DataProvider\CurrentTokenIteratorProvider */ - private $currentTokenIteratorProvider; + private CurrentTokenIteratorProvider $currentTokenIteratorProvider; /** * @var BasePhpDocNodeVisitorInterface[] * @readonly */ - private $phpDocNodeVisitors; + private array $phpDocNodeVisitors; /** * @readonly - * @var \Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser */ - private $phpDocNodeTraverser; + private PhpDocNodeTraverser $phpDocNodeTraverser; /** * @param BasePhpDocNodeVisitorInterface[] $phpDocNodeVisitors */ diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php index 3c7ced13d..e0ad30732 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php @@ -13,9 +13,8 @@ final class ArrayTypePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor impleme { /** * @readonly - * @var \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer */ - private $attributeMirrorer; + private AttributeMirrorer $attributeMirrorer; public function __construct(AttributeMirrorer $attributeMirrorer) { $this->attributeMirrorer = $attributeMirrorer; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php index 6a2995676..bb479b91b 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/CallableTypePhpDocNodeVisitor.php @@ -13,9 +13,8 @@ final class CallableTypePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor impl { /** * @readonly - * @var \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer */ - private $attributeMirrorer; + private AttributeMirrorer $attributeMirrorer; public function __construct(AttributeMirrorer $attributeMirrorer) { $this->attributeMirrorer = $attributeMirrorer; @@ -28,7 +27,7 @@ public function enterNode(Node $node) : ?Node if ($node instanceof SpacingAwareCallableTypeNode) { return null; } - $spacingAwareCallableTypeNode = new SpacingAwareCallableTypeNode($node->identifier, $node->parameters, $node->returnType); + $spacingAwareCallableTypeNode = new SpacingAwareCallableTypeNode($node->identifier, $node->parameters, $node->returnType, []); $this->attributeMirrorer->mirror($node, $spacingAwareCallableTypeNode); return $spacingAwareCallableTypeNode; } diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php index 204edcefe..f79017892 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/ChangedPhpDocNodeVisitor.php @@ -8,10 +8,7 @@ use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; final class ChangedPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor { - /** - * @var bool - */ - private $hasChanged = \false; + private bool $hasChanged = \false; public function beforeTraverse(Node $node) : void { $this->hasChanged = \false; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php index b790d8e86..c00112d5d 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/IntersectionTypeNodePhpDocNodeVisitor.php @@ -13,9 +13,8 @@ final class IntersectionTypeNodePhpDocNodeVisitor extends AbstractPhpDocNodeVisi { /** * @readonly - * @var \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer */ - private $attributeMirrorer; + private AttributeMirrorer $attributeMirrorer; public function __construct(AttributeMirrorer $attributeMirrorer) { $this->attributeMirrorer = $attributeMirrorer; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php index 6cc8f9f76..43834c974 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/TemplatePhpDocNodeVisitor.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor; +use PHPStan\PhpDocParser\Ast\Attribute; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; use PHPStan\PhpDocParser\Lexer\Lexer; @@ -11,22 +12,18 @@ use Rector\BetterPhpDocParser\DataProvider\CurrentTokenIteratorProvider; use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator; use Rector\BetterPhpDocParser\ValueObject\PhpDoc\SpacingAwareTemplateTagValueNode; -use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\BetterPhpDocParser\ValueObject\StartAndEnd; use Rector\Exception\ShouldNotHappenException; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; final class TemplatePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor implements BasePhpDocNodeVisitorInterface { /** * @readonly - * @var \Rector\BetterPhpDocParser\DataProvider\CurrentTokenIteratorProvider */ - private $currentTokenIteratorProvider; + private CurrentTokenIteratorProvider $currentTokenIteratorProvider; /** * @readonly - * @var \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer */ - private $attributeMirrorer; + private AttributeMirrorer $attributeMirrorer; public function __construct(CurrentTokenIteratorProvider $currentTokenIteratorProvider, AttributeMirrorer $attributeMirrorer) { $this->currentTokenIteratorProvider = $currentTokenIteratorProvider; @@ -41,18 +38,19 @@ public function enterNode(Node $node) : ?Node return null; } $betterTokenIterator = $this->currentTokenIteratorProvider->provide(); - $startAndEnd = $node->getAttribute(PhpDocAttributeKey::START_AND_END); - if (!$startAndEnd instanceof StartAndEnd) { + $startIndex = $node->getAttribute(Attribute::START_INDEX); + $endIndex = $node->getAttribute(Attribute::END_INDEX); + if ($startIndex === null || $endIndex === null) { throw new ShouldNotHappenException(); } - $prepositions = $this->resolvePreposition($betterTokenIterator, $startAndEnd); + $prepositions = $this->resolvePreposition($betterTokenIterator, $startIndex, $endIndex); $spacingAwareTemplateTagValueNode = new SpacingAwareTemplateTagValueNode($node->name, $node->bound, $node->description, $prepositions); $this->attributeMirrorer->mirror($node, $spacingAwareTemplateTagValueNode); return $spacingAwareTemplateTagValueNode; } - private function resolvePreposition(BetterTokenIterator $betterTokenIterator, StartAndEnd $startAndEnd) : string + private function resolvePreposition(BetterTokenIterator $betterTokenIterator, int $startIndex, int $endIndex) : string { - $partialTokens = $betterTokenIterator->partialTokens($startAndEnd->getStart(), $startAndEnd->getEnd()); + $partialTokens = $betterTokenIterator->partialTokens($startIndex, $endIndex); foreach ($partialTokens as $partialToken) { if ($partialToken[1] !== Lexer::TOKEN_IDENTIFIER) { continue; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php index 670814fe6..1b04a1523 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php @@ -18,14 +18,12 @@ final class UnionTypeNodePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor imp { /** * @readonly - * @var \Rector\BetterPhpDocParser\DataProvider\CurrentTokenIteratorProvider */ - private $currentTokenIteratorProvider; + private CurrentTokenIteratorProvider $currentTokenIteratorProvider; /** * @readonly - * @var \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer */ - private $attributeMirrorer; + private AttributeMirrorer $attributeMirrorer; public function __construct(CurrentTokenIteratorProvider $currentTokenIteratorProvider, AttributeMirrorer $attributeMirrorer) { $this->currentTokenIteratorProvider = $currentTokenIteratorProvider; @@ -39,9 +37,11 @@ public function enterNode(Node $node) : ?Node if ($node instanceof BracketsAwareUnionTypeNode) { return null; } - $startAndEnd = $this->resolveStardAndEnd($node); + $startAndEnd = $this->resolveStartAndEnd($node); if (!$startAndEnd instanceof StartAndEnd) { - return null; + $firstKey = \array_key_first($node->types); + $lastKey = \array_key_last($node->types); + $startAndEnd = new StartAndEnd($node->types[$firstKey]->getAttribute('startIndex'), $node->types[$lastKey]->getAttribute('endIndex')); } $betterTokenProvider = $this->currentTokenIteratorProvider->provide(); $isWrappedInCurlyBrackets = $this->isWrappedInCurlyBrackets($betterTokenProvider, $startAndEnd); @@ -58,7 +58,7 @@ private function isWrappedInCurlyBrackets(BetterTokenIterator $betterTokenProvid // there is no + 1, as end is right at the next token return $betterTokenProvider->isTokenTypeOnPosition(Lexer::TOKEN_CLOSE_PARENTHESES, $startAndEnd->getEnd()); } - private function resolveStardAndEnd(UnionTypeNode $unionTypeNode) : ?StartAndEnd + private function resolveStartAndEnd(UnionTypeNode $unionTypeNode) : ?StartAndEnd { $starAndEnd = $unionTypeNode->getAttribute(PhpDocAttributeKey::START_AND_END); if ($starAndEnd instanceof StartAndEnd) { diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ArrayItemClassNameDecorator.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ArrayItemClassNameDecorator.php index a21f3c3f5..bb1df03ab 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ArrayItemClassNameDecorator.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ArrayItemClassNameDecorator.php @@ -19,14 +19,12 @@ final class ArrayItemClassNameDecorator implements PhpDocNodeDecoratorInterface { /** * @readonly - * @var \Rector\StaticTypeMapper\Naming\NameScopeFactory */ - private $nameScopeFactory; + private NameScopeFactory $nameScopeFactory; /** * @readonly - * @var \Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser */ - private $phpDocNodeTraverser; + private PhpDocNodeTraverser $phpDocNodeTraverser; public function __construct(NameScopeFactory $nameScopeFactory, PhpDocNodeTraverser $phpDocNodeTraverser) { $this->nameScopeFactory = $nameScopeFactory; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php index 949ec9766..7493d0d7d 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocParser; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; @@ -13,9 +13,11 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode; use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\PhpDocParser\Parser\ConstExprParser; +use PHPStan\PhpDocParser\Parser\ParserException; use PHPStan\PhpDocParser\Parser\PhpDocParser; use PHPStan\PhpDocParser\Parser\TokenIterator; use PHPStan\PhpDocParser\Parser\TypeParser; +use PHPStan\PhpDocParser\ParserConfig; use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface; use Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory; use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator; @@ -30,19 +32,17 @@ final class BetterPhpDocParser extends PhpDocParser { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory */ - private $tokenIteratorFactory; + private TokenIteratorFactory $tokenIteratorFactory; /** * @var PhpDocNodeDecoratorInterface[] * @readonly */ - private $phpDocNodeDecorators; + private array $phpDocNodeDecorators; /** * @readonly - * @var \Rector\Util\Reflection\PrivatesAccessor */ - private $privatesAccessor; + private PrivatesAccessor $privatesAccessor; /** * @var string * @see https://regex101.com/r/JDzr0c/1 @@ -56,26 +56,18 @@ final class BetterPhpDocParser extends PhpDocParser /** * @param PhpDocNodeDecoratorInterface[] $phpDocNodeDecorators */ - public function __construct(TypeParser $typeParser, ConstExprParser $constExprParser, TokenIteratorFactory $tokenIteratorFactory, array $phpDocNodeDecorators, PrivatesAccessor $privatesAccessor) + public function __construct(ParserConfig $parserConfig, TypeParser $typeParser, ConstExprParser $constExprParser, TokenIteratorFactory $tokenIteratorFactory, array $phpDocNodeDecorators, PrivatesAccessor $privatesAccessor) { $this->tokenIteratorFactory = $tokenIteratorFactory; $this->phpDocNodeDecorators = $phpDocNodeDecorators; $this->privatesAccessor = $privatesAccessor; parent::__construct( + // ParserConfig + $parserConfig, // TypeParser $typeParser, // ConstExprParser - $constExprParser, - // requireWhitespaceBeforeDescription - \false, - // preserveTypeAliasesWithInvalidTypes - \false, - // usedAttributes - ['lines' => \true, 'indexes' => \true], - // parseDoctrineAnnotations - \false, - // textBetweenTagsBelongsToDescription, default to false, exists since 1.23.0 - \true + $constExprParser ); } public function parseWithNode(BetterTokenIterator $betterTokenIterator, Node $node) : PhpDocNode @@ -117,16 +109,12 @@ public function parseTagValue(TokenIterator $tokenIterator, string $tag) : PhpDo $phpDocTagValueNode = parent::parseTagValue($tokenIterator, $tag); $endPosition = $tokenIterator->currentPosition(); if ($isPrecededByHorizontalWhitespace && \property_exists($phpDocTagValueNode, 'description')) { - $phpDocTagValueNode->description = Strings::replace((string) $phpDocTagValueNode->description, self::NEW_LINE_REGEX, static function (array $match) : string { - return $match['new_line'] . ' * '; - }); + $phpDocTagValueNode->description = Strings::replace((string) $phpDocTagValueNode->description, self::NEW_LINE_REGEX, static fn(array $match): string => $match['new_line'] . ' * '); } $startAndEnd = new StartAndEnd($startPosition, $endPosition); $phpDocTagValueNode->setAttribute(PhpDocAttributeKey::START_AND_END, $startAndEnd); if ($phpDocTagValueNode instanceof GenericTagValueNode) { - $phpDocTagValueNode->value = Strings::replace($phpDocTagValueNode->value, self::MULTI_NEW_LINES_REGEX, static function (array $match) { - return $match['new_line']; - }); + $phpDocTagValueNode->value = Strings::replace($phpDocTagValueNode->value, self::MULTI_NEW_LINES_REGEX, static fn(array $match) => $match['new_line']); } return $phpDocTagValueNode; } @@ -137,8 +125,12 @@ private function parseChildAndStoreItsPositions(TokenIterator $tokenIterator) : { $betterTokenIterator = $this->tokenIteratorFactory->createFromTokenIterator($tokenIterator); $startPosition = $betterTokenIterator->currentPosition(); - /** @var PhpDocTextNode|PhpDocTagNode $phpDocNode */ - $phpDocNode = $this->privatesAccessor->callPrivateMethod($this, 'parseChild', [$betterTokenIterator]); + try { + /** @var PhpDocTextNode|PhpDocTagNode $phpDocNode */ + $phpDocNode = $this->privatesAccessor->callPrivateMethod($this, 'parseChild', [$betterTokenIterator]); + } catch (ParserException $exception) { + $phpDocNode = new PhpDocTextNode(''); + } $endPosition = $betterTokenIterator->currentPosition(); $startAndEnd = new StartAndEnd($startPosition, $endPosition); $phpDocNode->setAttribute(PhpDocAttributeKey::START_AND_END, $startAndEnd); diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php deleted file mode 100644 index b6c0cdc71..000000000 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php +++ /dev/null @@ -1,35 +0,0 @@ -tokenIteratorFactory = $tokenIteratorFactory; - parent::__construct($constExprParser); - } - public function parse(TokenIterator $tokenIterator) : TypeNode - { - $betterTokenIterator = $this->tokenIteratorFactory->createFromTokenIterator($tokenIterator); - $startPosition = $betterTokenIterator->currentPosition(); - $typeNode = parent::parse($betterTokenIterator); - $endPosition = $betterTokenIterator->currentPosition(); - $startAndEnd = new StartAndEnd($startPosition, $endPosition); - $typeNode->setAttribute(PhpDocAttributeKey::START_AND_END, $startAndEnd); - return $typeNode; - } -} diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php index ea9d264bc..84b5a5a21 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php @@ -19,29 +19,29 @@ final class ClassAnnotationMatcher { /** * @readonly - * @var \Rector\CodingStyle\NodeAnalyzer\UseImportNameMatcher */ - private $useImportNameMatcher; + private UseImportNameMatcher $useImportNameMatcher; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** - * @var array + * @var array */ - private $fullyQualifiedNameByHash = []; + private array $fullyQualifiedNameByHash = []; public function __construct(UseImportNameMatcher $useImportNameMatcher, UseImportsResolver $useImportsResolver, ReflectionProvider $reflectionProvider) { $this->useImportNameMatcher = $useImportNameMatcher; $this->useImportsResolver = $useImportsResolver; $this->reflectionProvider = $reflectionProvider; } + /** + * @return non-empty-string + */ public function resolveTagFullyQualifiedName(string $tag, Node $node) : string { $uniqueId = $tag . \spl_object_id($node); @@ -59,6 +59,7 @@ public function resolveTagFullyQualifiedName(string $tag, Node $node) : string } /** * @param array $uses + * @return non-empty-string|null */ private function resolveFullyQualifiedClass(array $uses, Node $node, string $tag) : ?string { @@ -83,6 +84,7 @@ private function resolveFullyQualifiedClass(array $uses, Node $node, string $tag } /** * @param array $uses + * @return non-empty-string|null */ private function resolveAsAliased(array $uses, string $tag) : ?string { diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php index 87de5359f..fcb5d16f0 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php @@ -19,14 +19,12 @@ final class ConstExprClassNameDecorator implements PhpDocNodeDecoratorInterface { /** * @readonly - * @var \Rector\StaticTypeMapper\Naming\NameScopeFactory */ - private $nameScopeFactory; + private NameScopeFactory $nameScopeFactory; /** * @readonly - * @var \Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser */ - private $phpDocNodeTraverser; + private PhpDocNodeTraverser $phpDocNodeTraverser; public function __construct(NameScopeFactory $nameScopeFactory, PhpDocNodeTraverser $phpDocNodeTraverser) { $this->nameScopeFactory = $nameScopeFactory; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php index c6c080a49..442d2b3e7 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php @@ -3,15 +3,18 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocParser; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; +use PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine\DoctrineTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\Type\ObjectType; use Rector\BetterPhpDocParser\Attributes\AttributeMirrorer; use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; @@ -20,30 +23,34 @@ use Rector\BetterPhpDocParser\ValueObject\DoctrineAnnotation\SilentKeyMap; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\BetterPhpDocParser\ValueObject\StartAndEnd; +use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; +use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; +use Rector\TypeDeclaration\PHPStan\ObjectTypeSpecifier; use Rector\Util\StringUtils; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class DoctrineAnnotationDecorator implements PhpDocNodeDecoratorInterface { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher */ - private $classAnnotationMatcher; + private \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher $classAnnotationMatcher; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser */ - private $staticDoctrineAnnotationParser; + private \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory */ - private $tokenIteratorFactory; + private TokenIteratorFactory $tokenIteratorFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer */ - private $attributeMirrorer; + private AttributeMirrorer $attributeMirrorer; + /** + * @readonly + */ + private ObjectTypeSpecifier $objectTypeSpecifier; /** * @see https://regex101.com/r/bGp2V0/2 * @var string @@ -64,12 +71,18 @@ final class DoctrineAnnotationDecorator implements PhpDocNodeDecoratorInterface * @var string */ private const NEWLINE_ANNOTATION_FQCN_REGEX = '#\\r?\\n@\\\\#'; - public function __construct(\Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher $classAnnotationMatcher, \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser, TokenIteratorFactory $tokenIteratorFactory, AttributeMirrorer $attributeMirrorer) + /** + * @var string + * @see https://regex101.com/r/3zXEh7/1 + */ + private const STAR_COMMENT_REGEX = '#^\\s*\\*#ms'; + public function __construct(\Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher $classAnnotationMatcher, \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser, TokenIteratorFactory $tokenIteratorFactory, AttributeMirrorer $attributeMirrorer, ObjectTypeSpecifier $objectTypeSpecifier) { $this->classAnnotationMatcher = $classAnnotationMatcher; $this->staticDoctrineAnnotationParser = $staticDoctrineAnnotationParser; $this->tokenIteratorFactory = $tokenIteratorFactory; $this->attributeMirrorer = $attributeMirrorer; + $this->objectTypeSpecifier = $objectTypeSpecifier; } public function decorate(PhpDocNode $phpDocNode, Node $phpNode) : void { @@ -171,6 +184,19 @@ private function transformGenericTagValueNodesToDoctrineAnnotationTagValueNodes( if (!$phpDocChildNode instanceof PhpDocTagNode) { continue; } + // single quoted got invalid tag, keep process + if ($phpDocChildNode->value instanceof InvalidTagValueNode) { + $name = \ltrim($phpDocChildNode->name, '@'); + $values = $phpDocChildNode->value->value; + $this->processDoctrine($currentPhpNode, $name, $phpDocChildNode, $phpDocNode, $key, $values); + } + // needs stable correct detection of full class name + if ($phpDocChildNode->value instanceof DoctrineTagValueNode) { + $name = \ltrim($phpDocChildNode->name, '@'); + $values = \implode(', ', $phpDocChildNode->value->annotation->arguments); + $this->processDoctrine($currentPhpNode, $name, $phpDocChildNode, $phpDocNode, $key, $values); + continue; + } if (!$phpDocChildNode->value instanceof GenericTagValueNode) { $this->processDescriptionAsSpacelessPhpDoctagNode($phpDocNode, $phpDocChildNode, $currentPhpNode, $key); continue; @@ -212,6 +238,37 @@ private function transformGenericTagValueNodesToDoctrineAnnotationTagValueNodes( \array_splice($phpDocNode->children, $key + 1, 0, $spacelessPhpDocTagNodes); } } + /** + * @param mixed $key + */ + private function processDoctrine(Node $currentPhpNode, string $name, PhpDocTagNode $phpDocTagNode, PhpDocNode $phpDocNode, $key, string $values) : void + { + $type = $this->objectTypeSpecifier->narrowToFullyQualifiedOrAliasedObjectType($currentPhpNode, new ObjectType($name), $currentPhpNode->getAttribute(AttributeKey::SCOPE)); + $fullyQualifiedAnnotationClass = null; + if ($type instanceof ShortenedObjectType || $type instanceof AliasedObjectType) { + $fullyQualifiedAnnotationClass = $type->getFullyQualifiedName(); + } elseif ($type instanceof ObjectType) { + $fullyQualifiedAnnotationClass = $type->getClassName(); + } + if ($fullyQualifiedAnnotationClass === null) { + return; + } + if ($values !== '') { + $values = Strings::replace($values, self::STAR_COMMENT_REGEX); + if ($phpDocTagNode->value instanceof DoctrineTagValueNode) { + $values = '(' . $values . ')'; + if ($phpDocTagNode->value->description !== '') { + $values .= $phpDocTagNode->value->description; + } + } + } + $genericTagValueNode = new GenericTagValueNode($values); + $startAndEnd = $phpDocTagNode->getAttribute(PhpDocAttributeKey::START_AND_END); + $genericTagValueNode->setAttribute(PhpDocAttributeKey::START_AND_END, $startAndEnd); + $spacelessPhpDocTagNode = $this->createSpacelessPhpDocTagNode('@' . $name, $genericTagValueNode, $fullyQualifiedAnnotationClass, $currentPhpNode); + $this->attributeMirrorer->mirror($phpDocTagNode, $spacelessPhpDocTagNode); + $phpDocNode->children[$key] = $spacelessPhpDocTagNode; + } private function processDescriptionAsSpacelessPhpDoctagNode(PhpDocNode $phpDocNode, PhpDocTagNode $phpDocTagNode, Node $currentPhpNode, int $key) : void { if (!\property_exists($phpDocTagNode->value, 'description')) { @@ -256,10 +313,10 @@ private function isClosedContent(string $composedContent) : bool return \true; } do { - if ($composedTokenIterator->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET, Lexer::TOKEN_OPEN_PARENTHESES) || \strpos($composedTokenIterator->currentTokenValue(), '(') !== \false) { + if ($composedTokenIterator->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET, Lexer::TOKEN_OPEN_PARENTHESES) || \strpos($composedTokenIterator->currentTokenValue(), '{') !== \false || \strpos($composedTokenIterator->currentTokenValue(), '(') !== \false) { ++$openBracketCount; } - if ($composedTokenIterator->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET, Lexer::TOKEN_CLOSE_PARENTHESES) || \strpos($composedTokenIterator->currentTokenValue(), ')') !== \false) { + if ($composedTokenIterator->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET, Lexer::TOKEN_CLOSE_PARENTHESES) || \strpos($composedTokenIterator->currentTokenValue(), '}') !== \false || \strpos($composedTokenIterator->currentTokenValue(), ')') !== \false) { ++$closeBracketCount; } $composedTokenIterator->next(); diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php index 8862737d8..96732475c 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php @@ -22,14 +22,12 @@ final class StaticDoctrineAnnotationParser { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\PlainValueParser */ - private $plainValueParser; + private PlainValueParser $plainValueParser; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser */ - private $arrayParser; + private ArrayParser $arrayParser; /** * @var string * @see https://regex101.com/r/Pthg5d/1 diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php index 1d4f9cbca..ba8f32561 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php @@ -17,9 +17,8 @@ final class ArrayParser { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\PlainValueParser */ - private $plainValueParser; + private \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\PlainValueParser $plainValueParser; public function __construct(\Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\PlainValueParser $plainValueParser) { $this->plainValueParser = $plainValueParser; @@ -154,6 +153,22 @@ private function createArrayItemFromKeyAndValue($rawKey, $rawValue) : ArrayItemN if (\is_string($rawValue) && $valueQuoteKind === String_::KIND_DOUBLE_QUOTED) { // give raw value $value = new StringNode(\substr($rawValue, 1, \strlen($rawValue) - 2)); + } elseif ($valueQuoteKind === null && \is_string($rawValue)) { + $lowerRawValue = \strtolower($rawValue); + switch ($lowerRawValue) { + case 'null': + $value = null; + break; + case 'true': + $value = \true; + break; + case 'false': + $value = \false; + break; + default: + $value = $rawValue; + break; + } } else { $value = $rawValue; } diff --git a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php index eb0e14cca..b0b2924df 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php @@ -20,17 +20,10 @@ final class PlainValueParser { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher */ - private $classAnnotationMatcher; - /** - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser - */ - private $staticDoctrineAnnotationParser; - /** - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser - */ - private $arrayParser; + private ClassAnnotationMatcher $classAnnotationMatcher; + private StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser; + private \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser $arrayParser; public function __construct(ClassAnnotationMatcher $classAnnotationMatcher) { $this->classAnnotationMatcher = $classAnnotationMatcher; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php b/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php index 540b22e8a..b090f35bc 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/Printer/DocBlockInliner.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\Printer; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; final class DocBlockInliner { /** diff --git a/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php b/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php index 97a6cb6ec..d0595ee59 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\Printer; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Comment; use PhpParser\Node\Stmt\InlineHTML; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; @@ -29,24 +29,20 @@ final class PhpDocInfoPrinter { /** * @readonly - * @var \Rector\BetterPhpDocParser\Printer\EmptyPhpDocDetector */ - private $emptyPhpDocDetector; + private \Rector\BetterPhpDocParser\Printer\EmptyPhpDocDetector $emptyPhpDocDetector; /** * @readonly - * @var \Rector\BetterPhpDocParser\Printer\DocBlockInliner */ - private $docBlockInliner; + private \Rector\BetterPhpDocParser\Printer\DocBlockInliner $docBlockInliner; /** * @readonly - * @var \Rector\BetterPhpDocParser\Printer\RemoveNodesStartAndEndResolver */ - private $removeNodesStartAndEndResolver; + private \Rector\BetterPhpDocParser\Printer\RemoveNodesStartAndEndResolver $removeNodesStartAndEndResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocNodeVisitor\ChangedPhpDocNodeVisitor */ - private $changedPhpDocNodeVisitor; + private ChangedPhpDocNodeVisitor $changedPhpDocNodeVisitor; /** * @var string * @see https://regex101.com/r/Ab0Vey/1 @@ -70,27 +66,17 @@ final class PhpDocInfoPrinter * @see https://regex101.com/r/ME5Fcn/1 */ private const NEW_LINE_WITH_SPACE_REGEX = "# (?\r\n|\n)#"; - /** - * @var int - */ - private $tokenCount = 0; - /** - * @var int - */ - private $currentTokenPosition = 0; + private int $tokenCount = 0; + private int $currentTokenPosition = 0; /** * @var mixed[] */ - private $tokens = []; - /** - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo|null - */ - private $phpDocInfo; + private array $tokens = []; + private ?PhpDocInfo $phpDocInfo = null; /** * @readonly - * @var \Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser */ - private $changedPhpDocNodeTraverser; + private PhpDocNodeTraverser $changedPhpDocNodeTraverser; public function __construct(\Rector\BetterPhpDocParser\Printer\EmptyPhpDocDetector $emptyPhpDocDetector, \Rector\BetterPhpDocParser\Printer\DocBlockInliner $docBlockInliner, \Rector\BetterPhpDocParser\Printer\RemoveNodesStartAndEndResolver $removeNodesStartAndEndResolver, ChangedPhpDocNodeVisitor $changedPhpDocNodeVisitor) { $this->emptyPhpDocDetector = $emptyPhpDocDetector; @@ -179,9 +165,7 @@ private function printPhpDocNode(PhpDocNode $phpDocNode) : string if (\strncmp($output, '/**', \strlen('/**')) === 0 && !StringUtils::isMatch($output, self::CLOSING_DOCBLOCK_REGEX)) { $output .= ' */'; } - return Strings::replace($output, self::NEW_LINE_WITH_SPACE_REGEX, static function (array $match) { - return $match['new_line']; - }); + return Strings::replace($output, self::NEW_LINE_WITH_SPACE_REGEX, static fn(array $match) => $match['new_line']); } private function hasDocblockStart(string $output) : bool { diff --git a/vendor/rector/rector/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php b/vendor/rector/rector/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php index ffd5c26e2..85a1027a3 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php @@ -33,7 +33,7 @@ public function resolve(PhpDocNode $originalPhpDocNode, PhpDocNode $currentPhpDo if ($tokens[$seekPosition][1] === Lexer::TOKEN_PHPDOC_EOL) { break; } - // do not colide + // do not collide if ($lastEndPosition < $seekPosition) { break; } diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Parser/BetterTokenIterator.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Parser/BetterTokenIterator.php index 8946693a2..6f7dfdb68 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Parser/BetterTokenIterator.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Parser/BetterTokenIterator.php @@ -76,7 +76,7 @@ public function count() : int */ public function partialTokens(int $start, int $end) : array { - return \array_slice($this->getTokens(), $start, $end); + return \array_slice($this->getTokens(), $start, $end - $start + 1); } public function containsTokenType(int $type) : bool { diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/AbstractValuesAwareNode.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/AbstractValuesAwareNode.php index 4e8a45aa8..efa61901b 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/AbstractValuesAwareNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/AbstractValuesAwareNode.php @@ -13,20 +13,11 @@ abstract class AbstractValuesAwareNode implements PhpDocTagValueNode /** * @var ArrayItemNode[] */ - public $values = []; - /** - * @var string|null - */ - protected $originalContent; - /** - * @var string|null - */ - protected $silentKey; + public array $values = []; + protected ?string $originalContent = null; + protected ?string $silentKey = null; use NodeAttributes; - /** - * @var bool - */ - protected $hasChanged = \false; + protected bool $hasChanged = \false; /** * @param ArrayItemNode[] $values Must be public so node traverser can go through them */ @@ -97,15 +88,17 @@ public function markAsChanged() : void { $this->hasChanged = \true; } + public function getOriginalContent() : ?string + { + return $this->originalContent; + } /** * @param mixed[] $values */ protected function printValuesContent(array $values) : string { $itemContents = ''; - \end($values); - $lastItemKey = \key($values); - \reset($values); + $lastItemKey = \array_key_last($values); foreach ($values as $key => $value) { if (\is_int($key)) { $itemContents .= $this->stringifyValue($value); diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php index e61201fad..dced42b74 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php @@ -5,14 +5,14 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Stringable; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class CurlyListNode extends \Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\AbstractValuesAwareNode { /** * @var ArrayItemNode[] * @readonly */ - private $arrayItemNodes = []; + private array $arrayItemNodes = []; /** * @param ArrayItemNode[] $arrayItemNodes */ @@ -33,9 +33,7 @@ public function __toString() : string private function implode(array $array) : string { $itemContents = ''; - \end($array); - $lastItemKey = \key($array); - \reset($array); + $lastItemKey = \array_key_last($array); foreach ($array as $key => $value) { if (\is_int($key)) { $itemContents .= (string) $value; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/SpacingAwareTemplateTagValueNode.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/SpacingAwareTemplateTagValueNode.php index 09408f0b6..449215e24 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/SpacingAwareTemplateTagValueNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/PhpDoc/SpacingAwareTemplateTagValueNode.php @@ -10,9 +10,8 @@ final class SpacingAwareTemplateTagValueNode extends TemplateTagValueNode { /** * @readonly - * @var string */ - private $preposition; + private string $preposition; public function __construct(string $name, ?TypeNode $typeNode, string $description, string $preposition) { $this->preposition = $preposition; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/StartAndEnd.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/StartAndEnd.php index 5b2621b58..49f86da40 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/StartAndEnd.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/StartAndEnd.php @@ -8,14 +8,12 @@ final class StartAndEnd { /** * @readonly - * @var int */ - private $start; + private int $start; /** * @readonly - * @var int */ - private $end; + private int $end; public function __construct(int $start, int $end) { $this->start = $start; diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/BracketsAwareUnionTypeNode.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/BracketsAwareUnionTypeNode.php index d566e953b..3cb85ce13 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/BracketsAwareUnionTypeNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/BracketsAwareUnionTypeNode.php @@ -10,9 +10,8 @@ final class BracketsAwareUnionTypeNode extends UnionTypeNode { /** * @readonly - * @var bool */ - private $isWrappedInBrackets = \false; + private bool $isWrappedInBrackets = \false; /** * @param TypeNode[] $types */ diff --git a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/SpacingAwareCallableTypeNode.php b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/SpacingAwareCallableTypeNode.php index e28d41bee..c37bc8ae6 100644 --- a/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/SpacingAwareCallableTypeNode.php +++ b/vendor/rector/rector/src/BetterPhpDocParser/ValueObject/Type/SpacingAwareCallableTypeNode.php @@ -4,8 +4,6 @@ namespace Rector\BetterPhpDocParser\ValueObject\Type; use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; -use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; -use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use Stringable; final class SpacingAwareCallableTypeNode extends CallableTypeNode { @@ -16,10 +14,8 @@ public function __toString() : string } private function createExplicitCallable() : string { - /** @var IdentifierTypeNode|GenericTypeNode $returnType */ - $returnType = $this->returnType; $parameterTypeString = $this->createParameterTypeString(); - $returnTypeAsString = (string) $returnType; + $returnTypeAsString = (string) $this->returnType; if (\strpos($returnTypeAsString, '|') !== \false) { $returnTypeAsString = '(' . $returnTypeAsString . ')'; } diff --git a/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php b/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php index 181dc38ee..da3a21d9d 100644 --- a/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php +++ b/vendor/rector/rector/src/Bootstrap/RectorConfigsResolver.php @@ -4,8 +4,8 @@ namespace Rector\Bootstrap; use Rector\ValueObject\Bootstrap\BootstrapConfigs; -use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202506\Webmozart\Assert\Assert; final class RectorConfigsResolver { public function provide() : BootstrapConfigs diff --git a/vendor/rector/rector/src/Bridge/SetProviderCollector.php b/vendor/rector/rector/src/Bridge/SetProviderCollector.php index 8a6d3adf9..5d7280e31 100644 --- a/vendor/rector/rector/src/Bridge/SetProviderCollector.php +++ b/vendor/rector/rector/src/Bridge/SetProviderCollector.php @@ -9,6 +9,12 @@ use Rector\Set\Contract\SetProviderInterface; use Rector\Set\SetProvider\CoreSetProvider; use Rector\Set\SetProvider\PHPSetProvider; +use Rector\Set\ValueObject\ComposerTriggeredSet; +use Rector\Symfony\Set\SetProvider\Symfony3SetProvider; +use Rector\Symfony\Set\SetProvider\Symfony4SetProvider; +use Rector\Symfony\Set\SetProvider\Symfony5SetProvider; +use Rector\Symfony\Set\SetProvider\Symfony6SetProvider; +use Rector\Symfony\Set\SetProvider\Symfony7SetProvider; use Rector\Symfony\Set\SetProvider\SymfonySetProvider; use Rector\Symfony\Set\SetProvider\TwigSetProvider; /** @@ -22,7 +28,7 @@ final class SetProviderCollector * @var SetProviderInterface[] * @readonly */ - private $setProviders; + private array $setProviders; /** * @param SetProviderInterface[] $extraSetProviders */ @@ -34,6 +40,11 @@ public function __construct(array $extraSetProviders = []) new CoreSetProvider(), new PHPUnitSetProvider(), new SymfonySetProvider(), + new Symfony3SetProvider(), + new Symfony4SetProvider(), + new Symfony5SetProvider(), + new Symfony6SetProvider(), + new Symfony7SetProvider(), new DoctrineSetProvider(), new TwigSetProvider(), ]; @@ -57,4 +68,11 @@ public function provideSets() : array } return $sets; } + /** + * @return array + */ + public function provideComposerTriggeredSets() : array + { + return \array_filter($this->provideSets(), fn(SetInterface $set): bool => $set instanceof ComposerTriggeredSet); + } } diff --git a/vendor/rector/rector/src/Bridge/SetRectorsResolver.php b/vendor/rector/rector/src/Bridge/SetRectorsResolver.php index 38adc16de..51cc67ad3 100644 --- a/vendor/rector/rector/src/Bridge/SetRectorsResolver.php +++ b/vendor/rector/rector/src/Bridge/SetRectorsResolver.php @@ -5,10 +5,9 @@ use Rector\Config\RectorConfig; use Rector\Contract\Rector\RectorInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api - * @experimental since 1.1.2 * Utils class to ease building bridges by 3rd-party tools * * @see \Rector\Tests\Bridge\SetRectorsResolverTest diff --git a/vendor/rector/rector/src/Caching/Cache.php b/vendor/rector/rector/src/Caching/Cache.php index c3f4c7983..54df4f0de 100644 --- a/vendor/rector/rector/src/Caching/Cache.php +++ b/vendor/rector/rector/src/Caching/Cache.php @@ -9,9 +9,8 @@ final class Cache { /** * @readonly - * @var \Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface */ - private $cacheStorage; + private CacheStorageInterface $cacheStorage; public function __construct(CacheStorageInterface $cacheStorage) { $this->cacheStorage = $cacheStorage; diff --git a/vendor/rector/rector/src/Caching/CacheFactory.php b/vendor/rector/rector/src/Caching/CacheFactory.php index de80f5be9..8ee627b15 100644 --- a/vendor/rector/rector/src/Caching/CacheFactory.php +++ b/vendor/rector/rector/src/Caching/CacheFactory.php @@ -7,14 +7,13 @@ use Rector\Caching\ValueObject\Storage\MemoryCacheStorage; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; -use RectorPrefix202411\Symfony\Component\Filesystem\Filesystem; +use RectorPrefix202506\Symfony\Component\Filesystem\Filesystem; final class CacheFactory { /** * @readonly - * @var \Symfony\Component\Filesystem\Filesystem */ - private $fileSystem; + private Filesystem $fileSystem; public function __construct(Filesystem $fileSystem) { $this->fileSystem = $fileSystem; diff --git a/vendor/rector/rector/src/Caching/Detector/ChangedFilesDetector.php b/vendor/rector/rector/src/Caching/Detector/ChangedFilesDetector.php index 1246e2fc8..a27f53b7d 100644 --- a/vendor/rector/rector/src/Caching/Detector/ChangedFilesDetector.php +++ b/vendor/rector/rector/src/Caching/Detector/ChangedFilesDetector.php @@ -16,23 +16,20 @@ final class ChangedFilesDetector { /** * @readonly - * @var \Rector\Caching\Config\FileHashComputer */ - private $fileHashComputer; + private FileHashComputer $fileHashComputer; /** * @readonly - * @var \Rector\Caching\Cache */ - private $cache; + private Cache $cache; /** * @readonly - * @var \Rector\Util\FileHasher */ - private $fileHasher; + private FileHasher $fileHasher; /** * @var array */ - private $cachableFiles = []; + private array $cacheableFiles = []; public function __construct(FileHashComputer $fileHashComputer, Cache $cache, FileHasher $fileHasher) { $this->fileHashComputer = $fileHashComputer; @@ -42,16 +39,16 @@ public function __construct(FileHashComputer $fileHashComputer, Cache $cache, Fi public function cacheFile(string $filePath) : void { $filePathCacheKey = $this->getFilePathCacheKey($filePath); - if (!isset($this->cachableFiles[$filePathCacheKey])) { + if (!isset($this->cacheableFiles[$filePathCacheKey])) { return; } $hash = $this->hashFile($filePath); $this->cache->save($filePathCacheKey, CacheKey::FILE_HASH_KEY, $hash); } - public function addCachableFile(string $filePath) : void + public function addCacheableFile(string $filePath) : void { $filePathCacheKey = $this->getFilePathCacheKey($filePath); - $this->cachableFiles[$filePathCacheKey] = \true; + $this->cacheableFiles[$filePathCacheKey] = \true; } public function hasFileChanged(string $filePath) : bool { @@ -68,7 +65,7 @@ public function invalidateFile(string $filePath) : void { $fileInfoCacheKey = $this->getFilePathCacheKey($filePath); $this->cache->clean($fileInfoCacheKey); - unset($this->cachableFiles[$fileInfoCacheKey]); + unset($this->cacheableFiles[$fileInfoCacheKey]); } public function clear() : void { @@ -85,7 +82,6 @@ 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/src/Caching/UnchangedFilesFilter.php b/vendor/rector/rector/src/Caching/UnchangedFilesFilter.php index 595ba65cf..797242d9d 100644 --- a/vendor/rector/rector/src/Caching/UnchangedFilesFilter.php +++ b/vendor/rector/rector/src/Caching/UnchangedFilesFilter.php @@ -8,9 +8,8 @@ final class UnchangedFilesFilter { /** * @readonly - * @var \Rector\Caching\Detector\ChangedFilesDetector */ - private $changedFilesDetector; + private ChangedFilesDetector $changedFilesDetector; public function __construct(ChangedFilesDetector $changedFilesDetector) { $this->changedFilesDetector = $changedFilesDetector; diff --git a/vendor/rector/rector/src/Caching/ValueObject/CacheFilePaths.php b/vendor/rector/rector/src/Caching/ValueObject/CacheFilePaths.php index d30aa9a6d..5c3415e60 100644 --- a/vendor/rector/rector/src/Caching/ValueObject/CacheFilePaths.php +++ b/vendor/rector/rector/src/Caching/ValueObject/CacheFilePaths.php @@ -7,19 +7,16 @@ final class CacheFilePaths { /** * @readonly - * @var string */ - private $firstDirectory; + private string $firstDirectory; /** * @readonly - * @var string */ - private $secondDirectory; + private string $secondDirectory; /** * @readonly - * @var string */ - private $filePath; + private string $filePath; public function __construct(string $firstDirectory, string $secondDirectory, string $filePath) { $this->firstDirectory = $firstDirectory; diff --git a/vendor/rector/rector/src/Caching/ValueObject/CacheItem.php b/vendor/rector/rector/src/Caching/ValueObject/CacheItem.php index ebb60a5b5..42fa4fa4e 100644 --- a/vendor/rector/rector/src/Caching/ValueObject/CacheItem.php +++ b/vendor/rector/rector/src/Caching/ValueObject/CacheItem.php @@ -11,9 +11,8 @@ final class CacheItem { /** * @readonly - * @var string */ - private $variableKey; + private string $variableKey; /** * @readonly * @var mixed diff --git a/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php b/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php index 61154a0a4..bf765d33d 100644 --- a/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php +++ b/vendor/rector/rector/src/Caching/ValueObject/Storage/FileCacheStorage.php @@ -4,8 +4,8 @@ namespace Rector\Caching\ValueObject\Storage; use FilesystemIterator; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Random; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Random; use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface; use Rector\Caching\ValueObject\CacheFilePaths; use Rector\Caching\ValueObject\CacheItem; @@ -18,15 +18,13 @@ final class FileCacheStorage implements CacheStorageInterface { /** * @readonly - * @var string */ - private $directory; + private string $directory; /** * @readonly - * @var \Symfony\Component\Filesystem\Filesystem */ - private $filesystem; - public function __construct(string $directory, \RectorPrefix202411\Symfony\Component\Filesystem\Filesystem $filesystem) + private \RectorPrefix202506\Symfony\Component\Filesystem\Filesystem $filesystem; + public function __construct(string $directory, \RectorPrefix202506\Symfony\Component\Filesystem\Filesystem $filesystem) { $this->directory = $directory; $this->filesystem = $filesystem; diff --git a/vendor/rector/rector/src/Caching/ValueObject/Storage/MemoryCacheStorage.php b/vendor/rector/rector/src/Caching/ValueObject/Storage/MemoryCacheStorage.php index be137b178..e6cec6a9a 100644 --- a/vendor/rector/rector/src/Caching/ValueObject/Storage/MemoryCacheStorage.php +++ b/vendor/rector/rector/src/Caching/ValueObject/Storage/MemoryCacheStorage.php @@ -13,7 +13,7 @@ final class MemoryCacheStorage implements CacheStorageInterface /** * @var array */ - private $storage = []; + private array $storage = []; /** * @return null|mixed */ diff --git a/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php b/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php index 773b5c16f..abd78fa74 100644 --- a/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php +++ b/vendor/rector/rector/src/ChangesReporting/Output/ConsoleOutputFormatter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\ChangesReporting\Output; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\ChangesReporting\Contract\Output\OutputFormatterInterface; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; @@ -11,15 +11,14 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\ProcessResult; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class ConsoleOutputFormatter implements OutputFormatterInterface { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @var string */ @@ -119,7 +118,7 @@ private function addEditorUrl(string $filePath, ?string $absoluteFilePath, ?stri { $editorUrl = SimpleParameterProvider::provideStringParameter(Option::EDITOR_URL, ''); if ($editorUrl !== '') { - $editorUrl = \str_replace(['%file%', '%relFile%', '%line%'], [$absoluteFilePath, $relativeFilePath, $lineNumber], $editorUrl); + $editorUrl = \str_replace(['%file%', '%relFile%', '%line%'], [(string) $absoluteFilePath, (string) $relativeFilePath, (string) $lineNumber], $editorUrl); $filePath = '' . $filePath . ''; } return $filePath; diff --git a/vendor/rector/rector/src/ChangesReporting/Output/GitHubOutputFormatter.php b/vendor/rector/rector/src/ChangesReporting/Output/GitHubOutputFormatter.php new file mode 100644 index 000000000..e5f75fc45 --- /dev/null +++ b/vendor/rector/rector/src/ChangesReporting/Output/GitHubOutputFormatter.php @@ -0,0 +1,104 @@ +startGroup(); + $this->reportSystemErrors($processResult, $configuration); + $this->reportFileDiffs($processResult, $configuration); + $this->endGroup(); + } + private function startGroup() : void + { + echo \sprintf('::group::%s', self::GROUP_NAME) . \PHP_EOL; + } + private function endGroup() : void + { + echo '::endgroup::' . \PHP_EOL; + } + private function reportSystemErrors(ProcessResult $processResult, Configuration $configuration) : void + { + foreach ($processResult->getSystemErrors() as $systemError) { + $filePath = $configuration->isReportingWithRealPath() ? $systemError->getAbsoluteFilePath() : $systemError->getRelativeFilePath(); + $line = $systemError->getLine(); + $message = \trim($systemError->getRectorShortClass() . \PHP_EOL . $systemError->getMessage()); + $this->reportErrorAnnotation($message, ['file' => $filePath, 'line' => $line]); + } + } + private function reportFileDiffs(ProcessResult $processResult, Configuration $configuration) : void + { + $fileDiffs = $processResult->getFileDiffs(); + \ksort($fileDiffs); + foreach ($fileDiffs as $fileDiff) { + $filePath = $configuration->isReportingWithRealPath() ? $fileDiff->getAbsoluteFilePath() : $fileDiff->getRelativeFilePath(); + $line = $fileDiff->getFirstLineNumber(); + $endLine = $fileDiff->getLastLineNumber(); + $message = \trim(\implode(' / ', $fileDiff->getRectorShortClasses())) . \PHP_EOL . \PHP_EOL . $fileDiff->getDiff(); + $this->reportErrorAnnotation($message, ['file' => $filePath, 'line' => $line, 'endLine' => $endLine]); + } + } + /** + * @param AnnotationProperties $annotationProperties + */ + private function reportErrorAnnotation(string $message, array $annotationProperties) : void + { + $properties = $this->sanitizeAnnotationProperties($annotationProperties); + $command = \sprintf('::error %s::%s', $properties, $message); + // Sanitize command + $command = \str_replace(['%', "\r", "\n"], ['%25', '%0D', '%0A'], $command); + echo $command . \PHP_EOL; + } + /** + * @param AnnotationProperties $annotationProperties + */ + private function sanitizeAnnotationProperties(array $annotationProperties) : string + { + if (!isset($annotationProperties['line']) || !$annotationProperties['line']) { + $annotationProperties['line'] = 0; + } + // This is a workaround for buggy endLine. See https://github.com/orgs/community/discussions/129899 + // TODO: Should be removed once github will have fixed it issue. + unset($annotationProperties['endLine']); + $nonNullProperties = \array_filter($annotationProperties, static fn($value): bool => $value !== null); + $sanitizedProperties = \array_map(fn($key, $value): string => \sprintf('%s=%s', $key, $this->sanitizeAnnotationProperty($value)), \array_keys($nonNullProperties), $nonNullProperties); + return \implode(',', $sanitizedProperties); + } + /** + * @param string|int|null $value + */ + private function sanitizeAnnotationProperty($value) : string + { + if ($value === null || $value === '') { + return ''; + } + $value = (string) $value; + return \str_replace(['%', "\r", "\n", ':', ','], ['%25', '%0D', '%0A', '%3A', '%2C'], $value); + } +} diff --git a/vendor/rector/rector/src/ChangesReporting/Output/GitlabOutputFormatter.php b/vendor/rector/rector/src/ChangesReporting/Output/GitlabOutputFormatter.php new file mode 100644 index 000000000..51cc288e3 --- /dev/null +++ b/vendor/rector/rector/src/ChangesReporting/Output/GitlabOutputFormatter.php @@ -0,0 +1,96 @@ +filehasher = $filehasher; + } + public function getName() : string + { + return self::NAME; + } + public function report(ProcessResult $processResult, Configuration $configuration) : void + { + $errorsJson = \array_merge($this->appendSystemErrors($processResult, $configuration), $this->appendFileDiffs($processResult, $configuration)); + $json = Json::encode($errorsJson, \true); + echo $json . \PHP_EOL; + } + /** + * @return array + */ + private function appendSystemErrors(ProcessResult $processResult, Configuration $configuration) : array + { + $errorsJson = []; + foreach ($processResult->getSystemErrors() as $systemError) { + $filePath = $configuration->isReportingWithRealPath() ? $systemError->getAbsoluteFilePath() ?? '' : $systemError->getRelativeFilePath() ?? ''; + $fingerprint = $this->filehasher->hash($filePath . ';' . $systemError->getLine() . ';' . $systemError->getMessage()); + $errorsJson[] = ['fingerprint' => $fingerprint, 'type' => self::ERROR_TYPE_ISSUE, 'categories' => [self::ERROR_CATEGORY_BUG_RISK], 'severity' => self::ERROR_SEVERITY_BLOCKER, 'description' => $systemError->getMessage(), 'check_name' => $systemError->getRectorClass() ?? '', 'location' => ['path' => $filePath, 'lines' => ['begin' => $systemError->getLine() ?? 0]]]; + } + return $errorsJson; + } + /** + * @return array + */ + private function appendFileDiffs(ProcessResult $processResult, Configuration $configuration) : array + { + $errorsJson = []; + $fileDiffs = $processResult->getFileDiffs(); + \ksort($fileDiffs); + foreach ($fileDiffs as $fileDiff) { + $filePath = $configuration->isReportingWithRealPath() ? $fileDiff->getAbsoluteFilePath() ?? '' : $fileDiff->getRelativeFilePath() ?? ''; + $rectorClasses = \implode(' / ', $fileDiff->getRectorShortClasses()); + $fingerprint = $this->filehasher->hash($filePath . ';' . $fileDiff->getDiff()); + $errorsJson[] = ['fingerprint' => $fingerprint, 'type' => self::ERROR_TYPE_ISSUE, 'categories' => [self::ERROR_CATEGORY_STYLE], 'severity' => self::ERROR_SEVERITY_MINOR, 'description' => $rectorClasses, 'content' => ['body' => $fileDiff->getDiff()], 'check_name' => $rectorClasses, 'location' => ['path' => $filePath, 'lines' => ['begin' => $fileDiff->getFirstLineNumber() ?? 0]]]; + } + return $errorsJson; + } +} diff --git a/vendor/rector/rector/src/ChangesReporting/Output/JUnitOutputFormatter.php b/vendor/rector/rector/src/ChangesReporting/Output/JUnitOutputFormatter.php new file mode 100644 index 000000000..c9f01d297 --- /dev/null +++ b/vendor/rector/rector/src/ChangesReporting/Output/JUnitOutputFormatter.php @@ -0,0 +1,89 @@ +symfonyStyle = $symfonyStyle; + } + public function getName() : string + { + return self::NAME; + } + public function report(ProcessResult $processResult, Configuration $configuration) : void + { + if (!\extension_loaded('dom')) { + $this->symfonyStyle->warning('The "dom" extension is not loaded. The rector could not generate a response in the JUnit format'); + return; + } + $domDocument = new DOMDocument('1.0', 'UTF-8'); + $xmlTestSuite = $domDocument->createElement(self::XML_ELEMENT_TESTSUITE); + $xmlTestSuite->setAttribute(self::XML_ATTRIBUTE_NAME, 'rector'); + $xmlTestSuites = $domDocument->createElement(self::XML_ELEMENT_TESTSUITES); + $xmlTestSuites->appendChild($xmlTestSuite); + $domDocument->appendChild($xmlTestSuites); + $this->appendSystemErrors($processResult, $configuration, $domDocument, $xmlTestSuite); + $this->appendFileDiffs($processResult, $configuration, $domDocument, $xmlTestSuite); + echo $domDocument->saveXML() . \PHP_EOL; + } + private function appendSystemErrors(ProcessResult $processResult, Configuration $configuration, DOMDocument $domDocument, DOMElement $domElement) : void + { + if ($processResult->getSystemErrors() === []) { + return; + } + foreach ($processResult->getSystemErrors() as $systemError) { + $filePath = $configuration->isReportingWithRealPath() ? $systemError->getAbsoluteFilePath() ?? '' : $systemError->getRelativeFilePath() ?? ''; + $xmlError = $domDocument->createElement(self::XML_ELEMENT_ERROR, $systemError->getMessage()); + $xmlError->setAttribute(self::XML_ATTRIBUTE_TYPE, 'Error'); + $xmlTestCase = $domDocument->createElement(self::XML_ELEMENT_TESTCASE); + $xmlTestCase->setAttribute(self::XML_ATTRIBUTE_FILE, $filePath); + $xmlTestCase->setAttribute(self::XML_ATTRIBUTE_NAME, $filePath . ':' . $systemError->getLine()); + $xmlTestCase->appendChild($xmlError); + $domElement->appendChild($xmlTestCase); + } + } + private function appendFileDiffs(ProcessResult $processResult, Configuration $configuration, DOMDocument $domDocument, DOMElement $domElement) : void + { + if ($processResult->getFileDiffs() === []) { + return; + } + $fileDiffs = $processResult->getFileDiffs(); + \ksort($fileDiffs); + foreach ($fileDiffs as $fileDiff) { + $filePath = $configuration->isReportingWithRealPath() ? $fileDiff->getAbsoluteFilePath() ?? '' : $fileDiff->getRelativeFilePath() ?? ''; + $rectorClasses = \implode(' / ', $fileDiff->getRectorShortClasses()); + $xmlError = $domDocument->createElement(self::XML_ELEMENT_ERROR, $fileDiff->getDiff()); + $xmlError->setAttribute(self::XML_ATTRIBUTE_TYPE, $rectorClasses); + $xmlTestCase = $domDocument->createElement(self::XML_ELEMENT_TESTCASE); + $xmlTestCase->setAttribute(self::XML_ATTRIBUTE_FILE, $filePath); + $xmlTestCase->setAttribute(self::XML_ATTRIBUTE_NAME, $filePath . ':' . $fileDiff->getFirstLineNumber()); + $xmlTestCase->appendChild($xmlError); + $domElement->appendChild($xmlTestCase); + } + } +} diff --git a/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php b/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php index fee25e2bf..dfd60e595 100644 --- a/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php +++ b/vendor/rector/rector/src/ChangesReporting/Output/JsonOutputFormatter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\ChangesReporting\Output; -use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\Json; use Rector\ChangesReporting\Contract\Output\OutputFormatterInterface; use Rector\Parallel\ValueObject\Bridge; use Rector\ValueObject\Configuration; diff --git a/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php b/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php index d25c60076..e0f17e903 100644 --- a/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php +++ b/vendor/rector/rector/src/ChangesReporting/ValueObject/RectorWithLineChange.php @@ -4,15 +4,14 @@ namespace Rector\ChangesReporting\ValueObject; use Rector\Contract\Rector\RectorInterface; -use RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symplify\EasyParallel\Contract\SerializableInterface; +use RectorPrefix202506\Webmozart\Assert\Assert; final class RectorWithLineChange implements SerializableInterface { /** * @readonly - * @var int */ - private $line; + private int $line; /** * @var string */ @@ -25,7 +24,7 @@ final class RectorWithLineChange implements SerializableInterface * @var class-string * @readonly */ - private $rectorClass; + private string $rectorClass; /** * @param class-string|RectorInterface $rectorClass */ @@ -46,9 +45,8 @@ public function getRectorClass() : string } /** * @param array $json - * @return $this */ - public static function decode(array $json) : \RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface + public static function decode(array $json) : self { /** @var class-string $rectorClass */ $rectorClass = $json[self::KEY_RECTOR_CLASS]; diff --git a/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/ErrorFactory.php b/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/ErrorFactory.php index df2b6f8b6..9c3bdcef3 100644 --- a/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/ErrorFactory.php +++ b/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/ErrorFactory.php @@ -10,9 +10,8 @@ final class ErrorFactory { /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; public function __construct(FilePathHelper $filePathHelper) { $this->filePathHelper = $filePathHelper; diff --git a/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/FileDiffFactory.php b/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/FileDiffFactory.php index fdf7d757b..148dc86c8 100644 --- a/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/FileDiffFactory.php +++ b/vendor/rector/rector/src/ChangesReporting/ValueObjectFactory/FileDiffFactory.php @@ -13,19 +13,16 @@ final class FileDiffFactory { /** * @readonly - * @var \Rector\Differ\DefaultDiffer */ - private $defaultDiffer; + private DefaultDiffer $defaultDiffer; /** * @readonly - * @var \Rector\Console\Formatter\ConsoleDiffer */ - private $consoleDiffer; + private ConsoleDiffer $consoleDiffer; /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; public function __construct(DefaultDiffer $defaultDiffer, ConsoleDiffer $consoleDiffer, FilePathHelper $filePathHelper) { $this->defaultDiffer = $defaultDiffer; @@ -35,14 +32,10 @@ public function __construct(DefaultDiffer $defaultDiffer, ConsoleDiffer $console /** * @param RectorWithLineChange[] $rectorsWithLineChanges */ - public function createFileDiffWithLineChanges(File $file, string $oldContent, string $newContent, array $rectorsWithLineChanges) : FileDiff + public function createFileDiffWithLineChanges(bool $shouldShowDiffs, File $file, string $oldContent, string $newContent, array $rectorsWithLineChanges) : FileDiff { $relativeFilePath = $this->filePathHelper->relativePath($file->getFilePath()); // always keep the most recent diff - return new FileDiff($relativeFilePath, $this->defaultDiffer->diff($oldContent, $newContent), $this->consoleDiffer->diff($oldContent, $newContent), $rectorsWithLineChanges); - } - public function createTempFileDiff(File $file) : FileDiff - { - return $this->createFileDiffWithLineChanges($file, '', '', $file->getRectorWithLineChanges()); + return new FileDiff($relativeFilePath, $shouldShowDiffs ? $this->defaultDiffer->diff($oldContent, $newContent) : '', $shouldShowDiffs ? $this->consoleDiffer->diff($oldContent, $newContent) : '', $rectorsWithLineChanges); } } diff --git a/vendor/rector/rector/src/Comments/CommentRemover.php b/vendor/rector/rector/src/Comments/CommentRemover.php index e76829000..5235beffa 100644 --- a/vendor/rector/rector/src/Comments/CommentRemover.php +++ b/vendor/rector/rector/src/Comments/CommentRemover.php @@ -12,9 +12,8 @@ final class CommentRemover { /** * @readonly - * @var \Rector\Comments\NodeTraverser\CommentRemovingNodeTraverser */ - private $commentRemovingNodeTraverser; + private CommentRemovingNodeTraverser $commentRemovingNodeTraverser; public function __construct(CommentRemovingNodeTraverser $commentRemovingNodeTraverser) { $this->commentRemovingNodeTraverser = $commentRemovingNodeTraverser; diff --git a/vendor/rector/rector/src/Comments/NodeDocBlock/DocBlockUpdater.php b/vendor/rector/rector/src/Comments/NodeDocBlock/DocBlockUpdater.php index 6cf4ccb17..c389295d2 100644 --- a/vendor/rector/rector/src/Comments/NodeDocBlock/DocBlockUpdater.php +++ b/vendor/rector/rector/src/Comments/NodeDocBlock/DocBlockUpdater.php @@ -13,9 +13,8 @@ final class DocBlockUpdater { /** * @readonly - * @var \Rector\BetterPhpDocParser\Printer\PhpDocInfoPrinter */ - private $phpDocInfoPrinter; + private PhpDocInfoPrinter $phpDocInfoPrinter; public function __construct(PhpDocInfoPrinter $phpDocInfoPrinter) { $this->phpDocInfoPrinter = $phpDocInfoPrinter; @@ -34,13 +33,19 @@ public function updateRefactoredNodeWithPhpDocInfo(Node $node) : void } $printedPhpDoc = $this->printPhpDocInfoToString($phpDocInfo); $node->setDocComment(new Doc($printedPhpDoc)); + if ($printedPhpDoc === '') { + $this->clearEmptyDoc($node); + } } private function setCommentsAttribute(Node $node) : void { - $comments = \array_filter($node->getComments(), static function (Comment $comment) : bool { - return !$comment instanceof Doc; - }); - $node->setAttribute(AttributeKey::COMMENTS, $comments); + $comments = \array_filter($node->getComments(), static fn(Comment $comment): bool => !$comment instanceof Doc); + $node->setAttribute(AttributeKey::COMMENTS, \array_values($comments)); + } + private function clearEmptyDoc(Node $node) : void + { + $comments = \array_filter($node->getComments(), static fn(Comment $comment): bool => !$comment instanceof Doc || $comment->getText() !== ''); + $node->setAttribute(AttributeKey::COMMENTS, \array_values($comments)); } private function printPhpDocInfoToString(PhpDocInfo $phpDocInfo) : string { diff --git a/vendor/rector/rector/src/Comments/NodeTraverser/CommentRemovingNodeTraverser.php b/vendor/rector/rector/src/Comments/NodeTraverser/CommentRemovingNodeTraverser.php index cbaec4954..6153e346c 100644 --- a/vendor/rector/rector/src/Comments/NodeTraverser/CommentRemovingNodeTraverser.php +++ b/vendor/rector/rector/src/Comments/NodeTraverser/CommentRemovingNodeTraverser.php @@ -9,7 +9,6 @@ final class CommentRemovingNodeTraverser extends NodeTraverser { public function __construct(CommentRemovingNodeVisitor $commentRemovingNodeVisitor) { - $this->addVisitor($commentRemovingNodeVisitor); - parent::__construct(); + parent::__construct($commentRemovingNodeVisitor); } } diff --git a/vendor/rector/rector/src/Composer/InstalledPackageResolver.php b/vendor/rector/rector/src/Composer/InstalledPackageResolver.php index 9b895b4fb..7c33bca00 100644 --- a/vendor/rector/rector/src/Composer/InstalledPackageResolver.php +++ b/vendor/rector/rector/src/Composer/InstalledPackageResolver.php @@ -3,41 +3,78 @@ declare (strict_types=1); namespace Rector\Composer; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Json; use Rector\Composer\ValueObject\InstalledPackage; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202411\Webmozart\Assert\Assert; +use Rector\Skipper\FileSystem\PathNormalizer; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\Composer\InstalledPackageResolverTest */ final class InstalledPackageResolver { /** - * @var array + * @readonly */ - private $resolvedInstalledPackages = []; + private ?string $projectDirectory = null; + /** + * @var InstalledPackage[] + */ + private array $resolvedInstalledPackages = []; + public function __construct(?string $projectDirectory = null) + { + $this->projectDirectory = $projectDirectory; + // fallback to root project directory + if ($projectDirectory === null) { + $projectDirectory = \getcwd(); + } + Assert::directory($projectDirectory); + } /** * @return InstalledPackage[] */ - public function resolve(string $projectDirectory) : array + public function resolve() : array { // cache - if (isset($this->resolvedInstalledPackages[$projectDirectory])) { - return $this->resolvedInstalledPackages[$projectDirectory]; + if ($this->resolvedInstalledPackages !== []) { + return $this->resolvedInstalledPackages; } - Assert::directory($projectDirectory); - $installedPackagesFilePath = $projectDirectory . '/vendor/composer/installed.json'; + $installedPackagesFilePath = self::resolveVendorDir() . '/composer/installed.json'; if (!\file_exists($installedPackagesFilePath)) { - throw new ShouldNotHappenException('The installed package json not found. Make sure you run `composer update` and "vendor/composer/installed.json" file exists'); + throw new ShouldNotHappenException('The installed package json not found. Make sure you run `composer update` and the "vendor/composer/installed.json" file exists'); } $installedPackageFileContents = FileSystem::read($installedPackagesFilePath); $installedPackagesFilePath = Json::decode($installedPackageFileContents, \true); + $installedPackages = $this->createInstalledPackages($installedPackagesFilePath['packages']); + $this->resolvedInstalledPackages = $installedPackages; + return $installedPackages; + } + /** + * @param mixed[] $packages + * @return InstalledPackage[] + */ + private function createInstalledPackages(array $packages) : array + { $installedPackages = []; - foreach ($installedPackagesFilePath['packages'] as $installedPackage) { - $installedPackages[] = new InstalledPackage($installedPackage['name'], $installedPackage['version_normalized']); + foreach ($packages as $package) { + $installedPackages[] = new InstalledPackage($package['name'], $package['version_normalized']); } - $this->resolvedInstalledPackages[$projectDirectory] = $installedPackages; return $installedPackages; } + private function resolveVendorDir() : string + { + $projectComposerJsonFilePath = $this->projectDirectory . '/composer.json'; + if (\file_exists($projectComposerJsonFilePath)) { + $projectComposerContents = FileSystem::read($projectComposerJsonFilePath); + $projectComposerJson = Json::decode($projectComposerContents, \true); + if (isset($projectComposerJson['config']['vendor-dir']) && \is_string($projectComposerJson['config']['vendor-dir'])) { + $realPathVendorDir = \realpath($projectComposerJson['config']['vendor-dir']) ?: ''; + $normalizedRealPathVendorDir = PathNormalizer::normalize($realPathVendorDir); + $normalizedVendorDir = PathNormalizer::normalize($projectComposerJson['config']['vendor-dir']); + return $normalizedRealPathVendorDir === $normalizedVendorDir ? $projectComposerJson['config']['vendor-dir'] : $this->projectDirectory . '/' . $projectComposerJson['config']['vendor-dir']; + } + } + return $this->projectDirectory . '/vendor'; + } } diff --git a/vendor/rector/rector/src/Composer/ValueObject/InstalledPackage.php b/vendor/rector/rector/src/Composer/ValueObject/InstalledPackage.php index 333787701..8fb30c63e 100644 --- a/vendor/rector/rector/src/Composer/ValueObject/InstalledPackage.php +++ b/vendor/rector/rector/src/Composer/ValueObject/InstalledPackage.php @@ -7,14 +7,12 @@ final class InstalledPackage { /** * @readonly - * @var string */ - private $name; + private string $name; /** * @readonly - * @var string */ - private $version; + private string $version; public function __construct(string $name, string $version) { $this->name = $name; diff --git a/vendor/rector/rector/src/Config/Level/CodeQualityLevel.php b/vendor/rector/rector/src/Config/Level/CodeQualityLevel.php index da3c9318a..9d70e3431 100644 --- a/vendor/rector/rector/src/Config/Level/CodeQualityLevel.php +++ b/vendor/rector/rector/src/Config/Level/CodeQualityLevel.php @@ -71,9 +71,6 @@ use Rector\CodeQuality\Rector\Ternary\SwitchNegatedTernaryRector; use Rector\CodeQuality\Rector\Ternary\TernaryEmptyArrayArrayDimFetchToCoalesceRector; use Rector\CodeQuality\Rector\Ternary\UnnecessaryTernaryExpressionRector; -use Rector\CodingStyle\Rector\ClassMethod\FuncGetArgsToVariadicParamRector; -use Rector\CodingStyle\Rector\FuncCall\CallUserFuncToMethodCallRector; -use Rector\CodingStyle\Rector\FuncCall\CountArrayToEmptyArrayComparisonRector; use Rector\Contract\Rector\RectorInterface; use Rector\Php52\Rector\Property\VarToPublicPropertyRector; use Rector\Php71\Rector\FuncCall\RemoveExtraParametersRector; @@ -98,7 +95,7 @@ final class CodeQualityLevel * * @var array> */ - public const RULES = [CombinedAssignRector::class, SimplifyEmptyArrayCheckRector::class, ReplaceMultipleBooleanNotRector::class, ForeachToInArrayRector::class, SimplifyForeachToCoalescingRector::class, SimplifyFuncGetArgsCountRector::class, SimplifyInArrayValuesRector::class, SimplifyStrposLowerRector::class, SimplifyArraySearchRector::class, SimplifyConditionsRector::class, SimplifyIfNotNullReturnRector::class, SimplifyIfReturnBoolRector::class, UnnecessaryTernaryExpressionRector::class, RemoveExtraParametersRector::class, SimplifyDeMorganBinaryRector::class, SimplifyTautologyTernaryRector::class, SingleInArrayToCompareRector::class, SimplifyIfElseToTernaryRector::class, JoinStringConcatRector::class, ConsecutiveNullCompareReturnsToNullCoalesceQueueRector::class, ExplicitBoolCompareRector::class, CombineIfRector::class, UseIdenticalOverEqualWithSameTypeRector::class, SimplifyBoolIdenticalTrueRector::class, SimplifyRegexPatternRector::class, BooleanNotIdenticalToNotIdenticalRector::class, AndAssignsToSeparateLinesRector::class, CompactToVariablesRector::class, CompleteDynamicPropertiesRector::class, IsAWithStringWithThirdArgumentRector::class, StrlenZeroToIdenticalEmptyStringRector::class, ThrowWithPreviousExceptionRector::class, RemoveSoleValueSprintfRector::class, ShortenElseIfRector::class, ExplicitReturnNullRector::class, ArrayMergeOfNonArraysToSimpleArrayRector::class, ArrayKeyExistsTernaryThenValueToCoalescingRector::class, AbsolutizeRequireAndIncludePathRector::class, ChangeArrayPushToArrayAssignRector::class, ForRepeatedCountToOwnVariableRector::class, ForeachItemsAssignToEmptyArrayToAssignRector::class, InlineIfToExplicitIfRector::class, UnusedForeachValueToArrayKeysRector::class, CommonNotEqualRector::class, SetTypeToCastRector::class, LogicalToBooleanRector::class, VarToPublicPropertyRector::class, IssetOnPropertyObjectToPropertyExistsRector::class, NewStaticToNewSelfRector::class, UnwrapSprintfOneArgumentRector::class, SwitchNegatedTernaryRector::class, SingularSwitchToIfRector::class, SimplifyIfNullableReturnRector::class, FuncGetArgsToVariadicParamRector::class, CallUserFuncToMethodCallRector::class, CallUserFuncWithArrowFunctionToInlineRector::class, CountArrayToEmptyArrayComparisonRector::class, FlipTypeControlToUseExclusiveTypeRector::class, InlineArrayReturnAssignRector::class, InlineIsAInstanceOfRector::class, TernaryFalseExpressionToIfRector::class, InlineConstructorDefaultToPropertyRector::class, TernaryEmptyArrayArrayDimFetchToCoalesceRector::class, OptionalParametersAfterRequiredRector::class, SimplifyEmptyCheckOnEmptyArrayRector::class, SwitchTrueToIfRector::class, CleanupUnneededNullsafeOperatorRector::class, DisallowedEmptyRuleFixerRector::class, ConvertStaticPrivateConstantToSelfRector::class, LocallyCalledStaticMethodToNonStaticRector::class, NumberCompareToMaxFuncCallRector::class, CompleteMissingIfElseBracketRector::class, RemoveUselessIsObjectCheckRector::class, StaticToSelfStaticMethodCallOnFinalClassRector::class]; + public const RULES = [CombinedAssignRector::class, SimplifyEmptyArrayCheckRector::class, ReplaceMultipleBooleanNotRector::class, ForeachToInArrayRector::class, SimplifyForeachToCoalescingRector::class, SimplifyFuncGetArgsCountRector::class, SimplifyInArrayValuesRector::class, SimplifyStrposLowerRector::class, SimplifyArraySearchRector::class, SimplifyConditionsRector::class, SimplifyIfNotNullReturnRector::class, SimplifyIfReturnBoolRector::class, UnnecessaryTernaryExpressionRector::class, RemoveExtraParametersRector::class, SimplifyDeMorganBinaryRector::class, SimplifyTautologyTernaryRector::class, SingleInArrayToCompareRector::class, SimplifyIfElseToTernaryRector::class, JoinStringConcatRector::class, ConsecutiveNullCompareReturnsToNullCoalesceQueueRector::class, ExplicitBoolCompareRector::class, CombineIfRector::class, UseIdenticalOverEqualWithSameTypeRector::class, SimplifyBoolIdenticalTrueRector::class, SimplifyRegexPatternRector::class, BooleanNotIdenticalToNotIdenticalRector::class, AndAssignsToSeparateLinesRector::class, CompactToVariablesRector::class, CompleteDynamicPropertiesRector::class, IsAWithStringWithThirdArgumentRector::class, StrlenZeroToIdenticalEmptyStringRector::class, ThrowWithPreviousExceptionRector::class, RemoveSoleValueSprintfRector::class, ShortenElseIfRector::class, ExplicitReturnNullRector::class, ArrayMergeOfNonArraysToSimpleArrayRector::class, ArrayKeyExistsTernaryThenValueToCoalescingRector::class, AbsolutizeRequireAndIncludePathRector::class, ChangeArrayPushToArrayAssignRector::class, ForRepeatedCountToOwnVariableRector::class, ForeachItemsAssignToEmptyArrayToAssignRector::class, InlineIfToExplicitIfRector::class, UnusedForeachValueToArrayKeysRector::class, CommonNotEqualRector::class, SetTypeToCastRector::class, LogicalToBooleanRector::class, VarToPublicPropertyRector::class, IssetOnPropertyObjectToPropertyExistsRector::class, NewStaticToNewSelfRector::class, UnwrapSprintfOneArgumentRector::class, SwitchNegatedTernaryRector::class, SingularSwitchToIfRector::class, SimplifyIfNullableReturnRector::class, CallUserFuncWithArrowFunctionToInlineRector::class, FlipTypeControlToUseExclusiveTypeRector::class, InlineArrayReturnAssignRector::class, InlineIsAInstanceOfRector::class, TernaryFalseExpressionToIfRector::class, InlineConstructorDefaultToPropertyRector::class, TernaryEmptyArrayArrayDimFetchToCoalesceRector::class, OptionalParametersAfterRequiredRector::class, SimplifyEmptyCheckOnEmptyArrayRector::class, SwitchTrueToIfRector::class, CleanupUnneededNullsafeOperatorRector::class, DisallowedEmptyRuleFixerRector::class, ConvertStaticPrivateConstantToSelfRector::class, LocallyCalledStaticMethodToNonStaticRector::class, NumberCompareToMaxFuncCallRector::class, CompleteMissingIfElseBracketRector::class, RemoveUselessIsObjectCheckRector::class, StaticToSelfStaticMethodCallOnFinalClassRector::class]; /** * @var array, mixed[]> */ @@ -109,7 +106,7 @@ final class CodeQualityLevel # https://www.php.net/manual/en/aliases.php 'chop' => 'rtrim', 'doubleval' => 'floatval', - 'gzputs' => 'gzwrites', + 'gzputs' => 'gzwrite', 'fputs' => 'fwrite', 'ini_alter' => 'ini_set', 'is_double' => 'is_float', diff --git a/vendor/rector/rector/src/Config/Level/CodingStyleLevel.php b/vendor/rector/rector/src/Config/Level/CodingStyleLevel.php new file mode 100644 index 000000000..4edb9c600 --- /dev/null +++ b/vendor/rector/rector/src/Config/Level/CodingStyleLevel.php @@ -0,0 +1,57 @@ +> + */ + public const RULES = [SeparateMultiUseImportsRector::class, NewlineAfterStatementRector::class, RemoveFinalFromConstRector::class, NullableCompareToNullRector::class, ConsistentImplodeRector::class, TernaryConditionVariableAssignmentRector::class, SymplifyQuoteEscapeRector::class, StringClassNameToClassConstantRector::class, CatchExceptionNameMatchingTypeRector::class, SplitDoubleAssignRector::class, EncapsedStringsToSprintfRector::class, WrapEncapsedVariableInCurlyBracesRector::class, NewlineBeforeNewAssignSetRector::class, MakeInheritedMethodVisibilitySameAsParentRector::class, CallUserFuncArrayToVariadicRector::class, VersionCompareFuncCallToConstantRector::class, CountArrayToEmptyArrayComparisonRector::class, CallUserFuncToMethodCallRector::class, FuncGetArgsToVariadicParamRector::class, StrictArraySearchRector::class, UseClassKeywordForClassNameResolutionRector::class, SplitGroupedPropertiesRector::class, SplitGroupedClassConstantsRector::class, ExplicitPublicClassMethodRector::class, RemoveUselessAliasInUseStatementRector::class]; + /** + * @var array, mixed[]> + */ + public const RULES_WITH_CONFIGURATION = [FuncCallToConstFetchRector::class => ['php_sapi_name' => 'PHP_SAPI', 'pi' => 'M_PI']]; +} diff --git a/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php b/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php index 9260df3a7..cf698b760 100644 --- a/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php +++ b/vendor/rector/rector/src/Config/Level/DeadCodeLevel.php @@ -8,10 +8,12 @@ use Rector\DeadCode\Rector\Array_\RemoveDuplicatedArrayKeyRector; use Rector\DeadCode\Rector\Assign\RemoveDoubleAssignRector; use Rector\DeadCode\Rector\Assign\RemoveUnusedVariableAssignRector; +use Rector\DeadCode\Rector\Block\ReplaceBlockToItsStmtsRector; use Rector\DeadCode\Rector\BooleanAnd\RemoveAndTrueRector; use Rector\DeadCode\Rector\Cast\RecastingRemovalRector; use Rector\DeadCode\Rector\ClassConst\RemoveUnusedPrivateClassConstantRector; use Rector\DeadCode\Rector\ClassLike\RemoveTypedPropertyNonMockDocblockRector; +use Rector\DeadCode\Rector\ClassMethod\RemoveArgumentFromDefaultParentCallRector; use Rector\DeadCode\Rector\ClassMethod\RemoveEmptyClassMethodRector; use Rector\DeadCode\Rector\ClassMethod\RemoveNullTagValueNodeRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUnusedConstructorParamRector; @@ -19,6 +21,7 @@ use Rector\DeadCode\Rector\ClassMethod\RemoveUnusedPrivateMethodRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUnusedPromotedPropertyRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUnusedPublicMethodParameterRector; +use Rector\DeadCode\Rector\ClassMethod\RemoveUselessAssignFromPropertyPromotionRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessParamTagRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnExprInConstructRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnTagRector; @@ -30,6 +33,7 @@ use Rector\DeadCode\Rector\For_\RemoveDeadIfForeachForRector; use Rector\DeadCode\Rector\For_\RemoveDeadLoopRector; use Rector\DeadCode\Rector\Foreach_\RemoveUnusedForeachKeyRector; +use Rector\DeadCode\Rector\FuncCall\RemoveFilterVarOnExactTypeRector; use Rector\DeadCode\Rector\FunctionLike\RemoveDeadReturnRector; use Rector\DeadCode\Rector\If_\ReduceAlwaysFalseIfOrRector; use Rector\DeadCode\Rector\If_\RemoveAlwaysTrueIfConditionRector; @@ -49,6 +53,7 @@ use Rector\DeadCode\Rector\Stmt\RemoveUnreachableStatementRector; use Rector\DeadCode\Rector\Switch_\RemoveDuplicatedCaseInSwitchRector; use Rector\DeadCode\Rector\Ternary\TernaryToBooleanOrFalseToBooleanAndRector; +use Rector\DeadCode\Rector\TryCatch\RemoveDeadCatchRector; use Rector\DeadCode\Rector\TryCatch\RemoveDeadTryCatchRector; /** * Key 0 = level 0 @@ -80,9 +85,12 @@ final class DeadCodeLevel RemoveUnusedNonEmptyArrayBeforeForeachRector::class, RemoveNullPropertyInitializationRector::class, RemoveUselessReturnExprInConstructRector::class, + ReplaceBlockToItsStmtsRector::class, + RemoveFilterVarOnExactTypeRector::class, RemoveTypedPropertyDeadInstanceOfRector::class, TernaryToBooleanOrFalseToBooleanAndRector::class, RemoveDoubleAssignRector::class, + RemoveUselessAssignFromPropertyPromotionRector::class, RemoveConcatAutocastRector::class, SimplifyIfElseWithSameContentRector::class, SimplifyUselessVariableRector::class, @@ -103,6 +111,7 @@ final class DeadCodeLevel RemoveUnusedPrivatePropertyRector::class, RemoveDuplicatedCaseInSwitchRector::class, RemoveDeadInstanceOfRector::class, + RemoveDeadCatchRector::class, RemoveDeadTryCatchRector::class, RemoveDeadIfForeachForRector::class, RemoveDeadStmtRector::class, @@ -121,5 +130,6 @@ final class DeadCodeLevel RemoveUnusedConstructorParamRector::class, RemoveEmptyClassMethodRector::class, RemoveDeadReturnRector::class, + RemoveArgumentFromDefaultParentCallRector::class, ]; } diff --git a/vendor/rector/rector/src/Config/Level/TypeDeclarationLevel.php b/vendor/rector/rector/src/Config/Level/TypeDeclarationLevel.php index b4346d94f..18775852d 100644 --- a/vendor/rector/rector/src/Config/Level/TypeDeclarationLevel.php +++ b/vendor/rector/rector/src/Config/Level/TypeDeclarationLevel.php @@ -47,6 +47,7 @@ use Rector\TypeDeclaration\Rector\Closure\AddClosureVoidReturnTypeWhereNoReturnRector; use Rector\TypeDeclaration\Rector\Closure\ClosureReturnTypeRector; use Rector\TypeDeclaration\Rector\Empty_\EmptyOnNullableObjectToInstanceOfRector; +use Rector\TypeDeclaration\Rector\FuncCall\AddArrowFunctionParamArrayWhereDimFetchRector; use Rector\TypeDeclaration\Rector\Function_\AddFunctionVoidReturnTypeWhereNoReturnRector; use Rector\TypeDeclaration\Rector\FunctionLike\AddParamTypeSplFixedArrayRector; use Rector\TypeDeclaration\Rector\FunctionLike\AddReturnTypeDeclarationFromYieldsRector; @@ -106,6 +107,7 @@ final class TypeDeclarationLevel // closures AddClosureNeverReturnTypeRector::class, ClosureReturnTypeRector::class, + AddArrowFunctionParamArrayWhereDimFetchRector::class, // more risky rules ReturnTypeFromStrictParamRector::class, AddParamTypeFromPropertyTypeRector::class, diff --git a/vendor/rector/rector/src/Config/RectorConfig.php b/vendor/rector/rector/src/Config/RectorConfig.php index c706b4ee7..a3dcdd071 100644 --- a/vendor/rector/rector/src/Config/RectorConfig.php +++ b/vendor/rector/rector/src/Config/RectorConfig.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Config; -use RectorPrefix202411\Illuminate\Container\Container; +use RectorPrefix202506\Illuminate\Container\Container; use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; @@ -13,31 +13,37 @@ use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Contract\Rector\RectorInterface; use Rector\DependencyInjection\Laravel\ContainerMemento; +use Rector\Enum\Config\Defaults; use Rector\Exception\ShouldNotHappenException; use Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver; use Rector\Validation\RectorConfigValidator; +use Rector\ValueObject\Configuration\LevelOverflow; use Rector\ValueObject\PhpVersion; use Rector\ValueObject\PolyfillPackage; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\ArrayInput; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api */ final class RectorConfig extends Container { /** - * @var array, mixed[]>> + * @var array, mixed[]> */ - private $ruleConfigurations = []; + private array $ruleConfigurations = []; /** * @var string[] */ - private $autotagInterfaces = [Command::class, ResetableInterface::class]; + private array $autotagInterfaces = [Command::class, ResetableInterface::class]; + private static ?bool $recreated = null; public static function configure() : RectorConfigBuilder { + if (self::$recreated === null) { + self::$recreated = \false; + } elseif (self::$recreated === \false) { + self::$recreated = \true; + } + SimpleParameterProvider::setParameter(Option::IS_RECTORCONFIG_BUILDER_RECREATED, self::$recreated); return new RectorConfigBuilder(); } /** @@ -65,20 +71,6 @@ public function sets(array $sets) : void Assert::fileExists($set); $this->import($set); } - // notify about deprecated sets - foreach ($sets as $set) { - if (\strpos($set, 'deprecated-level-set') === \false) { - continue; - } - // display only on main command run, skip spamming in workers - $commandArguments = $_SERVER['argv']; - if (!\in_array('worker', $commandArguments, \true)) { - // show warning, to avoid confusion - $symfonyStyle = new SymfonyStyle(new ArrayInput([]), new ConsoleOutput()); - $symfonyStyle->warning("The Symfony/Twig/PHPUnit level sets have been deprecated since Rector 0.19.2 due to heavy performance loads and conflicting overrides. Instead, please use the latest major set.\n\nFor more information, visit https://getrector.com/blog/5-common-mistakes-in-rector-config-and-how-to-avoid-them"); - break; - } - } // for cache invalidation in case of sets change SimpleParameterProvider::addParameter(Option::REGISTERED_RECTOR_SETS, $sets); } @@ -86,7 +78,7 @@ public function disableParallel() : void { SimpleParameterProvider::setParameter(Option::PARALLEL, \false); } - public function parallel(int $processTimeout = 120, int $maxNumberOfProcess = 16, int $jobSize = 16) : void + public function parallel(int $processTimeout = 120, int $maxNumberOfProcess = Defaults::PARALLEL_MAX_NUMBER_OF_PROCESS, int $jobSize = 16) : void { SimpleParameterProvider::setParameter(Option::PARALLEL, \true); SimpleParameterProvider::setParameter(Option::PARALLEL_JOB_TIMEOUT_IN_SECONDS, $processTimeout); @@ -188,7 +180,11 @@ public function command(string $commandClass) : void } public function import(string $filePath) : void { - if (\strpos($filePath, '*') !== \false) { + /** + * Only stop when filePath realpath is false and contains glob patterns + * @see https://github.com/rectorphp/rector/issues/9156#issuecomment-2869130541 + */ + if (\realpath($filePath) === \false && \strpos($filePath, '*') !== \false) { throw new ShouldNotHappenException('Matching file paths by using glob-patterns is no longer supported. Use specific file path instead.'); } Assert::fileExists($filePath); @@ -356,4 +352,11 @@ public function getRectorClasses() : array { return $this->tags[RectorInterface::class] ?? []; } + /** + * @param LevelOverflow[] $levelOverflows + */ + public function setOverflowLevels(array $levelOverflows) : void + { + SimpleParameterProvider::addParameter(Option::LEVEL_OVERFLOWS, $levelOverflows); + } } diff --git a/vendor/rector/rector/src/Config/RegisteredService.php b/vendor/rector/rector/src/Config/RegisteredService.php index aca7fb89b..c240edf66 100644 --- a/vendor/rector/rector/src/Config/RegisteredService.php +++ b/vendor/rector/rector/src/Config/RegisteredService.php @@ -7,19 +7,16 @@ final class RegisteredService { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string|null */ - private $alias; + private ?string $alias; /** * @readonly - * @var string|null */ - private $tag; + private ?string $tag; public function __construct(string $className, ?string $alias, ?string $tag) { $this->className = $className; diff --git a/vendor/rector/rector/src/Configuration/ConfigInitializer.php b/vendor/rector/rector/src/Configuration/ConfigInitializer.php index ff789008d..739317252 100644 --- a/vendor/rector/rector/src/Configuration/ConfigInitializer.php +++ b/vendor/rector/rector/src/Configuration/ConfigInitializer.php @@ -3,28 +3,26 @@ declare (strict_types=1); namespace Rector\Configuration; -use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem; use Rector\Contract\Rector\RectorInterface; use Rector\FileSystem\InitFilePathsResolver; use Rector\PostRector\Contract\Rector\PostRectorInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class ConfigInitializer { /** * @var RectorInterface[] * @readonly */ - private $rectors; + private array $rectors; /** * @readonly - * @var \Rector\FileSystem\InitFilePathsResolver */ - private $initFilePathsResolver; + private InitFilePathsResolver $initFilePathsResolver; /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @param RectorInterface[] $rectors */ @@ -63,9 +61,7 @@ public function areSomeRectorsLoaded() : bool */ private function filterActiveRectors(array $rectors) : array { - return \array_filter($rectors, static function (RectorInterface $rector) : bool { - return !$rector instanceof PostRectorInterface; - }); + return \array_filter($rectors, static fn(RectorInterface $rector): bool => !$rector instanceof PostRectorInterface); } private function replacePathsContents(string $rectorPhpTemplateContents, string $projectDirectory) : string { diff --git a/vendor/rector/rector/src/Configuration/ConfigurationFactory.php b/vendor/rector/rector/src/Configuration/ConfigurationFactory.php index 2690e4d1a..4b002759f 100644 --- a/vendor/rector/rector/src/Configuration/ConfigurationFactory.php +++ b/vendor/rector/rector/src/Configuration/ConfigurationFactory.php @@ -6,8 +6,8 @@ use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\ValueObject\Configuration; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; /** * @see \Rector\Tests\Configuration\ConfigurationFactoryTest */ @@ -15,12 +15,16 @@ final class ConfigurationFactory { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; - public function __construct(SymfonyStyle $symfonyStyle) + private SymfonyStyle $symfonyStyle; + /** + * @readonly + */ + private \Rector\Configuration\OnlyRuleResolver $onlyRuleResolver; + public function __construct(SymfonyStyle $symfonyStyle, \Rector\Configuration\OnlyRuleResolver $onlyRuleResolver) { $this->symfonyStyle = $symfonyStyle; + $this->onlyRuleResolver = $onlyRuleResolver; } /** * @api used in tests @@ -29,7 +33,7 @@ public function __construct(SymfonyStyle $symfonyStyle) public function createForTests(array $paths) : Configuration { $fileExtensions = SimpleParameterProvider::provideArrayParameter(\Rector\Configuration\Option::FILE_EXTENSIONS); - return new Configuration(\false, \true, \false, ConsoleOutputFormatter::NAME, $fileExtensions, $paths, \true, null, null, \false, null, \false, \false); + return new Configuration(\false, \true, \false, ConsoleOutputFormatter::NAME, $fileExtensions, $paths, \true, null, null, \false, null, \false, \false, null, null); } /** * Needs to run in the start of the life cycle, since the rest of workflow uses it. @@ -43,6 +47,12 @@ public function createFromInput(InputInterface $input) : Configuration $showDiffs = $this->shouldShowDiffs($input); $paths = $this->resolvePaths($input); $fileExtensions = SimpleParameterProvider::provideArrayParameter(\Rector\Configuration\Option::FILE_EXTENSIONS); + // filter rule and path + $onlyRule = $input->getOption(\Rector\Configuration\Option::ONLY); + if ($onlyRule !== null) { + $onlyRule = $this->onlyRuleResolver->resolve($onlyRule); + } + $onlySuffix = $input->getOption(\Rector\Configuration\Option::ONLY_SUFFIX); $isParallel = SimpleParameterProvider::provideBoolParameter(\Rector\Configuration\Option::PARALLEL); $parallelPort = (string) $input->getOption(\Rector\Configuration\Option::PARALLEL_PORT); $parallelIdentifier = (string) $input->getOption(\Rector\Configuration\Option::PARALLEL_IDENTIFIER); @@ -53,7 +63,8 @@ public function createFromInput(InputInterface $input) : Configuration } $memoryLimit = $this->resolveMemoryLimit($input); $isReportingWithRealPath = SimpleParameterProvider::provideBoolParameter(\Rector\Configuration\Option::ABSOLUTE_FILE_PATH); - return new Configuration($isDryRun, $showProgressBar, $shouldClearCache, $outputFormat, $fileExtensions, $paths, $showDiffs, $parallelPort, $parallelIdentifier, $isParallel, $memoryLimit, $isDebug, $isReportingWithRealPath); + $levelOverflows = SimpleParameterProvider::provideArrayParameter(\Rector\Configuration\Option::LEVEL_OVERFLOWS); + return new Configuration($isDryRun, $showProgressBar, $shouldClearCache, $outputFormat, $fileExtensions, $paths, $showDiffs, $parallelPort, $parallelIdentifier, $isParallel, $memoryLimit, $isDebug, $isReportingWithRealPath, $onlyRule, $onlySuffix, $levelOverflows); } private function shouldShowProgressBar(InputInterface $input, string $outputFormat) : bool { @@ -83,10 +94,28 @@ private function resolvePaths(InputInterface $input) : array $commandLinePaths = (array) $input->getArgument(\Rector\Configuration\Option::SOURCE); // give priority to command line if ($commandLinePaths !== []) { + $this->setFilesWithoutExtensionParameter($commandLinePaths); return $commandLinePaths; } // fallback to parameter - return SimpleParameterProvider::provideArrayParameter(\Rector\Configuration\Option::PATHS); + $configPaths = SimpleParameterProvider::provideArrayParameter(\Rector\Configuration\Option::PATHS); + $this->setFilesWithoutExtensionParameter($configPaths); + return $configPaths; + } + /** + * @param string[] $paths + */ + private function setFilesWithoutExtensionParameter(array $paths) : void + { + foreach ($paths as $path) { + if (\is_file($path) && \pathinfo($path, \PATHINFO_EXTENSION) === '') { + $path = \realpath($path); + if ($path === \false) { + continue; + } + SimpleParameterProvider::addParameter(\Rector\Configuration\Option::FILES_WITHOUT_EXTENSION, $path); + } + } } private function resolveMemoryLimit(InputInterface $input) : ?string { diff --git a/vendor/rector/rector/src/Configuration/ConfigurationRuleFilter.php b/vendor/rector/rector/src/Configuration/ConfigurationRuleFilter.php new file mode 100644 index 000000000..5d7bcb1f3 --- /dev/null +++ b/vendor/rector/rector/src/Configuration/ConfigurationRuleFilter.php @@ -0,0 +1,47 @@ +configuration = $configuration; + } + /** + * @param list $rectors + * @return list + */ + public function filter(array $rectors) : array + { + if (!$this->configuration instanceof Configuration) { + return $rectors; + } + $onlyRule = $this->configuration->getOnlyRule(); + if ($onlyRule !== null) { + return $this->filterOnlyRule($rectors, $onlyRule); + } + return $rectors; + } + /** + * @param list $rectors + * @return list + */ + public function filterOnlyRule(array $rectors, string $onlyRule) : array + { + $activeRectors = []; + foreach ($rectors as $rector) { + if ($rector instanceof $onlyRule) { + $activeRectors[] = $rector; + } + } + return $activeRectors; + } +} diff --git a/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php b/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php index 63465aed3..935015716 100644 --- a/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php +++ b/vendor/rector/rector/src/Configuration/Levels/LevelRulesResolver.php @@ -5,7 +5,7 @@ use Rector\Contract\Rector\RectorInterface; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class LevelRulesResolver { /** diff --git a/vendor/rector/rector/src/Configuration/OnlyRuleResolver.php b/vendor/rector/rector/src/Configuration/OnlyRuleResolver.php new file mode 100644 index 000000000..146878170 --- /dev/null +++ b/vendor/rector/rector/src/Configuration/OnlyRuleResolver.php @@ -0,0 +1,63 @@ +rectors = $rectors; + } + public function resolve(string $rule) : string + { + //fix wrongly double escaped backslashes + $rule = \str_replace('\\\\', '\\', $rule); + //remove single quotes appearing when single-quoting arguments on windows + if (\strncmp($rule, "'", \strlen("'")) === 0 && \substr_compare($rule, "'", -\strlen("'")) === 0) { + $rule = \substr($rule, 1, -1); + } + $rule = \ltrim($rule, '\\'); + foreach ($this->rectors as $rector) { + if (\get_class($rector) === $rule) { + return $rule; + } + } + //allow short rule names if there are not duplicates + $matching = []; + foreach ($this->rectors as $rector) { + if (\substr_compare(\get_class($rector), '\\' . $rule, -\strlen('\\' . $rule)) === 0) { + $matching[] = \get_class($rector); + } + } + $matching = \array_unique($matching); + if (\count($matching) == 1) { + return $matching[0]; + } + if (\count($matching) > 1) { + \sort($matching); + $message = \sprintf('Short rule name "%s" is ambiguous. Specify the full rule name:' . \PHP_EOL . '- ' . \implode(\PHP_EOL . '- ', $matching), $rule); + throw new RectorRuleNameAmbiguousException($message); + } + if (\strpos($rule, '\\') === \false) { + $message = \sprintf('Rule "%s" was not found.%sThe rule has no namespace. Make sure to escape the backslashes, and add quotes around the rule name: --only="My\\Rector\\Rule"', $rule, \PHP_EOL); + } else { + $message = \sprintf('Rule "%s" was not found.%sMake sure it is registered in your config or in one of the sets', $rule, \PHP_EOL); + } + throw new RectorRuleNotFoundException($message); + } +} diff --git a/vendor/rector/rector/src/Configuration/Option.php b/vendor/rector/rector/src/Configuration/Option.php index f5ea0d23f..ccda97c7f 100644 --- a/vendor/rector/rector/src/Configuration/Option.php +++ b/vendor/rector/rector/src/Configuration/Option.php @@ -80,6 +80,10 @@ final class Option * @var string */ public const CLEAR_CACHE = 'clear-cache'; + /** + * @var string + */ + public const ONLY = 'only'; /** * @internal Use @see \Rector\Config\RectorConfig::parallel() instead * @var string @@ -111,7 +115,7 @@ final class Option */ public const CACHE_DIR = 'cache_dir'; /** - * Cache backend. Most of the time we cache in files, but in ephemeral environment (e.g. CI), a faster `MemoryCacheStorage` can be usefull. + * Cache backend. Most of the time we cache in files, but in ephemeral environment (e.g. CI), a faster `MemoryCacheStorage` can be useful. * @internal Use RectorConfig::cacheClass() instead * * @var class-string @@ -200,6 +204,11 @@ final class Option * @var string */ public const REGISTERED_RECTOR_SETS = 'registered_rector_sets'; + /** + * @internal For verify RectorConfigBuilder instance recreated + * @var string + */ + public const IS_RECTORCONFIG_BUILDER_RECREATED = 'is_rectorconfig_builder_recreated'; /** * @internal For verify skipped rules exists in registered rules * @var string @@ -222,4 +231,31 @@ final class Option * @var string */ public const EDITOR_URL = 'editor_url'; + /** + * @internal To report composer based loaded sets + * @see \Rector\Configuration\RectorConfigBuilder::withComposerBased() + * @var string + */ + public const COMPOSER_BASED_SETS = 'composer_based_sets'; + /** + * @internal To filter files by specific suffix + */ + public const ONLY_SUFFIX = 'only-suffix'; + /** + * @internal To report overflow levels in ->with*Level() methods + */ + public const LEVEL_OVERFLOWS = 'level_overflows'; + /** + * @internal To avoid registering rules via ->withRules(), that are already loaded in sets, + * and keep rector.php clean + */ + public const ROOT_STANDALONE_REGISTERED_RULES = 'root_standalone_registered_rules'; + /** + * @internal The other half of ROOT_STANDALONE_REGISTERED_RULES to compare + */ + public const SET_REGISTERED_RULES = 'set_registered_rules'; + /** + * @internal to allow process file without extension if explicitly registered + */ + public const FILES_WITHOUT_EXTENSION = 'files_without_extension'; } diff --git a/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php b/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php index a7a8d0bbf..8ffca421f 100644 --- a/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php +++ b/vendor/rector/rector/src/Configuration/Parameter/SimpleParameterProvider.php @@ -5,7 +5,7 @@ use Rector\Configuration\Option; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api */ @@ -14,7 +14,7 @@ final class SimpleParameterProvider /** * @var array */ - private static $parameters = []; + private static array $parameters = []; /** * @param Option::* $name * @param mixed $value @@ -62,7 +62,7 @@ public static function provideArrayParameter(string $name) : array }; if ($arrayIsListFunction($parameter)) { // remove duplicates - $uniqueParameters = \array_unique($parameter); + $uniqueParameters = \array_unique($parameter, \SORT_REGULAR); return \array_values($uniqueParameters); } return $parameter; diff --git a/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php b/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php index 0585148ed..cc859df9e 100644 --- a/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php +++ b/vendor/rector/rector/src/Configuration/PhpLevelSetResolver.php @@ -6,7 +6,7 @@ use Rector\Set\ValueObject\SetList; use Rector\Tests\Configuration\PhpLevelSetResolverTest; use Rector\ValueObject\PhpVersion; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see PhpLevelSetResolverTest */ diff --git a/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php b/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php index a4086df15..e03ee849e 100644 --- a/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php +++ b/vendor/rector/rector/src/Configuration/RectorConfigBuilder.php @@ -3,23 +3,29 @@ declare (strict_types=1); namespace Rector\Configuration; -use RectorPrefix202411\Nette\Utils\FileSystem; use Rector\Bridge\SetProviderCollector; use Rector\Bridge\SetRectorsResolver; use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface; +use Rector\Composer\InstalledPackageResolver; use Rector\Config\Level\CodeQualityLevel; +use Rector\Config\Level\CodingStyleLevel; use Rector\Config\Level\DeadCodeLevel; use Rector\Config\Level\TypeDeclarationLevel; use Rector\Config\RectorConfig; use Rector\Config\RegisteredService; use Rector\Configuration\Levels\LevelRulesResolver; +use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Console\Notifier; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Contract\Rector\RectorInterface; use Rector\Doctrine\Set\DoctrineSetList; +use Rector\Enum\Config\Defaults; use Rector\Exception\Configuration\InvalidConfigurationException; use Rector\Php\PhpVersionResolver\ComposerJsonPhpVersionResolver; +use Rector\Php80\Rector\Class_\AnnotationToAttributeRector; +use Rector\Php80\ValueObject\AnnotationToAttribute; use Rector\PHPUnit\Set\PHPUnitSetList; +use Rector\Set\Contract\SetProviderInterface; use Rector\Set\Enum\SetGroup; use Rector\Set\SetManager; use Rector\Set\ValueObject\DowngradeLevelSetList; @@ -28,176 +34,123 @@ use Rector\Symfony\Set\JMSSetList; use Rector\Symfony\Set\SensiolabsSetList; use Rector\Symfony\Set\SymfonySetList; +use Rector\ValueObject\Configuration\LevelOverflow; use Rector\ValueObject\PhpVersion; -use RectorPrefix202411\Symfony\Component\Finder\Finder; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Finder\Finder; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api */ final class RectorConfigBuilder { + /** + * @var int + */ + private const MAX_LEVEL_GAP = 10; /** * @var string[] */ - private $paths = []; + private array $paths = []; /** * @var string[] */ - private $sets = []; + private array $sets = []; /** * @var array */ - private $skip = []; + private array $skip = []; /** * @var array> */ - private $rules = []; + private array $rules = []; /** * @var array, mixed[]> */ - private $rulesWithConfigurations = []; + private array $rulesWithConfigurations = []; /** * @var string[] */ - private $fileExtensions = []; + private array $fileExtensions = []; /** * @var null|class-string */ - private $cacheClass; - /** - * @var string|null - */ - private $cacheDirectory; - /** - * @var string|null - */ - private $containerCacheDirectory; - /** - * @var bool|null - */ - private $parallel; - /** - * @var int - */ - private $parallelTimeoutSeconds = 120; - /** - * @var int - */ - private $parallelMaxNumberOfProcess = 16; - /** - * @var int - */ - private $parallelJobSize = 16; - /** - * @var bool - */ - private $importNames = \false; - /** - * @var bool - */ - private $importDocBlockNames = \false; - /** - * @var bool - */ - private $importShortClasses = \true; - /** - * @var bool - */ - private $removeUnusedImports = \false; - /** - * @var bool - */ - private $noDiffs = \false; - /** - * @var string|null - */ - private $memoryLimit; + private ?string $cacheClass = null; + private ?string $cacheDirectory = null; + private ?string $containerCacheDirectory = null; + private ?bool $parallel = null; + private int $parallelTimeoutSeconds = 120; + private int $parallelMaxNumberOfProcess = Defaults::PARALLEL_MAX_NUMBER_OF_PROCESS; + private int $parallelJobSize = 16; + private bool $importNames = \false; + private bool $importDocBlockNames = \false; + private bool $importShortClasses = \true; + private bool $removeUnusedImports = \false; + private bool $noDiffs = \false; + private ?string $memoryLimit = null; /** * @var string[] */ - private $autoloadPaths = []; + private array $autoloadPaths = []; /** * @var string[] */ - private $bootstrapFiles = []; - /** - * @var string - */ - private $indentChar = ' '; - /** - * @var int - */ - private $indentSize = 4; + private array $bootstrapFiles = []; + private string $indentChar = ' '; + private int $indentSize = 4; /** * @var string[] */ - private $phpstanConfigs = []; + private array $phpstanConfigs = []; /** * @var null|PhpVersion::* */ - private $phpVersion; - /** - * @var string|null - */ - private $symfonyContainerXmlFile; - /** - * @var string|null - */ - private $symfonyContainerPhpFile; + private ?int $phpVersion = null; + private ?string $symfonyContainerXmlFile = null; + private ?string $symfonyContainerPhpFile = null; /** * To make sure type declarations set and level are not duplicated, * as both contain same rules - * @var bool|null - */ - private $isTypeCoverageLevelUsed; - /** - * @var bool|null - */ - private $isDeadCodeLevelUsed; - /** - * @var bool|null */ - private $isCodeQualityLevelUsed; - /** - * @var bool|null - */ - private $isFluentNewLine; + private ?bool $isTypeCoverageLevelUsed = null; + private ?bool $isDeadCodeLevelUsed = null; + private ?bool $isCodeQualityLevelUsed = null; + private ?bool $isCodingStyleLevelUsed = null; + private ?bool $isFluentNewLine = null; /** * @var RegisteredService[] */ - private $registerServices = []; + private array $registerServices = []; /** * @var array */ - private $setGroups = []; - /** - * @var bool|null - */ - private $reportingRealPath; + private array $setGroups = []; + private ?bool $reportingRealPath = null; /** * @var string[] */ - private $groupLoadedSets = []; + private array $groupLoadedSets = []; + private ?string $editorUrl = null; + private ?bool $isWithPhpSetsUsed = null; + private ?bool $isWithPhpLevelUsed = null; /** - * @var string|null + * @var array,bool> */ - private $editorUrl; + private array $setProviders = []; /** - * @api soon to be used - * @var bool|null + * @var LevelOverflow[] */ - private $isWithPhpSetsUsed; - /** - * @var bool|null - */ - private $isWithPhpLevelUsed; + private array $levelOverflows = []; public function __invoke(RectorConfig $rectorConfig) : void { - // @experimental 2024-06 - if ($this->setGroups !== []) { - $setProviderCollector = $rectorConfig->make(SetProviderCollector::class); - $setManager = new SetManager($setProviderCollector); + if ($this->setGroups !== [] || $this->setProviders !== []) { + $setProviderCollector = new SetProviderCollector(\array_map(static fn(string $setProvider): SetProviderInterface => $rectorConfig->make($setProvider), \array_keys($this->setProviders))); + $setManager = new SetManager($setProviderCollector, new InstalledPackageResolver(\getcwd())); $this->groupLoadedSets = $setManager->matchBySetGroups($this->setGroups); + SimpleParameterProvider::addParameter(\Rector\Configuration\Option::COMPOSER_BASED_SETS, $this->groupLoadedSets); + } + // not to miss it by accident + if ($this->isWithPhpSetsUsed === \true) { + $this->sets[] = SetList::PHP_POLYFILLS; } // merge sets together $this->sets = \array_merge($this->sets, $this->groupLoadedSets); @@ -214,9 +167,15 @@ public function __invoke(RectorConfig $rectorConfig) : void if (\in_array(SetList::CODE_QUALITY, $uniqueSets, \true) && $this->isCodeQualityLevelUsed === \true) { throw new InvalidConfigurationException(\sprintf('Your config already enables code quality set.%sRemove "->withCodeQualityLevel()" as it only duplicates it, or remove code quality set.', \PHP_EOL)); } + if (\in_array(SetList::CODING_STYLE, $uniqueSets, \true) && $this->isCodingStyleLevelUsed === \true) { + throw new InvalidConfigurationException(\sprintf('Your config already enables coding style set.%sRemove "->withCodingStyleLevel()" as it only duplicates it, or remove coding style set.', \PHP_EOL)); + } if ($uniqueSets !== []) { $rectorConfig->sets($uniqueSets); } + // log rules from sets and compare them with explicit rules + $setRegisteredRectorClasses = $rectorConfig->getRectorClasses(); + SimpleParameterProvider::addParameter(\Rector\Configuration\Option::SET_REGISTERED_RULES, $setRegisteredRectorClasses); if ($this->paths !== []) { $rectorConfig->paths($this->paths); } @@ -303,6 +262,9 @@ public function __invoke(RectorConfig $rectorConfig) : void if ($this->editorUrl !== null) { $rectorConfig->editorUrl($this->editorUrl); } + if ($this->levelOverflows !== []) { + $rectorConfig->setOverflowLevels($this->levelOverflows); + } } /** * @param string[] $paths @@ -328,45 +290,14 @@ public function withSkipPath(string $skipPath) : self return $this->withSkip([$skipPath]); } /** - * Include PHP files from the root directory, - * typically ecs.php, rector.php etc. + * Include PHP files from the root directory (including hidden ones), + * typically ecs.php, rector.php, .php-cs-fixer.dist.php etc. */ public function withRootFiles() : self { - $gitIgnoreContents = []; - if (\file_exists(\getcwd() . '/.gitignore')) { - $gitIgnoreContents = \array_filter(\iterator_to_array(FileSystem::readLines(\getcwd() . '/.gitignore')), function (string $string) : bool { - $string = \trim($string); - // new line - if ($string === '') { - return \false; - } - // comment - if (\strncmp($string, '#', \strlen('#')) === 0) { - return \false; - } - // normalize - $string = \ltrim($string, '/\\'); - // files in deep directory, no need to be in lists - if (\strpos($string, '/') !== \false || \strpos($string, '\\') !== \false) { - return \false; - } - // only files - return \is_file($string); - }); - // make realpath collection - $gitIgnoreContents = \array_map(function (string $string) : string { - // normalize - $string = \ltrim($string, '/\\'); - return \realpath($string); - }, $gitIgnoreContents); - } - $rootPhpFilesFinder = (new Finder())->files()->in(\getcwd())->depth(0)->name('*.php'); + $rootPhpFilesFinder = (new Finder())->files()->in(\getcwd())->depth(0)->ignoreDotFiles(\false)->ignoreVCSIgnored(\true)->name('*.php')->name('.*.php')->notName('.phpstorm.meta.php'); foreach ($rootPhpFilesFinder as $rootPhpFileFinder) { $path = $rootPhpFileFinder->getRealPath(); - if (\in_array($path, $gitIgnoreContents, \true)) { - continue; - } $this->paths[] = $path; } return $this; @@ -382,11 +313,28 @@ public function withSets(array $sets) : self /** * Upgrade your annotations to attributes */ - public function withAttributesSets(bool $symfony = \false, bool $doctrine = \false, bool $mongoDb = \false, bool $gedmo = \false, bool $phpunit = \false, bool $fosRest = \false, bool $jms = \false, bool $sensiolabs = \false, bool $all = \false) : self + public function withAttributesSets(bool $symfony = \false, bool $doctrine = \false, bool $mongoDb = \false, bool $gedmo = \false, bool $phpunit = \false, bool $fosRest = \false, bool $jms = \false, bool $sensiolabs = \false, bool $behat = \false, bool $all = \false, bool $symfonyRoute = \false, bool $symfonyValidator = \false) : self { + // if nothing is passed, enable all as convention in other method + if (\func_get_args() === []) { + $all = \true; + } if ($symfony || $all) { $this->sets[] = SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES; } + // dx for more granular upgrade + if ($symfonyRoute) { + if ($symfony) { + throw new InvalidConfigurationException('$symfonyRoute is already included in $symfony. Use $symfony only'); + } + $this->withConfiguredRule(AnnotationToAttributeRector::class, [new AnnotationToAttribute('Symfony\\Component\\Routing\\Annotation\\Route')]); + } + if ($symfonyValidator) { + if ($symfony) { + throw new InvalidConfigurationException('$symfonyValidator is already included in $symfony. Use $symfony only'); + } + $this->sets[] = SymfonySetList::SYMFONY_52_VALIDATOR_ATTRIBUTES; + } if ($doctrine || $all) { $this->sets[] = DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES; } @@ -408,15 +356,19 @@ public function withAttributesSets(bool $symfony = \false, bool $doctrine = \fal if ($sensiolabs || $all) { $this->sets[] = SensiolabsSetList::ANNOTATIONS_TO_ATTRIBUTES; } + if ($behat || $all) { + $this->sets[] = SetList::BEHAT_ANNOTATIONS_TO_ATTRIBUTES; + } return $this; } /** + * @deprecated Already included in withPhpSets(), no need to repeat * make use of polyfill packages in composer.json + * @return never */ - public function withPhpPolyfill() : self + public function withPhpPolyfill() { - $this->sets[] = SetList::PHP_POLYFILLS; - return $this; + throw new InvalidConfigurationException(\sprintf('Method "%s()" is deprecated and is now part of ->withPhpSets() to avoid duplications and too granular configuration.', __METHOD__)); } /** * What PHP sets should be applied? By default the same version @@ -424,10 +376,13 @@ public function withPhpPolyfill() : self */ public function withPhpSets(bool $php83 = \false, bool $php82 = \false, bool $php81 = \false, bool $php80 = \false, bool $php74 = \false, bool $php73 = \false, bool $php72 = \false, bool $php71 = \false, bool $php70 = \false, bool $php56 = \false, bool $php55 = \false, bool $php54 = \false, bool $php53 = \false, bool $php84 = \false) : self { + if ($this->isWithPhpSetsUsed === \true) { + throw new InvalidConfigurationException(\sprintf('Method "%s()" can be called only once. It always includes all previous sets UP TO the defined version.%sThe best practise is to call it once with no argument. That way it will pick up PHP version from composer.json and your project will always stay up to date.', __METHOD__, \PHP_EOL)); + } $this->isWithPhpSetsUsed = \true; $pickedArguments = \array_filter(\func_get_args()); if ($pickedArguments !== []) { - Notifier::notifyWithPhpSetsNotSuitableForPHP80(); + Notifier::errorWithPhpSetsNotSuitableForPHP74AndLower(); } if (\count($pickedArguments) > 1) { throw new InvalidConfigurationException(\sprintf('Pick only one version target in "withPhpSets()". All rules up to this version will be used.%sTo use your composer.json PHP version, keep arguments empty.', \PHP_EOL)); @@ -551,79 +506,24 @@ public function withPhp74Sets() : self } // there is no withPhp80Sets() and above, // as we already use PHP 8.0 and should go with withPhpSets() instead - public function withPreparedSets( - bool $deadCode = \false, - bool $codeQuality = \false, - bool $codingStyle = \false, - bool $typeDeclarations = \false, - bool $privatization = \false, - bool $naming = \false, - bool $instanceOf = \false, - bool $earlyReturn = \false, - bool $strictBooleans = \false, - bool $carbon = \false, - bool $rectorPreset = \false, - bool $phpunitCodeQuality = \false, - bool $doctrineCodeQuality = \false, - bool $symfonyCodeQuality = \false, - bool $symfonyConfigs = \false, - // composer based - bool $twig = \false, - bool $phpunit = \false - ) : self + public function withPreparedSets(bool $deadCode = \false, bool $codeQuality = \false, bool $codingStyle = \false, bool $typeDeclarations = \false, bool $privatization = \false, bool $naming = \false, bool $instanceOf = \false, bool $earlyReturn = \false, bool $strictBooleans = \false, bool $carbon = \false, bool $rectorPreset = \false, bool $phpunitCodeQuality = \false, bool $doctrineCodeQuality = \false, bool $symfonyCodeQuality = \false, bool $symfonyConfigs = \false) : self { Notifier::notifyNotSuitableMethodForPHP74(__METHOD__); - if ($deadCode) { - $this->sets[] = SetList::DEAD_CODE; - } - if ($codeQuality) { - $this->sets[] = SetList::CODE_QUALITY; - } - if ($codingStyle) { - $this->sets[] = SetList::CODING_STYLE; - } - if ($typeDeclarations) { - $this->sets[] = SetList::TYPE_DECLARATION; - } - if ($privatization) { - $this->sets[] = SetList::PRIVATIZATION; - } - if ($naming) { - $this->sets[] = SetList::NAMING; - } - if ($instanceOf) { - $this->sets[] = SetList::INSTANCEOF; - } - if ($earlyReturn) { - $this->sets[] = SetList::EARLY_RETURN; - } - if ($strictBooleans) { - $this->sets[] = SetList::STRICT_BOOLEANS; - } - if ($carbon) { - $this->sets[] = SetList::CARBON; - } - if ($rectorPreset) { - $this->sets[] = SetList::RECTOR_PRESET; - } - if ($phpunitCodeQuality) { - $this->sets[] = PHPUnitSetList::PHPUNIT_CODE_QUALITY; - } - if ($doctrineCodeQuality) { - $this->sets[] = DoctrineSetList::DOCTRINE_CODE_QUALITY; - } - if ($symfonyCodeQuality) { - $this->sets[] = SymfonySetList::SYMFONY_CODE_QUALITY; - } - if ($symfonyConfigs) { - $this->sets[] = SymfonySetList::CONFIGS; - } - // @experimental 2024-06 - if ($twig) { - $this->setGroups[] = SetGroup::TWIG; + $setMap = [SetList::DEAD_CODE => $deadCode, SetList::CODE_QUALITY => $codeQuality, SetList::CODING_STYLE => $codingStyle, SetList::TYPE_DECLARATION => $typeDeclarations, SetList::PRIVATIZATION => $privatization, SetList::NAMING => $naming, SetList::INSTANCEOF => $instanceOf, SetList::EARLY_RETURN => $earlyReturn, SetList::STRICT_BOOLEANS => $strictBooleans, SetList::CARBON => $carbon, SetList::RECTOR_PRESET => $rectorPreset, PHPUnitSetList::PHPUNIT_CODE_QUALITY => $phpunitCodeQuality, DoctrineSetList::DOCTRINE_CODE_QUALITY => $doctrineCodeQuality, SymfonySetList::SYMFONY_CODE_QUALITY => $symfonyCodeQuality, SymfonySetList::CONFIGS => $symfonyConfigs]; + foreach ($setMap as $setPath => $isEnabled) { + if ($isEnabled) { + $this->sets[] = $setPath; + } } - if ($phpunit) { - $this->setGroups[] = SetGroup::PHPUNIT; + return $this; + } + public function withComposerBased(bool $twig = \false, bool $doctrine = \false, bool $phpunit = \false, bool $symfony = \false, bool $netteUtils = \false) : self + { + $setMap = [SetGroup::TWIG => $twig, SetGroup::DOCTRINE => $doctrine, SetGroup::PHPUNIT => $phpunit, SetGroup::SYMFONY => $symfony, SetGroup::NETTE_UTILS => $netteUtils]; + foreach ($setMap as $setPath => $isEnabled) { + if ($isEnabled) { + $this->setGroups[] = $setPath; + } } return $this; } @@ -633,6 +533,12 @@ public function withPreparedSets( public function withRules(array $rules) : self { $this->rules = \array_merge($this->rules, $rules); + if (SimpleParameterProvider::provideBoolParameter(\Rector\Configuration\Option::IS_RECTORCONFIG_BUILDER_RECREATED, \false) === \false) { + // log all explicitly registered rules on root rector.php + // we only check the non-configurable rules, as the configurable ones might override them + $nonConfigurableRules = \array_filter($rules, fn(string $rule): bool => !\is_a($rule, ConfigurableRectorInterface::class, \true)); + SimpleParameterProvider::addParameter(\Rector\Configuration\Option::ROOT_STANDALONE_REGISTERED_RULES, $nonConfigurableRules); + } return $this; } /** @@ -739,40 +645,56 @@ public function withPhpVersion(int $phpVersion) : self } public function withSymfonyContainerXml(string $symfonyContainerXmlFile) : self { + if (\substr_compare($symfonyContainerXmlFile, '.xml', -\strlen('.xml')) !== 0) { + throw new InvalidConfigurationException(\sprintf('Provided dumped Symfony container must have "xml" suffix. "%s" given', $symfonyContainerXmlFile)); + } $this->symfonyContainerXmlFile = $symfonyContainerXmlFile; return $this; } public function withSymfonyContainerPhp(string $symfonyContainerPhpFile) : self { + if (\substr_compare($symfonyContainerPhpFile, '.php', -\strlen('.php')) !== 0) { + throw new InvalidConfigurationException(\sprintf('Provided dumped Symfony container must have "php" suffix. "%s" given', $symfonyContainerPhpFile)); + } $this->symfonyContainerPhpFile = $symfonyContainerPhpFile; return $this; } /** - * @experimental since 0.19.7 Raise your dead-code coverage from the safest rules + * Raise your type coverage from the safest type rules * to more affecting ones, one level at a time */ - public function withDeadCodeLevel(int $level) : self + public function withTypeCoverageLevel(int $level) : self { Assert::natural($level); - $this->isDeadCodeLevelUsed = \true; - $levelRules = LevelRulesResolver::resolve($level, DeadCodeLevel::RULES, __METHOD__); + $this->isTypeCoverageLevelUsed = \true; + $levelRules = LevelRulesResolver::resolve($level, TypeDeclarationLevel::RULES, __METHOD__); + // too high + $levelRulesCount = \count($levelRules); + if ($levelRulesCount + self::MAX_LEVEL_GAP < $level) { + $this->levelOverflows[] = new LevelOverflow('withTypeCoverageLevel', $level, $levelRulesCount, 'typeDeclarations', 'TYPE_DECLARATION'); + } $this->rules = \array_merge($this->rules, $levelRules); return $this; } /** - * @experimental since 0.19.7 Raise your type coverage from the safest type rules + * Raise your dead-code coverage from the safest rules * to more affecting ones, one level at a time */ - public function withTypeCoverageLevel(int $level) : self + public function withDeadCodeLevel(int $level) : self { Assert::natural($level); - $this->isTypeCoverageLevelUsed = \true; - $levelRules = LevelRulesResolver::resolve($level, TypeDeclarationLevel::RULES, __METHOD__); + $this->isDeadCodeLevelUsed = \true; + $levelRules = LevelRulesResolver::resolve($level, DeadCodeLevel::RULES, __METHOD__); + // too high + $levelRulesCount = \count($levelRules); + if ($levelRulesCount + self::MAX_LEVEL_GAP < $level) { + $this->levelOverflows[] = new LevelOverflow('withDeadCodeLevel', $level, $levelRulesCount, 'deadCode', 'DEAD_CODE'); + } $this->rules = \array_merge($this->rules, $levelRules); return $this; } /** - * @experimental Since 1.2.5 Raise your PHP level from, one level at a time + * Raise your PHP level from, one level at a time */ public function withPhpLevel(int $level) : self { @@ -783,7 +705,7 @@ public function withPhpLevel(int $level) : self $setFilePaths = \Rector\Configuration\PhpLevelSetResolver::resolveFromPhpVersion($phpVersion); $rectorRulesWithConfiguration = $setRectorsResolver->resolveFromFilePathsIncludingConfiguration($setFilePaths); foreach ($rectorRulesWithConfiguration as $position => $rectorRuleWithConfiguration) { - // add rules untill level is reached + // add rules until level is reached if ($position > $level) { continue; } @@ -799,7 +721,7 @@ public function withPhpLevel(int $level) : self return $this; } /** - * @experimental Raise your code quality from the safest rules + * Raise your code quality from the safest rules * to more affecting ones, one level at a time */ public function withCodeQualityLevel(int $level) : self @@ -807,12 +729,37 @@ public function withCodeQualityLevel(int $level) : self Assert::natural($level); $this->isCodeQualityLevelUsed = \true; $levelRules = LevelRulesResolver::resolve($level, CodeQualityLevel::RULES, __METHOD__); + // too high + $levelRulesCount = \count($levelRules); + if ($levelRulesCount + self::MAX_LEVEL_GAP < $level) { + $this->levelOverflows[] = new LevelOverflow('withCodeQualityLevel', $level, $levelRulesCount, 'codeQuality', 'CODE_QUALITY'); + } $this->rules = \array_merge($this->rules, $levelRules); foreach (CodeQualityLevel::RULES_WITH_CONFIGURATION as $rectorClass => $configuration) { $this->rulesWithConfigurations[$rectorClass][] = $configuration; } return $this; } + /** + * Raise your coding style from the safest rules + * to more affecting ones, one level at a time + */ + public function withCodingStyleLevel(int $level) : self + { + Assert::natural($level); + $this->isCodingStyleLevelUsed = \true; + $levelRules = LevelRulesResolver::resolve($level, CodingStyleLevel::RULES, __METHOD__); + // too high + $levelRulesCount = \count($levelRules); + if ($levelRulesCount + self::MAX_LEVEL_GAP < $level) { + $this->levelOverflows[] = new LevelOverflow('withCodingStyleLevel', $level, $levelRulesCount, 'codingStyle', 'CODING_STYLE'); + } + $this->rules = \array_merge($this->rules, $levelRules); + foreach (CodingStyleLevel::RULES_WITH_CONFIGURATION as $rectorClass => $configuration) { + $this->rulesWithConfigurations[$rectorClass][] = $configuration; + } + return $this; + } public function withFluentCallNewLine(bool $isFluentNewLine = \true) : self { $this->isFluentNewLine = $isFluentNewLine; @@ -831,23 +778,17 @@ public function withDowngradeSets(bool $php82 = \false, bool $php81 = \false, bo } if ($php82) { $this->sets[] = DowngradeLevelSetList::DOWN_TO_PHP_82; - } - if ($php81) { + } elseif ($php81) { $this->sets[] = DowngradeLevelSetList::DOWN_TO_PHP_81; - } - if ($php80) { + } elseif ($php80) { $this->sets[] = DowngradeLevelSetList::DOWN_TO_PHP_80; - } - if ($php74) { + } elseif ($php74) { $this->sets[] = DowngradeLevelSetList::DOWN_TO_PHP_74; - } - if ($php73) { + } elseif ($php73) { $this->sets[] = DowngradeLevelSetList::DOWN_TO_PHP_73; - } - if ($php72) { + } elseif ($php72) { $this->sets[] = DowngradeLevelSetList::DOWN_TO_PHP_72; - } - if ($php71) { + } elseif ($php71) { $this->sets[] = DowngradeLevelSetList::DOWN_TO_PHP_71; } return $this; @@ -862,4 +803,20 @@ public function withEditorUrl(string $editorUrl) : self $this->editorUrl = $editorUrl; return $this; } + /** + * @param class-string ...$setProviders + */ + public function withSetProviders(string ...$setProviders) : self + { + foreach ($setProviders as $setProvider) { + if (\array_key_exists($setProvider, $this->setProviders)) { + continue; + } + if (!\is_a($setProvider, SetProviderInterface::class, \true)) { + throw new InvalidConfigurationException(\sprintf('Set provider "%s" must implement "%s"', $setProvider, SetProviderInterface::class)); + } + $this->setProviders[$setProvider] = \true; + } + return $this; + } } diff --git a/vendor/rector/rector/src/Configuration/RenamedClassesDataCollector.php b/vendor/rector/rector/src/Configuration/RenamedClassesDataCollector.php index f85573cd3..b018fa2a2 100644 --- a/vendor/rector/rector/src/Configuration/RenamedClassesDataCollector.php +++ b/vendor/rector/rector/src/Configuration/RenamedClassesDataCollector.php @@ -10,7 +10,7 @@ final class RenamedClassesDataCollector implements ResetableInterface /** * @var array */ - private $oldToNewClasses = []; + private array $oldToNewClasses = []; public function reset() : void { $this->oldToNewClasses = []; diff --git a/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php b/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php index c248958dc..d38721e08 100644 --- a/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php +++ b/vendor/rector/rector/src/Console/Command/CustomRuleCommand.php @@ -7,23 +7,22 @@ use DOMElement; use DOMXPath; use Generator; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\Exception\ShouldNotHappenException; use Rector\FileSystem\JsonFileSystem; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202411\Symfony\Component\Finder\Finder; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Finder\Finder; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; final class CustomRuleCommand extends Command { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @see https://regex101.com/r/2eP4rw/1 * @var string diff --git a/vendor/rector/rector/src/Console/Command/ListRulesCommand.php b/vendor/rector/rector/src/Console/Command/ListRulesCommand.php index 2de98e3cd..3feab5f15 100644 --- a/vendor/rector/rector/src/Console/Command/ListRulesCommand.php +++ b/vendor/rector/rector/src/Console/Command/ListRulesCommand.php @@ -3,41 +3,51 @@ declare (strict_types=1); namespace Rector\Console\Command; -use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\Json; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; +use Rector\Configuration\ConfigurationRuleFilter; +use Rector\Configuration\OnlyRuleResolver; use Rector\Configuration\Option; use Rector\Contract\Rector\RectorInterface; use Rector\PostRector\Contract\Rector\PostRectorInterface; use Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class ListRulesCommand extends Command { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @readonly - * @var \Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver */ - private $skippedClassResolver; + private SkippedClassResolver $skippedClassResolver; + /** + * @readonly + */ + private OnlyRuleResolver $onlyRuleResolver; + /** + * @readonly + */ + private ConfigurationRuleFilter $configurationRuleFilter; /** * @var RectorInterface[] * @readonly */ - private $rectors; + private array $rectors; /** * @param RectorInterface[] $rectors */ - public function __construct(SymfonyStyle $symfonyStyle, SkippedClassResolver $skippedClassResolver, array $rectors) + public function __construct(SymfonyStyle $symfonyStyle, SkippedClassResolver $skippedClassResolver, OnlyRuleResolver $onlyRuleResolver, ConfigurationRuleFilter $configurationRuleFilter, array $rectors) { $this->symfonyStyle = $symfonyStyle; $this->skippedClassResolver = $skippedClassResolver; + $this->onlyRuleResolver = $onlyRuleResolver; + $this->configurationRuleFilter = $configurationRuleFilter; $this->rectors = $rectors; parent::__construct(); } @@ -47,10 +57,15 @@ protected function configure() : void $this->setDescription('Show loaded Rectors'); $this->setAliases(['show-rules']); $this->addOption(Option::OUTPUT_FORMAT, null, InputOption::VALUE_REQUIRED, 'Select output format', ConsoleOutputFormatter::NAME); + $this->addOption(Option::ONLY, null, InputOption::VALUE_REQUIRED, 'Fully qualified rule class name'); } protected function execute(InputInterface $input, OutputInterface $output) : int { - $rectorClasses = $this->resolveRectorClasses(); + $onlyRule = $input->getOption(Option::ONLY); + if ($onlyRule !== null) { + $onlyRule = $this->onlyRuleResolver->resolve($onlyRule); + } + $rectorClasses = $this->resolveRectorClasses($onlyRule); $skippedClasses = $this->getSkippedCheckers(); $outputFormat = $input->getOption(Option::OUTPUT_FORMAT); if ($outputFormat === 'json') { @@ -71,14 +86,13 @@ protected function execute(InputInterface $input, OutputInterface $output) : int /** * @return array> */ - private function resolveRectorClasses() : array + private function resolveRectorClasses(?string $onlyRule) : array { - $customRectors = \array_filter($this->rectors, static function (RectorInterface $rector) : bool { - return !$rector instanceof PostRectorInterface; - }); - $rectorClasses = \array_map(static function (RectorInterface $rector) : string { - return \get_class($rector); - }, $customRectors); + $customRectors = \array_filter($this->rectors, static fn(RectorInterface $rector): bool => !$rector instanceof PostRectorInterface); + if ($onlyRule !== null) { + $customRectors = $this->configurationRuleFilter->filterOnlyRule($customRectors, $onlyRule); + } + $rectorClasses = \array_map(static fn(RectorInterface $rector): string => \get_class($rector), $customRectors); \sort($rectorClasses); return \array_unique($rectorClasses); } diff --git a/vendor/rector/rector/src/Console/Command/ProcessCommand.php b/vendor/rector/rector/src/Console/Command/ProcessCommand.php index 173b77f68..61da9fc0d 100644 --- a/vendor/rector/rector/src/Console/Command/ProcessCommand.php +++ b/vendor/rector/rector/src/Console/Command/ProcessCommand.php @@ -9,7 +9,9 @@ use Rector\ChangesReporting\Output\JsonOutputFormatter; use Rector\Configuration\ConfigInitializer; use Rector\Configuration\ConfigurationFactory; +use Rector\Configuration\ConfigurationRuleFilter; use Rector\Configuration\Option; +use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Console\ExitCode; use Rector\Console\Output\OutputFormatterCollector; use Rector\Console\ProcessConfigureDecorator; @@ -19,70 +21,64 @@ use Rector\StaticReflection\DynamicSourceLocatorDecorator; use Rector\Util\MemoryLimiter; use Rector\ValueObject\Configuration; +use Rector\ValueObject\Configuration\LevelOverflow; use Rector\ValueObject\ProcessResult; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class ProcessCommand extends Command { /** * @readonly - * @var \Rector\Autoloading\AdditionalAutoloader */ - private $additionalAutoloader; + private AdditionalAutoloader $additionalAutoloader; /** * @readonly - * @var \Rector\Caching\Detector\ChangedFilesDetector */ - private $changedFilesDetector; + private ChangedFilesDetector $changedFilesDetector; /** * @readonly - * @var \Rector\Configuration\ConfigInitializer */ - private $configInitializer; + private ConfigInitializer $configInitializer; /** * @readonly - * @var \Rector\Application\ApplicationFileProcessor */ - private $applicationFileProcessor; + private ApplicationFileProcessor $applicationFileProcessor; /** * @readonly - * @var \Rector\StaticReflection\DynamicSourceLocatorDecorator */ - private $dynamicSourceLocatorDecorator; + private DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator; /** * @readonly - * @var \Rector\Console\Output\OutputFormatterCollector */ - private $outputFormatterCollector; + private OutputFormatterCollector $outputFormatterCollector; /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @readonly - * @var \Rector\Util\MemoryLimiter */ - private $memoryLimiter; + private MemoryLimiter $memoryLimiter; /** * @readonly - * @var \Rector\Configuration\ConfigurationFactory */ - private $configurationFactory; + private ConfigurationFactory $configurationFactory; /** * @readonly - * @var \Rector\Reporting\DeprecatedRulesReporter */ - private $deprecatedRulesReporter; + private DeprecatedRulesReporter $deprecatedRulesReporter; /** * @readonly - * @var \Rector\Reporting\MissConfigurationReporter */ - private $missConfigurationReporter; - public function __construct(AdditionalAutoloader $additionalAutoloader, ChangedFilesDetector $changedFilesDetector, ConfigInitializer $configInitializer, ApplicationFileProcessor $applicationFileProcessor, DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator, OutputFormatterCollector $outputFormatterCollector, SymfonyStyle $symfonyStyle, MemoryLimiter $memoryLimiter, ConfigurationFactory $configurationFactory, DeprecatedRulesReporter $deprecatedRulesReporter, MissConfigurationReporter $missConfigurationReporter) + private MissConfigurationReporter $missConfigurationReporter; + /** + * @readonly + */ + private ConfigurationRuleFilter $configurationRuleFilter; + public function __construct(AdditionalAutoloader $additionalAutoloader, ChangedFilesDetector $changedFilesDetector, ConfigInitializer $configInitializer, ApplicationFileProcessor $applicationFileProcessor, DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator, OutputFormatterCollector $outputFormatterCollector, SymfonyStyle $symfonyStyle, MemoryLimiter $memoryLimiter, ConfigurationFactory $configurationFactory, DeprecatedRulesReporter $deprecatedRulesReporter, MissConfigurationReporter $missConfigurationReporter, ConfigurationRuleFilter $configurationRuleFilter) { $this->additionalAutoloader = $additionalAutoloader; $this->changedFilesDetector = $changedFilesDetector; @@ -95,6 +91,7 @@ public function __construct(AdditionalAutoloader $additionalAutoloader, ChangedF $this->configurationFactory = $configurationFactory; $this->deprecatedRulesReporter = $deprecatedRulesReporter; $this->missConfigurationReporter = $missConfigurationReporter; + $this->configurationRuleFilter = $configurationRuleFilter; parent::__construct(); } protected function configure() : void @@ -131,16 +128,25 @@ protected function execute(InputInterface $input, OutputInterface $output) : int } $configuration = $this->configurationFactory->createFromInput($input); $this->memoryLimiter->adjust($configuration); + $this->configurationRuleFilter->setConfiguration($configuration); // disable console output in case of json output formatter if ($configuration->getOutputFormat() === JsonOutputFormatter::NAME) { $this->symfonyStyle->setVerbosity(OutputInterface::VERBOSITY_QUIET); } $this->additionalAutoloader->autoloadInput($input); - $this->additionalAutoloader->autoloadPaths(); $paths = $configuration->getPaths(); - // 1. add files and directories to static locator + // 0. warn about too high levels + foreach ($configuration->getLevelOverflows() as $levelOverflow) { + $this->reportLevelOverflow($levelOverflow); + } + // 1. warn about rules registered in both withRules() and sets to avoid bloated rector.php configs + $setAndRulesDuplicatedRegistrations = $configuration->getBothSetAndRulesDuplicatedRegistrations(); + if ($setAndRulesDuplicatedRegistrations !== []) { + $this->symfonyStyle->warning(\sprintf('These rules are registered in both sets and "withRules()". Remove them from "withRules()" to avoid duplications: %s* %s', \PHP_EOL . \PHP_EOL, \implode(' * ', $setAndRulesDuplicatedRegistrations) . \PHP_EOL)); + } + // 2. add files and directories to static locator $this->dynamicSourceLocatorDecorator->addPaths($paths); - if ($this->dynamicSourceLocatorDecorator->isPathsEmpty()) { + if ($this->dynamicSourceLocatorDecorator->arePathsEmpty()) { // read from rector.php, no paths definition needs withPaths() config if ($paths === []) { $this->symfonyStyle->error('No paths definition in rector configuration, define paths: https://getrector.com/documentation/define-paths'); @@ -151,6 +157,16 @@ protected function execute(InputInterface $input, OutputInterface $output) : int $this->symfonyStyle->error(\sprintf('The following given path%s do%s not match any file%s or director%s: %s%s', $isSingular ? '' : 's', $isSingular ? 'es' : '', $isSingular ? '' : 's', $isSingular ? 'y' : 'ies', \PHP_EOL . \PHP_EOL . ' - ', \implode(\PHP_EOL . ' - ', $paths))); return ExitCode::FAILURE; } + // autoload paths is register to DynamicSourceLocatorProvider, + // so check after arePathsEmpty() above + // check in no parallel since parallel will require register on its own process + if (!$configuration->isParallel()) { + $this->additionalAutoloader->autoloadPaths(); + } + // show debug info + if ($configuration->isDebug()) { + $this->reportLoadedComposerBasedSets(); + } // MAIN PHASE // 2. run Rector $processResult = $this->applicationFileProcessor->run($configuration, $input); @@ -199,4 +215,21 @@ private function resolveReturnCode(ProcessResult $processResult, Configuration $ } return ExitCode::SUCCESS; } + private function reportLoadedComposerBasedSets() : void + { + if (!SimpleParameterProvider::hasParameter(Option::COMPOSER_BASED_SETS)) { + return; + } + $composerBasedSets = SimpleParameterProvider::provideArrayParameter(Option::COMPOSER_BASED_SETS); + if ($composerBasedSets === []) { + return; + } + $this->symfonyStyle->writeln('[info] Sets loaded based on installed packages:'); + $this->symfonyStyle->listing($composerBasedSets); + } + private function reportLevelOverflow(LevelOverflow $levelOverflow) : void + { + $suggestedSetMethod = \PHP_VERSION_ID >= 80000 ? \sprintf('->withPreparedSets(%s: true)', $levelOverflow->getSuggestedRuleset()) : \sprintf('->withSets(SetList::%s)', $levelOverflow->getSuggestedSetListConstant()); + $this->symfonyStyle->warning(\sprintf('The "->%s()" level contains only %d rules, but you set level to %d.%sYou are using the full set now! Time to switch to more efficient "%s".', $levelOverflow->getConfigurationName(), $levelOverflow->getRuleCount(), $levelOverflow->getLevel(), \PHP_EOL, $suggestedSetMethod)); + } } diff --git a/vendor/rector/rector/src/Console/Command/SetupCICommand.php b/vendor/rector/rector/src/Console/Command/SetupCICommand.php index 4ee94f035..25ef5325b 100644 --- a/vendor/rector/rector/src/Console/Command/SetupCICommand.php +++ b/vendor/rector/rector/src/Console/Command/SetupCICommand.php @@ -3,21 +3,20 @@ declare (strict_types=1); namespace Rector\Console\Command; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\OndraM\CiDetector\CiDetector; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\OndraM\CiDetector\CiDetector; use Rector\Git\RepositoryHelper; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; use function sprintf; final class SetupCICommand extends Command { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; public function __construct(SymfonyStyle $symfonyStyle) { $this->symfonyStyle = $symfonyStyle; @@ -38,7 +37,7 @@ protected function execute(InputInterface $input, OutputInterface $output) : int if ($ci === CiDetector::CI_GITHUB_ACTIONS) { return $this->handleGithubActions(); } - $noteMessage = sprintf('Only Github and GitLab are currently supported.%s Contribute your CI template to Rector to make this work: %s', \PHP_EOL, 'https://github.com/rectorphp/rector-src/'); + $noteMessage = sprintf('Only GitHub and GitLab are currently supported.%s Contribute your CI template to Rector to make this work: %s', \PHP_EOL, 'https://github.com/rectorphp/rector-src/'); $this->symfonyStyle->note($noteMessage); return self::SUCCESS; } diff --git a/vendor/rector/rector/src/Console/Command/WorkerCommand.php b/vendor/rector/rector/src/Console/Command/WorkerCommand.php index e51989759..618850889 100644 --- a/vendor/rector/rector/src/Console/Command/WorkerCommand.php +++ b/vendor/rector/rector/src/Console/Command/WorkerCommand.php @@ -3,27 +3,29 @@ declare (strict_types=1); namespace Rector\Console\Command; -use RectorPrefix202411\Clue\React\NDJson\Decoder; -use RectorPrefix202411\Clue\React\NDJson\Encoder; -use RectorPrefix202411\React\EventLoop\StreamSelectLoop; -use RectorPrefix202411\React\Socket\ConnectionInterface; -use RectorPrefix202411\React\Socket\TcpConnector; +use RectorPrefix202506\Clue\React\NDJson\Decoder; +use RectorPrefix202506\Clue\React\NDJson\Encoder; +use RectorPrefix202506\React\EventLoop\StreamSelectLoop; +use RectorPrefix202506\React\Socket\ConnectionInterface; +use RectorPrefix202506\React\Socket\TcpConnector; use Rector\Application\ApplicationFileProcessor; +use Rector\Autoloading\AdditionalAutoloader; use Rector\Configuration\ConfigurationFactory; +use Rector\Configuration\ConfigurationRuleFilter; use Rector\Console\ProcessConfigureDecorator; use Rector\Parallel\ValueObject\Bridge; use Rector\StaticReflection\DynamicSourceLocatorDecorator; use Rector\Util\MemoryLimiter; use Rector\ValueObject\Configuration; use Rector\ValueObject\Error\SystemError; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symplify\EasyParallel\Enum\Action; -use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactCommand; -use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactEvent; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symplify\EasyParallel\Enum\Action; +use RectorPrefix202506\Symplify\EasyParallel\Enum\ReactCommand; +use RectorPrefix202506\Symplify\EasyParallel\Enum\ReactEvent; use Throwable; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\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 @@ -35,34 +37,40 @@ final class WorkerCommand extends Command { /** * @readonly - * @var \Rector\StaticReflection\DynamicSourceLocatorDecorator */ - private $dynamicSourceLocatorDecorator; + private AdditionalAutoloader $additionalAutoloader; /** * @readonly - * @var \Rector\Application\ApplicationFileProcessor */ - private $applicationFileProcessor; + private DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator; /** * @readonly - * @var \Rector\Util\MemoryLimiter */ - private $memoryLimiter; + private ApplicationFileProcessor $applicationFileProcessor; /** * @readonly - * @var \Rector\Configuration\ConfigurationFactory */ - private $configurationFactory; + private MemoryLimiter $memoryLimiter; + /** + * @readonly + */ + private ConfigurationFactory $configurationFactory; + /** + * @readonly + */ + private ConfigurationRuleFilter $configurationRuleFilter; /** * @var string */ private const RESULT = 'result'; - public function __construct(DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator, ApplicationFileProcessor $applicationFileProcessor, MemoryLimiter $memoryLimiter, ConfigurationFactory $configurationFactory) + public function __construct(AdditionalAutoloader $additionalAutoloader, DynamicSourceLocatorDecorator $dynamicSourceLocatorDecorator, ApplicationFileProcessor $applicationFileProcessor, MemoryLimiter $memoryLimiter, ConfigurationFactory $configurationFactory, ConfigurationRuleFilter $configurationRuleFilter) { + $this->additionalAutoloader = $additionalAutoloader; $this->dynamicSourceLocatorDecorator = $dynamicSourceLocatorDecorator; $this->applicationFileProcessor = $applicationFileProcessor; $this->memoryLimiter = $memoryLimiter; $this->configurationFactory = $configurationFactory; + $this->configurationRuleFilter = $configurationRuleFilter; parent::__construct(); } protected function configure() : void @@ -76,6 +84,7 @@ protected function execute(InputInterface $input, OutputInterface $output) : int { $configuration = $this->configurationFactory->createFromInput($input); $this->memoryLimiter->adjust($configuration); + $this->configurationRuleFilter->setConfiguration($configuration); $streamSelectLoop = new StreamSelectLoop(); $parallelIdentifier = $configuration->getParallelIdentifier(); $tcpConnector = new TcpConnector($streamSelectLoop); @@ -91,6 +100,7 @@ protected function execute(InputInterface $input, OutputInterface $output) : int } private function runWorker(Encoder $encoder, Decoder $decoder, Configuration $configuration, OutputInterface $output) : void { + $this->additionalAutoloader->autoloadPaths(); $this->dynamicSourceLocatorDecorator->addPaths($configuration->getPaths()); if ($configuration->isDebug()) { $preFileCallback = static function (string $filePath) use($output) : void { diff --git a/vendor/rector/rector/src/Console/ConsoleApplication.php b/vendor/rector/rector/src/Console/ConsoleApplication.php index f921daee5..8f36de39c 100644 --- a/vendor/rector/rector/src/Console/ConsoleApplication.php +++ b/vendor/rector/rector/src/Console/ConsoleApplication.php @@ -3,17 +3,18 @@ declare (strict_types=1); namespace Rector\Console; -use RectorPrefix202411\Composer\XdebugHandler\XdebugHandler; +use RectorPrefix202506\Composer\XdebugHandler\XdebugHandler; use Rector\Application\VersionResolver; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use Rector\Configuration\Option; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use Rector\Util\Reflection\PrivatesAccessor; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Webmozart\Assert\Assert; final class ConsoleApplication extends Application { /** @@ -50,6 +51,15 @@ public function doRun(InputInterface $input, OutputInterface $output) : int if ($shouldFollowByNewline) { $output->write(\PHP_EOL); } + $commandName = $input->getFirstArgument(); + // if paths exist + if (\is_string($commandName) && \file_exists($commandName)) { + // prepend command name if implicit + $privatesAccessor = new PrivatesAccessor(); + $tokens = $privatesAccessor->getPrivateProperty($input, 'tokens'); + $tokens = \array_merge(['process'], $tokens); + $privatesAccessor->setPrivateProperty($input, 'tokens', $tokens); + } return parent::doRun($input, $output); } protected function getDefaultInputDefinition() : InputDefinition diff --git a/vendor/rector/rector/src/Console/ExitCode.php b/vendor/rector/rector/src/Console/ExitCode.php index a87e73d6e..7e04a0f3c 100644 --- a/vendor/rector/rector/src/Console/ExitCode.php +++ b/vendor/rector/rector/src/Console/ExitCode.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Console; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; /** * @api */ diff --git a/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php b/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php index 7ce6611f1..3c81f29bc 100644 --- a/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php +++ b/vendor/rector/rector/src/Console/Formatter/ColorConsoleDiffFormatter.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\Console\Formatter; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\Util\NewLineSplitter; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; /** * Inspired by @see https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/master/src/Differ/DiffConsoleFormatter.php to be * used as standalone class, without need to require whole package by Dariusz Rumiński @@ -23,7 +23,7 @@ final class ColorConsoleDiffFormatter * @var string * @see https://regex101.com/r/xwywpa/1 */ - private const MINUT_START_REGEX = '#^(\\-.*)#'; + private const MINUS_START_REGEX = '#^(\\-.*)#'; /** * @var string * @see https://regex101.com/r/CMlwa8/1 @@ -31,9 +31,8 @@ final class ColorConsoleDiffFormatter private const AT_START_REGEX = '#^(@.*)#'; /** * @readonly - * @var string */ - private $template; + private string $template; public function __construct() { $this->template = \sprintf(' ---------- begin diff ----------%s%%s%s ----------- end diff -----------' . \PHP_EOL, \PHP_EOL, \PHP_EOL); @@ -72,7 +71,7 @@ private function makePlusLinesGreen(string $string) : string } private function makeMinusLinesRed(string $string) : string { - return Strings::replace($string, self::MINUT_START_REGEX, '$1'); + return Strings::replace($string, self::MINUS_START_REGEX, '$1'); } private function makeAtNoteCyan(string $string) : string { diff --git a/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php b/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php index 51bcfabc6..d7f11a039 100644 --- a/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php +++ b/vendor/rector/rector/src/Console/Formatter/ConsoleDiffer.php @@ -3,20 +3,18 @@ declare (strict_types=1); namespace Rector\Console\Formatter; -use RectorPrefix202411\SebastianBergmann\Diff\Differ; -use RectorPrefix202411\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; +use RectorPrefix202506\SebastianBergmann\Diff\Differ; +use RectorPrefix202506\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; final class ConsoleDiffer { /** * @readonly - * @var \Rector\Console\Formatter\ColorConsoleDiffFormatter */ - private $colorConsoleDiffFormatter; + private \Rector\Console\Formatter\ColorConsoleDiffFormatter $colorConsoleDiffFormatter; /** * @readonly - * @var \SebastianBergmann\Diff\Differ */ - private $differ; + private Differ $differ; public function __construct(\Rector\Console\Formatter\ColorConsoleDiffFormatter $colorConsoleDiffFormatter) { $this->colorConsoleDiffFormatter = $colorConsoleDiffFormatter; diff --git a/vendor/rector/rector/src/Console/Notifier.php b/vendor/rector/rector/src/Console/Notifier.php index 524f5dd48..da5541af6 100644 --- a/vendor/rector/rector/src/Console/Notifier.php +++ b/vendor/rector/rector/src/Console/Notifier.php @@ -3,9 +3,10 @@ declare (strict_types=1); namespace Rector\Console; -use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use Rector\Exception\Configuration\InvalidConfigurationException; +use RectorPrefix202506\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class Notifier { public static function notifyNotSuitableMethodForPHP74(string $calledMethod) : void @@ -18,14 +19,11 @@ public static function notifyNotSuitableMethodForPHP74(string $calledMethod) : v $symfonyStyle->warning($message); \sleep(3); } - public static function notifyWithPhpSetsNotSuitableForPHP80() : void + public static function errorWithPhpSetsNotSuitableForPHP74AndLower() : void { if (\PHP_VERSION_ID >= 80000) { return; } - $message = 'The "withPhpSets()" method uses named arguments. Its suitable for PHP 8.0+. Use more explicit "withPhp53Sets()" ... "withPhp74Sets()" in lower PHP versions instead.'; - $symfonyStyle = new SymfonyStyle(new ArgvInput(), new ConsoleOutput()); - $symfonyStyle->warning($message); - \sleep(3); + throw new InvalidConfigurationException('The "->withPhpSets()" method uses named arguments. Its suitable for PHP 8.0+. Use more explicit "->withPhp53Sets()" ... "->withPhp74Sets()" in lower PHP versions instead.'); } } diff --git a/vendor/rector/rector/src/Console/Output/OutputFormatterCollector.php b/vendor/rector/rector/src/Console/Output/OutputFormatterCollector.php index 9480d99fb..1e8263bab 100644 --- a/vendor/rector/rector/src/Console/Output/OutputFormatterCollector.php +++ b/vendor/rector/rector/src/Console/Output/OutputFormatterCollector.php @@ -10,7 +10,7 @@ final class OutputFormatterCollector /** * @var array */ - private $outputFormatters = []; + private array $outputFormatters = []; /** * @param OutputFormatterInterface[] $outputFormatters */ diff --git a/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php b/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php index ea26d34ab..0e124eddb 100644 --- a/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php +++ b/vendor/rector/rector/src/Console/ProcessConfigureDecorator.php @@ -5,9 +5,9 @@ use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use Rector\Configuration\Option; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; final class ProcessConfigureDecorator { public static function decorate(Command $command) : void @@ -18,6 +18,9 @@ public static function decorate(Command $command) : void $command->addOption(Option::NO_PROGRESS_BAR, null, InputOption::VALUE_NONE, 'Hide progress bar. Useful e.g. for nicer CI output.'); $command->addOption(Option::NO_DIFFS, null, InputOption::VALUE_NONE, 'Hide diffs of changed files. Useful e.g. for nicer CI output.'); $command->addOption(Option::OUTPUT_FORMAT, null, InputOption::VALUE_REQUIRED, 'Select output format', ConsoleOutputFormatter::NAME); + // filter by rule and path + $command->addOption(Option::ONLY, null, InputOption::VALUE_REQUIRED, 'Fully qualified rule class name'); + $command->addOption(Option::ONLY_SUFFIX, null, InputOption::VALUE_REQUIRED, 'Filter only files with specific suffix in name, e.g. "Controller"'); $command->addOption(Option::DEBUG, null, InputOption::VALUE_NONE, 'Display debug output.'); $command->addOption(Option::MEMORY_LIMIT, null, InputOption::VALUE_REQUIRED, 'Memory limit for process'); $command->addOption(Option::CLEAR_CACHE, null, InputOption::VALUE_NONE, 'Clear unchanged files cache'); diff --git a/vendor/rector/rector/src/Console/Style/RectorStyle.php b/vendor/rector/rector/src/Console/Style/RectorStyle.php index ab6cd5580..ae475af9b 100644 --- a/vendor/rector/rector/src/Console/Style/RectorStyle.php +++ b/vendor/rector/rector/src/Console/Style/RectorStyle.php @@ -3,18 +3,15 @@ declare (strict_types=1); namespace Rector\Console\Style; -use RectorPrefix202411\OndraM\CiDetector\CiDetector; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Console\Helper\ProgressBar; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\OndraM\CiDetector\CiDetector; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Helper\ProgressBar; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class RectorStyle extends SymfonyStyle { - /** - * @var \Symfony\Component\Console\Helper\ProgressBar|null - */ - private $progressBar; + private ?ProgressBar $progressBar = null; /** * @var bool|null */ diff --git a/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php b/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php index 057ca57f0..39820260e 100644 --- a/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php +++ b/vendor/rector/rector/src/Console/Style/SymfonyStyleFactory.php @@ -4,17 +4,16 @@ namespace Rector\Console\Style; use Rector\Util\Reflection\PrivatesAccessor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; final class SymfonyStyleFactory { /** * @readonly - * @var \Rector\Util\Reflection\PrivatesAccessor */ - private $privatesAccessor; + private PrivatesAccessor $privatesAccessor; public function __construct(PrivatesAccessor $privatesAccessor) { $this->privatesAccessor = $privatesAccessor; @@ -43,7 +42,7 @@ public function create() : \Rector\Console\Style\RectorStyle return new \Rector\Console\Style\RectorStyle($argvInput, $consoleOutput); } /** - * Never ever used static methods if not neccesary, this is just handy for tests + src to prevent duplication. + * Never ever used static methods if not necessary, this is just handy for tests + src to prevent duplication. */ private function isPHPUnitRun() : bool { diff --git a/vendor/rector/rector/src/Contract/Rector/HTMLAverseRectorInterface.php b/vendor/rector/rector/src/Contract/Rector/HTMLAverseRectorInterface.php new file mode 100644 index 000000000..794687206 --- /dev/null +++ b/vendor/rector/rector/src/Contract/Rector/HTMLAverseRectorInterface.php @@ -0,0 +1,12 @@ + $value) { @@ -75,25 +75,25 @@ private static function isStringList(array $items) : bool private static function dumpFlags($flags) : string { $strs = []; - if (($flags & Class_::MODIFIER_PUBLIC) !== 0) { + if (($flags & Modifiers::PUBLIC) !== 0) { $strs[] = 'MODIFIER_PUBLIC'; } - if (($flags & Class_::MODIFIER_PROTECTED) !== 0) { + if (($flags & Modifiers::PROTECTED) !== 0) { $strs[] = 'MODIFIER_PROTECTED'; } - if (($flags & Class_::MODIFIER_PRIVATE) !== 0) { + if (($flags & Modifiers::PRIVATE) !== 0) { $strs[] = 'MODIFIER_PRIVATE'; } - if (($flags & Class_::MODIFIER_ABSTRACT) !== 0) { + if (($flags & Modifiers::ABSTRACT) !== 0) { $strs[] = 'MODIFIER_ABSTRACT'; } - if (($flags & Class_::MODIFIER_STATIC) !== 0) { + if (($flags & Modifiers::STATIC) !== 0) { $strs[] = 'MODIFIER_STATIC'; } - if (($flags & Class_::MODIFIER_FINAL) !== 0) { + if (($flags & Modifiers::FINAL) !== 0) { $strs[] = 'MODIFIER_FINAL'; } - if (($flags & Class_::MODIFIER_READONLY) !== 0) { + if (($flags & Modifiers::READONLY) !== 0) { $strs[] = 'MODIFIER_READONLY'; } if ($strs !== []) { @@ -132,7 +132,7 @@ private static function dumpSingleNode(Node $node) : string } elseif ($node instanceof Identifier) { $result .= '( name: "' . $node->name . '" )'; } elseif ($node instanceof Name) { - $result .= '( parts: ' . \json_encode($node->getParts(), 0) . ' )'; + $result .= '( parts: ' . \json_encode($node->getParts(), \JSON_THROW_ON_ERROR) . ' )'; } elseif ($node instanceof Scalar && $node->getSubNodeNames() === ['value']) { if (\is_string($node->value)) { $result .= '( value: "' . $node->value . '" )'; @@ -155,7 +155,7 @@ private static function dumpSingleNode(Node $node) : string $result .= self::dumpFlags($value); } elseif ($key === 'type' && $node instanceof Include_) { $result .= self::dumpIncludeType($value); - } elseif ($key === 'type' && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { + } elseif ($key === 'type' && ($node instanceof Use_ || $node instanceof UseItem || $node instanceof GroupUse)) { $result .= self::dumpUseType($value); } elseif (\is_string($value)) { $result .= '"' . $value . '"'; diff --git a/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php b/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php index 836c18e3f..39e603778 100644 --- a/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php +++ b/vendor/rector/rector/src/DependencyInjection/Laravel/ContainerMemento.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\DependencyInjection\Laravel; -use RectorPrefix202411\Illuminate\Container\Container; +use RectorPrefix202506\Illuminate\Container\Container; use Rector\Util\Reflection\PrivatesAccessor; /** * Helper service to modify Laravel container diff --git a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php index aef82bf63..dbc50468a 100644 --- a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php +++ b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php @@ -3,17 +3,15 @@ declare (strict_types=1); namespace Rector\DependencyInjection; -use RectorPrefix202411\Doctrine\Inflector\Inflector; -use RectorPrefix202411\Doctrine\Inflector\Rules\English\InflectorFactory; -use RectorPrefix202411\Illuminate\Container\Container; +use RectorPrefix202506\Doctrine\Inflector\Inflector; +use RectorPrefix202506\Doctrine\Inflector\Rules\English\InflectorFactory; +use RectorPrefix202506\Illuminate\Container\Container; use PhpParser\Lexer; use PHPStan\Analyser\NodeScopeResolver; use PHPStan\Analyser\ScopeFactory; use PHPStan\Parser\Parser; use PHPStan\PhpDoc\TypeNodeResolver; -use PHPStan\PhpDocParser\Parser\ConstExprParser; -use PHPStan\PhpDocParser\Parser\TypeParser; -use PHPStan\Reflection\BetterReflection\SourceLocator\CachingVisitor; +use PHPStan\PhpDocParser\ParserConfig; use PHPStan\Reflection\ReflectionProvider; use Rector\Application\ChangedNodeScopeRefresher; use Rector\Application\FileProcessor; @@ -28,7 +26,6 @@ use Rector\BetterPhpDocParser\PhpDocNodeVisitor\UnionTypeNodePhpDocNodeVisitor; use Rector\BetterPhpDocParser\PhpDocParser\ArrayItemClassNameDecorator; use Rector\BetterPhpDocParser\PhpDocParser\BetterPhpDocParser; -use Rector\BetterPhpDocParser\PhpDocParser\BetterTypeParser; use Rector\BetterPhpDocParser\PhpDocParser\ConstExprClassNameDecorator; use Rector\BetterPhpDocParser\PhpDocParser\DoctrineAnnotationDecorator; use Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser; @@ -38,15 +35,21 @@ use Rector\Caching\CacheFactory; use Rector\ChangesReporting\Contract\Output\OutputFormatterInterface; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; +use Rector\ChangesReporting\Output\GitHubOutputFormatter; +use Rector\ChangesReporting\Output\GitlabOutputFormatter; use Rector\ChangesReporting\Output\JsonOutputFormatter; +use Rector\ChangesReporting\Output\JUnitOutputFormatter; use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipper; use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\AliasClassNameImportSkipVoter; use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\ClassLikeNameClassNameImportSkipVoter; use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\FullyQualifiedNameClassNameImportSkipVoter; +use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\ReservedClassNameImportSkipVoter; use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\UsesClassNameImportSkipVoter; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; use Rector\Config\RectorConfig; use Rector\Configuration\ConfigInitializer; +use Rector\Configuration\ConfigurationRuleFilter; +use Rector\Configuration\OnlyRuleResolver; use Rector\Configuration\RenamedClassesDataCollector; use Rector\Console\Command\CustomRuleCommand; use Rector\Console\Command\ListRulesCommand; @@ -130,6 +133,7 @@ use Rector\PHPStanStaticTypeMapper\TypeMapper\ClosureTypeMapper; use Rector\PHPStanStaticTypeMapper\TypeMapper\ConditionalTypeForParameterMapper; use Rector\PHPStanStaticTypeMapper\TypeMapper\ConditionalTypeMapper; +use Rector\PHPStanStaticTypeMapper\TypeMapper\ConstantArrayTypeMapper; use Rector\PHPStanStaticTypeMapper\TypeMapper\FloatTypeMapper; use Rector\PHPStanStaticTypeMapper\TypeMapper\GenericClassStringTypeMapper; use Rector\PHPStanStaticTypeMapper\TypeMapper\HasMethodTypeMapper; @@ -175,10 +179,10 @@ use Rector\StaticTypeMapper\PhpParser\NullableTypeNodeMapper; use Rector\StaticTypeMapper\PhpParser\StringNodeMapper; use Rector\StaticTypeMapper\PhpParser\UnionTypeNodeMapper; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Webmozart\Assert\Assert; final class LazyContainerFactory { /** @@ -204,11 +208,11 @@ final class LazyContainerFactory /** * @var array> */ - private const CLASS_NAME_IMPORT_SKIPPER_CLASSES = [AliasClassNameImportSkipVoter::class, ClassLikeNameClassNameImportSkipVoter::class, FullyQualifiedNameClassNameImportSkipVoter::class, UsesClassNameImportSkipVoter::class]; + private const CLASS_NAME_IMPORT_SKIPPER_CLASSES = [AliasClassNameImportSkipVoter::class, ClassLikeNameClassNameImportSkipVoter::class, FullyQualifiedNameClassNameImportSkipVoter::class, UsesClassNameImportSkipVoter::class, ReservedClassNameImportSkipVoter::class]; /** * @var array> */ - private const TYPE_MAPPER_CLASSES = [AccessoryLiteralStringTypeMapper::class, AccessoryNonEmptyStringTypeMapper::class, AccessoryNonFalsyStringTypeMapper::class, AccessoryNumericStringTypeMapper::class, ArrayTypeMapper::class, BooleanTypeMapper::class, CallableTypeMapper::class, ClassStringTypeMapper::class, ClosureTypeMapper::class, ConditionalTypeForParameterMapper::class, ConditionalTypeMapper::class, FloatTypeMapper::class, GenericClassStringTypeMapper::class, HasMethodTypeMapper::class, HasOffsetTypeMapper::class, HasOffsetValueTypeTypeMapper::class, HasPropertyTypeMapper::class, IntegerTypeMapper::class, IntersectionTypeMapper::class, IterableTypeMapper::class, MixedTypeMapper::class, NeverTypeMapper::class, NonEmptyArrayTypeMapper::class, NullTypeMapper::class, ObjectTypeMapper::class, ObjectWithoutClassTypeMapper::class, OversizedArrayTypeMapper::class, ParentStaticTypeMapper::class, ResourceTypeMapper::class, SelfObjectTypeMapper::class, StaticTypeMapper::class, StrictMixedTypeMapper::class, StringTypeMapper::class, ThisTypeMapper::class, TypeWithClassNameTypeMapper::class, UnionTypeMapper::class, VoidTypeMapper::class]; + private const TYPE_MAPPER_CLASSES = [AccessoryLiteralStringTypeMapper::class, AccessoryNonEmptyStringTypeMapper::class, AccessoryNonFalsyStringTypeMapper::class, AccessoryNumericStringTypeMapper::class, ConstantArrayTypeMapper::class, ArrayTypeMapper::class, BooleanTypeMapper::class, CallableTypeMapper::class, ClassStringTypeMapper::class, ClosureTypeMapper::class, ConditionalTypeForParameterMapper::class, ConditionalTypeMapper::class, FloatTypeMapper::class, GenericClassStringTypeMapper::class, HasMethodTypeMapper::class, HasOffsetTypeMapper::class, HasOffsetValueTypeTypeMapper::class, HasPropertyTypeMapper::class, IntegerTypeMapper::class, IntersectionTypeMapper::class, IterableTypeMapper::class, MixedTypeMapper::class, NeverTypeMapper::class, NonEmptyArrayTypeMapper::class, NullTypeMapper::class, ObjectTypeMapper::class, ObjectWithoutClassTypeMapper::class, OversizedArrayTypeMapper::class, ParentStaticTypeMapper::class, ResourceTypeMapper::class, SelfObjectTypeMapper::class, StaticTypeMapper::class, StrictMixedTypeMapper::class, StringTypeMapper::class, ThisTypeMapper::class, TypeWithClassNameTypeMapper::class, UnionTypeMapper::class, VoidTypeMapper::class]; /** * @var array> */ @@ -216,11 +220,11 @@ final class LazyContainerFactory /** * @var array */ - private const PUBLIC_PHPSTAN_SERVICE_TYPES = [ScopeFactory::class, TypeNodeResolver::class, NodeScopeResolver::class, ReflectionProvider::class, CachingVisitor::class]; + private const PUBLIC_PHPSTAN_SERVICE_TYPES = [ScopeFactory::class, TypeNodeResolver::class, NodeScopeResolver::class, ReflectionProvider::class]; /** * @var array> */ - private const OUTPUT_FORMATTER_CLASSES = [ConsoleOutputFormatter::class, JsonOutputFormatter::class]; + private const OUTPUT_FORMATTER_CLASSES = [ConsoleOutputFormatter::class, JsonOutputFormatter::class, GitlabOutputFormatter::class, JUnitOutputFormatter::class, GitHubOutputFormatter::class]; /** * @var array> */ @@ -241,31 +245,29 @@ public function create() : RectorConfig $rectorConfig = new RectorConfig(); $rectorConfig->import(__DIR__ . '/../../config/config.php'); $rectorConfig->singleton(Application::class, static function (Container $container) : Application { - $application = $container->make(ConsoleApplication::class); + $consoleApplication = $container->make(ConsoleApplication::class); $commandNamesToHide = ['list', 'completion', 'help', 'worker']; foreach ($commandNamesToHide as $commandNameToHide) { - $commandToHide = $application->get($commandNameToHide); + $commandToHide = $consoleApplication->get($commandNameToHide); $commandToHide->setHidden(); } - return $application; + return $consoleApplication; }); $rectorConfig->when(ConsoleApplication::class)->needs('$commands')->giveTagged(Command::class); $rectorConfig->singleton(Inflector::class, static function () : Inflector { $inflectorFactory = new InflectorFactory(); return $inflectorFactory->build(); }); + $rectorConfig->singleton(ConfigurationRuleFilter::class); $rectorConfig->singleton(ProcessCommand::class); $rectorConfig->singleton(WorkerCommand::class); $rectorConfig->singleton(SetupCICommand::class); $rectorConfig->singleton(ListRulesCommand::class); $rectorConfig->singleton(CustomRuleCommand::class); $rectorConfig->when(ListRulesCommand::class)->needs('$rectors')->giveTagged(RectorInterface::class); + $rectorConfig->when(OnlyRuleResolver::class)->needs('$rectors')->giveTagged(RectorInterface::class); $rectorConfig->singleton(FileProcessor::class); $rectorConfig->singleton(PostFileProcessor::class); - // phpdoc-parser - $rectorConfig->when(TypeParser::class)->needs('$usedAttributes')->give(['lines' => \true, 'indexes' => \true]); - $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(ConfigInitializer::class)->needs('$rectors')->giveTagged(RectorInterface::class); $rectorConfig->when(ClassNameImportSkipper::class)->needs('$classNameImportSkipVoters')->giveTagged(ClassNameImportSkipVoterInterface::class); @@ -331,8 +333,8 @@ public function create() : RectorConfig $rectorConfig->when(OutputFormatterCollector::class)->needs('$outputFormatters')->giveTagged(OutputFormatterInterface::class); // required-like setter $rectorConfig->afterResolving(ArrayAnnotationToAttributeMapper::class, static function (ArrayAnnotationToAttributeMapper $arrayAnnotationToAttributeMapper, Container $container) : void { - $annotationToAttributesMapper = $container->make(AnnotationToAttributeMapper::class); - $arrayAnnotationToAttributeMapper->autowire($annotationToAttributesMapper); + $annotationToAttributeMapper = $container->make(AnnotationToAttributeMapper::class); + $arrayAnnotationToAttributeMapper->autowire($annotationToAttributeMapper); }); $rectorConfig->afterResolving(ArrayItemNodeAnnotationToAttributeMapper::class, static function (ArrayItemNodeAnnotationToAttributeMapper $arrayItemNodeAnnotationToAttributeMapper, Container $container) : void { $annotationToAttributeMapper = $container->make(AnnotationToAttributeMapper::class); @@ -353,6 +355,8 @@ public function create() : RectorConfig $this->registerTagged($rectorConfig, self::SCOPE_RESOLVER_NODE_VISITOR_CLASSES, ScopeResolverNodeVisitorInterface::class); $this->createPHPStanServices($rectorConfig); $rectorConfig->when(PhpDocNodeMapper::class)->needs('$phpDocNodeVisitors')->giveTagged(BasePhpDocNodeVisitorInterface::class); + // phpdoc-parser + $rectorConfig->singleton(ParserConfig::class, static fn(Container $container): ParserConfig => new ParserConfig(['lines' => \true, 'indexes' => \true, 'comments' => \true])); return $rectorConfig; } /** @@ -370,17 +374,17 @@ private function registerTagged(Container $container, array $classes, string $ta private function createPHPStanServices(RectorConfig $rectorConfig) : void { $rectorConfig->singleton(Parser::class, static function (Container $container) { - $phpstanServiceFactory = $container->make(PHPStanServicesFactory::class); - return $phpstanServiceFactory->createPHPStanParser(); + $phpStanServicesFactory = $container->make(PHPStanServicesFactory::class); + return $phpStanServicesFactory->createPHPStanParser(); }); $rectorConfig->singleton(Lexer::class, static function (Container $container) { - $phpstanServiceFactory = $container->make(PHPStanServicesFactory::class); - return $phpstanServiceFactory->createEmulativeLexer(); + $phpStanServicesFactory = $container->make(PHPStanServicesFactory::class); + return $phpStanServicesFactory->createEmulativeLexer(); }); foreach (self::PUBLIC_PHPSTAN_SERVICE_TYPES as $publicPhpstanServiceType) { $rectorConfig->singleton($publicPhpstanServiceType, static function (Container $container) use($publicPhpstanServiceType) { - $phpstanServiceFactory = $container->make(PHPStanServicesFactory::class); - return $phpstanServiceFactory->getByType($publicPhpstanServiceType); + $phpStanServicesFactory = $container->make(PHPStanServicesFactory::class); + return $phpStanServicesFactory->getByType($publicPhpstanServiceType); }); } } diff --git a/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php b/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php index 45cd0ac27..28ee16279 100644 --- a/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php +++ b/vendor/rector/rector/src/DependencyInjection/RectorContainerFactory.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\DependencyInjection; -use RectorPrefix202411\Illuminate\Container\Container; +use RectorPrefix202506\Illuminate\Container\Container; use Rector\Autoloading\BootstrapFilesIncluder; use Rector\Caching\Detector\ChangedFilesDetector; use Rector\ValueObject\Bootstrap\BootstrapConfigs; diff --git a/vendor/rector/rector/src/Differ/DefaultDiffer.php b/vendor/rector/rector/src/Differ/DefaultDiffer.php index d5e7e9d53..7210fadc5 100644 --- a/vendor/rector/rector/src/Differ/DefaultDiffer.php +++ b/vendor/rector/rector/src/Differ/DefaultDiffer.php @@ -3,15 +3,14 @@ declare (strict_types=1); namespace Rector\Differ; -use RectorPrefix202411\SebastianBergmann\Diff\Differ; -use RectorPrefix202411\SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder; +use RectorPrefix202506\SebastianBergmann\Diff\Differ; +use RectorPrefix202506\SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder; final class DefaultDiffer { /** * @readonly - * @var \SebastianBergmann\Diff\Differ */ - private $differ; + private Differ $differ; public function __construct() { $strictUnifiedDiffOutputBuilder = new StrictUnifiedDiffOutputBuilder(['fromFile' => 'Original', 'toFile' => 'New']); @@ -19,9 +18,6 @@ public function __construct() } public function diff(string $old, string $new) : string { - if ($old === $new) { - return ''; - } return $this->differ->diff($old, $new); } } diff --git a/vendor/rector/rector/src/Enum/ClassName.php b/vendor/rector/rector/src/Enum/ClassName.php index 80b446eca..3fcda9415 100644 --- a/vendor/rector/rector/src/Enum/ClassName.php +++ b/vendor/rector/rector/src/Enum/ClassName.php @@ -9,4 +9,12 @@ final class ClassName * @var string */ public const TEST_CASE_CLASS = 'PHPUnit\\Framework\\TestCase'; + /** + * @var string + */ + public const MOCK_OBJECT = 'PHPUnit\\Framework\\MockObject\\MockObject'; + /** + * @var string + */ + public const DATE_TIME_INTERFACE = 'DateTimeInterface'; } diff --git a/vendor/rector/rector/src/Enum/Config/Defaults.php b/vendor/rector/rector/src/Enum/Config/Defaults.php new file mode 100644 index 000000000..bf396f151 --- /dev/null +++ b/vendor/rector/rector/src/Enum/Config/Defaults.php @@ -0,0 +1,12 @@ +resolveParentClassMethods($classReflection, $methodName) !== []; - } /** * Look both parent class and interface, yes, all PHP interface methods are abstract */ diff --git a/vendor/rector/rector/src/FamilyTree/Reflection/FamilyRelationsAnalyzer.php b/vendor/rector/rector/src/FamilyTree/Reflection/FamilyRelationsAnalyzer.php index 9915012f6..b95a8e3cf 100644 --- a/vendor/rector/rector/src/FamilyTree/Reflection/FamilyRelationsAnalyzer.php +++ b/vendor/rector/rector/src/FamilyTree/Reflection/FamilyRelationsAnalyzer.php @@ -13,14 +13,12 @@ final class FamilyRelationsAnalyzer { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(ReflectionProvider $reflectionProvider, NodeNameResolver $nodeNameResolver) { $this->reflectionProvider = $reflectionProvider; @@ -41,9 +39,7 @@ public function getClassLikeAncestorNames($classOrName) : array } $classReflection = $this->reflectionProvider->getClass($fullName); $ancestors = \array_merge($classReflection->getParents(), $classReflection->getInterfaces()); - return \array_map(static function (ClassReflection $classReflection) : string { - return $classReflection->getName(); - }, $ancestors); + return \array_map(static fn(ClassReflection $classReflection): string => $classReflection->getName(), $ancestors); } if ($classOrName instanceof Interface_) { foreach ($classOrName->extends as $extendInterfaceName) { diff --git a/vendor/rector/rector/src/FileSystem/FileAndDirectoryFilter.php b/vendor/rector/rector/src/FileSystem/FileAndDirectoryFilter.php index 10f0bedfd..caccb21d0 100644 --- a/vendor/rector/rector/src/FileSystem/FileAndDirectoryFilter.php +++ b/vendor/rector/rector/src/FileSystem/FileAndDirectoryFilter.php @@ -14,9 +14,7 @@ final class FileAndDirectoryFilter */ public function filterDirectories(array $filesAndDirectories) : array { - $directories = \array_filter($filesAndDirectories, static function (string $path) : bool { - return \is_dir($path) && \realpath($path) !== \false; - }); + $directories = \array_filter($filesAndDirectories, static fn(string $path): bool => \is_dir($path)); return \array_values($directories); } /** @@ -25,9 +23,7 @@ public function filterDirectories(array $filesAndDirectories) : array */ public function filterFiles(array $filesAndDirectories) : array { - $files = \array_filter($filesAndDirectories, static function (string $path) : bool { - return \is_file($path) && \realpath($path) !== \false; - }); + $files = \array_filter($filesAndDirectories, static fn(string $path): bool => \is_file($path)); return \array_values($files); } } diff --git a/vendor/rector/rector/src/FileSystem/FilePathHelper.php b/vendor/rector/rector/src/FileSystem/FilePathHelper.php index 1a91e30e6..323541eb7 100644 --- a/vendor/rector/rector/src/FileSystem/FilePathHelper.php +++ b/vendor/rector/rector/src/FileSystem/FilePathHelper.php @@ -3,10 +3,10 @@ declare (strict_types=1); namespace Rector\FileSystem; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\Skipper\FileSystem\PathNormalizer; -use RectorPrefix202411\Symfony\Component\Filesystem\Filesystem; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Filesystem\Filesystem; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\FileSystem\FilePathHelperTest */ @@ -14,9 +14,8 @@ final class FilePathHelper { /** * @readonly - * @var \Symfony\Component\Filesystem\Filesystem */ - private $filesystem; + private Filesystem $filesystem; /** * @see https://regex101.com/r/d4F5Fm/1 * @var string diff --git a/vendor/rector/rector/src/FileSystem/FilesFinder.php b/vendor/rector/rector/src/FileSystem/FilesFinder.php index ba9476b1e..6132c7d30 100644 --- a/vendor/rector/rector/src/FileSystem/FilesFinder.php +++ b/vendor/rector/rector/src/FileSystem/FilesFinder.php @@ -3,14 +3,14 @@ declare (strict_types=1); namespace Rector\FileSystem; -use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem; use Rector\Caching\Detector\ChangedFilesDetector; use Rector\Caching\UnchangedFilesFilter; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Skipper\Skipper\PathSkipper; use Rector\ValueObject\Configuration; -use RectorPrefix202411\Symfony\Component\Finder\Finder; +use RectorPrefix202506\Symfony\Component\Finder\Finder; /** * @see \Rector\Tests\FileSystem\FilesFinder\FilesFinderTest */ @@ -18,34 +18,28 @@ final class FilesFinder { /** * @readonly - * @var \Rector\FileSystem\FilesystemTweaker */ - private $filesystemTweaker; + private \Rector\FileSystem\FilesystemTweaker $filesystemTweaker; /** * @readonly - * @var \Rector\Caching\UnchangedFilesFilter */ - private $unchangedFilesFilter; + private UnchangedFilesFilter $unchangedFilesFilter; /** * @readonly - * @var \Rector\FileSystem\FileAndDirectoryFilter */ - private $fileAndDirectoryFilter; + private \Rector\FileSystem\FileAndDirectoryFilter $fileAndDirectoryFilter; /** * @readonly - * @var \Rector\Skipper\Skipper\PathSkipper */ - private $pathSkipper; + private PathSkipper $pathSkipper; /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private \Rector\FileSystem\FilePathHelper $filePathHelper; /** * @readonly - * @var \Rector\Caching\Detector\ChangedFilesDetector */ - private $changedFilesDetector; + private ChangedFilesDetector $changedFilesDetector; public function __construct(\Rector\FileSystem\FilesystemTweaker $filesystemTweaker, UnchangedFilesFilter $unchangedFilesFilter, \Rector\FileSystem\FileAndDirectoryFilter $fileAndDirectoryFilter, PathSkipper $pathSkipper, \Rector\FileSystem\FilePathHelper $filePathHelper, ChangedFilesDetector $changedFilesDetector) { $this->filesystemTweaker = $filesystemTweaker; @@ -60,24 +54,32 @@ public function __construct(\Rector\FileSystem\FilesystemTweaker $filesystemTwea * @param string[] $suffixes * @return string[] */ - public function findInDirectoriesAndFiles(array $source, array $suffixes = [], bool $sortByName = \true) : array + public function findInDirectoriesAndFiles(array $source, array $suffixes = [], bool $sortByName = \true, ?string $onlySuffix = null) : array { $filesAndDirectories = $this->filesystemTweaker->resolveWithFnmatch($source); // filtering files in files collection $filteredFilePaths = $this->fileAndDirectoryFilter->filterFiles($filesAndDirectories); - $filteredFilePaths = \array_map(function (string $filePath) : string { - return \realpath($filePath); - }, $filteredFilePaths); - $filteredFilePaths = \array_filter($filteredFilePaths, function (string $filePath) : bool { - return !$this->pathSkipper->shouldSkip($filePath); - }); - if ($suffixes !== []) { - $fileWithExtensionsFilter = static function (string $filePath) use($suffixes) : bool { + $filteredFilePaths = \array_filter($filteredFilePaths, fn(string $filePath): bool => !$this->pathSkipper->shouldSkip($filePath)); + // fallback append `.php` to be used for both $filteredFilePaths and $filteredFilePathsInDirectories + $hasOnlySuffix = $onlySuffix !== null && $onlySuffix !== ''; + if ($hasOnlySuffix && \substr_compare($onlySuffix, '.php', -\strlen('.php')) !== 0) { + $onlySuffix .= '.php'; + } + // filter files by specific suffix + if ($hasOnlySuffix) { + /** @var string $onlySuffix */ + $fileWithSuffixFilter = static fn(string $filePath): bool => \substr_compare($filePath, $onlySuffix, -\strlen($onlySuffix)) === 0; + } elseif ($suffixes !== []) { + $fileWithSuffixFilter = static function (string $filePath) use($suffixes) : bool { $filePathExtension = \pathinfo($filePath, \PATHINFO_EXTENSION); return \in_array($filePathExtension, $suffixes, \true); }; - $filteredFilePaths = \array_filter($filteredFilePaths, $fileWithExtensionsFilter); + } else { + $fileWithSuffixFilter = fn(): bool => \true; } + $filteredFilePaths = \array_filter($filteredFilePaths, $fileWithSuffixFilter === null ? fn($value, $key): bool => !empty($value) : $fileWithSuffixFilter, $fileWithSuffixFilter === null ? \ARRAY_FILTER_USE_BOTH : 0); + // add file without extension after file extension filter + $filteredFilePaths = \array_merge($filteredFilePaths, SimpleParameterProvider::provideArrayParameter(Option::FILES_WITHOUT_EXTENSION)); $filteredFilePaths = \array_filter($filteredFilePaths, function (string $file) : bool { if ($this->isStartWithShortPHPTag(FileSystem::read($file))) { SimpleParameterProvider::addParameter(Option::SKIPPED_START_WITH_SHORT_OPEN_TAG_FILES, $this->filePathHelper->relativePath($file)); @@ -87,7 +89,7 @@ public function findInDirectoriesAndFiles(array $source, array $suffixes = [], b }); // filtering files in directories collection $directories = $this->fileAndDirectoryFilter->filterDirectories($filesAndDirectories); - $filteredFilePathsInDirectories = $this->findInDirectories($directories, $suffixes, $sortByName); + $filteredFilePathsInDirectories = $this->findInDirectories($directories, $suffixes, $hasOnlySuffix, $onlySuffix, $sortByName); $filePaths = \array_merge($filteredFilePaths, $filteredFilePathsInDirectories); return $this->unchangedFilesFilter->filterFilePaths($filePaths); } @@ -100,8 +102,7 @@ public function findFilesInPaths(array $paths, Configuration $configuration) : a if ($configuration->shouldClearCache()) { $this->changedFilesDetector->clear(); } - $supportedFileExtensions = $configuration->getFileExtensions(); - return $this->findInDirectoriesAndFiles($paths, $supportedFileExtensions); + return $this->findInDirectoriesAndFiles($paths, $configuration->getFileExtensions(), \true, $configuration->getOnlySuffix()); } /** * Exclude short "files()->size('> 0')->in($directories); - if ($sortByName) { - $finder->sortByName(); - } - if ($suffixes !== []) { + // filter files by specific suffix + if ($hasOnlySuffix) { + $finder->name('*' . $onlySuffix); + } elseif ($suffixes !== []) { $suffixesPattern = $this->normalizeSuffixesToPattern($suffixes); $finder->name($suffixesPattern); } + if ($sortByName) { + $finder->sortByName(); + } $filePaths = []; foreach ($finder as $fileInfo) { // getRealPath() function will return false when it checks broken symlinks. diff --git a/vendor/rector/rector/src/FileSystem/FilesystemTweaker.php b/vendor/rector/rector/src/FileSystem/FilesystemTweaker.php index 2c02929e7..473a2dea0 100644 --- a/vendor/rector/rector/src/FileSystem/FilesystemTweaker.php +++ b/vendor/rector/rector/src/FileSystem/FilesystemTweaker.php @@ -18,13 +18,29 @@ public function resolveWithFnmatch(array $paths) : array foreach ($paths as $path) { if (\strpos($path, '*') !== \false) { $foundPaths = $this->foundInGlob($path); - $absolutePathsFound = \array_merge($absolutePathsFound, $foundPaths); + $absolutePathsFound = $this->appendPaths($foundPaths, $absolutePathsFound); } else { - $absolutePathsFound[] = $path; + $absolutePathsFound = $this->appendPaths([$path], $absolutePathsFound); } } return $absolutePathsFound; } + /** + * @param string[] $foundPaths + * @param string[] $absolutePathsFound + * @return string[] + */ + private function appendPaths(array $foundPaths, array $absolutePathsFound) : array + { + foreach ($foundPaths as $foundPath) { + $foundPath = \realpath($foundPath); + if ($foundPath === \false) { + continue; + } + $absolutePathsFound[] = $foundPath; + } + return $absolutePathsFound; + } /** * @return string[] */ @@ -32,8 +48,6 @@ private function foundInGlob(string $path) : array { /** @var string[] $paths */ $paths = (array) \glob($path); - return \array_filter($paths, static function (string $path) : bool { - return \file_exists($path); - }); + return \array_filter($paths, static fn(string $path): bool => \file_exists($path)); } } diff --git a/vendor/rector/rector/src/FileSystem/InitFilePathsResolver.php b/vendor/rector/rector/src/FileSystem/InitFilePathsResolver.php index 2a035da03..cf42a28cd 100644 --- a/vendor/rector/rector/src/FileSystem/InitFilePathsResolver.php +++ b/vendor/rector/rector/src/FileSystem/InitFilePathsResolver.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\FileSystem; -use RectorPrefix202411\Symfony\Component\Finder\Finder; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Finder\Finder; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; /** * @see \Rector\Tests\FileSystem\InitFilePathsResolver\InitFilePathsResolverTest */ @@ -14,7 +14,7 @@ final class InitFilePathsResolver * @var string * @see https://regex101.com/r/XkQ6Pe/1 */ - private const DO_NOT_INCLUDE_PATHS_REGEX = '#(vendor|var|stubs|temp|templates|tmp|e2e|bin|build|Migrations|data(?:base)?|storage|migrations|writable)#'; + private const DO_NOT_INCLUDE_PATHS_REGEX = '#(vendor|var|stubs|temp|templates|tmp|e2e|bin|build|Migrations|data(?:base)?|storage|migrations|writable|node_modules)#'; /** * @return string[] */ @@ -35,7 +35,6 @@ public function resolve(string $projectDirectory) : array private function hasDirectoryFileInfoPhpFiles(SplFileInfo $rootDirectoryFileInfo) : bool { // is directory with PHP files? - $phpFilesCount = Finder::create()->files()->in($rootDirectoryFileInfo->getPathname())->name('*.php')->count(); - return $phpFilesCount !== 0; + return Finder::create()->files()->in($rootDirectoryFileInfo->getPathname())->name('*.php')->hasResults(); } } diff --git a/vendor/rector/rector/src/FileSystem/JsonFileSystem.php b/vendor/rector/rector/src/FileSystem/JsonFileSystem.php index 216742be7..83b24e6f2 100644 --- a/vendor/rector/rector/src/FileSystem/JsonFileSystem.php +++ b/vendor/rector/rector/src/FileSystem/JsonFileSystem.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\FileSystem; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Json; final class JsonFileSystem { /** diff --git a/vendor/rector/rector/src/Git/RepositoryHelper.php b/vendor/rector/rector/src/Git/RepositoryHelper.php index c7f135ade..ab1136ba8 100644 --- a/vendor/rector/rector/src/Git/RepositoryHelper.php +++ b/vendor/rector/rector/src/Git/RepositoryHelper.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Git; -use RectorPrefix202411\Nette\Utils\Strings; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Nette\Utils\Strings; +use RectorPrefix202506\Symfony\Component\Process\Process; final class RepositoryHelper { /** diff --git a/vendor/rector/rector/src/NodeAnalyzer/BinaryOpAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/BinaryOpAnalyzer.php index 38fba2173..cdf2d6e98 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/BinaryOpAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/BinaryOpAnalyzer.php @@ -11,9 +11,8 @@ final class BinaryOpAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeAnalyzer/CallAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/CallAnalyzer.php index 9c4f3a393..953d8c7d1 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/CallAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/CallAnalyzer.php @@ -19,9 +19,8 @@ final class CallAnalyzer { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var array> */ diff --git a/vendor/rector/rector/src/NodeAnalyzer/CompactFuncCallAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/CompactFuncCallAnalyzer.php index e689ffae8..70793d3c1 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/CompactFuncCallAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/CompactFuncCallAnalyzer.php @@ -4,8 +4,8 @@ namespace Rector\NodeAnalyzer; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; @@ -15,9 +15,8 @@ final class CompactFuncCallAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; @@ -58,7 +57,7 @@ private function isInArgOrArrayItemNodes(array $nodes, string $variableName) : b return \false; } /** - * @param \PhpParser\Node\Arg|\PhpParser\Node\VariadicPlaceholder|\PhpParser\Node\Expr\ArrayItem|null $node + * @param \PhpParser\Node\Arg|\PhpParser\Node\VariadicPlaceholder|\PhpParser\Node\ArrayItem|null $node */ private function shouldSkip($node) : bool { diff --git a/vendor/rector/rector/src/NodeAnalyzer/DoctrineEntityAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/DoctrineEntityAnalyzer.php index ac2505626..f794b9cb8 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/DoctrineEntityAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/DoctrineEntityAnalyzer.php @@ -15,9 +15,8 @@ final class DoctrineEntityAnalyzer { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var string[] */ diff --git a/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php index fc50a3965..7fa18e38e 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php @@ -3,19 +3,50 @@ declare (strict_types=1); namespace Rector\NodeAnalyzer; +use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; +use PhpParser\Node\Expr\BinaryOp; +use PhpParser\Node\Expr\BinaryOp\BooleanAnd; +use PhpParser\Node\Expr\BinaryOp\BooleanOr; +use PhpParser\Node\Expr\BinaryOp\Equal; +use PhpParser\Node\Expr\BinaryOp\Greater; +use PhpParser\Node\Expr\BinaryOp\GreaterOrEqual; +use PhpParser\Node\Expr\BinaryOp\Identical; +use PhpParser\Node\Expr\BinaryOp\LogicalAnd; +use PhpParser\Node\Expr\BinaryOp\LogicalOr; +use PhpParser\Node\Expr\BinaryOp\LogicalXor; +use PhpParser\Node\Expr\BinaryOp\NotEqual; +use PhpParser\Node\Expr\BinaryOp\NotIdentical; +use PhpParser\Node\Expr\BinaryOp\Smaller; +use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual; +use PhpParser\Node\Expr\BitwiseNot; +use PhpParser\Node\Expr\BooleanNot; +use PhpParser\Node\Expr\CallLike; +use PhpParser\Node\Expr\Cast; +use PhpParser\Node\Expr\Cast\Bool_; use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node\Expr\Clone_; use PhpParser\Node\Expr\ConstFetch; +use PhpParser\Node\Expr\Empty_; +use PhpParser\Node\Expr\ErrorSuppress; +use PhpParser\Node\Expr\Eval_; +use PhpParser\Node\Expr\Exit_; +use PhpParser\Node\Expr\Include_; +use PhpParser\Node\Expr\Instanceof_; +use PhpParser\Node\Expr\Isset_; +use PhpParser\Node\Expr\Print_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Expr\UnaryPlus; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Scalar; -use PhpParser\Node\Scalar\Encapsed; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use PHPStan\Analyser\Scope; use PHPStan\Type\MixedType; @@ -25,6 +56,39 @@ use Rector\NodeTypeResolver\Node\AttributeKey; final class ExprAnalyzer { + public function isBoolExpr(Expr $expr) : bool + { + return $expr instanceof BooleanNot || $expr instanceof Empty_ || $expr instanceof Isset_ || $expr instanceof Instanceof_ || $expr instanceof Bool_ || $expr instanceof Equal || $expr instanceof NotEqual || $expr instanceof Identical || $expr instanceof NotIdentical || $expr instanceof Greater || $expr instanceof GreaterOrEqual || $expr instanceof Smaller || $expr instanceof SmallerOrEqual || $expr instanceof BooleanAnd || $expr instanceof BooleanOr || $expr instanceof LogicalAnd || $expr instanceof LogicalOr || $expr instanceof LogicalXor; + } + public function isCallLikeReturnNativeBool(Expr $expr) : bool + { + if (!$expr instanceof CallLike) { + return \false; + } + $scope = $expr->getAttribute(AttributeKey::SCOPE); + if (!$scope instanceof Scope) { + return \false; + } + $nativeType = $scope->getNativeType($expr); + return $nativeType->isBoolean()->yes(); + } + /** + * Verify that Expr has ->expr property that can be wrapped by parentheses + */ + public function isExprWithExprPropertyWrappable(Node $node) : bool + { + if (!$node instanceof Expr) { + return \false; + } + // ensure only verify on reprint, using token start verification is more reliable for its check + if ($node->getStartTokenPos() > 0) { + return \false; + } + if ($node instanceof Cast || $node instanceof YieldFrom || $node instanceof UnaryMinus || $node instanceof UnaryPlus || $node instanceof Throw_ || $node instanceof Empty_ || $node instanceof BooleanNot || $node instanceof Clone_ || $node instanceof ErrorSuppress || $node instanceof BitwiseNot || $node instanceof Eval_ || $node instanceof Print_ || $node instanceof Exit_ || $node instanceof Include_ || $node instanceof Instanceof_) { + return $node->expr instanceof BinaryOp; + } + return \false; + } public function isNonTypedFromParam(Expr $expr) : bool { if (!$expr instanceof Variable) { @@ -36,10 +100,10 @@ public function isNonTypedFromParam(Expr $expr) : bool return \true; } $nativeType = $scope->getNativeType($expr); - if ($nativeType instanceof MixedType && !$nativeType->isExplicitMixed()) { + $type = $scope->getType($expr); + if ($nativeType instanceof MixedType && !$nativeType->isExplicitMixed() || $nativeType instanceof MixedType && !$type instanceof MixedType) { return \true; } - $type = $scope->getType($expr); if ($nativeType instanceof ObjectWithoutClassType && !$type instanceof ObjectWithoutClassType) { return \true; } @@ -59,7 +123,7 @@ public function isDynamicExpr(Expr $expr) : bool } if ($expr instanceof Scalar) { // string interpolation is true, otherwise false - return $expr instanceof Encapsed; + return $expr instanceof InterpolatedString; } return !$this->isAllowedConstFetchOrClassConstFetch($expr); } @@ -103,7 +167,7 @@ private function isAllowedArrayKey(?Expr $expr) : bool if ($expr instanceof String_) { return \true; } - return $expr instanceof LNumber; + return $expr instanceof Int_; } private function isAllowedArrayValue(Expr $expr) : bool { diff --git a/vendor/rector/rector/src/NodeAnalyzer/MagicClassMethodAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/MagicClassMethodAnalyzer.php index d992c85d1..27a936f00 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/MagicClassMethodAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/MagicClassMethodAnalyzer.php @@ -10,9 +10,8 @@ final class MagicClassMethodAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeAnalyzer/ParamAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/ParamAnalyzer.php index 40305c5af..9942e0ace 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/ParamAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/ParamAnalyzer.php @@ -16,7 +16,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeManipulator\FuncCallManipulator; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; @@ -26,29 +26,24 @@ final class ParamAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeManipulator\FuncCallManipulator */ - private $funcCallManipulator; + private FuncCallManipulator $funcCallManipulator; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(NodeComparator $nodeComparator, NodeNameResolver $nodeNameResolver, FuncCallManipulator $funcCallManipulator, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, BetterNodeFinder $betterNodeFinder) { $this->nodeComparator = $nodeComparator; @@ -65,14 +60,14 @@ public function isParamUsedInClassMethod(ClassMethod $classMethod, Param $param) } $this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod->stmts, function (Node $node) use(&$isParamUsed, $param) : ?int { if ($isParamUsed) { - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if ($this->isUsedAsArg($node, $param)) { $isParamUsed = \true; } // skip nested anonymous class if ($node instanceof Class_ || $node instanceof Function_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($node instanceof Variable && $this->nodeComparator->areNodesEqual($node, $param->var)) { $isParamUsed = \true; @@ -93,7 +88,7 @@ public function isParamUsedInClassMethod(ClassMethod $classMethod, Param $param) public function hasPropertyPromotion(array $params) : bool { foreach ($params as $param) { - if ($param->flags !== 0) { + if ($param->isPromoted()) { return \true; } } @@ -104,7 +99,7 @@ public function isNullable(Param $param) : bool if ($param->variadic) { return \false; } - if ($param->type === null) { + if (!$param->type instanceof Node) { return \false; } return $param->type instanceof NullableType; diff --git a/vendor/rector/rector/src/NodeAnalyzer/PropertyAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/PropertyAnalyzer.php index 92b9a3224..d4649d8fe 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/PropertyAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/PropertyAnalyzer.php @@ -4,20 +4,17 @@ namespace Rector\NodeAnalyzer; use PhpParser\Node\Stmt\Property; -use PHPStan\Type\CallableType; -use PHPStan\Type\NullType; use PHPStan\Type\Type; -use PHPStan\Type\TypeWithClassName; use PHPStan\Type\UnionType; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\StaticTypeMapper\ValueObject\Type\NonExistingObjectType; final class PropertyAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -25,7 +22,7 @@ public function __construct(NodeTypeResolver $nodeTypeResolver) public function hasForbiddenType(Property $property) : bool { $propertyType = $this->nodeTypeResolver->getType($property); - if ($propertyType instanceof NullType) { + if ($propertyType->isNull()->yes()) { return \true; } if ($this->isForbiddenType($propertyType)) { @@ -42,7 +39,7 @@ public function hasForbiddenType(Property $property) : bool } return \false; } - private function isForbiddenType(Type $type) : bool + public function isForbiddenType(Type $type) : bool { if ($type instanceof NonExistingObjectType) { return \true; @@ -51,9 +48,9 @@ private function isForbiddenType(Type $type) : bool } private function isCallableType(Type $type) : bool { - if ($type instanceof TypeWithClassName && $type->getClassName() === 'Closure') { + if (ClassNameFromObjectTypeResolver::resolve($type) === 'Closure') { return \false; } - return $type instanceof CallableType; + return $type->isCallable()->yes(); } } diff --git a/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php index 8678cf322..2445b9600 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php @@ -22,6 +22,7 @@ use PHPStan\Type\ThisType; use Rector\Enum\ObjectReference; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeNestingScope\ContextAnalyzer; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\AstResolver; use Rector\PhpParser\Node\BetterNodeFinder; @@ -31,40 +32,40 @@ final class PropertyFetchAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; + /** + * @readonly + */ + private ContextAnalyzer $contextAnalyzer; /** * @var string */ private const THIS = 'this'; - public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, AstResolver $astResolver, NodeTypeResolver $nodeTypeResolver, ReflectionResolver $reflectionResolver) + public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, AstResolver $astResolver, NodeTypeResolver $nodeTypeResolver, ReflectionResolver $reflectionResolver, ContextAnalyzer $contextAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; $this->betterNodeFinder = $betterNodeFinder; $this->astResolver = $astResolver; $this->nodeTypeResolver = $nodeTypeResolver; $this->reflectionResolver = $reflectionResolver; + $this->contextAnalyzer = $contextAnalyzer; } public function isLocalPropertyFetch(Node $node) : bool { @@ -95,12 +96,28 @@ public function isLocalPropertyFetchName(Node $node, string $desiredPropertyName return $this->isLocalPropertyFetch($node); } public function containsLocalPropertyFetchName(Trait_ $trait, string $propertyName) : bool + { + if ($trait->getProperty($propertyName) instanceof Property) { + return \true; + } + return (bool) $this->betterNodeFinder->findFirst($trait, fn(Node $node): bool => $this->isLocalPropertyFetchName($node, $propertyName)); + } + public function containsWrittenPropertyFetchName(Trait_ $trait, string $propertyName) : bool { if ($trait->getProperty($propertyName) instanceof Property) { return \true; } return (bool) $this->betterNodeFinder->findFirst($trait, function (Node $node) use($propertyName) : bool { - return $this->isLocalPropertyFetchName($node, $propertyName); + if (!$this->isLocalPropertyFetchName($node, $propertyName)) { + return \false; + } + /** + * @var PropertyFetch|StaticPropertyFetch|NullsafePropertyFetch $node + */ + if ($this->contextAnalyzer->isChangeableContext($node)) { + return \true; + } + return $this->contextAnalyzer->isLeftPartOfAssign($node); }); } /** diff --git a/vendor/rector/rector/src/NodeAnalyzer/PropertyPresenceChecker.php b/vendor/rector/rector/src/NodeAnalyzer/PropertyPresenceChecker.php index 8c03cbca5..22810e22e 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/PropertyPresenceChecker.php +++ b/vendor/rector/rector/src/NodeAnalyzer/PropertyPresenceChecker.php @@ -10,11 +10,11 @@ use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\Type; -use PHPStan\Type\TypeWithClassName; use Rector\NodeNameResolver\NodeNameResolver; use Rector\Php80\NodeAnalyzer\PromotedPropertyResolver; use Rector\PhpParser\AstResolver; use Rector\PostRector\ValueObject\PropertyMetadata; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; /** * Can be local property, parent property etc. */ @@ -22,24 +22,20 @@ final class PropertyPresenceChecker { /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PromotedPropertyResolver */ - private $promotedPropertyResolver; + private PromotedPropertyResolver $promotedPropertyResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; public function __construct(PromotedPropertyResolver $promotedPropertyResolver, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, AstResolver $astResolver) { $this->promotedPropertyResolver = $promotedPropertyResolver; @@ -106,14 +102,14 @@ private function matchPropertyByType(PropertyMetadata $propertyMetadata, PhpProp if (!$propertyMetadata->getType() instanceof Type) { return null; } - if (!$propertyMetadata->getType() instanceof TypeWithClassName) { + if (ClassNameFromObjectTypeResolver::resolve($propertyMetadata->getType()) === null) { return null; } - if (!$phpPropertyReflection->getWritableType() instanceof TypeWithClassName) { + if (ClassNameFromObjectTypeResolver::resolve($phpPropertyReflection->getWritableType()) === null) { return null; } - $propertyObjectTypeWithClassName = $propertyMetadata->getType(); - if (!$propertyObjectTypeWithClassName->equals($phpPropertyReflection->getWritableType())) { + $type = $propertyMetadata->getType(); + if (!$type->equals($phpPropertyReflection->getWritableType())) { return null; } return $this->astResolver->resolvePropertyFromPropertyReflection($phpPropertyReflection); diff --git a/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php index 0b9904dcf..f426ff11c 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php @@ -4,17 +4,15 @@ namespace Rector\NodeAnalyzer; use PhpParser\Node; -use PhpParser\Node\Arg; -use PhpParser\Node\Expr\Variable; +use PhpParser\Node\ComplexType; use PhpParser\Node\Identifier; use PhpParser\Node\Name; -use PhpParser\Node\Param; final class ScopeAnalyzer { /** * @var array> */ - private const NON_REFRESHABLE_NODES = [Name::class, Identifier::class, Param::class, Arg::class, Variable::class]; + private const NON_REFRESHABLE_NODES = [Name::class, Identifier::class, ComplexType::class]; public function isRefreshable(Node $node) : bool { foreach (self::NON_REFRESHABLE_NODES as $noScopeNode) { diff --git a/vendor/rector/rector/src/NodeAnalyzer/TerminatedNodeAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/TerminatedNodeAnalyzer.php index 61d2e43e7..6fddd81e0 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/TerminatedNodeAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/TerminatedNodeAnalyzer.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Exit_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Break_; use PhpParser\Node\Stmt\ClassLike; @@ -22,7 +23,6 @@ use PhpParser\Node\Stmt\Nop; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; -use PhpParser\Node\Stmt\Throw_; use PhpParser\Node\Stmt\TryCatch; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; @@ -31,11 +31,7 @@ final class TerminatedNodeAnalyzer /** * @var array> */ - private const TERMINATED_NODES = [Return_::class, Throw_::class]; - /** - * @var array> - */ - private const TERMINABLE_NODES = [Throw_::class, Return_::class, Break_::class, Continue_::class]; + private const TERMINABLE_NODES = [Return_::class, Break_::class, Continue_::class]; /** * @var array> */ @@ -69,7 +65,7 @@ private function isTerminatedNode(Node $previousNode, Node $currentStmt) : bool if (\in_array(\get_class($previousNode), self::TERMINABLE_NODES, \true)) { return \true; } - if ($previousNode instanceof Expression && $previousNode->expr instanceof Exit_) { + if ($previousNode instanceof Expression && ($previousNode->expr instanceof Exit_ || $previousNode->expr instanceof Throw_)) { return \true; } if ($previousNode instanceof Goto_) { @@ -135,16 +131,14 @@ private function isTerminatedInLastStmts(array $stmts, Node $node) : bool if ($stmts === []) { return \false; } - \end($stmts); - $lastKey = \key($stmts); - \reset($stmts); + $lastKey = \array_key_last($stmts); $lastNode = $stmts[$lastKey]; - if (isset($stmts[$lastKey - 1]) && $this->isTerminatedNode($stmts[$lastKey - 1], $node)) { + if (isset($stmts[$lastKey - 1]) && !$this->isTerminatedNode($stmts[$lastKey - 1], $node)) { return \false; } if ($lastNode instanceof Expression) { - return $lastNode->expr instanceof Exit_; + return $lastNode->expr instanceof Exit_ || $lastNode->expr instanceof Throw_; } - return \in_array(\get_class($lastNode), self::TERMINATED_NODES, \true); + return $lastNode instanceof Return_; } } diff --git a/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php index 43eaaf8b9..cc23a468e 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/VariadicAnalyzer.php @@ -13,9 +13,8 @@ final class VariadicAnalyzer { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; @@ -36,9 +35,9 @@ public function hasVariadicParameters($call) : bool */ private function hasVariadicVariant($functionLikeReflection) : bool { - foreach ($functionLikeReflection->getVariants() as $parametersAcceptor) { + foreach ($functionLikeReflection->getVariants() as $variant) { // can be any number of arguments → nothing to limit here - if ($parametersAcceptor->isVariadic()) { + if ($variant->isVariadic()) { return \true; } } diff --git a/vendor/rector/rector/src/NodeCollector/NodeAnalyzer/ArrayCallableMethodMatcher.php b/vendor/rector/rector/src/NodeCollector/NodeAnalyzer/ArrayCallableMethodMatcher.php index 385e8509e..9a7c48a21 100644 --- a/vendor/rector/rector/src/NodeCollector/NodeAnalyzer/ArrayCallableMethodMatcher.php +++ b/vendor/rector/rector/src/NodeCollector/NodeAnalyzer/ArrayCallableMethodMatcher.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\NodeCollector\NodeAnalyzer; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Scalar\MagicConst\Class_; use PhpParser\Node\Scalar\String_; @@ -30,24 +30,20 @@ final class ArrayCallableMethodMatcher { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(NodeTypeResolver $nodeTypeResolver, ValueResolver $valueResolver, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver) { $this->nodeTypeResolver = $nodeTypeResolver; @@ -165,8 +161,8 @@ private function resolveClassContextType($classContext, Scope $scope, ?string $c return new ObjectType($classConstantReference, null, $classReflection); } $extendedMethodReflection = $classReflection->getMethod(MethodName::CONSTRUCT, $scope); - $parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); - foreach ($parametersAcceptorWithPhpDocs->getParameters() as $parameterReflectionWithPhpDoc) { + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + foreach ($extendedParametersAcceptor->getParameters() as $parameterReflectionWithPhpDoc) { if (!$parameterReflectionWithPhpDoc->getDefaultValue() instanceof Type) { return new MixedType(); } diff --git a/vendor/rector/rector/src/NodeCollector/ValueObject/ArrayCallable.php b/vendor/rector/rector/src/NodeCollector/ValueObject/ArrayCallable.php index 6e3e9cd08..1a33f3935 100644 --- a/vendor/rector/rector/src/NodeCollector/ValueObject/ArrayCallable.php +++ b/vendor/rector/rector/src/NodeCollector/ValueObject/ArrayCallable.php @@ -9,19 +9,16 @@ final class ArrayCallable { /** * @readonly - * @var \PhpParser\Node\Expr */ - private $callerExpr; + private Expr $callerExpr; /** * @readonly - * @var string */ - private $class; + private string $class; /** * @readonly - * @var string */ - private $method; + private string $method; public function __construct(Expr $callerExpr, string $class, string $method) { $this->callerExpr = $callerExpr; diff --git a/vendor/rector/rector/src/NodeDecorator/CreatedByRuleDecorator.php b/vendor/rector/rector/src/NodeDecorator/CreatedByRuleDecorator.php index ef81e0052..ed7b7e616 100644 --- a/vendor/rector/rector/src/NodeDecorator/CreatedByRuleDecorator.php +++ b/vendor/rector/rector/src/NodeDecorator/CreatedByRuleDecorator.php @@ -45,9 +45,7 @@ private function createByRule(Node $node, string $rectorClass) : void return; } // filter out when exists, then append - $createdByRule = \array_filter($createdByRule, static function (string $rectorRule) use($rectorClass) : bool { - return $rectorRule !== $rectorClass; - }); + $createdByRule = \array_filter($createdByRule, static fn(string $rectorRule): bool => $rectorRule !== $rectorClass); $node->setAttribute(AttributeKey::CREATED_BY_RULE, \array_merge($createdByRule, [$rectorClass])); } } diff --git a/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php b/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php index f9c67a569..c97530f69 100644 --- a/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php +++ b/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php @@ -17,24 +17,20 @@ final class PropertyTypeDecorator { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, PhpVersionProvider $phpVersionProvider, StaticTypeMapper $staticTypeMapper, PhpDocTypeChanger $phpDocTypeChanger) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/src/NodeDecorator/StatementDepthAttributeDecorator.php b/vendor/rector/rector/src/NodeDecorator/StatementDepthAttributeDecorator.php new file mode 100644 index 000000000..9c9ff2df9 --- /dev/null +++ b/vendor/rector/rector/src/NodeDecorator/StatementDepthAttributeDecorator.php @@ -0,0 +1,25 @@ +stmts as $methodStmt) { + $methodStmt->setAttribute(AttributeKey::IS_FIRST_LEVEL_STATEMENT, \true); + if ($methodStmt instanceof Expression) { + $methodStmt->expr->setAttribute(AttributeKey::IS_FIRST_LEVEL_STATEMENT, \true); + } + } + } + } +} diff --git a/vendor/rector/rector/src/NodeManipulator/AssignManipulator.php b/vendor/rector/rector/src/NodeManipulator/AssignManipulator.php index 21e610023..2d6f93d6f 100644 --- a/vendor/rector/rector/src/NodeManipulator/AssignManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/AssignManipulator.php @@ -13,31 +13,33 @@ use PhpParser\Node\FunctionLike; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\NodeNestingScope\ContextAnalyzer; use Rector\Php72\ValueObject\ListAndEach; use Rector\PhpParser\Node\BetterNodeFinder; final class AssignManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; - public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, PropertyFetchAnalyzer $propertyFetchAnalyzer) + private PropertyFetchAnalyzer $propertyFetchAnalyzer; + /** + * @readonly + */ + private ContextAnalyzer $contextAnalyzer; + public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, PropertyFetchAnalyzer $propertyFetchAnalyzer, ContextAnalyzer $contextAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; $this->betterNodeFinder = $betterNodeFinder; $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; + $this->contextAnalyzer = $contextAnalyzer; } /** * Matches: @@ -67,16 +69,6 @@ public function matchListAndEach(Assign $assign) : ?ListAndEach } return new ListAndEach($assign->var, $bareExpr); } - public function isLeftPartOfAssign(Node $node) : bool - { - if ($node->getAttribute(AttributeKey::IS_BEING_ASSIGNED) === \true) { - return \true; - } - if ($node->getAttribute(AttributeKey::IS_ASSIGN_REF_EXPR) === \true) { - return \true; - } - return $node->getAttribute(AttributeKey::IS_ASSIGN_OP_VAR) === \true; - } /** * @api doctrine * @return array @@ -87,7 +79,7 @@ public function resolveAssignsToLocalPropertyFetches(FunctionLike $functionLike) if (!$this->propertyFetchAnalyzer->isLocalPropertyFetch($node)) { return \false; } - return $this->isLeftPartOfAssign($node); + return $this->contextAnalyzer->isLeftPartOfAssign($node); }); } } diff --git a/vendor/rector/rector/src/NodeManipulator/BinaryOpManipulator.php b/vendor/rector/rector/src/NodeManipulator/BinaryOpManipulator.php index 82729fa80..a0df4a413 100644 --- a/vendor/rector/rector/src/NodeManipulator/BinaryOpManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/BinaryOpManipulator.php @@ -16,9 +16,8 @@ final class BinaryOpManipulator { /** * @readonly - * @var \Rector\PhpParser\Node\AssignAndBinaryMap */ - private $assignAndBinaryMap; + private AssignAndBinaryMap $assignAndBinaryMap; public function __construct(AssignAndBinaryMap $assignAndBinaryMap) { $this->assignAndBinaryMap = $assignAndBinaryMap; @@ -117,9 +116,7 @@ private function normalizeCondition($condition) : callable if (\is_callable($condition)) { return $condition; } - return static function (Node $node) use($condition) : bool { - return $node instanceof $condition; - }; + return static fn(Node $node): bool => $node instanceof $condition; } /** * @return class-string|null diff --git a/vendor/rector/rector/src/NodeManipulator/ClassConstManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassConstManipulator.php index 5baebdd9e..602494c34 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassConstManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassConstManipulator.php @@ -5,34 +5,39 @@ use PhpParser\Node; use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\ClassLike; use PHPStan\Reflection\ClassReflection; +use PHPStan\Type\ObjectType; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\AstResolver; use Rector\PhpParser\Node\BetterNodeFinder; final class ClassConstManipulator { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; - public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, AstResolver $astResolver) + private AstResolver $astResolver; + /** + * @readonly + */ + private NodeTypeResolver $nodeTypeResolver; + public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, AstResolver $astResolver, NodeTypeResolver $nodeTypeResolver) { $this->betterNodeFinder = $betterNodeFinder; $this->nodeNameResolver = $nodeNameResolver; $this->astResolver = $astResolver; + $this->nodeTypeResolver = $nodeTypeResolver; } public function hasClassConstFetch(ClassConst $classConst, ClassReflection $classReflection) : bool { @@ -40,18 +45,19 @@ public function hasClassConstFetch(ClassConst $classConst, ClassReflection $clas return \true; } $className = $classReflection->getName(); + $objectType = new ObjectType($className); foreach ($classReflection->getAncestors() as $ancestorClassReflection) { $ancestorClass = $this->astResolver->resolveClassFromClassReflection($ancestorClassReflection); if (!$ancestorClass instanceof ClassLike) { continue; } // has in class? - $isClassConstFetchFound = (bool) $this->betterNodeFinder->findFirst($ancestorClass, function (Node $node) use($classConst, $className) : bool { + $isClassConstFetchFound = (bool) $this->betterNodeFinder->findFirst($ancestorClass, function (Node $node) use($classConst, $className, $objectType) : bool { // property + static fetch if (!$node instanceof ClassConstFetch) { return \false; } - return $this->isNameMatch($node, $classConst, $className); + return $this->isNameMatch($node, $classConst, $className, $objectType); }); if ($isClassConstFetchFound) { return \true; @@ -59,12 +65,21 @@ public function hasClassConstFetch(ClassConst $classConst, ClassReflection $clas } return \false; } - private function isNameMatch(ClassConstFetch $classConstFetch, ClassConst $classConst, string $className) : bool + private function isNameMatch(ClassConstFetch $classConstFetch, ClassConst $classConst, string $className, ObjectType $objectType) : bool { $classConstName = (string) $this->nodeNameResolver->getName($classConst); $selfConstantName = 'self::' . $classConstName; $staticConstantName = 'static::' . $classConstName; $classNameConstantName = $className . '::' . $classConstName; - return $this->nodeNameResolver->isNames($classConstFetch, [$selfConstantName, $staticConstantName, $classNameConstantName]); + if ($this->nodeNameResolver->isNames($classConstFetch, [$selfConstantName, $staticConstantName, $classNameConstantName])) { + return \true; + } + if ($this->nodeTypeResolver->isObjectType($classConstFetch->class, $objectType)) { + if (!$classConstFetch->name instanceof Identifier) { + return \true; + } + return $this->nodeNameResolver->isName($classConstFetch->name, $classConstName); + } + return \false; } } diff --git a/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php index 0aaaa401a..533be8e12 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassDependencyManipulator.php @@ -3,11 +3,14 @@ declare (strict_types=1); namespace Rector\NodeManipulator; +use PhpParser\Node\Arg; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\StaticCall; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Property; @@ -17,6 +20,7 @@ use Rector\NodeAnalyzer\PropertyPresenceChecker; use Rector\NodeNameResolver\NodeNameResolver; use Rector\Php\PhpVersionProvider; +use Rector\PhpParser\AstResolver; use Rector\PhpParser\Node\NodeFactory; use Rector\PostRector\ValueObject\PropertyMetadata; use Rector\Reflection\ReflectionResolver; @@ -30,50 +34,45 @@ final class ClassDependencyManipulator { /** * @readonly - * @var \Rector\NodeManipulator\ClassInsertManipulator */ - private $classInsertManipulator; + private \Rector\NodeManipulator\ClassInsertManipulator $classInsertManipulator; /** * @readonly - * @var \Rector\NodeManipulator\ClassMethodAssignManipulator */ - private $classMethodAssignManipulator; + private \Rector\NodeManipulator\ClassMethodAssignManipulator $classMethodAssignManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private \Rector\NodeManipulator\StmtsManipulator $stmtsManipulator; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyPresenceChecker */ - private $propertyPresenceChecker; + private PropertyPresenceChecker $propertyPresenceChecker; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer */ - private $autowiredClassMethodOrPropertyAnalyzer; + private AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; - public function __construct(\Rector\NodeManipulator\ClassInsertManipulator $classInsertManipulator, \Rector\NodeManipulator\ClassMethodAssignManipulator $classMethodAssignManipulator, NodeFactory $nodeFactory, \Rector\NodeManipulator\StmtsManipulator $stmtsManipulator, PhpVersionProvider $phpVersionProvider, PropertyPresenceChecker $propertyPresenceChecker, NodeNameResolver $nodeNameResolver, AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, ReflectionResolver $reflectionResolver) + private ReflectionResolver $reflectionResolver; + /** + * @readonly + */ + private AstResolver $astResolver; + public function __construct(\Rector\NodeManipulator\ClassInsertManipulator $classInsertManipulator, \Rector\NodeManipulator\ClassMethodAssignManipulator $classMethodAssignManipulator, NodeFactory $nodeFactory, \Rector\NodeManipulator\StmtsManipulator $stmtsManipulator, PhpVersionProvider $phpVersionProvider, PropertyPresenceChecker $propertyPresenceChecker, NodeNameResolver $nodeNameResolver, AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, ReflectionResolver $reflectionResolver, AstResolver $astResolver) { $this->classInsertManipulator = $classInsertManipulator; $this->classMethodAssignManipulator = $classMethodAssignManipulator; @@ -84,36 +83,58 @@ public function __construct(\Rector\NodeManipulator\ClassInsertManipulator $clas $this->nodeNameResolver = $nodeNameResolver; $this->autowiredClassMethodOrPropertyAnalyzer = $autowiredClassMethodOrPropertyAnalyzer; $this->reflectionResolver = $reflectionResolver; + $this->astResolver = $astResolver; } public function addConstructorDependency(Class_ $class, PropertyMetadata $propertyMetadata) : void { + // already has property as dependency? skip it if ($this->hasClassPropertyAndDependency($class, $propertyMetadata)) { return; } - if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::PROPERTY_PROMOTION)) { + // special case for Symfony @required + $autowireClassMethod = $this->autowiredClassMethodOrPropertyAnalyzer->matchAutowiredMethodInClass($class); + if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::PROPERTY_PROMOTION) || $autowireClassMethod instanceof ClassMethod) { $this->classInsertManipulator->addPropertyToClass($class, $propertyMetadata->getName(), $propertyMetadata->getType()); } - if ($this->shouldAddPromotedProperty($class, $propertyMetadata)) { - $this->addPromotedProperty($class, $propertyMetadata); - } else { + // in case of existing autowire method, re-use it + if ($autowireClassMethod instanceof ClassMethod) { $assign = $this->nodeFactory->createPropertyAssignment($propertyMetadata->getName()); - $this->addConstructorDependencyWithCustomAssign($class, $propertyMetadata->getName(), $propertyMetadata->getType(), $assign); + $this->classMethodAssignManipulator->addParameterAndAssignToMethod($autowireClassMethod, $propertyMetadata->getName(), $propertyMetadata->getType(), $assign); + return; + } + $constructClassMethod = $this->resolveConstruct($class); + // add PHP 8.0 promoted property + if ($this->shouldAddPromotedProperty($class, $propertyMetadata)) { + $this->addPromotedProperty($class, $propertyMetadata, $constructClassMethod); + return; } + $assign = $this->nodeFactory->createPropertyAssignment($propertyMetadata->getName()); + $this->addConstructorDependencyWithCustomAssign($class, $propertyMetadata->getName(), $propertyMetadata->getType(), $assign); } /** * @api doctrine */ public function addConstructorDependencyWithCustomAssign(Class_ $class, string $name, ?Type $type, Assign $assign) : void { - /** @var ClassMethod|null $constructorMethod */ - $constructorMethod = $class->getMethod(MethodName::CONSTRUCT); - if ($constructorMethod instanceof ClassMethod) { - $this->classMethodAssignManipulator->addParameterAndAssignToMethod($constructorMethod, $name, $type, $assign); + /** @var ClassMethod|null $constructClassMethod */ + $constructClassMethod = $this->resolveConstruct($class); + if ($constructClassMethod instanceof ClassMethod) { + if (!$class->getMethod(MethodName::CONSTRUCT) instanceof ClassMethod) { + $parentArgs = []; + foreach ($constructClassMethod->params as $originalParam) { + $parentArgs[] = new Arg(new Variable((string) $this->nodeNameResolver->getName($originalParam->var))); + } + $constructClassMethod->stmts = [new Expression(new StaticCall(new Name(ObjectReference::PARENT), MethodName::CONSTRUCT, $parentArgs))]; + $this->classInsertManipulator->addAsFirstMethod($class, $constructClassMethod); + $this->classMethodAssignManipulator->addParameterAndAssignToMethod($constructClassMethod, $name, $type, $assign); + } else { + $this->classMethodAssignManipulator->addParameterAndAssignToMethod($constructClassMethod, $name, $type, $assign); + } return; } - $constructorMethod = $this->nodeFactory->createPublicMethod(MethodName::CONSTRUCT); - $this->classMethodAssignManipulator->addParameterAndAssignToMethod($constructorMethod, $name, $type, $assign); - $this->classInsertManipulator->addAsFirstMethod($class, $constructorMethod); + $constructClassMethod = $this->nodeFactory->createPublicMethod(MethodName::CONSTRUCT); + $this->classMethodAssignManipulator->addParameterAndAssignToMethod($constructClassMethod, $name, $type, $assign); + $this->classInsertManipulator->addAsFirstMethod($class, $constructClassMethod); } /** * @api doctrine @@ -139,16 +160,64 @@ public function addStmtsToConstructorIfNotThereYet(Class_ $class, array $stmts) } $classMethod->stmts = \array_merge($stmts, (array) $classMethod->stmts); } - private function addPromotedProperty(Class_ $class, PropertyMetadata $propertyMetadata) : void + private function resolveConstruct(Class_ $class) : ?ClassMethod + { + /** @var ClassMethod|null $constructorMethod */ + $constructorMethod = $class->getMethod(MethodName::CONSTRUCT); + // exists in current class + if ($constructorMethod instanceof ClassMethod) { + return $constructorMethod; + } + // lookup parent, found first found (nearest parent constructor to follow) + $classReflection = $this->reflectionResolver->resolveClassReflection($class); + if (!$classReflection instanceof ClassReflection) { + return null; + } + $ancestors = \array_filter($classReflection->getAncestors(), static fn(ClassReflection $ancestor): bool => $ancestor->getName() !== $classReflection->getName()); + foreach ($ancestors as $ancestor) { + if (!$ancestor->hasNativeMethod(MethodName::CONSTRUCT)) { + continue; + } + $parentClass = $this->astResolver->resolveClassFromClassReflection($ancestor); + if (!$parentClass instanceof ClassLike) { + continue; + } + $parentConstructorMethod = $parentClass->getMethod(MethodName::CONSTRUCT); + if (!$parentConstructorMethod instanceof ClassMethod) { + continue; + } + if ($parentConstructorMethod->isPrivate()) { + // stop, nearest __construct() uses private visibility + // which parent::__construct() will cause error + break; + } + $constructorMethod = clone $parentConstructorMethod; + // reprint parent method node to avoid invalid tokens + $this->nodeFactory->createReprintedNode($constructorMethod); + return $constructorMethod; + } + return null; + } + private function addPromotedProperty(Class_ $class, PropertyMetadata $propertyMetadata, ?ClassMethod $constructClassMethod) : void { - $constructClassMethod = $class->getMethod(MethodName::CONSTRUCT); $param = $this->nodeFactory->createPromotedPropertyParam($propertyMetadata); if ($constructClassMethod instanceof ClassMethod) { // parameter is already added if ($this->hasMethodParameter($constructClassMethod, $propertyMetadata->getName())) { return; } - $constructClassMethod->params[] = $param; + // found construct, but only on parent, add to current class + if (!$class->getMethod(MethodName::CONSTRUCT) instanceof ClassMethod) { + $parentArgs = []; + foreach ($constructClassMethod->params as $originalParam) { + $parentArgs[] = new Arg(new Variable((string) $this->nodeNameResolver->getName($originalParam->var))); + } + $constructClassMethod->params[] = $param; + $constructClassMethod->stmts = [new Expression(new StaticCall(new Name(ObjectReference::PARENT), MethodName::CONSTRUCT, $parentArgs))]; + $this->classInsertManipulator->addAsFirstMethod($class, $constructClassMethod); + } else { + $constructClassMethod->params[] = $param; + } } else { $constructClassMethod = $this->nodeFactory->createPublicMethod(MethodName::CONSTRUCT); $constructClassMethod->params[] = $param; diff --git a/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php index c669096d3..45249471e 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassInsertManipulator.php @@ -14,9 +14,8 @@ final class ClassInsertManipulator { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/src/NodeManipulator/ClassManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassManipulator.php index c3d0be1c1..02836377a 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassManipulator.php @@ -11,14 +11,12 @@ final class ClassManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeManipulator/ClassMethodAssignManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassMethodAssignManipulator.php index 71095bbc3..99472ff5a 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassMethodAssignManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassMethodAssignManipulator.php @@ -13,18 +13,16 @@ final class ClassMethodAssignManipulator { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @var array */ - private $alreadyAddedClassMethodNames = []; + private array $alreadyAddedClassMethodNames = []; public function __construct(NodeFactory $nodeFactory, NodeNameResolver $nodeNameResolver) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/src/NodeManipulator/ClassMethodManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassMethodManipulator.php index ed436f864..3dcc7452d 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassMethodManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassMethodManipulator.php @@ -13,14 +13,12 @@ final class ClassMethodManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionResolver $reflectionResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeManipulator/ClassMethodPropertyFetchManipulator.php b/vendor/rector/rector/src/NodeManipulator/ClassMethodPropertyFetchManipulator.php index bcb079fd2..1d276a407 100644 --- a/vendor/rector/rector/src/NodeManipulator/ClassMethodPropertyFetchManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/ClassMethodPropertyFetchManipulator.php @@ -13,26 +13,23 @@ use PhpParser\Node\Param; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; final class ClassMethodPropertyFetchManipulator { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeManipulator\FunctionLikeManipulator */ - private $functionLikeManipulator; + private \Rector\NodeManipulator\FunctionLikeManipulator $functionLikeManipulator; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, \Rector\NodeManipulator\FunctionLikeManipulator $functionLikeManipulator) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -53,7 +50,7 @@ public function findParamAssignToPropertyName(ClassMethod $classMethod, string $ $assignedParamName = null; $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $node) use($propertyName, &$assignedParamName) : ?int { if ($node instanceof Class_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Assign) { return null; @@ -68,7 +65,7 @@ public function findParamAssignToPropertyName(ClassMethod $classMethod, string $ return null; } $assignedParamName = $this->nodeNameResolver->getName($node->expr); - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); /** @var string|null $assignedParamName */ if ($assignedParamName === null) { @@ -97,7 +94,7 @@ public function findAssignsToPropertyName(ClassMethod $classMethod, string $prop $paramNames = $this->functionLikeManipulator->resolveParamNames($classMethod); $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $node) use($propertyName, &$assignExprs, $paramNames) : ?int { if ($node instanceof Class_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Assign) { return null; diff --git a/vendor/rector/rector/src/NodeManipulator/FuncCallManipulator.php b/vendor/rector/rector/src/NodeManipulator/FuncCallManipulator.php index 75b7e41ba..23caff11b 100644 --- a/vendor/rector/rector/src/NodeManipulator/FuncCallManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/FuncCallManipulator.php @@ -10,9 +10,8 @@ final class FuncCallManipulator { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/src/NodeManipulator/FunctionLikeManipulator.php b/vendor/rector/rector/src/NodeManipulator/FunctionLikeManipulator.php index 06872e7a7..9e58cdde2 100644 --- a/vendor/rector/rector/src/NodeManipulator/FunctionLikeManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/FunctionLikeManipulator.php @@ -9,9 +9,8 @@ final class FunctionLikeManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeManipulator/IfManipulator.php b/vendor/rector/rector/src/NodeManipulator/IfManipulator.php index 737044c82..e6bf571f7 100644 --- a/vendor/rector/rector/src/NodeManipulator/IfManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/IfManipulator.php @@ -21,24 +21,20 @@ final class IfManipulator { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private \Rector\NodeManipulator\StmtsManipulator $stmtsManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; public function __construct(BetterNodeFinder $betterNodeFinder, \Rector\NodeManipulator\StmtsManipulator $stmtsManipulator, ValueResolver $valueResolver, NodeComparator $nodeComparator) { $this->betterNodeFinder = $betterNodeFinder; @@ -139,12 +135,7 @@ public function collectNestedIfsWithNonBreaking(Foreach_ $foreach) : array if (!$this->isIfWithoutElseAndElseIfs($currentIf)) { return []; } - $return = $this->betterNodeFinder->findFirstInstanceOf($currentIf->stmts, Return_::class); - if ($return instanceof Return_) { - return []; - } - $exit = $this->betterNodeFinder->findFirstInstanceOf($currentIf->stmts, Exit_::class); - if ($exit instanceof Exit_) { + if ($this->betterNodeFinder->hasInstancesOf($currentIf->stmts, [Return_::class, Exit_::class])) { return []; } // last if is with the expression diff --git a/vendor/rector/rector/src/NodeManipulator/PropertyFetchAssignManipulator.php b/vendor/rector/rector/src/NodeManipulator/PropertyFetchAssignManipulator.php index 847206def..8b690c705 100644 --- a/vendor/rector/rector/src/NodeManipulator/PropertyFetchAssignManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/PropertyFetchAssignManipulator.php @@ -10,7 +10,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Property; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; @@ -19,19 +19,16 @@ final class PropertyFetchAssignManipulator { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -49,7 +46,7 @@ public function isAssignedMultipleTimesInConstructor(Class_ $class, Property $pr $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $classMethod->getStmts(), function (Node $node) use($propertyName, &$count) : ?int { // skip anonymous classes and inner function if ($node instanceof Class_ || $node instanceof Function_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Assign && !$node instanceof AssignOp) { return null; @@ -59,7 +56,7 @@ public function isAssignedMultipleTimesInConstructor(Class_ $class, Property $pr } ++$count; if ($count === 2) { - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; }); diff --git a/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php b/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php index 819681c14..f4fa161b0 100644 --- a/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/PropertyManipulator.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\NodeManipulator; -use RectorPrefix202411\Doctrine\ORM\Mapping\Table; +use RectorPrefix202506\Doctrine\ORM\Mapping\Table; use PhpParser\Node; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; @@ -19,6 +19,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeNestingScope\ContextAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; @@ -36,66 +37,54 @@ final class PropertyManipulator { /** * @readonly - * @var \Rector\NodeManipulator\AssignManipulator */ - private $assignManipulator; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PropertyFetchFinder $propertyFetchFinder; /** * @readonly - * @var \Rector\PhpParser\NodeFinder\PropertyFetchFinder */ - private $propertyFetchFinder; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private PromotedPropertyResolver $promotedPropertyResolver; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PromotedPropertyResolver */ - private $promotedPropertyResolver; + private ConstructorAssignDetector $constructorAssignDetector; /** * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ - private $constructorAssignDetector; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private ContextAnalyzer $contextAnalyzer; /** * @var string[]|class-string

[] */ - private const DOCTRINE_PROPERTY_ANNOTATIONS = ['Doctrine\\ORM\\Mapping\\Entity', 'Doctrine\\ORM\\Mapping\\Table', 'Doctrine\\ORM\\Mapping\\MappedSuperclass', 'Doctrine\\ORM\\Mapping\\Embeddable']; - public function __construct(\Rector\NodeManipulator\AssignManipulator $assignManipulator, BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory, PropertyFetchFinder $propertyFetchFinder, NodeNameResolver $nodeNameResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, NodeTypeResolver $nodeTypeResolver, PromotedPropertyResolver $promotedPropertyResolver, ConstructorAssignDetector $constructorAssignDetector, AstResolver $astResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer) + private const ALLOWED_NOT_READONLY_CLASS_ANNOTATIONS = ['ApiPlatform\\Core\\Annotation\\ApiResource', 'ApiPlatform\\Metadata\\ApiResource', 'Doctrine\\ORM\\Mapping\\Entity', 'Doctrine\\ORM\\Mapping\\Table', 'Doctrine\\ORM\\Mapping\\MappedSuperclass', 'Doctrine\\ORM\\Mapping\\Embeddable', 'Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\Document', 'Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\EmbeddedDocument']; + public function __construct(BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory, PropertyFetchFinder $propertyFetchFinder, NodeNameResolver $nodeNameResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, NodeTypeResolver $nodeTypeResolver, PromotedPropertyResolver $promotedPropertyResolver, ConstructorAssignDetector $constructorAssignDetector, AstResolver $astResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer, ContextAnalyzer $contextAnalyzer) { - $this->assignManipulator = $assignManipulator; $this->betterNodeFinder = $betterNodeFinder; $this->phpDocInfoFactory = $phpDocInfoFactory; $this->propertyFetchFinder = $propertyFetchFinder; @@ -106,6 +95,7 @@ public function __construct(\Rector\NodeManipulator\AssignManipulator $assignMan $this->constructorAssignDetector = $constructorAssignDetector; $this->astResolver = $astResolver; $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; + $this->contextAnalyzer = $contextAnalyzer; } /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $propertyOrParam @@ -119,7 +109,7 @@ public function isPropertyChangeableExceptConstructor(Class_ $class, $propertyOr $propertyFetches = $this->propertyFetchFinder->findPrivatePropertyFetches($class, $propertyOrParam, $scope); $classMethod = $class->getMethod(MethodName::CONSTRUCT); foreach ($propertyFetches as $propertyFetch) { - if ($this->isChangeableContext($propertyFetch)) { + if ($this->contextAnalyzer->isChangeableContext($propertyFetch)) { return \true; } // skip for constructor? it is allowed to set value in constructor method @@ -127,7 +117,7 @@ public function isPropertyChangeableExceptConstructor(Class_ $class, $propertyOr if ($this->isPropertyAssignedOnlyInConstructor($class, $propertyName, $propertyFetch, $classMethod)) { continue; } - if ($this->assignManipulator->isLeftPartOfAssign($propertyFetch)) { + if ($this->contextAnalyzer->isLeftPartOfAssign($propertyFetch)) { return \true; } if ($propertyFetch->getAttribute(AttributeKey::IS_UNSET_VAR) === \true) { @@ -171,6 +161,23 @@ public function isUsedByTrait(ClassReflection $classReflection, string $property } return \false; } + public function hasTraitWithSamePropertyOrWritten(ClassReflection $classReflection, string $propertyName) : bool + { + foreach ($classReflection->getTraits() as $traitUse) { + if ($traitUse->hasProperty($propertyName)) { + return \true; + } + $trait = $this->astResolver->resolveClassFromClassReflection($traitUse); + if (!$trait instanceof Trait_) { + continue; + } + // is property written to + if ($this->propertyFetchAnalyzer->containsWrittenPropertyFetchName($trait, $propertyName)) { + return \true; + } + } + return \false; + } /** * @param \PhpParser\Node\Expr\StaticPropertyFetch|\PhpParser\Node\Expr\PropertyFetch $propertyFetch */ @@ -179,36 +186,18 @@ private function isPropertyAssignedOnlyInConstructor(Class_ $class, string $prop if (!$classMethod instanceof ClassMethod) { return \false; } - $node = $this->betterNodeFinder->findFirst((array) $classMethod->stmts, static function (Node $subNode) use($propertyFetch) : bool { - return ($subNode instanceof PropertyFetch || $subNode instanceof StaticPropertyFetch) && $subNode === $propertyFetch; - }); + $node = $this->betterNodeFinder->findFirst((array) $classMethod->stmts, static fn(Node $subNode): bool => ($subNode instanceof PropertyFetch || $subNode instanceof StaticPropertyFetch) && $subNode === $propertyFetch); // there is property unset in Test class, so only check on __construct if (!$node instanceof Node) { return \false; } return $this->constructorAssignDetector->isPropertyAssigned($class, $propertyName); } - /** - * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch - */ - private function isChangeableContext($propertyFetch) : bool - { - if ($propertyFetch->getAttribute(AttributeKey::IS_UNSET_VAR, \false)) { - return \true; - } - if ($propertyFetch->getAttribute(AttributeKey::INSIDE_ARRAY_DIM_FETCH, \false)) { - return \true; - } - if ($propertyFetch->getAttribute(AttributeKey::IS_USED_AS_ARG_BY_REF_VALUE, \false) === \true) { - return \true; - } - return $propertyFetch->getAttribute(AttributeKey::IS_INCREMENT_OR_DECREMENT, \false) === \true; - } private function hasAllowedNotReadonlyAnnotationOrAttribute(PhpDocInfo $phpDocInfo, Class_ $class) : bool { - if ($phpDocInfo->hasByAnnotationClasses(self::DOCTRINE_PROPERTY_ANNOTATIONS)) { + if ($phpDocInfo->hasByAnnotationClasses(self::ALLOWED_NOT_READONLY_CLASS_ANNOTATIONS)) { return \true; } - return $this->phpAttributeAnalyzer->hasPhpAttributes($class, self::DOCTRINE_PROPERTY_ANNOTATIONS); + return $this->phpAttributeAnalyzer->hasPhpAttributes($class, self::ALLOWED_NOT_READONLY_CLASS_ANNOTATIONS); } } diff --git a/vendor/rector/rector/src/NodeManipulator/StmtsManipulator.php b/vendor/rector/rector/src/NodeManipulator/StmtsManipulator.php index 2ec893d40..5d8a573bf 100644 --- a/vendor/rector/rector/src/NodeManipulator/StmtsManipulator.php +++ b/vendor/rector/rector/src/NodeManipulator/StmtsManipulator.php @@ -4,12 +4,16 @@ namespace Rector\NodeManipulator; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; +use PhpParser\Node\Stmt\Finally_; +use PhpParser\Node\Stmt\TryCatch; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\DeadCode\NodeAnalyzer\ExprUsedInNodeAnalyzer; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Comparing\NodeComparator; use Rector\PhpParser\Node\BetterNodeFinder; @@ -17,24 +21,20 @@ final class StmtsManipulator { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\ExprUsedInNodeAnalyzer */ - private $exprUsedInNodeAnalyzer; + private ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, BetterNodeFinder $betterNodeFinder, NodeComparator $nodeComparator, ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -44,14 +44,17 @@ public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTrave } /** * @param Stmt[] $stmts + * @return null|\PhpParser\Node\Expr|\PhpParser\Node\Stmt */ - public function getUnwrappedLastStmt(array $stmts) : ?Node + public function getUnwrappedLastStmt(array $stmts) { - \end($stmts); - $lastStmtKey = \key($stmts); - \reset($stmts); + if ($stmts === []) { + return null; + } + $lastStmtKey = \array_key_last($stmts); $lastStmt = $stmts[$lastStmtKey]; if ($lastStmt instanceof Expression) { + $lastStmt->expr->setAttribute(AttributeKey::COMMENTS, $lastStmt->getAttribute(AttributeKey::COMMENTS)); return $lastStmt->expr; } return $lastStmt; @@ -73,18 +76,27 @@ public function filterOutExistingStmts(ClassMethod $classMethod, array $stmts) : }); return $stmts; } - /** - * @param StmtsAwareInterface|Stmt[] $stmtsAware - */ - public function isVariableUsedInNextStmt($stmtsAware, int $jumpToKey, string $variableName) : bool + public function isVariableUsedInNextStmt(StmtsAwareInterface $stmtsAware, int $jumpToKey, string $variableName) : bool { - if ($stmtsAware instanceof StmtsAwareInterface && $stmtsAware->stmts === null) { + if ($stmtsAware->stmts === null) { return \false; } - $stmts = \array_slice($stmtsAware instanceof StmtsAwareInterface ? $stmtsAware->stmts : $stmtsAware, $jumpToKey, null, \true); + $lastKey = \array_key_last($stmtsAware->stmts); + $stmts = []; + for ($key = $jumpToKey; $key <= $lastKey; ++$key) { + if (!isset($stmtsAware->stmts[$key])) { + // can be just removed + continue; + } + $stmts[] = $stmtsAware->stmts[$key]; + } + if ($stmtsAware instanceof TryCatch) { + $stmts = \array_merge($stmts, $stmtsAware->catches); + if ($stmtsAware->finally instanceof Finally_) { + $stmts = \array_merge($stmts, $stmtsAware->finally->stmts); + } + } $variable = new Variable($variableName); - return (bool) $this->betterNodeFinder->findFirst($stmts, function (Node $subNode) use($variable) : bool { - return $this->exprUsedInNodeAnalyzer->isUsed($subNode, $variable); - }); + return (bool) $this->betterNodeFinder->findFirst($stmts, fn(Node $subNode): bool => $this->exprUsedInNodeAnalyzer->isUsed($subNode, $variable)); } } diff --git a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver.php b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver.php index 39fbbe5c9..575c57da5 100644 --- a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver.php +++ b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver.php @@ -13,12 +13,12 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Param; +use PhpParser\Node\PropertyItem; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Const_; use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; use PhpParser\Node\Stmt\Trait_; use PHPStan\Analyser\Scope; use Rector\CodingStyle\Naming\ClassNaming; @@ -31,19 +31,17 @@ final class NodeNameResolver { /** * @readonly - * @var \Rector\CodingStyle\Naming\ClassNaming */ - private $classNaming; + private ClassNaming $classNaming; /** * @readonly - * @var \Rector\NodeAnalyzer\CallAnalyzer */ - private $callAnalyzer; + private CallAnalyzer $callAnalyzer; /** * @var NodeNameResolverInterface[] * @readonly */ - private $nodeNameResolvers = []; + private iterable $nodeNameResolvers = []; /** * Used to check if a string might contain a regex or fnmatch pattern */ @@ -51,7 +49,7 @@ final class NodeNameResolver /** * @var array */ - private $nodeNameResolversByClass = []; + private array $nodeNameResolversByClass = []; /** * @param NodeNameResolverInterface[] $nodeNameResolvers */ @@ -98,7 +96,7 @@ public function isName($node, string $name) : bool * @return ($node is Param ? string : * ($node is ClassMethod ? string : * ($node is Property ? string : - * ($node is PropertyProperty ? string : + * ($node is PropertyItem ? string : * ($node is Trait_ ? string : * ($node is Interface_ ? string : * ($node is Const_ ? string : diff --git a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FuncCallNameResolver.php b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FuncCallNameResolver.php index 318acb0b9..05b1fd8a6 100644 --- a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FuncCallNameResolver.php +++ b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FuncCallNameResolver.php @@ -18,9 +18,8 @@ final class FuncCallNameResolver implements NodeNameResolverInterface { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FunctionNameResolver.php b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FunctionNameResolver.php index 3309fb329..439259011 100644 --- a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FunctionNameResolver.php +++ b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/FunctionNameResolver.php @@ -19,7 +19,7 @@ public function getNode() : string /** * @param Function_ $node */ - public function resolve(Node $node, ?Scope $scope) : ?string + public function resolve(Node $node, ?Scope $scope) : string { $bareName = (string) $node->name; if (!$scope instanceof Scope) { diff --git a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/NameNameResolver.php b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/NameNameResolver.php index 19aeefa92..0e636d244 100644 --- a/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/NameNameResolver.php +++ b/vendor/rector/rector/src/NodeNameResolver/NodeNameResolver/NameNameResolver.php @@ -19,7 +19,7 @@ public function getNode() : string /** * @param Name $node */ - public function resolve(Node $node, ?Scope $scope) : ?string + public function resolve(Node $node, ?Scope $scope) : string { return $node->toString(); } diff --git a/vendor/rector/rector/src/NodeNestingScope/ContextAnalyzer.php b/vendor/rector/rector/src/NodeNestingScope/ContextAnalyzer.php index a795ff3bd..8c91ee1dc 100644 --- a/vendor/rector/rector/src/NodeNestingScope/ContextAnalyzer.php +++ b/vendor/rector/rector/src/NodeNestingScope/ContextAnalyzer.php @@ -4,6 +4,9 @@ namespace Rector\NodeNestingScope; use PhpParser\Node; +use PhpParser\Node\Expr\NullsafePropertyFetch; +use PhpParser\Node\Expr\PropertyFetch; +use PhpParser\Node\Expr\StaticPropertyFetch; use Rector\NodeTypeResolver\Node\AttributeKey; final class ContextAnalyzer { @@ -21,4 +24,30 @@ public function isInIf(Node $node) : bool { return $node->getAttribute(AttributeKey::IS_IN_IF) === \true; } + /** + * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch|\PhpParser\Node\Expr\NullsafePropertyFetch $propertyFetch + */ + public function isChangeableContext($propertyFetch) : bool + { + if ($propertyFetch->getAttribute(AttributeKey::IS_UNSET_VAR, \false)) { + return \true; + } + if ($propertyFetch->getAttribute(AttributeKey::INSIDE_ARRAY_DIM_FETCH, \false)) { + return \true; + } + if ($propertyFetch->getAttribute(AttributeKey::IS_USED_AS_ARG_BY_REF_VALUE, \false) === \true) { + return \true; + } + return $propertyFetch->getAttribute(AttributeKey::IS_INCREMENT_OR_DECREMENT, \false) === \true; + } + public function isLeftPartOfAssign(Node $node) : bool + { + if ($node->getAttribute(AttributeKey::IS_BEING_ASSIGNED) === \true) { + return \true; + } + if ($node->getAttribute(AttributeKey::IS_ASSIGN_REF_EXPR) === \true) { + return \true; + } + return $node->getAttribute(AttributeKey::IS_ASSIGN_OP_VAR) === \true; + } } diff --git a/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php b/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php index ca551ad06..63a7bdd64 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php +++ b/vendor/rector/rector/src/NodeTypeResolver/DependencyInjection/PHPStanServicesFactory.php @@ -15,11 +15,11 @@ use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider; -use RectorPrefix202411\Symfony\Component\Console\Input\ArrayInput; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Input\ArrayInput; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; use Throwable; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * Factory so Symfony app can use services from PHPStan container * @@ -41,9 +41,8 @@ final class PHPStanServicesFactory MESSAGE_ERROR; /** * @readonly - * @var \PHPStan\DependencyInjection\Container */ - private $container; + private Container $container; public function __construct() { $containerFactory = new ContainerFactory(\getcwd()); diff --git a/vendor/rector/rector/src/NodeTypeResolver/Node/AttributeKey.php b/vendor/rector/rector/src/NodeTypeResolver/Node/AttributeKey.php index 9d0c847fa..907b48ee2 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/Node/AttributeKey.php +++ b/vendor/rector/rector/src/NodeTypeResolver/Node/AttributeKey.php @@ -61,10 +61,6 @@ final class AttributeKey * Use often in php-parser */ public const KIND = 'kind'; - /** - * @var string - */ - public const IS_UNREACHABLE = 'isUnreachable'; /** * @var string */ @@ -77,10 +73,6 @@ final class AttributeKey * @var string */ public const DO_NOT_CHANGE = 'do_not_change'; - /** - * @var string - */ - public const FUNC_ARGS_TRAILING_COMMA = 'trailing_comma'; /** * Helps with infinite loop detection * @var string @@ -210,6 +202,10 @@ final class AttributeKey * @var string */ public const IS_INCREMENT_OR_DECREMENT = 'is_increment_or_decrement'; + /** + * @var string + */ + public const IS_RIGHT_AND = 'is_right_and'; /** * @var string */ @@ -234,4 +230,8 @@ final class AttributeKey * @var string */ public const ATTRIBUTE_COMMENT = 'attribute_comment'; + /** + * @var string + */ + public const IS_FIRST_LEVEL_STATEMENT = 'first_level_stmt'; } diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeScopeAndMetadataDecorator.php b/vendor/rector/rector/src/NodeTypeResolver/NodeScopeAndMetadataDecorator.php index 0c1e3392a..54159abcb 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeScopeAndMetadataDecorator.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeScopeAndMetadataDecorator.php @@ -12,26 +12,22 @@ final class NodeScopeAndMetadataDecorator { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Scope\PHPStanNodeScopeResolver */ - private $phpStanNodeScopeResolver; + private PHPStanNodeScopeResolver $phpStanNodeScopeResolver; /** * @readonly - * @var \Rector\PhpParser\NodeTraverser\FileWithoutNamespaceNodeTraverser */ - private $fileWithoutNamespaceNodeTraverser; + private FileWithoutNamespaceNodeTraverser $fileWithoutNamespaceNodeTraverser; /** * @readonly - * @var \PhpParser\NodeTraverser */ - private $nodeTraverser; + private NodeTraverser $nodeTraverser; public function __construct(CloningVisitor $cloningVisitor, PHPStanNodeScopeResolver $phpStanNodeScopeResolver, FileWithoutNamespaceNodeTraverser $fileWithoutNamespaceNodeTraverser) { $this->phpStanNodeScopeResolver = $phpStanNodeScopeResolver; $this->fileWithoutNamespaceNodeTraverser = $fileWithoutNamespaceNodeTraverser; - $this->nodeTraverser = new NodeTraverser(); // needed for format preserving printing - $this->nodeTraverser->addVisitor($cloningVisitor); + $this->nodeTraverser = new NodeTraverser($cloningVisitor); } /** * @param Stmt[] $stmts diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyStringTypeCorrector.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyStringTypeCorrector.php index f122b1195..c49f4b0e5 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyStringTypeCorrector.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyStringTypeCorrector.php @@ -8,10 +8,7 @@ use PHPStan\Type\Type; final class AccessoryNonEmptyStringTypeCorrector { - /** - * @return \PHPStan\Type\Type|\PHPStan\Type\IntersectionType - */ - public function correct(Type $mainType) + public function correct(Type $mainType) : Type { if (!$mainType instanceof IntersectionType) { return $mainType; diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/GenericClassStringTypeCorrector.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/GenericClassStringTypeCorrector.php index 6a8821516..6d2cff704 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/GenericClassStringTypeCorrector.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeCorrector/GenericClassStringTypeCorrector.php @@ -13,9 +13,8 @@ final class GenericClassStringTypeCorrector { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php index 5f8fcae3f..a23b94448 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver.php @@ -8,11 +8,15 @@ use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\BinaryOp\Coalesce; use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\NullsafeMethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Ternary; +use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Name; +use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\NullableType; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassConst; @@ -20,13 +24,15 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\UnionType as NodeUnionType; use PHPStan\Analyser\Scope; -use PHPStan\Broker\ClassAutoloadingException; +use PHPStan\Broker\ClassNotFoundException; use PHPStan\Reflection\ClassReflection; +use PHPStan\Reflection\Native\NativeFunctionReflection; 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\ErrorType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\NullType; @@ -40,6 +46,7 @@ use Rector\Configuration\RenamedClassesDataCollector; use Rector\Exception\ShouldNotHappenException; use Rector\NodeAnalyzer\ClassAnalyzer; +use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Contract\NodeTypeResolverAwareInterface; use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -53,34 +60,32 @@ final class NodeTypeResolver { /** * @readonly - * @var \Rector\TypeDeclaration\PHPStan\ObjectTypeSpecifier */ - private $objectTypeSpecifier; + private ObjectTypeSpecifier $objectTypeSpecifier; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeCorrector\GenericClassStringTypeCorrector */ - private $genericClassStringTypeCorrector; + private GenericClassStringTypeCorrector $genericClassStringTypeCorrector; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeCorrector\AccessoryNonEmptyStringTypeCorrector */ - private $accessoryNonEmptyStringTypeCorrector; + private AccessoryNonEmptyStringTypeCorrector $accessoryNonEmptyStringTypeCorrector; /** * @readonly - * @var \Rector\Configuration\RenamedClassesDataCollector */ - private $renamedClassesDataCollector; + private RenamedClassesDataCollector $renamedClassesDataCollector; + /** + * @readonly + */ + private NodeNameResolver $nodeNameResolver; /** * @var string */ @@ -88,11 +93,11 @@ final class NodeTypeResolver /** * @var array, NodeTypeResolverInterface> */ - private $nodeTypeResolvers = []; + private array $nodeTypeResolvers = []; /** * @param NodeTypeResolverInterface[] $nodeTypeResolvers */ - public function __construct(ObjectTypeSpecifier $objectTypeSpecifier, ClassAnalyzer $classAnalyzer, GenericClassStringTypeCorrector $genericClassStringTypeCorrector, ReflectionProvider $reflectionProvider, AccessoryNonEmptyStringTypeCorrector $accessoryNonEmptyStringTypeCorrector, RenamedClassesDataCollector $renamedClassesDataCollector, iterable $nodeTypeResolvers) + public function __construct(ObjectTypeSpecifier $objectTypeSpecifier, ClassAnalyzer $classAnalyzer, GenericClassStringTypeCorrector $genericClassStringTypeCorrector, ReflectionProvider $reflectionProvider, AccessoryNonEmptyStringTypeCorrector $accessoryNonEmptyStringTypeCorrector, RenamedClassesDataCollector $renamedClassesDataCollector, NodeNameResolver $nodeNameResolver, iterable $nodeTypeResolvers) { $this->objectTypeSpecifier = $objectTypeSpecifier; $this->classAnalyzer = $classAnalyzer; @@ -100,6 +105,7 @@ public function __construct(ObjectTypeSpecifier $objectTypeSpecifier, ClassAnaly $this->reflectionProvider = $reflectionProvider; $this->accessoryNonEmptyStringTypeCorrector = $accessoryNonEmptyStringTypeCorrector; $this->renamedClassesDataCollector = $renamedClassesDataCollector; + $this->nodeNameResolver = $nodeNameResolver; foreach ($nodeTypeResolvers as $nodeTypeResolver) { if ($nodeTypeResolver instanceof NodeTypeResolverAwareInterface) { $nodeTypeResolver->autowire($this); @@ -132,6 +138,20 @@ public function isObjectType(Node $node, ObjectType $requiredObjectType) : bool throw new ShouldNotHappenException(\sprintf(self::ERROR_MESSAGE, \get_class($node), ClassLike::class)); } $resolvedType = $this->getType($node); + // cover call $this on trait + if ($resolvedType instanceof ErrorType && ($node instanceof Variable && $this->nodeNameResolver->isName($node, 'this'))) { + $scope = $node->getAttribute(AttributeKey::SCOPE); + if (!$scope instanceof Scope) { + return \false; + } + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \false; + } + if ($classReflection->isTrait()) { + $resolvedType = new ObjectType($classReflection->getName()); + } + } if ($resolvedType instanceof MixedType) { return \false; } @@ -141,7 +161,7 @@ public function isObjectType(Node $node, ObjectType $requiredObjectType) : bool if ($resolvedType instanceof ObjectType) { try { return $this->resolveObjectType($resolvedType, $requiredObjectType); - } catch (ClassAutoloadingException $exception) { + } catch (ClassNotFoundException $exception) { // in some type checks, the provided type in rector.php configuration does not have to exists return \false; } @@ -178,7 +198,7 @@ public function getType(Node $node) : Type $type = $this->genericClassStringTypeCorrector->correct($type); if ($type instanceof ObjectType) { $scope = $node->getAttribute(AttributeKey::SCOPE); - $type = $this->objectTypeSpecifier->narrowToFullyQualifiedOrAliasedObjectType($node, $type, $scope); + $type = $this->objectTypeSpecifier->narrowToFullyQualifiedOrAliasedObjectType($node, $type, $scope, \true); } return $type; } @@ -278,6 +298,9 @@ public function getFullyQualifiedClassName(TypeWithClassName $typeWithClassName) public function isMethodStaticCallOrClassMethodObjectType(Node $node, ObjectType $objectType) : bool { if ($node instanceof MethodCall || $node instanceof NullsafeMethodCall) { + if ($this->isEnumTypeMatch($node, $objectType)) { + return \true; + } // method call is variable return return $this->isObjectType($node->var, $objectType); } @@ -295,7 +318,10 @@ public function isMethodStaticCallOrClassMethodObjectType(Node $node, ObjectType if ($classReflection->getName() === $objectType->getClassName()) { return \true; } - return $classReflection->isSubclassOf($objectType->getClassName()); + if ($classReflection->is($objectType->getClassName())) { + return \true; + } + return $classReflection->hasTraitUse($objectType->getClassName()); } /** * Allow pull type from @@ -316,7 +342,7 @@ public function isMethodStaticCallOrClassMethodObjectType(Node $node, ObjectType 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) { + if ($nativeVariableType instanceof MixedType || $nativeVariableType instanceof ArrayType && $nativeVariableType->getIterableValueType() instanceof MixedType) { return $originalNativeType; } $type = $scope->getType($arrayDimFetch); @@ -353,9 +379,9 @@ private function resolveNativeUnionType(UnionType $unionType) : Type } } if ($hasChanged) { - return $this->accessoryNonEmptyStringTypeCorrector->correct(new UnionType($types)); + return new UnionType($types); } - return $this->accessoryNonEmptyStringTypeCorrector->correct($unionType); + return $unionType; } private function isMatchObjectWithoutClassType(ObjectWithoutClassType $objectWithoutClassType, ObjectType $requiredObjectType) : bool { @@ -381,7 +407,7 @@ private function isAnonymousObjectType(Type $type) : bool } private function isUnionTypeable(Type $first, Type $second) : bool { - return !$first instanceof UnionType && !$second instanceof UnionType && !$second instanceof NullType; + return !$first instanceof UnionType && !$second instanceof UnionType && !$second->isNull()->yes(); } private function isMatchingUnionType(Type $resolvedType, ObjectType $requiredObjectType) : bool { @@ -478,6 +504,43 @@ private function resolveNativeTypeWithBuiltinMethodCallFallback(Expr $expr, Scop return $scope->getType($expr); } } + if ($expr instanceof FuncCall) { + if (!$expr->name instanceof Name) { + return $scope->getNativeType($expr); + } + $functionName = new Name((string) $this->nodeNameResolver->getName($expr)); + if (!$this->reflectionProvider->hasFunction($functionName, null)) { + return $scope->getNativeType($expr); + } + $functionReflection = $this->reflectionProvider->getFunction($functionName, null); + if (!$functionReflection instanceof NativeFunctionReflection) { + return $scope->getNativeType($expr); + } + return $scope->getType($expr); + } return $scope->getNativeType($expr); } + /** + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\NullsafeMethodCall $call + */ + private function isEnumTypeMatch($call, ObjectType $objectType) : bool + { + if (!$call->var instanceof ClassConstFetch) { + return \false; + } + // possibly enum + $classConstFetch = $call->var; + if (!$classConstFetch->class instanceof FullyQualified) { + return \false; + } + $className = $classConstFetch->class->toString(); + if (!$this->reflectionProvider->hasClass($className)) { + return \false; + } + $classReflection = $this->reflectionProvider->getClass($className); + if (!$classReflection->isEnum()) { + return \false; + } + return $classReflection->getName() === $objectType->getClassName(); + } } diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ClassAndInterfaceTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ClassAndInterfaceTypeResolver.php index 44c681e00..921a6229a 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ClassAndInterfaceTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ClassAndInterfaceTypeResolver.php @@ -24,9 +24,8 @@ final class ClassAndInterfaceTypeResolver implements NodeTypeResolverInterface { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/NewTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/NewTypeResolver.php index c3b8e5367..56c1267b9 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/NewTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/NewTypeResolver.php @@ -26,14 +26,12 @@ final class NewTypeResolver implements NodeTypeResolverInterface { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; public function __construct(NodeNameResolver $nodeNameResolver, ClassAnalyzer $classAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ParamTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ParamTypeResolver.php index a12d1176e..7becd4b0c 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ParamTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ParamTypeResolver.php @@ -17,10 +17,7 @@ */ final class ParamTypeResolver implements NodeTypeResolverInterface, NodeTypeResolverAwareInterface { - /** - * @var \Rector\NodeTypeResolver\NodeTypeResolver - */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function autowire(NodeTypeResolver $nodeTypeResolver) : void { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php index db70f679e..f7cd4071b 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php @@ -24,18 +24,13 @@ final class PropertyFetchTypeResolver implements NodeTypeResolverInterface, Node { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; - /** - * @var \Rector\NodeTypeResolver\NodeTypeResolver - */ - private $nodeTypeResolver; + private ReflectionProvider $reflectionProvider; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyTypeResolver.php index f5ac1da8f..d6ea6940d 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/PropertyTypeResolver.php @@ -19,9 +19,8 @@ final class PropertyTypeResolver implements NodeTypeResolverInterface { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver\PropertyFetchTypeResolver */ - private $propertyFetchTypeResolver; + private \Rector\NodeTypeResolver\NodeTypeResolver\PropertyFetchTypeResolver $propertyFetchTypeResolver; public function __construct(\Rector\NodeTypeResolver\NodeTypeResolver\PropertyFetchTypeResolver $propertyFetchTypeResolver) { $this->propertyFetchTypeResolver = $propertyFetchTypeResolver; diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ScalarTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ScalarTypeResolver.php index e08323961..b8df7b913 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ScalarTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/ScalarTypeResolver.php @@ -4,11 +4,11 @@ namespace Rector\NodeTypeResolver\NodeTypeResolver; use PhpParser\Node; +use PhpParser\Node\InterpolatedStringPart; use PhpParser\Node\Scalar; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\Encapsed; -use PhpParser\Node\Scalar\EncapsedStringPart; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\MagicConst; use PhpParser\Node\Scalar\String_; use PHPStan\Type\Constant\ConstantFloatType; @@ -32,22 +32,22 @@ public function getNodeClasses() : array } public function resolve(Node $node) : Type { - if ($node instanceof DNumber) { - return new ConstantFloatType((float) $node->value); + if ($node instanceof Float_) { + return new ConstantFloatType($node->value); } if ($node instanceof String_) { - return new ConstantStringType((string) $node->value); + return new ConstantStringType($node->value); } - if ($node instanceof LNumber) { - return new ConstantIntegerType((int) $node->value); + if ($node instanceof Int_) { + return new ConstantIntegerType($node->value); } if ($node instanceof MagicConst) { return new ConstantStringType($node->getName()); } - if ($node instanceof Encapsed) { + if ($node instanceof InterpolatedString) { return new StringType(); } - if ($node instanceof EncapsedStringPart) { + if ($node instanceof InterpolatedStringPart) { return new ConstantStringType($node->value); } throw new NotImplementedYetException(); diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/StaticCallMethodCallTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/StaticCallMethodCallTypeResolver.php index 4c6f0eef5..6ff3e1b62 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/StaticCallMethodCallTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/StaticCallMethodCallTypeResolver.php @@ -17,8 +17,6 @@ use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\NodeTypeResolver\PHPStan\ParametersAcceptorSelectorVariantsWrapper; -use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; -use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; /** * @implements NodeTypeResolverInterface */ @@ -26,13 +24,9 @@ final class StaticCallMethodCallTypeResolver implements NodeTypeResolverInterfac { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; - /** - * @var \Rector\NodeTypeResolver\NodeTypeResolver - */ - private $nodeTypeResolver; + private NodeNameResolver $nodeNameResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; @@ -71,9 +65,6 @@ public function resolve(Node $node) : Type } else { $callerType = $this->nodeTypeResolver->getType($node->class); } - if ($callerType instanceof AliasedObjectType) { - $callerType = new FullyQualifiedObjectType($callerType->getFullyQualifiedName()); - } foreach ($callerType->getObjectClassReflections() as $objectClassReflection) { $classMethodReturnType = $this->resolveClassMethodReturnType($objectClassReflection, $node, $methodName, $scope); if (!$classMethodReturnType instanceof MixedType) { diff --git a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/TraitTypeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/TraitTypeResolver.php index 0dfff4cc8..ec235e12d 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/TraitTypeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/NodeTypeResolver/TraitTypeResolver.php @@ -20,9 +20,8 @@ final class TraitTypeResolver implements NodeTypeResolverInterface { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.php index 155afcfa2..d46b9d5b2 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.php @@ -12,7 +12,7 @@ final class ObjectWithoutClassTypeWithParentTypes extends ObjectWithoutClassType * @var TypeWithClassName[] * @readonly */ - private $parentTypes; + private array $parentTypes; /** * @param TypeWithClassName[] $parentTypes */ diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php index 73c610ed5..c46a5f784 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php @@ -4,9 +4,11 @@ namespace Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\AssignRef; +use PhpParser\Node\Expr\List_; use PhpParser\NodeVisitorAbstract; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface; @@ -29,6 +31,13 @@ public function enterNode(Node $node) : ?Node return null; } $node->var->setAttribute(AttributeKey::IS_BEING_ASSIGNED, \true); + if ($node->var instanceof List_) { + foreach ($node->var->items as $item) { + if ($item instanceof ArrayItem) { + $item->value->setAttribute(AttributeKey::IS_BEING_ASSIGNED, \true); + } + } + } $node->expr->setAttribute(AttributeKey::IS_ASSIGNED_TO, \true); if ($node->expr instanceof Assign) { $node->var->setAttribute(AttributeKey::IS_MULTI_ASSIGN, \true); diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefReturnNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefReturnNodeVisitor.php index e1917ec75..e18714fe1 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefReturnNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefReturnNodeVisitor.php @@ -7,7 +7,7 @@ use PhpParser\Node\FunctionLike; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface; @@ -16,9 +16,8 @@ final class ByRefReturnNodeVisitor extends NodeVisitorAbstract implements ScopeR { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -37,7 +36,7 @@ public function enterNode(Node $node) : ?Node } $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, static function (Node $node) { if ($node instanceof Class_ || $node instanceof FunctionLike) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Return_) { return null; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefVariableNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefVariableNodeVisitor.php index e5c60eb71..273ef5058 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefVariableNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ByRefVariableNodeVisitor.php @@ -17,9 +17,8 @@ final class ByRefVariableNodeVisitor extends NodeVisitorAbstract implements Scop { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -64,7 +63,9 @@ private function resolveParamIsByRefAttribute(FunctionLike $functionLike, array foreach ($functionLike->getParams() as $param) { if ($param->byRef && $param->var instanceof Variable && !$param->var->name instanceof Expr) { $param->var->setAttribute(AttributeKey::IS_BYREF_VAR, \true); - $byRefVariableNames[] = $param->var->name; + /** @var string $paramVarName */ + $paramVarName = $param->var->name; + $byRefVariableNames[] = $paramVarName; } } return $byRefVariableNames; @@ -81,7 +82,9 @@ private function resolveClosureUseIsByRefAttribute(FunctionLike $functionLike, a foreach ($functionLike->uses as $closureUse) { if ($closureUse->byRef && !$closureUse->var->name instanceof Expr) { $closureUse->var->setAttribute(AttributeKey::IS_BYREF_VAR, \true); - $byRefVariableNames[] = $closureUse->var->name; + /** @var string $closureVarName */ + $closureVarName = $closureUse->var->name; + $byRefVariableNames[] = $closureVarName; } } return $byRefVariableNames; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ContextNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ContextNodeVisitor.php index 12495b1ea..ad9cae74a 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ContextNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/ContextNodeVisitor.php @@ -8,6 +8,7 @@ use PhpParser\Node\Attribute; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; +use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\PostDec; use PhpParser\Node\Expr\PostInc; @@ -30,7 +31,7 @@ use PhpParser\Node\Stmt\Switch_; use PhpParser\Node\Stmt\Unset_; use PhpParser\Node\Stmt\While_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface; @@ -39,9 +40,8 @@ final class ContextNodeVisitor extends NodeVisitorAbstract implements ScopeResol { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -78,6 +78,11 @@ public function enterNode(Node $node) : ?Node } if ($node instanceof PostDec || $node instanceof PostInc || $node instanceof PreDec || $node instanceof PreInc) { $node->var->setAttribute(AttributeKey::IS_INCREMENT_OR_DECREMENT, \true); + return null; + } + if ($node instanceof BooleanAnd) { + $node->right->setAttribute(AttributeKey::IS_RIGHT_AND, \true); + return null; } $this->processContextInClass($node); return null; @@ -139,7 +144,7 @@ private function processContextInLoop($node) : void $stmts = $node instanceof Switch_ ? $node->cases : $node->stmts; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, static function (Node $subNode) : ?int { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof If_ || $subNode instanceof Break_) { $subNode->setAttribute(AttributeKey::IS_IN_LOOP, \true); diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php index a8fc2c0f2..c98605c47 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php @@ -9,7 +9,7 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Global_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -19,9 +19,8 @@ final class GlobalVariableNodeVisitor extends NodeVisitorAbstract implements Sco { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -44,7 +43,9 @@ public function enterNode(Node $node) : ?Node foreach ($stmt->vars as $variable) { if ($variable instanceof Variable && !$variable->name instanceof Expr) { $variable->setAttribute(AttributeKey::IS_GLOBAL_VAR, \true); - $globalVariableNames[] = $variable->name; + /** @var string $variableName */ + $variableName = $variable->name; + $globalVariableNames[] = $variableName; } } } @@ -60,7 +61,7 @@ private function setIsGlobalVarAttribute(Stmt $stmt, array $globalVariableNames) } $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmt, static function (Node $subNode) use($globalVariableNames) { if ($subNode instanceof Class_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Variable) { return null; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StaticVariableNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StaticVariableNodeVisitor.php index 714e25174..d6d90cc04 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StaticVariableNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StaticVariableNodeVisitor.php @@ -9,7 +9,7 @@ use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Static_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -19,9 +19,8 @@ final class StaticVariableNodeVisitor extends NodeVisitorAbstract implements Sco { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -42,10 +41,12 @@ public function enterNode(Node $node) : ?Node continue; } foreach ($stmt->vars as $staticVar) { - if (!$staticVar->var->name instanceof Expr) { - $staticVar->var->setAttribute(AttributeKey::IS_STATIC_VAR, \true); - $staticVariableNames[] = $staticVar->var->name; + $staticVariableName = $staticVar->var->name; + if (!\is_string($staticVariableName)) { + continue; } + $staticVar->var->setAttribute(AttributeKey::IS_STATIC_VAR, \true); + $staticVariableNames[] = $staticVariableName; } } return null; @@ -60,7 +61,7 @@ private function setIsStaticVarAttribute(Stmt $stmt, array $staticVariableNames) } $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmt, static function (Node $subNode) use($staticVariableNames) { if ($subNode instanceof Class_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Variable) { return null; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StmtKeyNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StmtKeyNodeVisitor.php index 17b0af08b..986d115d9 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StmtKeyNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StmtKeyNodeVisitor.php @@ -4,27 +4,13 @@ namespace Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor; use PhpParser\Node; -use PhpParser\Node\Stmt\ClassLike; -use PhpParser\Node\Stmt\Declare_; use PhpParser\NodeVisitorAbstract; -use Rector\Contract\PhpParser\Node\StmtsAwareInterface; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Application\NodeAttributeReIndexer; use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface; final class StmtKeyNodeVisitor extends NodeVisitorAbstract implements ScopeResolverNodeVisitorInterface { public function enterNode(Node $node) : ?Node { - if (!$node instanceof StmtsAwareInterface && !$node instanceof ClassLike && !$node instanceof Declare_) { - return null; - } - if ($node->stmts === null) { - return null; - } - $node->stmts = \array_values($node->stmts); - // re-index stmt key under current node - foreach ($node->stmts as $key => $childStmt) { - $childStmt->setAttribute(AttributeKey::STMT_KEY, $key); - } - return null; + return NodeAttributeReIndexer::reIndexStmtKeyNodeAttributes($node); } } diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php index b56cd4c32..869151832 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php @@ -3,30 +3,54 @@ declare (strict_types=1); namespace Rector\NodeTypeResolver\PHPStan\Scope; +use Error; use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; +use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\AssignOp; +use PhpParser\Node\Expr\AssignRef; use PhpParser\Node\Expr\BinaryOp; +use PhpParser\Node\Expr\BitwiseNot; +use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node\Expr\Clone_; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\ConstFetch; +use PhpParser\Node\Expr\Empty_; +use PhpParser\Node\Expr\ErrorSuppress; +use PhpParser\Node\Expr\Eval_; +use PhpParser\Node\Expr\Exit_; use PhpParser\Node\Expr\FuncCall; +use PhpParser\Node\Expr\Include_; +use PhpParser\Node\Expr\Instanceof_; +use PhpParser\Node\Expr\Isset_; +use PhpParser\Node\Expr\List_; use PhpParser\Node\Expr\Match_; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\NullsafeMethodCall; +use PhpParser\Node\Expr\PostDec; +use PhpParser\Node\Expr\PostInc; +use PhpParser\Node\Expr\PreDec; +use PhpParser\Node\Expr\PreInc; +use PhpParser\Node\Expr\Print_; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Ternary; +use PhpParser\Node\Expr\Throw_; +use PhpParser\Node\Expr\UnaryMinus; +use PhpParser\Node\Expr\UnaryPlus; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Expr\Yield_; +use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\Identifier; use PhpParser\Node\IntersectionType; use PhpParser\Node\Name; @@ -38,25 +62,40 @@ use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Do_; +use PhpParser\Node\Stmt\Echo_; +use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\Enum_; use PhpParser\Node\Stmt\EnumCase; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Finally_; +use PhpParser\Node\Stmt\For_; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\Function_; +use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; use PhpParser\Node\Stmt\Trait_; use PhpParser\Node\Stmt\TryCatch; +use PhpParser\Node\Stmt\Unset_; +use PhpParser\Node\Stmt\While_; use PhpParser\Node\UnionType; use PhpParser\NodeTraverser; use PHPStan\Analyser\MutatingScope; use PHPStan\Analyser\NodeScopeResolver; use PHPStan\Analyser\ScopeContext; +use PHPStan\Analyser\UndefinedVariableException; +use PHPStan\Node\FunctionCallableNode; +use PHPStan\Node\InstantiationCallableNode; +use PHPStan\Node\MethodCallableNode; +use PHPStan\Node\Printer\Printer; +use PHPStan\Node\StaticMethodCallableNode; use PHPStan\Node\UnreachableStatementNode; use PHPStan\Node\VirtualNode; +use PHPStan\Parser\ParserErrorsException; +use PHPStan\PhpDocParser\Parser\ParserException; use PHPStan\Reflection\ReflectionProvider; use PHPStan\ShouldNotHappenException; use PHPStan\Type\ObjectType; @@ -66,10 +105,8 @@ use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Scope\Contract\NodeVisitor\ScopeResolverNodeVisitorInterface; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; -use Rector\PHPStan\NodeVisitor\UnreachableStatementNodeVisitor; -use Rector\PHPStan\NodeVisitor\WrappedNodeRestoringNodeVisitor; use Rector\Util\Reflection\PrivatesAccessor; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @inspired by https://github.com/silverstripe/silverstripe-upgrader/blob/532182b23e854d02e0b27e68ebc394f436de0682/src/UpgradeRule/PHP/Visitor/PHPStanScopeVisitor.php * - https://github.com/silverstripe/silverstripe-upgrader/pull/57/commits/e5c7cfa166ad940d9d4ff69537d9f7608e992359#diff-5e0807bb3dc03d6a8d8b6ad049abd774 @@ -78,43 +115,36 @@ final class PHPStanNodeScopeResolver { /** * @readonly - * @var \PHPStan\Analyser\NodeScopeResolver */ - private $nodeScopeResolver; + private NodeScopeResolver $nodeScopeResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Scope\ScopeFactory */ - private $scopeFactory; + private \Rector\NodeTypeResolver\PHPStan\Scope\ScopeFactory $scopeFactory; /** * @readonly - * @var \Rector\Util\Reflection\PrivatesAccessor */ - private $privatesAccessor; + private PrivatesAccessor $privatesAccessor; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @var string */ private const CONTEXT = 'context'; /** * @readonly - * @var \PhpParser\NodeTraverser */ - private $nodeTraverser; + private NodeTraverser $nodeTraverser; /** * @param ScopeResolverNodeVisitorInterface[] $nodeVisitors */ @@ -126,10 +156,7 @@ public function __construct(NodeScopeResolver $nodeScopeResolver, ReflectionProv $this->privatesAccessor = $privatesAccessor; $this->nodeNameResolver = $nodeNameResolver; $this->classAnalyzer = $classAnalyzer; - $this->nodeTraverser = new NodeTraverser(); - foreach ($nodeVisitors as $nodeVisitor) { - $this->nodeTraverser->addVisitor($nodeVisitor); - } + $this->nodeTraverser = new NodeTraverser(...$nodeVisitors); } /** * @param Stmt[] $stmts @@ -144,8 +171,7 @@ public function processNodes(array $stmts, string $filePath, ?MutatingScope $for Assert::allIsInstanceOf($stmts, Stmt::class); $this->nodeTraverser->traverse($stmts); $scope = $formerMutatingScope ?? $this->scopeFactory->createFromFile($filePath); - $hasUnreachableStatementNode = \false; - $nodeCallback = function (Node $node, MutatingScope $mutatingScope) use(&$nodeCallback, $filePath, &$hasUnreachableStatementNode) : void { + $nodeCallback = function (Node $node, MutatingScope $mutatingScope) use(&$nodeCallback, $filePath) : void { // the class reflection is resolved AFTER entering to class node // so we need to get it from the first after this one if ($node instanceof Class_ || $node instanceof Interface_ || $node instanceof Enum_) { @@ -162,8 +188,7 @@ public function processNodes(array $stmts, string $filePath, ?MutatingScope $for // early check here as UnreachableStatementNode is special VirtualNode // so node to be checked inside if ($node instanceof UnreachableStatementNode) { - $this->processUnreachableStatementNode($node, $filePath, $mutatingScope); - $hasUnreachableStatementNode = \true; + $this->processUnreachableStatementNode($node, $mutatingScope, $nodeCallback); return; } // init current Node set Attribute @@ -177,11 +202,22 @@ public function processNodes(array $stmts, string $filePath, ?MutatingScope $for return; } $this->decorateNodeAttrGroups($node, $mutatingScope, $nodeCallback); - if (($node instanceof Expression || $node instanceof Return_ || $node instanceof EnumCase || $node instanceof Cast) && $node->expr instanceof Expr) { + if (($node instanceof Expression || $node instanceof Return_ || $node instanceof EnumCase || $node instanceof Cast || $node instanceof YieldFrom || $node instanceof UnaryMinus || $node instanceof UnaryPlus || $node instanceof Throw_ || $node instanceof Empty_ || $node instanceof BooleanNot || $node instanceof Clone_ || $node instanceof ErrorSuppress || $node instanceof BitwiseNot || $node instanceof Eval_ || $node instanceof Print_ || $node instanceof Exit_ || $node instanceof ArrowFunction || $node instanceof Include_ || $node instanceof Instanceof_) && $node->expr instanceof Expr) { $node->expr->setAttribute(AttributeKey::SCOPE, $mutatingScope); return; } - if ($node instanceof Assign || $node instanceof AssignOp) { + if ($node instanceof PostInc || $node instanceof PostDec || $node instanceof PreInc || $node instanceof PreDec) { + $node->var->setAttribute(AttributeKey::SCOPE, $mutatingScope); + return; + } + if ($node instanceof ArrayDimFetch) { + $node->var->setAttribute(AttributeKey::SCOPE, $mutatingScope); + if ($node->dim instanceof Expr) { + $node->dim->setAttribute(AttributeKey::SCOPE, $mutatingScope); + } + return; + } + if ($node instanceof Assign || $node instanceof AssignOp || $node instanceof AssignRef) { $this->processAssign($node, $mutatingScope); if ($node->var instanceof Variable && $node->var->name instanceof Expr) { $this->nodeScopeResolverProcessNodes([new Expression($node->var), new Expression($node->expr)], $mutatingScope, $nodeCallback); @@ -203,17 +239,29 @@ public function processNodes(array $stmts, string $filePath, ?MutatingScope $for if ($node instanceof Foreach_) { // decorate value as well $node->valueVar->setAttribute(AttributeKey::SCOPE, $mutatingScope); - if ($node->valueVar instanceof Array_) { + if ($node->valueVar instanceof List_) { $this->processArray($node->valueVar, $mutatingScope); } return; } + if ($node instanceof For_) { + foreach (\array_merge($node->init, $node->cond, $node->loop) as $expr) { + $expr->setAttribute(AttributeKey::SCOPE, $mutatingScope); + if ($expr instanceof BinaryOp) { + $this->processBinaryOp($expr, $mutatingScope); + } + if ($expr instanceof Assign) { + $this->processAssign($expr, $mutatingScope); + } + } + return; + } if ($node instanceof Array_) { $this->processArray($node, $mutatingScope); return; } if ($node instanceof Property) { - $this->processProperty($node, $mutatingScope); + $this->processProperty($node, $mutatingScope, $nodeCallback); return; } if ($node instanceof Switch_) { @@ -264,16 +312,65 @@ public function processNodes(array $stmts, string $filePath, ?MutatingScope $for $this->processMatch($node, $mutatingScope); return; } + if ($node instanceof Yield_) { + $this->processYield($node, $mutatingScope); + return; + } + if ($node instanceof Isset_ || $node instanceof Unset_) { + $this->processIssetOrUnset($node, $mutatingScope); + return; + } + if ($node instanceof Echo_) { + $this->processEcho($node, $mutatingScope); + return; + } + if ($node instanceof If_ || $node instanceof ElseIf_ || $node instanceof Do_ || $node instanceof While_) { + $node->cond->setAttribute(AttributeKey::SCOPE, $mutatingScope); + return; + } + if ($node instanceof MethodCallableNode || $node instanceof FunctionCallableNode || $node instanceof StaticMethodCallableNode || $node instanceof InstantiationCallableNode) { + $node->getOriginalNode()->setAttribute(AttributeKey::SCOPE, $mutatingScope); + $this->processCallike($node->getOriginalNode(), $mutatingScope); + return; + } }; - $this->nodeScopeResolverProcessNodes($stmts, $scope, $nodeCallback); - $nodeTraverser = new NodeTraverser(); - $nodeTraverser->addVisitor(new WrappedNodeRestoringNodeVisitor()); - if ($hasUnreachableStatementNode) { - $nodeTraverser->addVisitor(new UnreachableStatementNodeVisitor($this, $filePath, $scope)); + try { + $this->nodeScopeResolverProcessNodes($stmts, $scope, $nodeCallback); + } catch (Error $error) { + if (\strncmp($error->getMessage(), 'Call to undefined method ' . Printer::class . '::pPHPStan_', \strlen('Call to undefined method ' . Printer::class . '::pPHPStan_')) !== 0) { + throw $error; + } + // nothing we can do more precise here as error printing from deep internal PHPStan Printer service with service injection we cannot reset + // in the middle of process + // fallback to fill by found scope + \Rector\NodeTypeResolver\PHPStan\Scope\RectorNodeScopeResolver::processNodes($stmts, $scope); } - $nodeTraverser->traverse($stmts); return $stmts; } + private function processYield(Yield_ $yield, MutatingScope $mutatingScope) : void + { + if ($yield->key instanceof Expr) { + $yield->key->setAttribute(AttributeKey::SCOPE, $mutatingScope); + } + if ($yield->value instanceof Expr) { + $yield->value->setAttribute(AttributeKey::SCOPE, $mutatingScope); + } + } + /** + * @param \PhpParser\Node\Expr\Isset_|\PhpParser\Node\Stmt\Unset_ $node + */ + private function processIssetOrUnset($node, MutatingScope $mutatingScope) : void + { + foreach ($node->vars as $var) { + $var->setAttribute(AttributeKey::SCOPE, $mutatingScope); + } + } + private function processEcho(Echo_ $echo, MutatingScope $mutatingScope) : void + { + foreach ($echo->exprs as $expr) { + $expr->setAttribute(AttributeKey::SCOPE, $mutatingScope); + } + } private function processMatch(Match_ $match, MutatingScope $mutatingScope) : void { $match->cond->setAttribute(AttributeKey::SCOPE, $mutatingScope); @@ -294,7 +391,11 @@ private function nodeScopeResolverProcessNodes(array $stmts, MutatingScope $muta { try { $this->nodeScopeResolver->processNodes($stmts, $mutatingScope, $nodeCallback); - } catch (ShouldNotHappenException $exception) { + } catch (ParserErrorsException|ParserException|ShouldNotHappenException|UndefinedVariableException $exception) { + // nothing we can do more precise here as error parsing from deep internal PHPStan service with service injection we cannot reset + // in the middle of process + // fallback to fill by found scope + \Rector\NodeTypeResolver\PHPStan\Scope\RectorNodeScopeResolver::processNodes($stmts, $mutatingScope); } } private function processCallike(CallLike $callLike, MutatingScope $mutatingScope) : void @@ -312,14 +413,17 @@ private function processCallike(CallLike $callLike, MutatingScope $mutatingScope } } /** - * @param \PhpParser\Node\Expr\Assign|\PhpParser\Node\Expr\AssignOp $assign + * @param \PhpParser\Node\Expr\Assign|\PhpParser\Node\Expr\AssignOp|\PhpParser\Node\Expr\AssignRef $assign */ private function processAssign($assign, MutatingScope $mutatingScope) : void { $assign->var->setAttribute(AttributeKey::SCOPE, $mutatingScope); $assign->expr->setAttribute(AttributeKey::SCOPE, $mutatingScope); } - private function processArray(Array_ $array, MutatingScope $mutatingScope) : void + /** + * @param \PhpParser\Node\Expr\List_|\PhpParser\Node\Expr\Array_ $array + */ + private function processArray($array, MutatingScope $mutatingScope) : void { foreach ($array->items as $arrayItem) { if ($arrayItem instanceof ArrayItem) { @@ -354,6 +458,7 @@ private function decorateNodeAttrGroups(Node $node, MutatingScope $mutatingScope } private function processSwitch(Switch_ $switch, MutatingScope $mutatingScope) : void { + $switch->cond->setAttribute(AttributeKey::SCOPE, $mutatingScope); // decorate value as well foreach ($switch->cases as $case) { $case->setAttribute(AttributeKey::SCOPE, $mutatingScope); @@ -362,9 +467,7 @@ private function processSwitch(Switch_ $switch, MutatingScope $mutatingScope) : private function processCatch(Catch_ $catch, string $filePath, MutatingScope $mutatingScope) : void { $varName = $catch->var instanceof Variable ? $this->nodeNameResolver->getName($catch->var) : null; - $type = TypeCombinator::union(...\array_map(static function (Name $name) : ObjectType { - return new ObjectType((string) $name); - }, $catch->types)); + $type = TypeCombinator::union(...\array_map(static fn(Name $name): ObjectType => new ObjectType((string) $name), $catch->types)); $catchMutatingScope = $mutatingScope->enterCatchType($type, $varName); $this->processNodes($catch->stmts, $filePath, $catchMutatingScope); } @@ -374,14 +477,18 @@ private function processTryCatch(TryCatch $tryCatch, MutatingScope $mutatingScop $tryCatch->finally->setAttribute(AttributeKey::SCOPE, $mutatingScope); } } - private function processUnreachableStatementNode(UnreachableStatementNode $unreachableStatementNode, string $filePath, MutatingScope $mutatingScope) : void + /** + * @param callable(Node $node, MutatingScope $scope): void $nodeCallback + */ + private function processUnreachableStatementNode(UnreachableStatementNode $unreachableStatementNode, MutatingScope $mutatingScope, callable $nodeCallback) : void { $originalStmt = $unreachableStatementNode->getOriginalStatement(); - $originalStmt->setAttribute(AttributeKey::IS_UNREACHABLE, \true); - $originalStmt->setAttribute(AttributeKey::SCOPE, $mutatingScope); - $this->processNodes([$originalStmt], $filePath, $mutatingScope); + $this->nodeScopeResolverProcessNodes(\array_merge([$originalStmt], $unreachableStatementNode->getNextStatements()), $mutatingScope, $nodeCallback); } - private function processProperty(Property $property, MutatingScope $mutatingScope) : void + /** + * @param callable(Node $node, MutatingScope $scope): void $nodeCallback + */ + private function processProperty(Property $property, MutatingScope $mutatingScope, callable $nodeCallback) : void { foreach ($property->props as $propertyProperty) { $propertyProperty->setAttribute(AttributeKey::SCOPE, $mutatingScope); @@ -389,6 +496,14 @@ private function processProperty(Property $property, MutatingScope $mutatingScop $propertyProperty->default->setAttribute(AttributeKey::SCOPE, $mutatingScope); } } + foreach ($property->hooks as $hook) { + if ($hook->body === null) { + continue; + } + /** @var Stmt[] $stmts */ + $stmts = $hook->body instanceof Expr ? [new Expression($hook->body)] : [$hook->body]; + $this->nodeScopeResolverProcessNodes($stmts, $mutatingScope, $nodeCallback); + } } private function processBinaryOp(BinaryOp $binaryOp, MutatingScope $mutatingScope) : void { diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/RectorNodeScopeResolver.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/RectorNodeScopeResolver.php new file mode 100644 index 000000000..9a5939cac --- /dev/null +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/RectorNodeScopeResolver.php @@ -0,0 +1,28 @@ +traverseNodesWithCallable($stmts, function (Node $node) use($mutatingScope) { + $node->setAttribute(AttributeKey::SCOPE, $mutatingScope); + return null; + }); + } +} diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php index 3932a29ec..62daa2e70 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php @@ -10,9 +10,8 @@ final class ScopeFactory { /** * @readonly - * @var PHPStanScopeFactory */ - private $phpStanScopeFactory; + private PHPStanScopeFactory $phpStanScopeFactory; public function __construct(PHPStanScopeFactory $phpStanScopeFactory) { $this->phpStanScopeFactory = $phpStanScopeFactory; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php index b94e86194..6b74433c3 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php @@ -7,7 +7,6 @@ use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\ConstantScalarType; use PHPStan\Type\MixedType; -use PHPStan\Type\NullType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; @@ -16,9 +15,8 @@ final class StaticTypeAnalyzer { /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeAnalyzer */ - private $unionTypeAnalyzer; + private UnionTypeAnalyzer $unionTypeAnalyzer; public function __construct(UnionTypeAnalyzer $unionTypeAnalyzer) { $this->unionTypeAnalyzer = $unionTypeAnalyzer; @@ -41,7 +39,7 @@ public function isAlwaysTruableType(Type $type) : bool if ($type instanceof ObjectType) { return \true; } - if ($type instanceof ConstantScalarType && !$type instanceof NullType) { + if ($type instanceof ConstantScalarType && !$type->isNull()->yes()) { return (bool) $type->getValue(); } if ($type->isScalar()->yes()) { @@ -63,7 +61,7 @@ private function isAlwaysTruableUnionType(Type $type) : bool } private function isAlwaysTruableArrayType(ArrayType $arrayType) : bool { - $itemType = $arrayType->getItemType(); + $itemType = $arrayType->getIterableValueType(); if (!$itemType instanceof ConstantScalarType) { return \false; } diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/TypeFactory.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/TypeFactory.php index b2137b853..8e2f8d22a 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/TypeFactory.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/Type/TypeFactory.php @@ -6,7 +6,6 @@ use PHPStan\Type\ArrayType; use PHPStan\Type\BooleanType; use PHPStan\Type\Constant\ConstantArrayType; -use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\Constant\ConstantFloatType; use PHPStan\Type\Constant\ConstantIntegerType; use PHPStan\Type\Constant\ConstantStringType; @@ -24,9 +23,8 @@ final class TypeFactory { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\TypeHasher */ - private $typeHasher; + private TypeHasher $typeHasher; public function __construct(TypeHasher $typeHasher) { $this->typeHasher = $typeHasher; @@ -93,15 +91,13 @@ private function normalizeObjectType(int $totalTypes, Type $type) : Type } private function normalizeBooleanType(bool &$hasFalse, bool &$hasTrue, Type $type) : Type { - if ($type instanceof ConstantBooleanType) { - if ($type->getValue()) { - $hasTrue = \true; - } - if ($type->getValue() === \false) { - $hasFalse = \true; - } + if ($type->isTrue()->yes()) { + $hasTrue = \true; + } + if ($type->isFalse()->yes()) { + $hasFalse = \true; } - if ($hasFalse && $hasTrue && $type instanceof ConstantBooleanType) { + if ($hasFalse && $hasTrue && ($type->isTrue()->yes() || $type->isFalse()->yes())) { return new BooleanType(); } return $type; @@ -160,7 +156,7 @@ private function removeValueFromConstantType(Type $type) : Type if ($type instanceof ConstantIntegerType) { return new IntegerType(); } - if ($type instanceof ConstantBooleanType) { + if ($type->isTrue()->yes() || $type->isFalse()->yes()) { return new BooleanType(); } return $type; @@ -171,8 +167,8 @@ private function removeValueFromConstantType(Type $type) : Type private function unwrapConstantArrayTypes(ConstantArrayType $constantArrayType) : array { $unwrappedTypes = []; - $flattenKeyTypes = TypeUtils::flattenTypes($constantArrayType->getKeyType()); - $flattenItemTypes = TypeUtils::flattenTypes($constantArrayType->getItemType()); + $flattenKeyTypes = TypeUtils::flattenTypes($constantArrayType->getIterableKeyType()); + $flattenItemTypes = TypeUtils::flattenTypes($constantArrayType->getIterableValueType()); foreach ($flattenItemTypes as $position => $nestedFlattenItemType) { $nestedFlattenKeyType = $flattenKeyTypes[$position] ?? null; if (!$nestedFlattenKeyType instanceof Type) { diff --git a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/TypeHasher.php b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/TypeHasher.php index 905bcc077..4b3d02159 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PHPStan/TypeHasher.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PHPStan/TypeHasher.php @@ -4,7 +4,6 @@ namespace Rector\NodeTypeResolver\PHPStan; use PHPStan\Type\ArrayType; -use PHPStan\Type\ConstantType; use PHPStan\Type\Generic\GenericObjectType; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; @@ -27,7 +26,7 @@ public function createTypeHash(Type $type) : string return $type->describe(VerbosityLevel::precise()) . $type->isExplicitMixed(); } if ($type instanceof ArrayType) { - return $this->createTypeHash($type->getItemType()) . $this->createTypeHash($type->getKeyType()) . '[]'; + return $this->createTypeHash($type->getIterableValueType()) . $this->createTypeHash($type->getIterableKeyType()) . '[]'; } if ($type instanceof GenericObjectType) { return $type->describe(VerbosityLevel::precise()); @@ -35,7 +34,7 @@ public function createTypeHash(Type $type) : string if ($type instanceof TypeWithClassName) { return $this->resolveUniqueTypeWithClassNameHash($type); } - if ($type instanceof ConstantType) { + if ($type->isConstantValue()->yes()) { return \get_class($type); } $type = $this->normalizeObjectType($type); diff --git a/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php b/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php index 8d8e6ad37..1855f70ed 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php @@ -12,9 +12,8 @@ final class DocBlockClassRenamer { /** * @readonly - * @var \Rector\NodeTypeResolver\PhpDocNodeVisitor\ClassRenamePhpDocNodeVisitor */ - private $classRenamePhpDocNodeVisitor; + private ClassRenamePhpDocNodeVisitor $classRenamePhpDocNodeVisitor; public function __construct(ClassRenamePhpDocNodeVisitor $classRenamePhpDocNodeVisitor) { $this->classRenamePhpDocNodeVisitor = $classRenamePhpDocNodeVisitor; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php b/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php index 3e2b9369a..357b26489 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php @@ -11,9 +11,8 @@ final class DocBlockNameImporter { /** * @readonly - * @var \Rector\NodeTypeResolver\PhpDocNodeVisitor\NameImportingPhpDocNodeVisitor */ - private $nameImportingPhpDocNodeVisitor; + private NameImportingPhpDocNodeVisitor $nameImportingPhpDocNodeVisitor; public function __construct(NameImportingPhpDocNodeVisitor $nameImportingPhpDocNodeVisitor) { $this->nameImportingPhpDocNodeVisitor = $nameImportingPhpDocNodeVisitor; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockTagReplacer.php b/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockTagReplacer.php index 9a27127b1..2f3008dd9 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockTagReplacer.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockTagReplacer.php @@ -11,9 +11,8 @@ final class DocBlockTagReplacer { /** * @readonly - * @var \Rector\BetterPhpDocParser\Annotation\AnnotationNaming */ - private $annotationNaming; + private AnnotationNaming $annotationNaming; public function __construct(AnnotationNaming $annotationNaming) { $this->annotationNaming = $annotationNaming; diff --git a/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php index bb8f212c7..12c7df754 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php @@ -4,57 +4,38 @@ namespace Rector\NodeTypeResolver\PhpDocNodeVisitor; use PhpParser\Node as PhpNode; -use PhpParser\Node\Identifier; -use PhpParser\Node\Stmt\GroupUse; -use PhpParser\Node\Stmt\Use_; -use PHPStan\Analyser\Scope; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; +use PHPStan\Type\Generic\TemplateObjectType; use PHPStan\Type\ObjectType; -use PHPStan\Type\Type; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\Exception\ShouldNotHappenException; -use Rector\Naming\Naming\UseImportsResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\ValueObject\OldToNewType; use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; use Rector\Renaming\Collector\RenamedNameCollector; use Rector\StaticTypeMapper\StaticTypeMapper; +use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; - /** - * @readonly - * @var \Rector\Renaming\Collector\RenamedNameCollector - */ - private $renamedNameCollector; + private RenamedNameCollector $renamedNameCollector; /** * @var OldToNewType[] */ - private $oldToNewTypes = []; - /** - * @var bool - */ - private $hasChanged = \false; - /** - * @var PhpNode|null - */ - private $currentPhpNode; - public function __construct(StaticTypeMapper $staticTypeMapper, UseImportsResolver $useImportsResolver, RenamedNameCollector $renamedNameCollector) + private array $oldToNewTypes = []; + private bool $hasChanged = \false; + private ?PhpNode $currentPhpNode = null; + public function __construct(StaticTypeMapper $staticTypeMapper, RenamedNameCollector $renamedNameCollector) { $this->staticTypeMapper = $staticTypeMapper; - $this->useImportsResolver = $useImportsResolver; $this->renamedNameCollector = $renamedNameCollector; } public function setCurrentPhpNode(PhpNode $phpNode) : void @@ -78,14 +59,18 @@ public function enterNode(Node $node) : ?Node } /** @var \PhpParser\Node $currentPhpNode */ $currentPhpNode = $this->currentPhpNode; - $identifier = clone $node; - $identifier->name = $this->resolveNamespacedName($identifier, $currentPhpNode, $node->name); - $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifier, $currentPhpNode); + $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($node, $currentPhpNode); + // non object type and @template is to not be renamed + if (!$staticType instanceof ObjectType || $staticType instanceof TemplateObjectType) { + return null; + } // make sure to compare FQNs - $objectType = $this->expandShortenedObjectType($staticType); + $objectType = $this->ensureFQCNObject($staticType, $node->name); foreach ($this->oldToNewTypes as $oldToNewType) { - /** @var ObjectType $oldType */ $oldType = $oldToNewType->getOldType(); + if (!$oldType instanceof ObjectType) { + continue; + } if (!$objectType->equals($oldType)) { continue; } @@ -112,70 +97,14 @@ public function hasChanged() : bool { return $this->hasChanged; } - private function resolveNamespacedName(IdentifierTypeNode $identifierTypeNode, PhpNode $phpNode, string $name) : string + private function ensureFQCNObject(ObjectType $objectType, string $identifierName) : ObjectType { - if (\strncmp($name, '\\', \strlen('\\')) === 0) { - return $name; - } - if (\strpos($name, '\\') !== \false) { - return $name; + if ($objectType instanceof ShortenedObjectType && \strncmp($identifierName, '\\', \strlen('\\')) === 0) { + return new ObjectType(\ltrim($identifierName, '\\')); } - $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifierTypeNode, $phpNode); - if (!$staticType instanceof ObjectType) { - return $name; - } - if ($staticType instanceof ShortenedObjectType) { - return $name; - } - $uses = $this->useImportsResolver->resolve(); - $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 PhpNode) { - return $this->resolveNamefromUse($uses, $name); - } - return ''; - } - $namespaceName = $scope->getNamespace(); - if ($namespaceName === null) { - return $this->resolveNamefromUse($uses, $name); - } - if ($uses === []) { - return $namespaceName . '\\' . $name; - } - $nameFromUse = $this->resolveNamefromUse($uses, $name); - if ($nameFromUse !== $name) { - return $nameFromUse; - } - return $namespaceName . '\\' . $nameFromUse; - } - /** - * @param array $uses - */ - private function resolveNamefromUse(array $uses, string $name) : string - { - foreach ($uses as $use) { - $prefix = $this->useImportsResolver->resolvePrefix($use); - foreach ($use->uses as $useUse) { - if ($useUse->alias instanceof Identifier) { - continue; - } - $lastName = $useUse->name->getLast(); - if ($lastName === $name) { - return $prefix . $useUse->name->toString(); - } - } - } - return $name; - } - /** - * @return \PHPStan\Type\ObjectType|\PHPStan\Type\Type - */ - private function expandShortenedObjectType(Type $type) - { - if ($type instanceof ShortenedObjectType) { - return new ObjectType($type->getFullyQualifiedName()); + if ($objectType instanceof ShortenedObjectType || $objectType instanceof AliasedObjectType) { + return new ObjectType($objectType->getFullyQualifiedName()); } - return $type; + return $objectType; } } diff --git a/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php b/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php index 8d21fb3c9..a3be0bc76 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php @@ -3,13 +3,13 @@ declare (strict_types=1); namespace Rector\NodeTypeResolver\PhpDocNodeVisitor; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node as PhpParserNode; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Reflection\ReflectionProvider; -use PHPStan\Type\ObjectType; +use PHPStan\Type\Type; use Rector\Application\Provider\CurrentFileProvider; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode; @@ -21,6 +21,7 @@ use Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor; use Rector\PostRector\Collector\UseNodesToAddCollector; use Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper; +use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; use Rector\ValueObject\Application\File; @@ -28,37 +29,26 @@ final class NameImportingPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor { /** * @readonly - * @var \Rector\CodingStyle\ClassNameImport\ClassNameImportSkipper */ - private $classNameImportSkipper; + private ClassNameImportSkipper $classNameImportSkipper; /** * @readonly - * @var \Rector\PostRector\Collector\UseNodesToAddCollector */ - private $useNodesToAddCollector; + private UseNodesToAddCollector $useNodesToAddCollector; /** * @readonly - * @var \Rector\Application\Provider\CurrentFileProvider */ - private $currentFileProvider; + private CurrentFileProvider $currentFileProvider; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper */ - private $identifierPhpDocTypeMapper; - /** - * @var PhpParserNode|null - */ - private $currentPhpParserNode; - /** - * @var bool - */ - private $hasChanged = \false; + private IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper; + private ?PhpParserNode $currentPhpParserNode = null; + private bool $hasChanged = \false; public function __construct(ClassNameImportSkipper $classNameImportSkipper, UseNodesToAddCollector $useNodesToAddCollector, CurrentFileProvider $currentFileProvider, ReflectionProvider $reflectionProvider, IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper) { $this->classNameImportSkipper = $classNameImportSkipper; @@ -93,9 +83,7 @@ public function enterNode(Node $node) : ?Node return null; } $staticType = $this->identifierPhpDocTypeMapper->mapIdentifierTypeNode($node, $this->currentPhpParserNode); - if ($staticType instanceof ShortenedObjectType) { - $staticType = new FullyQualifiedObjectType($staticType->getFullyQualifiedName()); - } + $staticType = $this->resolveFullyQualified($staticType); if (!$staticType instanceof FullyQualifiedObjectType) { return null; } @@ -118,6 +106,16 @@ public function hasChanged() : bool { return $this->hasChanged; } + private function resolveFullyQualified(Type $type) : ?FullyQualifiedObjectType + { + if ($type instanceof ShortenedObjectType || $type instanceof AliasedObjectType) { + return new FullyQualifiedObjectType($type->getFullyQualifiedName()); + } + if ($type instanceof FullyQualifiedObjectType) { + return $type; + } + return null; + } private function processFqnNameImport(PhpParserNode $phpParserNode, IdentifierTypeNode $identifierTypeNode, FullyQualifiedObjectType $fullyQualifiedObjectType, File $file) : ?IdentifierTypeNode { $parentNode = $identifierTypeNode->getAttribute(PhpDocAttributeKey::PARENT); @@ -185,11 +183,9 @@ private function processDoctrineAnnotationTagValueNode(DoctrineAnnotationTagValu } $identifierTypeNode = $doctrineAnnotationTagValueNode->identifierTypeNode; $staticType = $this->identifierPhpDocTypeMapper->mapIdentifierTypeNode($identifierTypeNode, $currentPhpParserNode); + $staticType = $this->resolveFullyQualified($staticType); if (!$staticType instanceof FullyQualifiedObjectType) { - if (!$staticType instanceof ObjectType) { - return; - } - $staticType = new FullyQualifiedObjectType($staticType->getClassName()); + return; } $file = $this->currentFileProvider->getFile(); if (!$file instanceof File) { @@ -218,11 +214,9 @@ private function enterSpacelessPhpDocTagNode(SpacelessPhpDocTagNode $spacelessPh throw new ShouldNotHappenException(); } $staticType = $this->identifierPhpDocTypeMapper->mapIdentifierTypeNode(new IdentifierTypeNode($attributeClass), $currentPhpParserNode); + $staticType = $this->resolveFullyQualified($staticType); if (!$staticType instanceof FullyQualifiedObjectType) { - if (!$staticType instanceof ObjectType) { - return null; - } - $staticType = new FullyQualifiedObjectType($staticType->getClassName()); + return null; } $file = $this->currentFileProvider->getFile(); if (!$file instanceof File) { diff --git a/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/RectorBetterReflectionSourceLocatorFactory.php b/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/RectorBetterReflectionSourceLocatorFactory.php index 855efd94a..79d4bd269 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/RectorBetterReflectionSourceLocatorFactory.php +++ b/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/RectorBetterReflectionSourceLocatorFactory.php @@ -14,14 +14,12 @@ final class RectorBetterReflectionSourceLocatorFactory { /** * @readonly - * @var \PHPStan\Reflection\BetterReflection\BetterReflectionSourceLocatorFactory */ - private $betterReflectionSourceLocatorFactory; + private BetterReflectionSourceLocatorFactory $betterReflectionSourceLocatorFactory; /** * @readonly - * @var \Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocator\IntermediateSourceLocator */ - private $intermediateSourceLocator; + private IntermediateSourceLocator $intermediateSourceLocator; public function __construct(BetterReflectionSourceLocatorFactory $betterReflectionSourceLocatorFactory, IntermediateSourceLocator $intermediateSourceLocator) { $this->betterReflectionSourceLocatorFactory = $betterReflectionSourceLocatorFactory; diff --git a/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocator/IntermediateSourceLocator.php b/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocator/IntermediateSourceLocator.php index 75436a44e..2b6bef8b4 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocator/IntermediateSourceLocator.php +++ b/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocator/IntermediateSourceLocator.php @@ -14,9 +14,8 @@ final class IntermediateSourceLocator implements SourceLocator { /** * @readonly - * @var \Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider */ - private $dynamicSourceLocatorProvider; + private DynamicSourceLocatorProvider $dynamicSourceLocatorProvider; public function __construct(DynamicSourceLocatorProvider $dynamicSourceLocatorProvider) { $this->dynamicSourceLocatorProvider = $dynamicSourceLocatorProvider; diff --git a/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php b/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php index a8f465bf5..c76eb1bb5 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php +++ b/vendor/rector/rector/src/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php @@ -17,26 +17,21 @@ final class DynamicSourceLocatorProvider implements ResetableInterface { /** * @readonly - * @var \PHPStan\Reflection\BetterReflection\SourceLocator\FileNodesFetcher */ - private $fileNodesFetcher; + private FileNodesFetcher $fileNodesFetcher; /** * @readonly - * @var \PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorFactory */ - private $optimizedDirectorySourceLocatorFactory; + private OptimizedDirectorySourceLocatorFactory $optimizedDirectorySourceLocatorFactory; /** * @var string[] */ - private $filePaths = []; + private array $filePaths = []; /** * @var string[] */ - private $directories = []; - /** - * @var \PHPStan\BetterReflection\SourceLocator\Type\AggregateSourceLocator|null - */ - private $aggregateSourceLocator; + private array $directories = []; + private ?AggregateSourceLocator $aggregateSourceLocator = null; public function __construct(FileNodesFetcher $fileNodesFetcher, OptimizedDirectorySourceLocatorFactory $optimizedDirectorySourceLocatorFactory) { $this->fileNodesFetcher = $fileNodesFetcher; @@ -51,14 +46,14 @@ public function setFilePath(string $filePath) : void */ public function addFiles(array $files) : void { - $this->filePaths = \array_merge($this->filePaths, $files); + $this->filePaths = \array_unique(\array_merge($this->filePaths, $files)); } /** * @param string[] $directories */ public function addDirectories(array $directories) : void { - $this->directories = \array_merge($this->directories, $directories); + $this->directories = \array_unique(\array_merge($this->directories, $directories)); } public function provide() : SourceLocator { @@ -76,7 +71,7 @@ public function provide() : SourceLocator } return $this->aggregateSourceLocator = new AggregateSourceLocator($sourceLocators); } - public function isPathsEmpty() : bool + public function arePathsEmpty() : bool { return $this->filePaths === [] && $this->directories === []; } diff --git a/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php b/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php index ec9d71786..32387d560 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php +++ b/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php @@ -9,9 +9,8 @@ final class ArrayTypeAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/StringTypeAnalyzer.php b/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/StringTypeAnalyzer.php index b429ffb9c..2a8e4faed 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/StringTypeAnalyzer.php +++ b/vendor/rector/rector/src/NodeTypeResolver/TypeAnalyzer/StringTypeAnalyzer.php @@ -9,9 +9,8 @@ final class StringTypeAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ArrayTypeComparator.php b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ArrayTypeComparator.php index 365b904ee..9b24b05a2 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ArrayTypeComparator.php +++ b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ArrayTypeComparator.php @@ -11,18 +11,22 @@ */ final class ArrayTypeComparator { - public function isSubtype(ArrayType $checkedType, ArrayType $mainType) : bool + /** + * @param \PHPStan\Type\ArrayType|\PHPStan\Type\Constant\ConstantArrayType $checkedType + * @param \PHPStan\Type\ArrayType|\PHPStan\Type\Constant\ConstantArrayType $mainType + */ + public function isSubtype($checkedType, $mainType) : bool { if (!$checkedType instanceof ConstantArrayType && !$mainType instanceof ConstantArrayType) { return $mainType->isSuperTypeOf($checkedType)->yes(); } - $checkedKeyType = $checkedType->getKeyType(); - $mainKeyType = $mainType->getKeyType(); + $checkedKeyType = $checkedType->getIterableKeyType(); + $mainKeyType = $mainType->getIterableKeyType(); if (!$mainKeyType instanceof MixedType && $mainKeyType->isSuperTypeOf($checkedKeyType)->yes()) { return \true; } - $checkedItemType = $checkedType->getItemType(); - $mainItemType = $mainType->getItemType(); + $checkedItemType = $checkedType->getIterableValueType(); + $mainItemType = $mainType->getIterableValueType(); return $checkedItemType->isSuperTypeOf($mainItemType)->yes(); } } diff --git a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ScalarTypeComparator.php b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ScalarTypeComparator.php index a7210e009..18152dd57 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ScalarTypeComparator.php +++ b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/ScalarTypeComparator.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\NodeTypeResolver\TypeComparator; -use PHPStan\Type\ClassStringType; use PHPStan\Type\Type; /** * @see \Rector\Tests\NodeTypeResolver\TypeComparator\ScalarTypeComparatorTest @@ -53,7 +52,7 @@ public function areDifferentScalarTypes(Type $firstType, Type $secondType) : boo if (!$firstType->isString()->yes()) { return \get_class($firstType) !== \get_class($secondType); } - if (!$secondType instanceof ClassStringType) { + if (!$secondType->isClassString()->yes()) { return \get_class($firstType) !== \get_class($secondType); } return \false; diff --git a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php index 5a5a4a6e0..7e0f1c51b 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php +++ b/vendor/rector/rector/src/NodeTypeResolver/TypeComparator/TypeComparator.php @@ -8,7 +8,6 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ArrayType; use PHPStan\Type\BooleanType; -use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\ConstantScalarType; use PHPStan\Type\Generic\TemplateType; use PHPStan\Type\MixedType; @@ -21,43 +20,31 @@ use Rector\Reflection\ReflectionResolver; use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; -use Rector\TypeDeclaration\TypeNormalizer; final class TypeComparator { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\TypeHasher */ - private $typeHasher; + private TypeHasher $typeHasher; /** * @readonly - * @var \Rector\TypeDeclaration\TypeNormalizer */ - private $typeNormalizer; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private \Rector\NodeTypeResolver\TypeComparator\ArrayTypeComparator $arrayTypeComparator; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\ArrayTypeComparator */ - private $arrayTypeComparator; + private \Rector\NodeTypeResolver\TypeComparator\ScalarTypeComparator $scalarTypeComparator; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\ScalarTypeComparator */ - private $scalarTypeComparator; - /** - * @readonly - * @var \Rector\Reflection\ReflectionResolver - */ - private $reflectionResolver; - public function __construct(TypeHasher $typeHasher, TypeNormalizer $typeNormalizer, StaticTypeMapper $staticTypeMapper, \Rector\NodeTypeResolver\TypeComparator\ArrayTypeComparator $arrayTypeComparator, \Rector\NodeTypeResolver\TypeComparator\ScalarTypeComparator $scalarTypeComparator, ReflectionResolver $reflectionResolver) + private ReflectionResolver $reflectionResolver; + public function __construct(TypeHasher $typeHasher, StaticTypeMapper $staticTypeMapper, \Rector\NodeTypeResolver\TypeComparator\ArrayTypeComparator $arrayTypeComparator, \Rector\NodeTypeResolver\TypeComparator\ScalarTypeComparator $scalarTypeComparator, ReflectionResolver $reflectionResolver) { $this->typeHasher = $typeHasher; - $this->typeNormalizer = $typeNormalizer; $this->staticTypeMapper = $staticTypeMapper; $this->arrayTypeComparator = $arrayTypeComparator; $this->scalarTypeComparator = $scalarTypeComparator; @@ -79,8 +66,6 @@ public function areTypesEqual(Type $firstType, Type $secondType) : bool if ($this->areAliasedObjectMatchingFqnObject($firstType, $secondType)) { return \true; } - $firstType = $this->typeNormalizer->normalizeArrayOfUnionToUnionArray($firstType); - $secondType = $this->typeNormalizer->normalizeArrayOfUnionToUnionArray($secondType); if ($this->typeHasher->areTypesEqual($firstType, $secondType)) { return \true; } @@ -154,8 +139,8 @@ private function areArrayTypeWithSingleObjectChildToParent(Type $firstType, Type if (!$secondType instanceof ArrayType) { return \false; } - $firstArrayItemType = $firstType->getItemType(); - $secondArrayItemType = $secondType->getItemType(); + $firstArrayItemType = $firstType->getIterableValueType(); + $secondArrayItemType = $secondType->getIterableValueType(); return $this->isMutualObjectSubtypes($firstArrayItemType, $secondArrayItemType); } private function isMutualObjectSubtypes(Type $firstArrayItemType, Type $secondArrayItemType) : bool @@ -174,7 +159,7 @@ private function isMutualObjectSubtypes(Type $firstArrayItemType, Type $secondAr private function normalizeConstantBooleanType(Type $type) : Type { return TypeTraverser::map($type, static function (Type $type, callable $callable) : Type { - if ($type instanceof ConstantBooleanType) { + if ($type->isTrue()->yes() || $type->isFalse()->yes()) { return new BooleanType(); } return $callable($type); diff --git a/vendor/rector/rector/src/NodeTypeResolver/ValueObject/OldToNewType.php b/vendor/rector/rector/src/NodeTypeResolver/ValueObject/OldToNewType.php index c22f1040a..e3fbaa1ab 100644 --- a/vendor/rector/rector/src/NodeTypeResolver/ValueObject/OldToNewType.php +++ b/vendor/rector/rector/src/NodeTypeResolver/ValueObject/OldToNewType.php @@ -8,14 +8,12 @@ final class OldToNewType { /** * @readonly - * @var \PHPStan\Type\Type */ - private $oldType; + private Type $oldType; /** * @readonly - * @var \PHPStan\Type\Type */ - private $newType; + private Type $newType; public function __construct(Type $oldType, Type $newType) { $this->oldType = $oldType; diff --git a/vendor/rector/rector/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php b/vendor/rector/rector/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php deleted file mode 100644 index 80b9da486..000000000 --- a/vendor/rector/rector/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php +++ /dev/null @@ -1,68 +0,0 @@ -phpStanNodeScopeResolver = $phpStanNodeScopeResolver; - $this->filePath = $filePath; - $this->mutatingScope = $mutatingScope; - } - public function enterNode(Node $node) : ?Node - { - if (!$node instanceof StmtsAwareInterface && !$node instanceof ClassLike && !$node instanceof Declare_) { - return null; - } - if ($node->stmts === null) { - return null; - } - $isPassedUnreachableStmt = \false; - $mutatingScope = $this->resolveScope($node->getAttribute(AttributeKey::SCOPE)); - foreach ($node->stmts as $stmt) { - $hasMutatingScope = $stmt->getAttribute(AttributeKey::SCOPE) instanceof MutatingScope; - if (!$hasMutatingScope) { - $stmt->setAttribute(AttributeKey::SCOPE, $mutatingScope); - $this->phpStanNodeScopeResolver->processNodes([$stmt], $this->filePath, $mutatingScope); - } - if ($stmt->getAttribute(AttributeKey::IS_UNREACHABLE) === \true) { - $isPassedUnreachableStmt = \true; - continue; - } - if ($isPassedUnreachableStmt) { - $stmt->setAttribute(AttributeKey::IS_UNREACHABLE, \true); - } - } - return null; - } - private function resolveScope(?Scope $mutatingScope) : MutatingScope - { - return $mutatingScope instanceof MutatingScope ? $mutatingScope : $this->mutatingScope; - } -} diff --git a/vendor/rector/rector/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php b/vendor/rector/rector/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php deleted file mode 100644 index b9ca62845..000000000 --- a/vendor/rector/rector/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php +++ /dev/null @@ -1,26 +0,0 @@ -getExpr(); - } - return $expr; - } -} diff --git a/vendor/rector/rector/src/PHPStan/ScopeFetcher.php b/vendor/rector/rector/src/PHPStan/ScopeFetcher.php new file mode 100644 index 000000000..202e01bf9 --- /dev/null +++ b/vendor/rector/rector/src/PHPStan/ScopeFetcher.php @@ -0,0 +1,23 @@ +getAttribute(AttributeKey::SCOPE); + if (!$currentScope instanceof Scope) { + $errorMessage = \sprintf('Scope not available on "%s" node. Fix scope refresh on changed nodes first', \get_class($node)); + throw new ShouldNotHappenException($errorMessage); + } + return $currentScope; + } +} diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/DoctrineTypeAnalyzer.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/DoctrineTypeAnalyzer.php index 410a0d1cf..7bfea910c 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/DoctrineTypeAnalyzer.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/DoctrineTypeAnalyzer.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper; -use PHPStan\Type\ArrayType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; @@ -14,20 +13,20 @@ public function isDoctrineCollectionWithIterableUnionType(Type $type) : bool if (!$type instanceof UnionType) { return \false; } - $arrayType = null; + $isArrayType = \false; $hasDoctrineCollectionType = \false; foreach ($type->getTypes() as $unionedType) { if ($this->isInstanceOfCollectionType($unionedType)) { $hasDoctrineCollectionType = \true; } - if ($unionedType instanceof ArrayType) { - $arrayType = $unionedType; + if ($unionedType->isArray()->yes()) { + $isArrayType = \true; } } if (!$hasDoctrineCollectionType) { return \false; } - return $arrayType instanceof ArrayType; + return $isArrayType; } public function isInstanceOfCollectionType(Type $type) : bool { diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php index 6088256a3..b9ab57dca 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php @@ -11,14 +11,14 @@ use Rector\Exception\NotImplementedYetException; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class PHPStanStaticTypeMapper { /** * @var TypeMapperInterface[] * @readonly */ - private $typeMappers; + private array $typeMappers; /** * @param TypeMapperInterface[] $typeMappers */ diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryLiteralStringTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryLiteralStringTypeMapper.php index fc92df245..8bd2118e9 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryLiteralStringTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryLiteralStringTypeMapper.php @@ -18,9 +18,8 @@ final class AccessoryLiteralStringTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonEmptyStringTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonEmptyStringTypeMapper.php index 669f72c5f..250c6ee92 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonEmptyStringTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonEmptyStringTypeMapper.php @@ -18,9 +18,8 @@ final class AccessoryNonEmptyStringTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonFalsyStringTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonFalsyStringTypeMapper.php index 1dc3ca3a9..e537ff916 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonFalsyStringTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNonFalsyStringTypeMapper.php @@ -18,9 +18,8 @@ final class AccessoryNonFalsyStringTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNumericStringTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNumericStringTypeMapper.php index 562f3887d..6bbfcfc4a 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNumericStringTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/AccessoryNumericStringTypeMapper.php @@ -18,9 +18,8 @@ final class AccessoryNumericStringTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ArrayTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ArrayTypeMapper.php index 03ff58369..bf924a4fc 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ArrayTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ArrayTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Identifier; use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; @@ -32,22 +31,17 @@ final class ArrayTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\GenericClassStringTypeNormalizer */ - private $genericClassStringTypeNormalizer; + private GenericClassStringTypeNormalizer $genericClassStringTypeNormalizer; /** * @readonly - * @var \Rector\TypeDeclaration\NodeTypeAnalyzer\DetailedTypeAnalyzer */ - private $detailedTypeAnalyzer; + private DetailedTypeAnalyzer $detailedTypeAnalyzer; /** * @var string */ public const HAS_GENERIC_TYPE_PARENT = 'has_generic_type_parent'; - /** - * @var \Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper - */ - private $phpStanStaticTypeMapper; + private PHPStanStaticTypeMapper $phpStanStaticTypeMapper; public function __construct(GenericClassStringTypeNormalizer $genericClassStringTypeNormalizer, DetailedTypeAnalyzer $detailedTypeAnalyzer) { $this->genericClassStringTypeNormalizer = $genericClassStringTypeNormalizer; @@ -69,7 +63,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode { // this cannot be handled by PHPStan $type->toPhpDocNode() as requires space removal around "|" in union type // then e.g. "int" instead of explicit number, and nice arrays - $itemType = $type->getItemType(); + $itemType = $type->getIterableValueType(); $isGenericArray = $this->isGenericArrayCandidate($type); if ($itemType instanceof UnionType && !$type instanceof ConstantArrayType && !$isGenericArray) { return $this->createArrayTypeNodeFromUnionType($itemType); @@ -86,7 +80,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param ArrayType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Identifier { return new Identifier('array'); } @@ -136,7 +130,7 @@ private function isGenericArrayCandidate(ArrayType $arrayType) : bool } private function createGenericArrayType(ArrayType $arrayType, bool $withKey = \false) : GenericTypeNode { - $itemType = $arrayType->getItemType(); + $itemType = $arrayType->getIterableValueType(); $itemTypeNode = $this->phpStanStaticTypeMapper->mapToPHPStanPhpDocTypeNode($itemType); $identifierTypeNode = new IdentifierTypeNode('array'); // is class-string[] list only @@ -155,7 +149,7 @@ private function createGenericArrayType(ArrayType $arrayType, bool $withKey = \f } // @see https://github.com/phpstan/phpdoc-parser/blob/98a088b17966bdf6ee25c8a4b634df313d8aa531/tests/PHPStan/Parser/PhpDocParserTest.php#L2692-L2696 foreach ($genericTypes as $genericType) { - /** @var \PHPStan\PhpDocParser\Ast\Node $genericType */ + /** @var TypeNode $genericType */ $genericType->setAttribute(self::HAS_GENERIC_TYPE_PARENT, $withKey); } $identifierTypeNode->setAttribute(self::HAS_GENERIC_TYPE_PARENT, $withKey); @@ -176,15 +170,15 @@ private function isIntegerKeyAndNonNestedArray(ArrayType $arrayType) : bool if (!$arrayType->getKeyType()->isInteger()->yes()) { return \false; } - return !$arrayType->getItemType() instanceof ArrayType; + return !$arrayType->getIterableValueType()->isArray()->yes(); } private function isClassStringArrayType(ArrayType $arrayType) : bool { if ($arrayType->getKeyType() instanceof MixedType) { - return $arrayType->getItemType() instanceof GenericClassStringType; + return $arrayType->getIterableValueType() instanceof GenericClassStringType; } if ($arrayType->getKeyType() instanceof ConstantIntegerType) { - return $arrayType->getItemType() instanceof GenericClassStringType; + return $arrayType->getIterableValueType() instanceof GenericClassStringType; } return \false; } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/BooleanTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/BooleanTypeMapper.php index 14662ace7..2bee8693b 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/BooleanTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/BooleanTypeMapper.php @@ -7,7 +7,6 @@ use PhpParser\Node\Identifier; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\BooleanType; -use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\Type; use Rector\Php\PhpVersionProvider; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; @@ -20,9 +19,8 @@ final class BooleanTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; @@ -49,11 +47,17 @@ public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node if ($typeKind === TypeKind::PROPERTY) { return new Identifier('bool'); } - if ($typeKind === TypeKind::UNION && $type instanceof ConstantBooleanType && $type->getValue() === \false) { + if ($typeKind === TypeKind::UNION && $type->isFalse()->yes()) { return new Identifier('false'); } - if ($this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::NULL_FALSE_TRUE_STANDALONE_TYPE) && $type instanceof ConstantBooleanType) { - return $type->getValue() ? new Identifier('true') : new Identifier('false'); + if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::NULL_FALSE_TRUE_STANDALONE_TYPE)) { + return new Identifier('bool'); + } + if ($type->isTrue()->yes()) { + return new Identifier('true'); + } + if ($type->isFalse()->yes()) { + return new Identifier('false'); } return new Identifier('bool'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClassStringTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClassStringTypeMapper.php index 77b53b32a..ac7ea10c4 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClassStringTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClassStringTypeMapper.php @@ -18,9 +18,8 @@ final class ClassStringTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php index 57a901b31..928b6095f 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php @@ -23,9 +23,8 @@ final class ClosureTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; @@ -66,13 +65,14 @@ public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node if ($typeKind === TypeKind::PROPERTY && $this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::TYPED_PROPERTIES)) { return new FullyQualified('Closure'); } - if ($typeKind !== TypeKind::RETURN) { - return null; - } // ref https://3v4l.org/nUreN#v7.0.0 - if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::ANONYMOUS_FUNCTION_RETURN_TYPE)) { - return null; + if ($typeKind === TypeKind::RETURN && $this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::ANONYMOUS_FUNCTION_RETURN_TYPE)) { + return new FullyQualified('Closure'); + } + // ref https://3v4l.org/ruh5g#v8.0.0 + if ($typeKind === TypeKind::UNION && $this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::UNION_TYPES)) { + return new FullyQualified('Closure'); } - return new FullyQualified('Closure'); + return null; } } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeForParameterMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeForParameterMapper.php index 64c2c7621..dd897113d 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeForParameterMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeForParameterMapper.php @@ -16,10 +16,7 @@ */ final class ConditionalTypeForParameterMapper implements TypeMapperInterface { - /** - * @var \Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper - */ - private $phpStanStaticTypeMapper; + private PHPStanStaticTypeMapper $phpStanStaticTypeMapper; public function autowire(PHPStanStaticTypeMapper $phpStanStaticTypeMapper) : void { $this->phpStanStaticTypeMapper = $phpStanStaticTypeMapper; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php index f90685394..4a132c623 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Reflection\ClassReflection; @@ -20,10 +20,7 @@ */ final class ConditionalTypeMapper implements TypeMapperInterface { - /** - * @var \Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper - */ - private $phpStanStaticTypeMapper; + private PHPStanStaticTypeMapper $phpStanStaticTypeMapper; public function autowire(PHPStanStaticTypeMapper $phpStanStaticTypeMapper) : void { $this->phpStanStaticTypeMapper = $phpStanStaticTypeMapper; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConstantArrayTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConstantArrayTypeMapper.php new file mode 100644 index 000000000..5c8741f89 --- /dev/null +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ConstantArrayTypeMapper.php @@ -0,0 +1,45 @@ + + */ +final class ConstantArrayTypeMapper implements TypeMapperInterface +{ + /** + * @readonly + */ + private PhpVersionProvider $phpVersionProvider; + public function __construct(PhpVersionProvider $phpVersionProvider) + { + $this->phpVersionProvider = $phpVersionProvider; + } + public function getNodeClass() : string + { + return ConstantArrayType::class; + } + /** + * @param ConstantArrayType $type + */ + public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode + { + return $type->toPhpDocNode(); + } + public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + { + if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::SCALAR_TYPES)) { + return null; + } + return new Identifier('array'); + } +} diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/FloatTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/FloatTypeMapper.php index 739471c7c..097523dd6 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/FloatTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/FloatTypeMapper.php @@ -18,9 +18,8 @@ final class FloatTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/GenericClassStringTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/GenericClassStringTypeMapper.php index 5cc8b1e8e..2127213f3 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/GenericClassStringTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/GenericClassStringTypeMapper.php @@ -18,9 +18,8 @@ final class GenericClassStringTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasMethodTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasMethodTypeMapper.php index 071a2e433..531db1dcd 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasMethodTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasMethodTypeMapper.php @@ -15,9 +15,8 @@ final class HasMethodTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper */ - private $objectWithoutClassTypeMapper; + private \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper; public function __construct(\Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper) { $this->objectWithoutClassTypeMapper = $objectWithoutClassTypeMapper; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php index c5bb96298..7e1eb7e8b 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Identifier; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Accessory\HasOffsetType; @@ -28,7 +27,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param HasOffsetType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Identifier { return new Identifier('array'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetValueTypeTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetValueTypeTypeMapper.php index 3de7a6700..76d7ab7da 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetValueTypeTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasOffsetValueTypeTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Identifier; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Accessory\HasOffsetValueType; @@ -28,7 +27,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param HasOffsetValueType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Identifier { return new Identifier('array'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasPropertyTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasPropertyTypeMapper.php index 8fcf7e7dd..500f3b19e 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasPropertyTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/HasPropertyTypeMapper.php @@ -15,9 +15,8 @@ final class HasPropertyTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper */ - private $objectWithoutClassTypeMapper; + private \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper; public function __construct(\Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper) { $this->objectWithoutClassTypeMapper = $objectWithoutClassTypeMapper; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntegerTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntegerTypeMapper.php index 57a77868a..b6690f24b 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntegerTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntegerTypeMapper.php @@ -19,9 +19,8 @@ final class IntegerTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php index 659854f7f..c6ffd81a7 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IntersectionTypeMapper.php @@ -28,24 +28,20 @@ final class IntersectionTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper */ - private $objectWithoutClassTypeMapper; + private \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectTypeMapper */ - private $objectTypeMapper; + private \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectTypeMapper $objectTypeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper */ - private $scalarStringToTypeMapper; + private ScalarStringToTypeMapper $scalarStringToTypeMapper; public function __construct(PhpVersionProvider $phpVersionProvider, \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectWithoutClassTypeMapper $objectWithoutClassTypeMapper, \Rector\PHPStanStaticTypeMapper\TypeMapper\ObjectTypeMapper $objectTypeMapper, ScalarStringToTypeMapper $scalarStringToTypeMapper) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IterableTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IterableTypeMapper.php index afa9aaa65..e7eaa16b3 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IterableTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/IterableTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Identifier; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\IterableType; @@ -28,7 +27,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param IterableType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Identifier { return new Identifier('iterable'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/MixedTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/MixedTypeMapper.php index e446ba533..911aca472 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/MixedTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/MixedTypeMapper.php @@ -19,9 +19,8 @@ final class MixedTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NonEmptyArrayTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NonEmptyArrayTypeMapper.php index 9b4fed22a..848843cf8 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NonEmptyArrayTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NonEmptyArrayTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Identifier; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Accessory\NonEmptyArrayType; @@ -28,7 +27,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param NonEmptyArrayType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Identifier { return new Identifier('array'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NullTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NullTypeMapper.php index 69dd2aa18..9ce866102 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NullTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/NullTypeMapper.php @@ -19,9 +19,8 @@ final class NullTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php index 930c7991e..8e23ef8c2 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; @@ -59,12 +59,9 @@ public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node if ($type instanceof SelfObjectType) { return new Name('self'); } - if ($type instanceof ShortenedObjectType) { + if ($type instanceof ShortenedObjectType || $type instanceof AliasedObjectType) { return new FullyQualified($type->getFullyQualifiedName()); } - if ($type instanceof AliasedObjectType) { - return new Name($type->getClassName()); - } if ($type instanceof FullyQualifiedObjectType) { $className = $type->getClassName(); if (\strncmp($className, '\\', \strlen('\\')) === 0) { diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectWithoutClassTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectWithoutClassTypeMapper.php index a4764dd9b..8b86c20f0 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectWithoutClassTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ObjectWithoutClassTypeMapper.php @@ -7,6 +7,8 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; use PHPStan\PhpDocParser\Ast\Type\TypeNode; +use PHPStan\Type\Accessory\HasMethodType; +use PHPStan\Type\Accessory\HasPropertyType; use PHPStan\Type\ObjectWithoutClassType; use PHPStan\Type\Type; use Rector\NodeTypeResolver\PHPStan\ObjectWithoutClassTypeWithParentTypes; @@ -20,9 +22,8 @@ final class ObjectWithoutClassTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; @@ -39,7 +40,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode return $type->toPhpDocNode(); } /** - * @param ObjectWithoutClassType $type + * @param ObjectWithoutClassType|HasMethodType|HasPropertyType $type */ public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node { diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/OversizedArrayTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/OversizedArrayTypeMapper.php index 4955a7f6d..824c3817f 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/OversizedArrayTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/OversizedArrayTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Identifier; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Accessory\OversizedArrayType; @@ -30,7 +29,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode * @param TypeKind::* $typeKind * @param OversizedArrayType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Identifier { return new Identifier('array'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ParentStaticTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ParentStaticTypeMapper.php index b2e534873..09bcf428c 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ParentStaticTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ParentStaticTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; @@ -29,7 +28,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param ParentStaticType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Name { return new Name(ObjectReference::PARENT); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/SelfObjectTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/SelfObjectTypeMapper.php index 081442d3c..c8940ffcb 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/SelfObjectTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/SelfObjectTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; @@ -28,7 +27,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param SelfObjectType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Name { return new Name('self'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StaticTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StaticTypeMapper.php index 1e3cb5a58..20211793d 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StaticTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StaticTypeMapper.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\TypeMapper; -use PhpParser\Node; use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\StaticType; @@ -24,9 +23,8 @@ final class StaticTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; @@ -45,7 +43,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param SimpleStaticType|StaticType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Name { if ($type instanceof SelfStaticType) { return new Name(ObjectReference::SELF); diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StrictMixedTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StrictMixedTypeMapper.php index 9539d083b..de16059b0 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StrictMixedTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StrictMixedTypeMapper.php @@ -19,9 +19,8 @@ final class StrictMixedTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @var string */ diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StringTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StringTypeMapper.php index 52271bd92..ef32b4cbb 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StringTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/StringTypeMapper.php @@ -18,9 +18,8 @@ final class StringTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ThisTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ThisTypeMapper.php index fc4f16fa3..9ea3c46e3 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ThisTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/ThisTypeMapper.php @@ -28,7 +28,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode /** * @param ThisType $type */ - public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node + public function mapToPhpParserNode(Type $type, string $typeKind) : Node { return new Name('self'); } diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/TypeWithClassNameTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/TypeWithClassNameTypeMapper.php index 1db83b2c6..49e74b234 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/TypeWithClassNameTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/TypeWithClassNameTypeMapper.php @@ -18,9 +18,8 @@ final class TypeWithClassNameTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(PhpVersionProvider $phpVersionProvider) { $this->phpVersionProvider = $phpVersionProvider; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php index 83458d093..49ff57945 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php @@ -12,17 +12,17 @@ use PhpParser\Node\NullableType; use PhpParser\Node\UnionType as PhpParserUnionType; use PHPStan\PhpDocParser\Ast\Type\TypeNode; -use PHPStan\Type\CallableType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareUnionTypeNode; +use Rector\NodeAnalyzer\PropertyAnalyzer; use Rector\Php\PhpVersionProvider; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper; use Rector\ValueObject\PhpVersionFeature; -use RectorPrefix202411\Webmozart\Assert\Assert; -use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202506\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\InvalidArgumentException; /** * @implements TypeMapperInterface */ @@ -30,16 +30,17 @@ final class UnionTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** - * @var \Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper + * @readonly */ - private $phpStanStaticTypeMapper; - public function __construct(PhpVersionProvider $phpVersionProvider) + private PropertyAnalyzer $propertyAnalyzer; + private PHPStanStaticTypeMapper $phpStanStaticTypeMapper; + public function __construct(PhpVersionProvider $phpVersionProvider, PropertyAnalyzer $propertyAnalyzer) { $this->phpVersionProvider = $phpVersionProvider; + $this->propertyAnalyzer = $propertyAnalyzer; } public function autowire(PHPStanStaticTypeMapper $phpStanStaticTypeMapper) : void { @@ -164,7 +165,7 @@ private function matchPhpParserUnionType(UnionType $unionType, string $typeKind) return null; } // special callable type only not allowed on property - if ($typeKind === TypeKind::PROPERTY && $unionedType instanceof CallableType) { + if ($typeKind === TypeKind::PROPERTY && $this->propertyAnalyzer->isForbiddenType($unionedType)) { return null; } $phpParserUnionedTypes[] = $phpParserNode; diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/VoidTypeMapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/VoidTypeMapper.php index e640706d9..02ef12ae6 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/VoidTypeMapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/TypeMapper/VoidTypeMapper.php @@ -19,9 +19,8 @@ final class VoidTypeMapper implements TypeMapperInterface { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @var string */ diff --git a/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php b/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php index 687576043..0a3a18b72 100644 --- a/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php +++ b/vendor/rector/rector/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php @@ -3,11 +3,10 @@ declare (strict_types=1); namespace Rector\PHPStanStaticTypeMapper\Utils; -use PHPStan\Type\CallableType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; -use PHPStan\Type\TypeWithClassName; use PHPStan\Type\UnionType; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class TypeUnwrapper { public function unwrapFirstObjectTypeFromUnionType(Type $type) : Type @@ -16,20 +15,21 @@ public function unwrapFirstObjectTypeFromUnionType(Type $type) : Type return $type; } foreach ($type->getTypes() as $unionedType) { - if (!$unionedType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($unionedType); + if ($className === null) { continue; } return $unionedType; } return $type; } - public function unwrapFirstCallableTypeFromUnionType(Type $type) : ?Type + public function unwrapFirstCallableTypeFromUnionType(Type $type) : Type { if (!$type instanceof UnionType) { return $type; } foreach ($type->getTypes() as $unionedType) { - if (!$unionedType instanceof CallableType) { + if (!$unionedType->isCallable()->yes()) { continue; } return $unionedType; @@ -38,27 +38,29 @@ public function unwrapFirstCallableTypeFromUnionType(Type $type) : ?Type } public function isIterableTypeValue(string $className, Type $type) : bool { - if (!$type instanceof TypeWithClassName) { + $typeClassName = ClassNameFromObjectTypeResolver::resolve($type); + if ($typeClassName === null) { return \false; } // get the namespace from $className $classNamespace = $this->namespace($className); // get the namespace from $parameterReflection - $reflectionNamespace = $this->namespace($type->getClassName()); + $reflectionNamespace = $this->namespace($typeClassName); // then match with - return $reflectionNamespace === $classNamespace && \substr_compare($type->getClassName(), '\\TValue', -\strlen('\\TValue')) === 0; + return $reflectionNamespace === $classNamespace && \substr_compare($typeClassName, '\\TValue', -\strlen('\\TValue')) === 0; } public function isIterableTypeKey(string $className, Type $type) : bool { - if (!$type instanceof TypeWithClassName) { + $typeClassName = ClassNameFromObjectTypeResolver::resolve($type); + if ($typeClassName === null) { return \false; } // get the namespace from $className $classNamespace = $this->namespace($className); // get the namespace from $parameterReflection - $reflectionNamespace = $this->namespace($type->getClassName()); + $reflectionNamespace = $this->namespace($typeClassName); // then match with - return $reflectionNamespace === $classNamespace && \substr_compare($type->getClassName(), '\\TKey', -\strlen('\\TKey')) === 0; + return $reflectionNamespace === $classNamespace && \substr_compare($typeClassName, '\\TKey', -\strlen('\\TKey')) === 0; } public function removeNullTypeFromUnionType(UnionType $unionType) : Type { diff --git a/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php b/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php index 325b196a0..bc0cb8911 100644 --- a/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php +++ b/vendor/rector/rector/src/Parallel/Application/ParallelFileProcessor.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\Parallel\Application; -use RectorPrefix202411\Clue\React\NDJson\Decoder; -use RectorPrefix202411\Clue\React\NDJson\Encoder; -use RectorPrefix202411\Nette\Utils\Random; -use RectorPrefix202411\React\EventLoop\StreamSelectLoop; -use RectorPrefix202411\React\Socket\ConnectionInterface; -use RectorPrefix202411\React\Socket\TcpServer; +use RectorPrefix202506\Clue\React\NDJson\Decoder; +use RectorPrefix202506\Clue\React\NDJson\Encoder; +use RectorPrefix202506\Nette\Utils\Random; +use RectorPrefix202506\React\EventLoop\StreamSelectLoop; +use RectorPrefix202506\React\Socket\ConnectionInterface; +use RectorPrefix202506\React\Socket\TcpServer; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Console\Command\ProcessCommand; @@ -17,15 +17,15 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\ProcessResult; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symplify\EasyParallel\Enum\Action; -use RectorPrefix202411\Symplify\EasyParallel\Enum\Content; -use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactCommand; -use RectorPrefix202411\Symplify\EasyParallel\Enum\ReactEvent; -use RectorPrefix202411\Symplify\EasyParallel\ValueObject\ParallelProcess; -use RectorPrefix202411\Symplify\EasyParallel\ValueObject\ProcessPool; -use RectorPrefix202411\Symplify\EasyParallel\ValueObject\Schedule; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symplify\EasyParallel\Enum\Action; +use RectorPrefix202506\Symplify\EasyParallel\Enum\Content; +use RectorPrefix202506\Symplify\EasyParallel\Enum\ReactCommand; +use RectorPrefix202506\Symplify\EasyParallel\Enum\ReactEvent; +use RectorPrefix202506\Symplify\EasyParallel\ValueObject\ParallelProcess; +use RectorPrefix202506\Symplify\EasyParallel\ValueObject\ProcessPool; +use RectorPrefix202506\Symplify\EasyParallel\ValueObject\Schedule; use Throwable; /** * Inspired from @see @@ -37,9 +37,8 @@ final class ParallelFileProcessor { /** * @readonly - * @var \Rector\Parallel\Command\WorkerCommandLineFactory */ - private $workerCommandLineFactory; + private WorkerCommandLineFactory $workerCommandLineFactory; /** * @var int */ diff --git a/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php b/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php index 971450bb5..c0eebfc78 100644 --- a/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php +++ b/vendor/rector/rector/src/Parallel/Command/WorkerCommandLineFactory.php @@ -6,10 +6,10 @@ use Rector\ChangesReporting\Output\JsonOutputFormatter; use Rector\Configuration\Option; use Rector\FileSystem\FilePathHelper; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; -use RectorPrefix202411\Symplify\EasyParallel\Reflection\CommandFromReflectionFactory; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; +use RectorPrefix202506\Symplify\EasyParallel\Reflection\CommandFromReflectionFactory; /** * @see \Rector\Tests\Parallel\Command\WorkerCommandLineFactoryTest * @todo possibly extract to symplify/easy-parallel @@ -18,14 +18,12 @@ final class WorkerCommandLineFactory { /** * @readonly - * @var \Symplify\EasyParallel\Reflection\CommandFromReflectionFactory */ - private $commandFromReflectionFactory; + private CommandFromReflectionFactory $commandFromReflectionFactory; /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; /** * @var string */ @@ -41,6 +39,10 @@ public function __construct(CommandFromReflectionFactory $commandFromReflectionF public function create(string $mainScript, string $mainCommandClass, string $workerCommandName, InputInterface $input, string $identifier, int $port) : string { $commandArguments = \array_slice($_SERVER['argv'], 1); + // add implicit "process" command name if missing + if ($commandArguments !== [] && ($commandArguments[0] !== 'process' && $commandArguments[0] !== 'p') && !\defined('PHPUNIT_COMPOSER_INSTALL')) { + $commandArguments = \array_merge(['process'], $commandArguments); + } $args = \array_merge([\PHP_BINARY, $mainScript], $commandArguments); $workerCommandArray = []; $mainCommand = $this->commandFromReflectionFactory->create($mainCommandClass); @@ -99,6 +101,10 @@ public function create(string $mainScript, string $mainCommandClass, string $wor $config = (string) $input->getOption(Option::CONFIG); $workerCommandArray[] = \escapeshellarg($this->filePathHelper->relativePath($config)); } + if ($input->getOption(Option::ONLY) !== null) { + $workerCommandArray[] = self::OPTION_DASHES . Option::ONLY; + $workerCommandArray[] = \escapeshellarg((string) $input->getOption(Option::ONLY)); + } return \implode(' ', $workerCommandArray); } private function shouldSkipOption(InputInterface $input, string $optionName) : bool diff --git a/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php b/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php index e883592c7..adfe03fb2 100644 --- a/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php +++ b/vendor/rector/rector/src/Php/PhpVersionResolver/ComposerJsonPhpVersionResolver.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Php\PhpVersionResolver; -use RectorPrefix202411\Composer\Semver\VersionParser; +use RectorPrefix202506\Composer\Semver\VersionParser; use Rector\Exception\Configuration\InvalidConfigurationException; use Rector\FileSystem\JsonFileSystem; use Rector\Util\PhpVersionFactory; @@ -16,7 +16,7 @@ final class ComposerJsonPhpVersionResolver /** * @var array */ - private static $cachedPhpVersions = []; + private static array $cachedPhpVersions = []; /** * @return PhpVersion::* */ @@ -41,8 +41,8 @@ public static function resolve(string $composerJson) : ?int return self::$cachedPhpVersions[$composerJson]; } $projectComposerJson = JsonFileSystem::readFilePath($composerJson); - // give this one a priority, as more generic one - $requirePhpVersion = $projectComposerJson['require']['php'] ?? null; + // give this one a priority, as more generic one. see https://github.com/composer/composer/issues/7914 + $requirePhpVersion = $projectComposerJson['require']['php'] ?? $projectComposerJson['require']['php-64bit'] ?? null; if ($requirePhpVersion !== null) { self::$cachedPhpVersions[$composerJson] = self::createIntVersionFromComposerVersion($requirePhpVersion); return self::$cachedPhpVersions[$composerJson]; diff --git a/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php b/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php index fc9d6459b..161f12cac 100644 --- a/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php +++ b/vendor/rector/rector/src/Php/PolyfillPackagesProvider.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Php; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Json; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\ValueObject\PolyfillPackage; @@ -43,8 +43,6 @@ public function provide() : array */ private function filterPolyfillPackages(array $require) : array { - return \array_filter(\array_keys($require), static function (string $packageName) : bool { - return \strncmp($packageName, 'symfony/polyfill-', \strlen('symfony/polyfill-')) === 0; - }); + return \array_filter(\array_keys($require), static fn(string $packageName): bool => \strncmp($packageName, 'symfony/polyfill-', \strlen('symfony/polyfill-')) === 0); } } diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php index af74828e6..7d7c87940 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php @@ -12,7 +12,7 @@ use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\PhpAttribute\AnnotationToAttributeMapper\AnnotationToAttributeMapperTest */ @@ -22,7 +22,7 @@ final class AnnotationToAttributeMapper * @var AnnotationToAttributeMapperInterface[] * @readonly */ - private $annotationToAttributeMappers; + private array $annotationToAttributeMappers; /** * @param AnnotationToAttributeMapperInterface[] $annotationToAttributeMappers */ diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php index 2c921f395..bc728a114 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\PhpAttribute\AnnotationToAttributeMapper; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; @@ -13,7 +13,7 @@ use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; use Rector\PhpParser\Node\Value\ValueResolver; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @implements AnnotationToAttributeMapperInterface */ @@ -21,13 +21,9 @@ final class ArrayAnnotationToAttributeMapper implements AnnotationToAttributeMap { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - /** - * @var \Rector\PhpAttribute\AnnotationToAttributeMapper - */ - private $annotationToAttributeMapper; + private ValueResolver $valueResolver; + private AnnotationToAttributeMapper $annotationToAttributeMapper; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php index 574273659..ae91013b8 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\PhpAttribute\AnnotationToAttributeMapper; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Scalar\String_; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; @@ -14,16 +14,13 @@ use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; use Rector\Validation\RectorAssert; -use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202506\Webmozart\Assert\InvalidArgumentException; /** * @implements AnnotationToAttributeMapperInterface */ final class ArrayItemNodeAnnotationToAttributeMapper implements AnnotationToAttributeMapperInterface { - /** - * @var \Rector\PhpAttribute\AnnotationToAttributeMapper - */ - private $annotationToAttributeMapper; + private AnnotationToAttributeMapper $annotationToAttributeMapper; /** * Avoid circular reference */ @@ -41,7 +38,7 @@ public function isCandidate($value) : bool /** * @param ArrayItemNode $arrayItemNode */ - public function map($arrayItemNode) : Expr + public function map($arrayItemNode) : ArrayItem { $valueExpr = $this->annotationToAttributeMapper->map($arrayItemNode->value); if ($valueExpr === DocTagNodeState::REMOVE_ARRAY) { diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ClassConstFetchAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ClassConstFetchAnnotationToAttributeMapper.php index b3481fe7c..aa6aac52b 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ClassConstFetchAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ClassConstFetchAnnotationToAttributeMapper.php @@ -3,8 +3,10 @@ declare (strict_types=1); namespace Rector\PhpAttribute\AnnotationToAttributeMapper; +use PhpParser\Node; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Name; +use PhpParser\Node\Scalar\String_; use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; /** * @implements AnnotationToAttributeMapperInterface @@ -27,10 +29,18 @@ public function isCandidate($value) : bool } /** * @param string $value + * @return String_|ClassConstFetch */ - public function map($value) : \PhpParser\Node\Expr + public function map($value) : Node { - [$class, $constant] = \explode('::', $value); + $values = \explode('::', $value); + if (\count($values) !== 2) { + return new String_($value); + } + [$class, $constant] = $values; + if ($class === '') { + return new String_($value); + } return new ClassConstFetch(new Name($class), $constant); } } diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php index 3c442f96a..955c18b60 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/CurlyListNodeAnnotationToAttributeMapper.php @@ -3,23 +3,20 @@ declare (strict_types=1); namespace Rector\PhpAttribute\AnnotationToAttributeMapper; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\CurlyListNode; use Rector\PhpAttribute\AnnotationToAttributeMapper; use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; use Rector\PhpAttribute\Enum\DocTagNodeState; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @implements AnnotationToAttributeMapperInterface */ final class CurlyListNodeAnnotationToAttributeMapper implements AnnotationToAttributeMapperInterface { - /** - * @var \Rector\PhpAttribute\AnnotationToAttributeMapper - */ - private $annotationToAttributeMapper; + private AnnotationToAttributeMapper $annotationToAttributeMapper; /** * Avoid circular reference */ @@ -37,7 +34,7 @@ public function isCandidate($value) : bool /** * @param CurlyListNode $value */ - public function map($value) : \PhpParser\Node\Expr + public function map($value) : Array_ { $arrayItems = []; $arrayItemNodes = $value->getValues(); @@ -59,7 +56,7 @@ public function map($value) : \PhpParser\Node\Expr $arrayItems[] = $valueExpr; continue; } - $valueExpr->key = new LNumber($arrayItemNodeKey); + $valueExpr->key = new Int_($arrayItemNodeKey); $arrayItems[] = $valueExpr; } return new Array_($arrayItems); diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/DoctrineAnnotationAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/DoctrineAnnotationAnnotationToAttributeMapper.php index 32d51d845..2fdfe1fc2 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/DoctrineAnnotationAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/DoctrineAnnotationAnnotationToAttributeMapper.php @@ -20,18 +20,13 @@ final class DoctrineAnnotationAnnotationToAttributeMapper implements AnnotationT { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\PhpAttribute\AttributeArrayNameInliner */ - private $attributeArrayNameInliner; - /** - * @var \Rector\PhpAttribute\AnnotationToAttributeMapper - */ - private $annotationToAttributeMapper; + private AttributeArrayNameInliner $attributeArrayNameInliner; + private AnnotationToAttributeMapper $annotationToAttributeMapper; public function __construct(PhpVersionProvider $phpVersionProvider, AttributeArrayNameInliner $attributeArrayNameInliner) { $this->phpVersionProvider = $phpVersionProvider; @@ -57,7 +52,7 @@ public function isCandidate($value) : bool /** * @param DoctrineAnnotationTagValueNode $value */ - public function map($value) : \PhpParser\Node\Expr + public function map($value) : New_ { $annotationShortName = $this->resolveAnnotationName($value); $values = $value->getValues(); diff --git a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/StringAnnotationToAttributeMapper.php b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/StringAnnotationToAttributeMapper.php index 07a88f142..ac1072c53 100644 --- a/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/StringAnnotationToAttributeMapper.php +++ b/vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/StringAnnotationToAttributeMapper.php @@ -4,9 +4,6 @@ namespace Rector\PhpAttribute\AnnotationToAttributeMapper; use PhpParser\Node\Expr; -use PhpParser\Node\Expr\ConstFetch; -use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpAttribute\Contract\AnnotationToAttributeMapperInterface; @@ -27,19 +24,6 @@ public function isCandidate($value) : bool */ public function map($value) : Expr { - if (\strtolower($value) === 'true') { - return new ConstFetch(new Name('true')); - } - if (\strtolower($value) === 'false') { - return new ConstFetch(new Name('false')); - } - if (\strtolower($value) === 'null') { - return new ConstFetch(new Name('null')); - } - // number as string to number - if (\is_numeric($value) && \strlen((string) (int) $value) === \strlen($value)) { - return LNumber::fromString($value); - } if (\strpos($value, "'") !== \false && \strpos($value, "\n") === \false) { $kind = String_::KIND_DOUBLE_QUOTED; } else { diff --git a/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php b/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php index cb9fb8866..fe06ec15e 100644 --- a/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php +++ b/vendor/rector/rector/src/PhpAttribute/AttributeArrayNameInliner.php @@ -4,19 +4,18 @@ namespace Rector\PhpAttribute; use PhpParser\Node\Arg; -use PhpParser\Node\Expr; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; -use Rector\Exception\NotImplementedYetException; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class AttributeArrayNameInliner { /** - * @param Array_|Arg[] $array - * @return Arg[] + * @param Array_|list $array + * @return list */ public function inlineArrayToArgs($array) : array { @@ -26,7 +25,7 @@ public function inlineArrayToArgs($array) : array return $this->inlineArrayNode($array); } /** - * @return Arg[] + * @return list */ private function inlineArrayNode(Array_ $array) : array { @@ -46,33 +45,22 @@ private function inlineArrayNode(Array_ $array) : array return $args; } /** - * @param Arg[] $args - * @return Arg[] + * @param list $args + * @return list */ private function inlineArray(array $args) : array { Assert::allIsAOf($args, Arg::class); - $newArgs = []; foreach ($args as $arg) { - // matching top root array key - if ($arg->value instanceof ArrayItem) { - $arrayItem = $arg->value; - if ($arrayItem->key instanceof LNumber) { - $newArgs[] = new Arg($arrayItem->value); - } elseif ($arrayItem->key instanceof String_) { - $arrayItemString = $arrayItem->key; - $newArgs[] = new Arg($arrayItem->value, \false, \false, [], new Identifier($arrayItemString->value)); - } elseif (!$arrayItem->key instanceof Expr) { - // silent key - $newArgs[] = new Arg($arrayItem->value); + if ($arg->value instanceof String_ && \is_numeric($arg->value->value)) { + // use equal over identical on purpose to verify if it is an integer + if ((float) $arg->value->value == (int) $arg->value->value) { + $arg->value = new Int_((int) $arg->value->value); } else { - throw new NotImplementedYetException(\get_debug_type($arrayItem->key)); + $arg->value = new Float_((float) $arg->value->value); } } } - if ($newArgs !== []) { - return $newArgs; - } return $args; } } diff --git a/vendor/rector/rector/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php b/vendor/rector/rector/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php index 6d337187c..77719c2af 100644 --- a/vendor/rector/rector/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php +++ b/vendor/rector/rector/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpAttribute\Contract; -use PhpParser\Node\Expr; +use PhpParser\Node; /** * @template T as mixed */ @@ -16,5 +16,5 @@ public function isCandidate($value) : bool; /** * @param T $value */ - public function map($value) : Expr; + public function map($value) : Node; } diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php index 1d6c48fe7..829e78989 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php @@ -4,25 +4,24 @@ namespace Rector\PhpAttribute\NodeFactory; use PhpParser\Node\Arg; -use PhpParser\Node\Expr\ArrayItem; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\ArrayItem; +use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ParameterReflection; use PHPStan\Reflection\ParametersAcceptorSelector; use PHPStan\Reflection\ReflectionProvider; -use PHPStan\Type\IntegerType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; use Rector\Php80\ValueObject\AnnotationToAttribute; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class AnnotationToAttributeIntegerValueCaster { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; @@ -43,10 +42,13 @@ public function castAttributeTypes(AnnotationToAttribute $annotationToAttribute, $parameterReflections = $this->resolveConstructorParameterReflections($attributeClassReflection); foreach ($parameterReflections as $parameterReflection) { foreach ($args as $arg) { - if (!$arg->value instanceof ArrayItem) { + if (!$arg->value instanceof Array_) { + continue; + } + $arrayItem = \current($arg->value->items) ?: null; + if (!$arrayItem instanceof ArrayItem) { continue; } - $arrayItem = $arg->value; if (!$arrayItem->key instanceof String_) { continue; } @@ -65,20 +67,20 @@ public function castAttributeTypes(AnnotationToAttribute $annotationToAttribute, if (!\is_numeric($valueString->value)) { continue; } - $arrayItem->value = new LNumber((int) $valueString->value); + $arrayItem->value = new Int_((int) $valueString->value); } } } private function containsInteger(Type $type) : bool { - if ($type instanceof IntegerType) { + if ($type->isInteger()->yes()) { return \true; } if (!$type instanceof UnionType) { return \false; } foreach ($type->getTypes() as $unionedType) { - if ($unionedType instanceof IntegerType) { + if ($unionedType->isInteger()->yes()) { return \true; } } @@ -90,7 +92,7 @@ private function containsInteger(Type $type) : bool private function resolveConstructorParameterReflections(ClassReflection $classReflection) : array { $extendedMethodReflection = $classReflection->getConstructor(); - $parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); - return $parametersAcceptorWithPhpDocs->getParameters(); + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + return $extendedParametersAcceptor->getParameters(); } } diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/AttributeNameFactory.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/AttributeNameFactory.php index e87ae41aa..cbfe6b8db 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/AttributeNameFactory.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/AttributeNameFactory.php @@ -14,9 +14,8 @@ final class AttributeNameFactory { /** * @readonly - * @var \Rector\PhpAttribute\UseAliasNameMatcher */ - private $useAliasNameMatcher; + private UseAliasNameMatcher $useAliasNameMatcher; public function __construct(UseAliasNameMatcher $useAliasNameMatcher) { $this->useAliasNameMatcher = $useAliasNameMatcher; diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php index 56be4debc..5626e6b0a 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/NamedArgsFactory.php @@ -3,37 +3,33 @@ declare (strict_types=1); namespace Rector\PhpAttribute\NodeFactory; -use RectorPrefix202411\Nette\Utils\Strings; use PhpParser\BuilderHelpers; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; -use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; -use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Identifier; -use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; use Rector\NodeTypeResolver\Node\AttributeKey; final class NamedArgsFactory { - /** - * @see https://regex101.com/r/1bJR0J/1 - * @var string - */ - private const CLASS_CONST_REGEX = '#(?\\w+)::(?\\w+)#'; /** * @param array $values - * @return Arg[] + * @return list */ public function createFromValues(array $values) : array { $args = []; foreach ($values as $key => $argValue) { - $expr = BuilderHelpers::normalizeValue($argValue); - $this->normalizeArrayWithConstFetchKey($expr); $name = null; + if ($argValue instanceof ArrayItem) { + if ($argValue->key instanceof String_) { + $name = new Identifier($argValue->key->value); + } + $argValue = $argValue->value; + } + $expr = BuilderHelpers::normalizeValue($argValue); // for named arguments - if (\is_string($key)) { + if (!$name instanceof Identifier && \is_string($key)) { $name = new Identifier($key); } $this->normalizeStringDoubleQuote($expr); @@ -55,28 +51,4 @@ private function normalizeStringDoubleQuote(Expr $expr) : void } $expr->setAttribute(AttributeKey::KIND, String_::KIND_DOUBLE_QUOTED); } - private function normalizeArrayWithConstFetchKey(Expr $expr) : void - { - if (!$expr instanceof Array_) { - return; - } - foreach ($expr->items as $arrayItem) { - if (!$arrayItem instanceof ArrayItem) { - continue; - } - if (!$arrayItem->key instanceof String_) { - continue; - } - $string = $arrayItem->key; - $match = Strings::match($string->value, self::CLASS_CONST_REGEX); - if ($match === null) { - continue; - } - /** @var string $class */ - $class = $match['class']; - /** @var string $constant */ - $constant = $match['constant']; - $arrayItem->key = new ClassConstFetch(new Name($class), $constant); - } - } } diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php index 8539249b3..285c079d3 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php @@ -4,11 +4,11 @@ namespace Rector\PhpAttribute\NodeFactory; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; @@ -27,48 +27,47 @@ final class PhpAttributeGroupFactory { /** * @readonly - * @var \Rector\PhpAttribute\AnnotationToAttributeMapper */ - private $annotationToAttributeMapper; + private AnnotationToAttributeMapper $annotationToAttributeMapper; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\AttributeNameFactory */ - private $attributeNameFactory; + private \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\NamedArgsFactory */ - private $namedArgsFactory; + private \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory; /** * @readonly - * @var \Rector\PhpAttribute\AttributeArrayNameInliner */ - private $attributeArrayNameInliner; + private \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster $annotationToAttributeIntegerValueCaster; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster */ - private $annotationToAttributeIntegerValueCaster; - public function __construct(AnnotationToAttributeMapper $annotationToAttributeMapper, \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory, \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory, AttributeArrayNameInliner $attributeArrayNameInliner, \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster $annotationToAttributeIntegerValueCaster) + private AttributeArrayNameInliner $attributeArrayNameInliner; + public function __construct(AnnotationToAttributeMapper $annotationToAttributeMapper, \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory, \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory, \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster $annotationToAttributeIntegerValueCaster, AttributeArrayNameInliner $attributeArrayNameInliner) { $this->annotationToAttributeMapper = $annotationToAttributeMapper; $this->attributeNameFactory = $attributeNameFactory; $this->namedArgsFactory = $namedArgsFactory; - $this->attributeArrayNameInliner = $attributeArrayNameInliner; $this->annotationToAttributeIntegerValueCaster = $annotationToAttributeIntegerValueCaster; + $this->attributeArrayNameInliner = $attributeArrayNameInliner; } - public function createFromSimpleTag(AnnotationToAttribute $annotationToAttribute) : AttributeGroup + public function createFromSimpleTag(AnnotationToAttribute $annotationToAttribute, ?string $value = null) : AttributeGroup { - return $this->createFromClass($annotationToAttribute->getAttributeClass()); + return $this->createFromClass($annotationToAttribute->getAttributeClass(), $value); } /** * @param AttributeName::*|string $attributeClass */ - public function createFromClass(string $attributeClass) : AttributeGroup + public function createFromClass(string $attributeClass, ?string $value = null) : AttributeGroup { $fullyQualified = new FullyQualified($attributeClass); $attribute = new Attribute($fullyQualified); + if ($value !== null && $value !== '') { + $arg = new Arg(new String_($value)); + $attribute->args = [$arg]; + } return new AttributeGroup([$attribute]); } /** @@ -106,9 +105,10 @@ public function create(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValu * @api tests * * @param ArrayItemNode[]|mixed[] $items + * @param string $attributeClass @deprecated * @param string[] $classReferencedFields * - * @return Arg[] + * @return list */ public function createArgsFromItems(array $items, string $attributeClass = '', array $classReferencedFields = []) : array { diff --git a/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php b/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php index 58ea15e9a..2a8c798d3 100644 --- a/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php +++ b/vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpNestedAttributeGroupFactory.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpAttribute\NodeFactory; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Arg; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; @@ -26,39 +26,33 @@ use Rector\Php80\ValueObject\NestedAnnotationToAttribute; use Rector\PhpAttribute\AnnotationToAttributeMapper; use Rector\PhpAttribute\AttributeArrayNameInliner; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class PhpNestedAttributeGroupFactory { /** * @readonly - * @var \Rector\PhpAttribute\AnnotationToAttributeMapper */ - private $annotationToAttributeMapper; + private AnnotationToAttributeMapper $annotationToAttributeMapper; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\AttributeNameFactory */ - private $attributeNameFactory; + private \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\NamedArgsFactory */ - private $namedArgsFactory; + private \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory; /** * @readonly - * @var \Rector\PhpAttribute\AttributeArrayNameInliner */ - private $attributeArrayNameInliner; + private AttributeArrayNameInliner $attributeArrayNameInliner; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory */ - private $tokenIteratorFactory; + private TokenIteratorFactory $tokenIteratorFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser */ - private $staticDoctrineAnnotationParser; + private StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser; public function __construct(AnnotationToAttributeMapper $annotationToAttributeMapper, \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory, \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory, AttributeArrayNameInliner $attributeArrayNameInliner, TokenIteratorFactory $tokenIteratorFactory, StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser) { $this->annotationToAttributeMapper = $annotationToAttributeMapper; @@ -110,7 +104,7 @@ public function createNested(DoctrineAnnotationTagValueNode $doctrineAnnotationT return $attributeGroups; } /** - * @return Arg[] + * @return list */ private function createAttributeArgs(DoctrineAnnotationTagValueNode $nestedDoctrineAnnotationTagValueNode) : array { @@ -119,7 +113,7 @@ private function createAttributeArgs(DoctrineAnnotationTagValueNode $nestedDoctr } /** * @param ArrayItemNode[] $arrayItemNodes - * @return Arg[] + * @return list */ private function createArgsFromItems(array $arrayItemNodes) : array { diff --git a/vendor/rector/rector/src/PhpAttribute/UseAliasNameMatcher.php b/vendor/rector/rector/src/PhpAttribute/UseAliasNameMatcher.php index c4de68459..c514ac30e 100644 --- a/vendor/rector/rector/src/PhpAttribute/UseAliasNameMatcher.php +++ b/vendor/rector/rector/src/PhpAttribute/UseAliasNameMatcher.php @@ -5,7 +5,7 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php80\Contract\ValueObject\AnnotationToAttributeInterface; use Rector\PhpAttribute\ValueObject\UseAliasMetadata; @@ -24,7 +24,7 @@ public function match(array $uses, string $shortAnnotationName, AnnotationToAttr foreach ($use->uses as $useUse) { // we need to use original use statement $originalUseUseNode = $useUse->getAttribute(AttributeKey::ORIGINAL_NODE); - if (!$originalUseUseNode instanceof UseUse) { + if (!$originalUseUseNode instanceof UseItem) { continue; } if (!$originalUseUseNode->alias instanceof Identifier) { diff --git a/vendor/rector/rector/src/PhpAttribute/ValueObject/UseAliasMetadata.php b/vendor/rector/rector/src/PhpAttribute/ValueObject/UseAliasMetadata.php index 8f020147c..b8ca343e1 100644 --- a/vendor/rector/rector/src/PhpAttribute/ValueObject/UseAliasMetadata.php +++ b/vendor/rector/rector/src/PhpAttribute/ValueObject/UseAliasMetadata.php @@ -3,29 +3,26 @@ declare (strict_types=1); namespace Rector\PhpAttribute\ValueObject; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; final class UseAliasMetadata { /** * @readonly - * @var string */ - private $shortAttributeName; + private string $shortAttributeName; /** * @readonly - * @var string */ - private $useImportName; + private string $useImportName; /** * @readonly - * @var \PhpParser\Node\Stmt\UseUse */ - private $useUse; - public function __construct(string $shortAttributeName, string $useImportName, UseUse $useUse) + private UseItem $useItem; + public function __construct(string $shortAttributeName, string $useImportName, UseItem $useItem) { $this->shortAttributeName = $shortAttributeName; $this->useImportName = $useImportName; - $this->useUse = $useUse; + $this->useItem = $useItem; } public function getShortAttributeName() : string { @@ -35,8 +32,8 @@ public function getUseImportName() : string { return $this->useImportName; } - public function getUseUse() : UseUse + public function getUseUse() : UseItem { - return $this->useUse; + return $this->useItem; } } diff --git a/vendor/rector/rector/src/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php b/vendor/rector/rector/src/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php index 3c1734699..05ea4d955 100644 --- a/vendor/rector/rector/src/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php +++ b/vendor/rector/rector/src/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php @@ -20,9 +20,8 @@ public function traverseNodesWithCallable($node, callable $callable) : void if ($node === null || $node === []) { return; } - $nodeTraverser = new NodeTraverser(); $callableNodeVisitor = new CallableNodeVisitor($callable); - $nodeTraverser->addVisitor($callableNodeVisitor); + $nodeTraverser = new NodeTraverser($callableNodeVisitor); $nodes = $node instanceof Node ? [$node] : $node; $nodeTraverser->traverse($nodes); } diff --git a/vendor/rector/rector/src/PhpDocParser/NodeVisitor/CallableNodeVisitor.php b/vendor/rector/rector/src/PhpDocParser/NodeVisitor/CallableNodeVisitor.php index 826426a3b..5508c03b3 100644 --- a/vendor/rector/rector/src/PhpDocParser/NodeVisitor/CallableNodeVisitor.php +++ b/vendor/rector/rector/src/PhpDocParser/NodeVisitor/CallableNodeVisitor.php @@ -7,7 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; final class CallableNodeVisitor extends NodeVisitorAbstract { @@ -15,14 +15,11 @@ final class CallableNodeVisitor extends NodeVisitorAbstract * @var callable(Node): (int|Node|null|Node[]) */ private $callable; - /** - * @var int|null - */ - private $nodeIdToRemove; + private ?int $nodeIdToRemove = null; /** * @var array */ - private $nodesToReturn = []; + private array $nodesToReturn = []; /** * @param callable(Node $node): (int|Node|null|Node[]) $callable */ @@ -39,7 +36,7 @@ public function enterNode(Node $node) $callable = $this->callable; /** @var int|Node|null|Node[] $newNode */ $newNode = $callable($node); - if ($newNode === NodeTraverser::REMOVE_NODE) { + if ($newNode === NodeVisitor::REMOVE_NODE) { $this->nodeIdToRemove = \spl_object_id($originalNode); return $originalNode; } @@ -60,7 +57,7 @@ public function leaveNode(Node $node) { if ($this->nodeIdToRemove !== null && $this->nodeIdToRemove === \spl_object_id($node)) { $this->nodeIdToRemove = null; - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } if ($this->nodesToReturn === []) { return $node; diff --git a/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php b/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php index 1d30c3299..e9975f843 100644 --- a/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php +++ b/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php @@ -61,11 +61,11 @@ final class PhpDocNodeTraverser /** * @var bool Whether traversal should be stopped */ - private $stopTraversal = \false; + private bool $stopTraversal = \false; /** * @var PhpDocNodeVisitorInterface[] */ - private $phpDocNodeVisitors = []; + private array $phpDocNodeVisitors = []; public function addPhpDocNodeVisitor(PhpDocNodeVisitorInterface $phpDocNodeVisitor) : void { $this->phpDocNodeVisitors[] = $phpDocNodeVisitor; @@ -119,7 +119,7 @@ private function traverseNode(Node $node) : Node } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = \true; } elseif ($return === self::NODE_REMOVE) { - $subNode = null; + unset($subNode); continue 2; } else { throw new InvalidTraverseException('enterNode() returned invalid value of type ' . \gettype($return)); diff --git a/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CallablePhpDocNodeVisitor.php b/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CallablePhpDocNodeVisitor.php index 751b87ca2..f87254ee3 100644 --- a/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CallablePhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CallablePhpDocNodeVisitor.php @@ -8,9 +8,8 @@ final class CallablePhpDocNodeVisitor extends \Rector\PhpDocParser\PhpDocParser\ { /** * @readonly - * @var string|null */ - private $docContent; + private ?string $docContent; /** * @var callable(Node, string|null): (int|null|Node) */ diff --git a/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php b/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php index 0c559fe15..4048b84bf 100644 --- a/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php +++ b/vendor/rector/rector/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php @@ -17,7 +17,7 @@ final class ParentConnectingPhpDocNodeVisitor extends \Rector\PhpDocParser\PhpDo /** * @var Node[] */ - private $stack = []; + private array $stack = []; public function beforeTraverse(Node $node) : void { $this->stack = [$node]; diff --git a/vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParser.php b/vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParser.php deleted file mode 100644 index 35fe3b68b..000000000 --- a/vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParser.php +++ /dev/null @@ -1,38 +0,0 @@ -parser = $parser; - } - /** - * @return Stmt[] - */ - public function parseFile(string $file) : array - { - return $this->parser->parseFile($file); - } - /** - * @return Stmt[] - */ - public function parseString(string $sourceCode) : array - { - return $this->parser->parseString($sourceCode); - } -} diff --git a/vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParserFactory.php b/vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParserFactory.php deleted file mode 100644 index afce3589a..000000000 --- a/vendor/rector/rector/src/PhpDocParser/PhpParser/SmartPhpParserFactory.php +++ /dev/null @@ -1,41 +0,0 @@ -createNativePhpParser(); - $cachedParser = $this->createPHPStanParser($nativePhpParser); - return new \Rector\PhpDocParser\PhpParser\SmartPhpParser($cachedParser); - } - private function createNativePhpParser() : Parser - { - $parserFactory = new ParserFactory(); - $lexerEmulative = new Emulative(['usedAttributes' => ['comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos']]); - return $parserFactory->create(ParserFactory::PREFER_PHP7, $lexerEmulative); - } - private function createPHPStanParser(Parser $parser) : CachedParser - { - $nameResolver = new NameResolver(); - $simpleParser = new SimpleParser($parser, $nameResolver); - return new CachedParser($simpleParser, 1024); - } -} diff --git a/vendor/rector/rector/src/PhpDocParser/ValueObject/AttributeKey.php b/vendor/rector/rector/src/PhpDocParser/ValueObject/AttributeKey.php index 7465777f4..42ab376b4 100644 --- a/vendor/rector/rector/src/PhpDocParser/ValueObject/AttributeKey.php +++ b/vendor/rector/rector/src/PhpDocParser/ValueObject/AttributeKey.php @@ -9,7 +9,7 @@ final class AttributeKey { /** - * Used in php-paser, do not change + * Used in php-parser, do not change * * @var string */ diff --git a/vendor/rector/rector/src/PhpParser/AstResolver.php b/vendor/rector/rector/src/PhpParser/AstResolver.php index c3f6addd9..2b1ef973f 100644 --- a/vendor/rector/rector/src/PhpParser/AstResolver.php +++ b/vendor/rector/rector/src/PhpParser/AstResolver.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\NullsafeMethodCall; use PhpParser\Node\Expr\StaticCall; +use PhpParser\Node\Name; use PhpParser\Node\Param; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; @@ -19,20 +20,19 @@ use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\Trait_; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\FunctionReflection; use PHPStan\Reflection\MethodReflection; use PHPStan\Reflection\Php\PhpFunctionReflection; use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Reflection\ReflectionProvider; -use PHPStan\Type\TypeWithClassName; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator; use Rector\NodeTypeResolver\NodeTypeResolver; -use Rector\PhpDocParser\PhpParser\SmartPhpParser; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PhpParser\Parser\RectorParser; use Rector\Reflection\MethodReflectionResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use Rector\ValueObject\MethodName; use Throwable; /** @@ -43,49 +43,42 @@ final class AstResolver { /** * @readonly - * @var \Rector\PhpDocParser\PhpParser\SmartPhpParser */ - private $smartPhpParser; + private RectorParser $rectorParser; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator */ - private $nodeScopeAndMetadataDecorator; + private NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\Reflection\MethodReflectionResolver */ - private $methodReflectionResolver; + private MethodReflectionResolver $methodReflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * Parsing files is very heavy performance, so this will help to leverage it * The value can be also null, when no statements could be parsed from the file. * * @var array */ - private $parsedFileNodes = []; - public function __construct(SmartPhpParser $smartPhpParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, MethodReflectionResolver $methodReflectionResolver, BetterNodeFinder $betterNodeFinder) + private array $parsedFileNodes = []; + public function __construct(RectorParser $rectorParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, MethodReflectionResolver $methodReflectionResolver, BetterNodeFinder $betterNodeFinder) { - $this->smartPhpParser = $smartPhpParser; + $this->rectorParser = $rectorParser; $this->nodeScopeAndMetadataDecorator = $nodeScopeAndMetadataDecorator; $this->nodeNameResolver = $nodeNameResolver; $this->reflectionProvider = $reflectionProvider; @@ -134,10 +127,10 @@ public function resolveClassMethodFromMethodReflection(MethodReflection $methodR * @param \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall $call * @return \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|null */ - public function resolveClassMethodOrFunctionFromCall($call, Scope $scope) + public function resolveClassMethodOrFunctionFromCall($call) { if ($call instanceof FuncCall) { - return $this->resolveFunctionFromFuncCall($call, $scope); + return $this->resolveFunctionFromFuncCall($call); } return $this->resolveClassMethodFromCall($call); } @@ -179,14 +172,15 @@ public function resolveClassMethod(string $className, string $methodName) : ?Cla public function resolveClassMethodFromCall($call) : ?ClassMethod { $callerStaticType = $call instanceof MethodCall || $call instanceof NullsafeMethodCall ? $this->nodeTypeResolver->getType($call->var) : $this->nodeTypeResolver->getType($call->class); - if (!$callerStaticType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($callerStaticType); + if ($className === null) { return null; } $methodName = $this->nodeNameResolver->getName($call->name); if ($methodName === null) { return null; } - return $this->resolveClassMethod($callerStaticType->getClassName(), $methodName); + return $this->resolveClassMethod($className, $methodName); } /** * @return \PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Enum_|null @@ -281,7 +275,7 @@ public function parseFileNameToDecoratedNodes(?string $fileName) : array return $this->parsedFileNodes[$fileName]; } try { - $stmts = $this->smartPhpParser->parseFile($fileName); + $stmts = $this->rectorParser->parseFile($fileName); } catch (Throwable $throwable) { /** * phpstan.phar contains jetbrains/phpstorm-stubs which the code is not downgraded @@ -329,7 +323,7 @@ private function findPromotedPropertyByName(array $stmts, string $desiredClassNa return \false; } foreach ($constructClassMethod->getParams() as $param) { - if ($param->flags === 0) { + if (!$param->isPromoted()) { continue; } if ($this->nodeNameResolver->isName($param, $desiredPropertyName)) { @@ -341,15 +335,16 @@ private function findPromotedPropertyByName(array $stmts, string $desiredClassNa }); return $paramNode; } - private function resolveFunctionFromFuncCall(FuncCall $funcCall, Scope $scope) : ?Function_ + private function resolveFunctionFromFuncCall(FuncCall $funcCall) : ?Function_ { if ($funcCall->name instanceof Expr) { return null; } - if (!$this->reflectionProvider->hasFunction($funcCall->name, $scope)) { + $functionName = new Name((string) $this->nodeNameResolver->getName($funcCall)); + if (!$this->reflectionProvider->hasFunction($functionName, null)) { return null; } - $functionReflection = $this->reflectionProvider->getFunction($funcCall->name, $scope); + $functionReflection = $this->reflectionProvider->getFunction($functionName, null); return $this->resolveFunctionFromFunctionReflection($functionReflection); } } diff --git a/vendor/rector/rector/src/PhpParser/Comparing/NodeComparator.php b/vendor/rector/rector/src/PhpParser/Comparing/NodeComparator.php index 40724ecb2..1a63f72c1 100644 --- a/vendor/rector/rector/src/PhpParser/Comparing/NodeComparator.php +++ b/vendor/rector/rector/src/PhpParser/Comparing/NodeComparator.php @@ -10,14 +10,12 @@ final class NodeComparator { /** * @readonly - * @var \Rector\Comments\CommentRemover */ - private $commentRemover; + private CommentRemover $commentRemover; /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; public function __construct(CommentRemover $commentRemover, BetterStandardPrinter $betterStandardPrinter) { $this->commentRemover = $commentRemover; diff --git a/vendor/rector/rector/src/PhpParser/Node/AssignAndBinaryMap.php b/vendor/rector/rector/src/PhpParser/Node/AssignAndBinaryMap.php index b9187050c..6bf96db42 100644 --- a/vendor/rector/rector/src/PhpParser/Node/AssignAndBinaryMap.php +++ b/vendor/rector/rector/src/PhpParser/Node/AssignAndBinaryMap.php @@ -46,9 +46,8 @@ final class AssignAndBinaryMap { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @var array, class-string> */ @@ -60,7 +59,7 @@ final class AssignAndBinaryMap /** * @var array, class-string> */ - private $binaryOpToAssignClasses = []; + private array $binaryOpToAssignClasses = []; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php b/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php index 33a4c5287..1268a0ffa 100644 --- a/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php +++ b/vendor/rector/rector/src/PhpParser/Node/BetterNodeFinder.php @@ -15,11 +15,11 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; use PhpParser\NodeFinder; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeAnalyzer\ClassAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\PhpParser\Node\BetterNodeFinder\BetterNodeFinderTest */ @@ -27,24 +27,20 @@ final class BetterNodeFinder { /** * @readonly - * @var \PhpParser\NodeFinder */ - private $nodeFinder; + private NodeFinder $nodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(NodeFinder $nodeFinder, NodeNameResolver $nodeNameResolver, ClassAnalyzer $classAnalyzer, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->nodeFinder = $nodeFinder; @@ -121,14 +117,14 @@ public function findVariableOfName($nodes, string $name) : ?Node public function hasInstancesOf($nodes, array $types) : bool { Assert::allIsAOf($types, Node::class); - foreach ($types as $type) { - $foundNode = $this->nodeFinder->findFirstInstanceOf($nodes, $type); - if (!$foundNode instanceof Node) { - continue; + return (bool) $this->nodeFinder->findFirst($nodes, static function (Node $node) use($types) : bool { + foreach ($types as $type) { + if ($node instanceof $type) { + return \true; + } } - return \true; - } - return \false; + return \false; + }); } /** * @param Node|Node[] $nodes @@ -147,9 +143,7 @@ public function find($nodes, callable $filter) : array public function findFirstNonAnonymousClass(array $nodes) : ?Node { // skip anonymous classes - return $this->findFirst($nodes, function (Node $node) : bool { - return $node instanceof Class_ && !$this->classAnalyzer->isAnonymousClass($node); - }); + return $this->findFirst($nodes, fn(Node $node): bool => $node instanceof Class_ && !$this->classAnalyzer->isAnonymousClass($node)); } /** * @param Node|Node[] $nodes @@ -172,12 +166,12 @@ public function hasInstancesOfInFunctionLikeScoped($functionLike, $types) : bool $isFoundNode = \false; $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $functionLike->stmts, static function (Node $subNode) use($types, &$isFoundNode) : ?int { if ($subNode instanceof Class_ || $subNode instanceof FunctionLike) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } foreach ($types as $type) { if ($subNode instanceof $type) { $isFoundNode = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } } return null; @@ -193,18 +187,17 @@ public function findReturnsScoped($functionLike) : array $returns = []; $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $functionLike->stmts, function (Node $subNode) use(&$returns) : ?int { if ($subNode instanceof Class_ || $subNode instanceof FunctionLike) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Yield_ || $subNode instanceof YieldFrom) { $returns = []; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } if ($subNode instanceof Return_) { $returns[] = $subNode; } return null; }); - Assert::allIsInstanceOf($returns, Return_::class); return $returns; } /** @@ -228,7 +221,7 @@ public function findInstancesOfScoped(array $nodes, $types) : array $foundNodes = []; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, static function (Node $subNode) use($types, &$foundNodes) : ?int { if ($subNode instanceof Class_ || $subNode instanceof FunctionLike) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } foreach ($types as $type) { if ($subNode instanceof $type) { @@ -256,36 +249,16 @@ public function findInstancesOfInFunctionLikeScoped($functionLike, $types) : arr */ public function findFirstInFunctionLikeScoped($functionLike, callable $filter) : ?Node { - if ($functionLike->stmts === null) { - return null; - } - $foundNode = $this->findFirst($functionLike->stmts, $filter); - if (!$foundNode instanceof Node) { - return null; - } - if (!$this->hasInstancesOf($functionLike->stmts, [Class_::class, FunctionLike::class])) { - return $foundNode; - } $scopedNode = null; - $this->simpleCallableNodeTraverser->traverseNodesWithCallable($functionLike->stmts, function (Node $subNode) use(&$scopedNode, $foundNode, $filter) : ?int { - if ($subNode instanceof Class_ || $subNode instanceof FunctionLike) { - if ($foundNode instanceof $subNode && $subNode === $foundNode) { - $scopedNode = $subNode; - return NodeTraverser::STOP_TRAVERSAL; + $this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $functionLike->stmts, function (Node $subNode) use(&$scopedNode, $filter) : ?int { + if (!$filter($subNode)) { + if ($subNode instanceof Class_ || $subNode instanceof FunctionLike) { + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; - } - if (!$foundNode instanceof $subNode) { return null; } - // handle after Closure - // @see https://github.com/rectorphp/rector-src/pull/4931 - $scopedFoundNode = $this->findFirst($subNode, $filter); - if ($scopedFoundNode === $subNode) { - $scopedNode = $subNode; - return NodeTraverser::STOP_TRAVERSAL; - } - return null; + $scopedNode = $subNode; + return NodeVisitor::STOP_TRAVERSAL; }); return $scopedNode; } @@ -297,8 +270,6 @@ public function findFirstInFunctionLikeScoped($functionLike, callable $filter) : private function findInstanceOfName($nodes, string $type, string $name) : ?Node { Assert::isAOf($type, Node::class); - return $this->nodeFinder->findFirst($nodes, function (Node $node) use($type, $name) : bool { - return $node instanceof $type && $this->nodeNameResolver->isName($node, $name); - }); + return $this->nodeFinder->findFirst($nodes, fn(Node $node): bool => $node instanceof $type && $this->nodeNameResolver->isName($node, $name)); } } diff --git a/vendor/rector/rector/src/PhpParser/Node/CustomNode/FileWithoutNamespace.php b/vendor/rector/rector/src/PhpParser/Node/CustomNode/FileWithoutNamespace.php index 6690128d1..8669080c5 100644 --- a/vendor/rector/rector/src/PhpParser/Node/CustomNode/FileWithoutNamespace.php +++ b/vendor/rector/rector/src/PhpParser/Node/CustomNode/FileWithoutNamespace.php @@ -13,7 +13,7 @@ final class FileWithoutNamespace extends Stmt implements StmtsAwareInterface /** * @var Stmt[] */ - public $stmts; + public array $stmts; /** * @param Stmt[] $stmts */ diff --git a/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php b/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php index e6b5bbaab..9a267fadb 100644 --- a/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php +++ b/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php @@ -8,11 +8,12 @@ use PhpParser\Builder\Property as PropertyBuilder; use PhpParser\BuilderFactory; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; @@ -34,7 +35,6 @@ use PhpParser\Node\Param; use PhpParser\Node\Scalar; use PhpParser\Node\Scalar\String_; -use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PHPStan\Type\Type; @@ -44,10 +44,12 @@ use Rector\Exception\ShouldNotHappenException; use Rector\NodeDecorator\PropertyTypeDecorator; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Php\PhpVersionProvider; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\PostRector\ValueObject\PropertyMetadata; use Rector\StaticTypeMapper\StaticTypeMapper; +use Rector\ValueObject\PhpVersionFeature; /** * @see \Rector\Tests\PhpParser\Node\NodeFactoryTest */ @@ -55,40 +57,40 @@ final class NodeFactory { /** * @readonly - * @var \PhpParser\BuilderFactory */ - private $builderFactory; + private BuilderFactory $builderFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\NodeDecorator\PropertyTypeDecorator */ - private $propertyTypeDecorator; + private PropertyTypeDecorator $propertyTypeDecorator; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; + /** + * @readonly + */ + private PhpVersionProvider $phpVersionProvider; /** * @var string */ private const THIS = 'this'; - public function __construct(BuilderFactory $builderFactory, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, PropertyTypeDecorator $propertyTypeDecorator, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) + public function __construct(BuilderFactory $builderFactory, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, PropertyTypeDecorator $propertyTypeDecorator, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, PhpVersionProvider $phpVersionProvider) { $this->builderFactory = $builderFactory; $this->phpDocInfoFactory = $phpDocInfoFactory; $this->staticTypeMapper = $staticTypeMapper; $this->propertyTypeDecorator = $propertyTypeDecorator; $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; + $this->phpVersionProvider = $phpVersionProvider; } /** * @param string|ObjectReference::* $className @@ -131,6 +133,11 @@ public function createArray(array $items) : Array_ */ public function createArgs(array $values) : array { + foreach ($values as $key => $value) { + if ($value instanceof ArrayItem) { + $values[$key] = $value->value; + } + } return $this->builderFactory->args($values); } /** @@ -274,7 +281,11 @@ public function createPromotedPropertyParam(PropertyMetadata $propertyMetadata) } $param = $paramBuilder->getNode(); $propertyFlags = $propertyMetadata->getFlags(); - $param->flags = $propertyFlags !== 0 ? $propertyFlags : Class_::MODIFIER_PRIVATE; + $param->flags = $propertyFlags !== 0 ? $propertyFlags : Modifiers::PRIVATE; + // make readonly by default + if ($this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::READONLY_PROPERTY)) { + $param->flags |= Modifiers::READONLY; + } return $param; } public function createFalse() : ConstFetch diff --git a/vendor/rector/rector/src/PhpParser/Node/Value/ValueResolver.php b/vendor/rector/rector/src/PhpParser/Node/Value/ValueResolver.php index 7b6c07ef9..1b7657638 100644 --- a/vendor/rector/rector/src/PhpParser/Node/Value/ValueResolver.php +++ b/vendor/rector/rector/src/PhpParser/Node/Value/ValueResolver.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\PhpParser\Node\Value; +use ArithmeticError; use PhpParser\ConstExprEvaluationException; use PhpParser\ConstExprEvaluator; use PhpParser\Node\Arg; @@ -10,14 +11,19 @@ use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\ConstFetch; +use PhpParser\Node\InterpolatedStringPart; use PhpParser\Node\Name; +use PhpParser\Node\Scalar\MagicConst\Class_; +use PhpParser\Node\Scalar\MagicConst\Dir; +use PhpParser\Node\Scalar\MagicConst\File; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\Constant\ConstantArrayType; +use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\ConstantScalarType; -use PHPStan\Type\ConstantType; -use PHPStan\Type\TypeWithClassName; +use PHPStan\Type\Type; +use Rector\Application\Provider\CurrentFileProvider; use Rector\Enum\ObjectReference; use Rector\Exception\ShouldNotHappenException; use Rector\NodeAnalyzer\ConstFetchAnalyzer; @@ -26,6 +32,7 @@ use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\Reflection\ClassReflectionAnalyzer; use Rector\Reflection\ReflectionResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; use TypeError; /** * @see \Rector\Tests\PhpParser\Node\Value\ValueResolverTest @@ -35,39 +42,34 @@ final class ValueResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ConstFetchAnalyzer */ - private $constFetchAnalyzer; + private ConstFetchAnalyzer $constFetchAnalyzer; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\Reflection\ClassReflectionAnalyzer */ - private $classReflectionAnalyzer; + private ClassReflectionAnalyzer $classReflectionAnalyzer; /** - * @var \PhpParser\ConstExprEvaluator|null + * @readonly */ - private $constExprEvaluator; - public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, ConstFetchAnalyzer $constFetchAnalyzer, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, ClassReflectionAnalyzer $classReflectionAnalyzer) + private CurrentFileProvider $currentFileProvider; + private ?ConstExprEvaluator $constExprEvaluator = null; + public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, ConstFetchAnalyzer $constFetchAnalyzer, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, ClassReflectionAnalyzer $classReflectionAnalyzer, CurrentFileProvider $currentFileProvider) { $this->nodeNameResolver = $nodeNameResolver; $this->nodeTypeResolver = $nodeTypeResolver; @@ -75,6 +77,7 @@ public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $this->reflectionProvider = $reflectionProvider; $this->reflectionResolver = $reflectionResolver; $this->classReflectionAnalyzer = $classReflectionAnalyzer; + $this->currentFileProvider = $currentFileProvider; } /** * @param mixed $value @@ -84,7 +87,7 @@ public function isValue(Expr $expr, $value) : bool return $this->getValue($expr) === $value; } /** - * @param \PhpParser\Node\Arg|\PhpParser\Node\Expr $expr + * @param \PhpParser\Node\Arg|\PhpParser\Node\Expr|\PhpParser\Node\InterpolatedStringPart $expr * @return mixed */ public function getValue($expr, bool $resolvedClassReference = \false) @@ -115,10 +118,7 @@ public function getValue($expr, bool $resolvedClassReference = \false) return $this->nodeNameResolver->getName($expr); } $nodeStaticType = $this->nodeTypeResolver->getType($expr); - if ($nodeStaticType instanceof ConstantType) { - return $this->resolveConstantType($nodeStaticType); - } - return null; + return $this->resolveConstantType($nodeStaticType); } /** * @api symfony @@ -166,14 +166,24 @@ public function areValuesEqual(array $nodes, array $expectedValues) : bool return \true; } /** + * @param \PhpParser\Node\Expr|\PhpParser\Node\InterpolatedStringPart $expr * @return mixed */ - private function resolveExprValueForConst(Expr $expr) + private function resolveExprValueForConst($expr) { + if ($expr instanceof InterpolatedStringPart) { + return $expr->value; + } try { $constExprEvaluator = $this->getConstExprEvaluator(); return $constExprEvaluator->evaluateDirectly($expr); - } catch (ConstExprEvaluationException|TypeError $exception) { + } catch (ConstExprEvaluationException|TypeError|ArithmeticError $exception) { + } + if ($expr instanceof Class_) { + $type = $this->nodeTypeResolver->getNativeType($expr); + if ($type instanceof ConstantStringType) { + return $type->getValue(); + } } return null; } @@ -187,6 +197,14 @@ private function getConstExprEvaluator() : ConstExprEvaluator return $this->constExprEvaluator; } $this->constExprEvaluator = new ConstExprEvaluator(function (Expr $expr) { + if ($expr instanceof Dir) { + // __DIR__ + return $this->resolveDirConstant(); + } + if ($expr instanceof File) { + // __FILE__ + return $this->resolveFileConstant($expr); + } // resolve "SomeClass::SOME_CONST" if ($expr instanceof ClassConstFetch && $expr->class instanceof Name) { return $this->resolveClassConstFetch($expr); @@ -195,6 +213,22 @@ private function getConstExprEvaluator() : ConstExprEvaluator }); return $this->constExprEvaluator; } + private function resolveDirConstant() : string + { + $file = $this->currentFileProvider->getFile(); + if (!$file instanceof \Rector\ValueObject\Application\File) { + throw new ShouldNotHappenException(); + } + return \dirname($file->getFilePath()); + } + private function resolveFileConstant(File $file) : string + { + $file = $this->currentFileProvider->getFile(); + if (!$file instanceof \Rector\ValueObject\Application\File) { + throw new ShouldNotHappenException(); + } + return $file->getFilePath(); + } /** * @return mixed[]|null */ @@ -202,7 +236,6 @@ private function extractConstantArrayTypeValue(ConstantArrayType $constantArrayT { $keys = []; foreach ($constantArrayType->getKeyTypes() as $i => $keyType) { - /** @var ConstantScalarType $keyType */ $keys[$i] = $keyType->getValue(); } $values = []; @@ -211,7 +244,7 @@ private function extractConstantArrayTypeValue(ConstantArrayType $constantArrayT $value = $this->extractConstantArrayTypeValue($valueType); } elseif ($valueType instanceof ConstantScalarType) { $value = $valueType->getValue(); - } elseif ($valueType instanceof TypeWithClassName) { + } elseif (ClassNameFromObjectTypeResolver::resolve($valueType) !== null) { continue; } else { return null; @@ -291,7 +324,7 @@ private function resolveClassFromSelfStaticParent(ClassConstFetch $classConstFet /** * @return mixed */ - private function resolveConstantType(ConstantType $constantType) + private function resolveConstantType(Type $constantType) { if ($constantType instanceof ConstantArrayType) { return $this->extractConstantArrayTypeValue($constantType); diff --git a/vendor/rector/rector/src/PhpParser/NodeFinder/LocalMethodCallFinder.php b/vendor/rector/rector/src/PhpParser/NodeFinder/LocalMethodCallFinder.php index 3cc8229e8..30c0eb6a3 100644 --- a/vendor/rector/rector/src/PhpParser/NodeFinder/LocalMethodCallFinder.php +++ b/vendor/rector/rector/src/PhpParser/NodeFinder/LocalMethodCallFinder.php @@ -8,27 +8,24 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Type\TypeWithClassName; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class LocalMethodCallFinder { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(BetterNodeFinder $betterNodeFinder, NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver) { $this->betterNodeFinder = $betterNodeFinder; @@ -54,10 +51,7 @@ public function match(Class_ $class, ClassMethod $classMethod) : array return \false; } $callerType = $subNode instanceof MethodCall ? $this->nodeTypeResolver->getType($subNode->var) : $this->nodeTypeResolver->getType($subNode->class); - if (!$callerType instanceof TypeWithClassName) { - return \false; - } - return $callerType->getClassName() === $className; + return ClassNameFromObjectTypeResolver::resolve($callerType) === $className; }); return $matchingMethodCalls; } diff --git a/vendor/rector/rector/src/PhpParser/NodeFinder/PropertyFetchFinder.php b/vendor/rector/rector/src/PhpParser/NodeFinder/PropertyFetchFinder.php index 3edd83191..6ceaad1f8 100644 --- a/vendor/rector/rector/src/PhpParser/NodeFinder/PropertyFetchFinder.php +++ b/vendor/rector/rector/src/PhpParser/NodeFinder/PropertyFetchFinder.php @@ -22,7 +22,6 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; use PHPStan\Type\StaticType; -use PHPStan\Type\TypeWithClassName; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -32,43 +31,37 @@ use Rector\PhpParser\AstResolver; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Reflection\ReflectionResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; final class PropertyFetchFinder { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, ReflectionResolver $reflectionResolver, AstResolver $astResolver, NodeTypeResolver $nodeTypeResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->betterNodeFinder = $betterNodeFinder; @@ -93,7 +86,7 @@ public function findPrivatePropertyFetches(Class_ $class, $propertyOrPromotedPar $nodes = [$class]; $nodesTrait = $this->astResolver->parseClassReflectionTraits($classReflection); $hasTrait = $nodesTrait !== []; - $nodes = \array_merge($nodes, $nodesTrait); + $nodes = [...$nodes, ...$nodesTrait]; return $this->findPropertyFetchesInClassLike($class, $nodes, $propertyName, $hasTrait, $scope); } /** @@ -102,7 +95,7 @@ public function findPrivatePropertyFetches(Class_ $class, $propertyOrPromotedPar public function findLocalPropertyFetchesByName(Class_ $class, string $paramName) : array { /** @var PropertyFetch[]|StaticPropertyFetch[]|NullsafePropertyFetch[] $foundPropertyFetches */ - $foundPropertyFetches = $this->betterNodeFinder->find($class->getMethods(), function (Node $subNode) use($paramName) : bool { + $foundPropertyFetches = $this->betterNodeFinder->find($this->resolveNodesToLocate($class), function (Node $subNode) use($paramName) : bool { if ($subNode instanceof PropertyFetch) { return $this->propertyFetchAnalyzer->isLocalPropertyFetchName($subNode, $paramName); } @@ -124,7 +117,7 @@ public function findLocalPropertyArrayDimFetchesAssignsByName(Class_ $class, Pro $propertyName = $this->nodeNameResolver->getName($property); /** @var ArrayDimFetch[] $propertyArrayDimFetches */ $propertyArrayDimFetches = []; - $this->simpleCallableNodeTraverser->traverseNodesWithCallable($class->getMethods(), function (Node $subNode) use(&$propertyArrayDimFetches, $propertyName) { + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($this->resolveNodesToLocate($class), function (Node $subNode) use(&$propertyArrayDimFetches, $propertyName) { if (!$subNode instanceof Assign) { return null; } @@ -163,6 +156,14 @@ public function isLocalPropertyFetchByName(Expr $expr, $class, string $propertyN } return \false; } + /** + * @return Stmt[] + */ + private function resolveNodesToLocate(Class_ $class) : array + { + $propertyWithHooks = \array_filter($class->getProperties(), fn(Property $property): bool => $property->hooks !== []); + return [...$propertyWithHooks, ...$class->getMethods()]; + } /** * @param Stmt[] $stmts * @return PropertyFetch[]|StaticPropertyFetch[] @@ -248,10 +249,10 @@ private function isNamePropertyNameEquals(PropertyFetch $propertyFetch, string $ return \false; } $propertyFetchVarType = $this->nodeTypeResolver->getType($propertyFetch->var); - if (!$propertyFetchVarType instanceof TypeWithClassName) { + $propertyFetchVarTypeClassName = ClassNameFromObjectTypeResolver::resolve($propertyFetchVarType); + if ($propertyFetchVarTypeClassName === null) { return \false; } - $propertyFetchVarTypeClassName = $propertyFetchVarType->getClassName(); $classLikeName = $this->nodeNameResolver->getName($class); return $propertyFetchVarTypeClassName === $classLikeName; } diff --git a/vendor/rector/rector/src/PhpParser/NodeTransformer.php b/vendor/rector/rector/src/PhpParser/NodeTransformer.php index 97ae7cf39..f114a1b58 100644 --- a/vendor/rector/rector/src/PhpParser/NodeTransformer.php +++ b/vendor/rector/rector/src/PhpParser/NodeTransformer.php @@ -5,9 +5,9 @@ use PhpParser\BuilderHelpers; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Yield_; @@ -64,9 +64,6 @@ public function transformArrayToYields(Array_ $array) : array { $yields = []; foreach ($array->items as $arrayItem) { - if (!$arrayItem instanceof ArrayItem) { - continue; - } $yield = new Yield_($arrayItem->value, $arrayItem->key); $expression = new Expression($yield); $arrayItemComments = $arrayItem->getComments(); @@ -116,7 +113,7 @@ private function splitMessageAndArgs(FuncCall $sprintfFuncCall) : ?SprintfString */ private function splitBySpace(string $value) : array { - $value = \str_getcsv($value, ' '); + $value = \str_getcsv($value, ' ', '"', '\\'); return \array_filter($value); } /** diff --git a/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php b/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php index cc55e4ed9..6978fcbda 100644 --- a/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php +++ b/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php @@ -7,6 +7,7 @@ use PhpParser\Node\Stmt; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor; +use Rector\Configuration\ConfigurationRuleFilter; use Rector\Contract\Rector\RectorInterface; use Rector\VersionBonding\PhpVersionedFilter; final class RectorNodeTraverser extends NodeTraverser @@ -14,27 +15,28 @@ final class RectorNodeTraverser extends NodeTraverser /** * @var RectorInterface[] */ - private $rectors; + private array $rectors; /** * @readonly - * @var \Rector\VersionBonding\PhpVersionedFilter */ - private $phpVersionedFilter; + private PhpVersionedFilter $phpVersionedFilter; /** - * @var bool + * @readonly */ - private $areNodeVisitorsPrepared = \false; + private ConfigurationRuleFilter $configurationRuleFilter; + private bool $areNodeVisitorsPrepared = \false; /** * @var array,RectorInterface[]> */ - private $visitorsPerNodeClass = []; + private array $visitorsPerNodeClass = []; /** * @param RectorInterface[] $rectors */ - public function __construct(array $rectors, PhpVersionedFilter $phpVersionedFilter) + public function __construct(array $rectors, PhpVersionedFilter $phpVersionedFilter, ConfigurationRuleFilter $configurationRuleFilter) { $this->rectors = $rectors; $this->phpVersionedFilter = $phpVersionedFilter; + $this->configurationRuleFilter = $configurationRuleFilter; parent::__construct(); } /** @@ -93,6 +95,8 @@ private function prepareNodeVisitors() : void } // filer out by version $this->visitors = $this->phpVersionedFilter->filter($this->rectors); + // filter by configuration + $this->visitors = $this->configurationRuleFilter->filter($this->visitors); $this->areNodeVisitorsPrepared = \true; } } diff --git a/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php b/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php index 95c4e55db..989f69334 100644 --- a/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php +++ b/vendor/rector/rector/src/PhpParser/Parser/InlineCodeParser.php @@ -3,11 +3,11 @@ declare (strict_types=1); namespace Rector\PhpParser\Parser; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Concat; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt; use Rector\PhpParser\Node\Value\ValueResolver; @@ -17,19 +17,16 @@ final class InlineCodeParser { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @readonly - * @var \Rector\PhpParser\Parser\SimplePhpParser */ - private $simplePhpParser; + private \Rector\PhpParser\Parser\SimplePhpParser $simplePhpParser; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var string * @see https://regex101.com/r/dwe4OW/1 @@ -92,15 +89,11 @@ public function stringify(Expr $expr) : string { if ($expr instanceof String_) { if (!StringUtils::isMatch($expr->value, self::BACKREFERENCE_NO_QUOTE_REGEX)) { - return Strings::replace($expr->value, self::BACKREFERENCE_NO_DOUBLE_QUOTE_START_REGEX, static function (array $match) : string { - return '"' . $match['backreference'] . '"'; - }); + return Strings::replace($expr->value, self::BACKREFERENCE_NO_DOUBLE_QUOTE_START_REGEX, static fn(array $match): string => '"' . $match['backreference'] . '"'); } - return Strings::replace($expr->value, self::BACKREFERENCE_NO_QUOTE_REGEX, static function (array $match) : string { - return '"\\' . $match['backreference'] . '"'; - }); + return Strings::replace($expr->value, self::BACKREFERENCE_NO_QUOTE_REGEX, static fn(array $match): string => '"\\' . $match['backreference'] . '"'); } - if ($expr instanceof Encapsed) { + if ($expr instanceof InterpolatedString) { return $this->resolveEncapsedValue($expr); } if ($expr instanceof Concat) { @@ -118,11 +111,11 @@ private function parseCode(string $code) : array $code = StringUtils::isMatch($code, self::ENDING_SEMI_COLON_REGEX) ? $code : $code . ';'; return $this->simplePhpParser->parseString($code); } - private function resolveEncapsedValue(Encapsed $encapsed) : string + private function resolveEncapsedValue(InterpolatedString $interpolatedString) : string { $value = ''; $isRequirePrint = \false; - foreach ($encapsed->parts as $part) { + foreach ($interpolatedString->parts as $part) { $partValue = (string) $this->valueResolver->getValue($part); if (\substr_compare($partValue, "'", -\strlen("'")) === 0) { $isRequirePrint = \true; @@ -130,7 +123,7 @@ private function resolveEncapsedValue(Encapsed $encapsed) : string } $value .= $partValue; } - $printedExpr = $isRequirePrint ? $this->betterStandardPrinter->print($encapsed) : $value; + $printedExpr = $isRequirePrint ? $this->betterStandardPrinter->print($interpolatedString) : $value; // remove " $printedExpr = \trim($printedExpr, '""'); // use \$ → $ @@ -147,8 +140,6 @@ private function resolveConcatValue(Concat $concat) : string $concat->right->value .= '.'; } $string = $this->stringify($concat->left) . $this->stringify($concat->right); - return Strings::replace($string, self::VARIABLE_IN_SINGLE_QUOTED_REGEX, static function (array $match) { - return $match['variable']; - }); + return Strings::replace($string, self::VARIABLE_IN_SINGLE_QUOTED_REGEX, static fn(array $match) => $match['variable']); } } diff --git a/vendor/rector/rector/src/PhpParser/Parser/ParserErrors.php b/vendor/rector/rector/src/PhpParser/Parser/ParserErrors.php index 47387ea8b..012146b0d 100644 --- a/vendor/rector/rector/src/PhpParser/Parser/ParserErrors.php +++ b/vendor/rector/rector/src/PhpParser/Parser/ParserErrors.php @@ -8,14 +8,12 @@ final class ParserErrors { /** * @readonly - * @var string */ - private $message; + private string $message; /** * @readonly - * @var int */ - private $line; + private int $line; public function __construct(ParserErrorsException $parserErrorsException) { $this->message = $parserErrorsException->getMessage(); diff --git a/vendor/rector/rector/src/PhpParser/Parser/RectorParser.php b/vendor/rector/rector/src/PhpParser/Parser/RectorParser.php index f3296e9f3..e6d03b33b 100644 --- a/vendor/rector/rector/src/PhpParser/Parser/RectorParser.php +++ b/vendor/rector/rector/src/PhpParser/Parser/RectorParser.php @@ -3,26 +3,26 @@ declare (strict_types=1); namespace Rector\PhpParser\Parser; -use PhpParser\Lexer; use PhpParser\Node\Stmt; +use PhpParser\ParserFactory; +use PhpParser\PhpVersion; use PHPStan\Parser\Parser; use Rector\PhpParser\ValueObject\StmtsAndTokens; +use Rector\Util\Reflection\PrivatesAccessor; final class RectorParser { /** * @readonly - * @var \PhpParser\Lexer */ - private $lexer; + private Parser $parser; /** * @readonly - * @var \PHPStan\Parser\Parser */ - private $parser; - public function __construct(Lexer $lexer, Parser $parser) + private PrivatesAccessor $privatesAccessor; + public function __construct(Parser $parser, PrivatesAccessor $privatesAccessor) { - $this->lexer = $lexer; $this->parser = $parser; + $this->privatesAccessor = $privatesAccessor; } /** * @api used by rector-symfony @@ -40,10 +40,24 @@ public function parseString(string $fileContent) : array { return $this->parser->parseString($fileContent); } - public function parseFileContentToStmtsAndTokens(string $fileContent) : StmtsAndTokens + public function parseFileContentToStmtsAndTokens(string $fileContent, bool $forNewestSupportedVersion = \true) : StmtsAndTokens { - $stmts = $this->parser->parseString($fileContent); - $tokens = $this->lexer->getTokens(); + if (!$forNewestSupportedVersion) { + // don't directly change PHPStan Parser service + // to avoid reuse on next file + $phpstanParser = clone $this->parser; + $parserFactory = new ParserFactory(); + $parser = $parserFactory->createForVersion(PhpVersion::fromString('7.0')); + $this->privatesAccessor->setPrivateProperty($phpstanParser, 'parser', $parser); + return $this->resolveStmtsAndTokens($phpstanParser, $fileContent); + } + return $this->resolveStmtsAndTokens($this->parser, $fileContent); + } + private function resolveStmtsAndTokens(Parser $parser, string $fileContent) : StmtsAndTokens + { + $stmts = $parser->parseString($fileContent); + $innerParser = $this->privatesAccessor->getPrivateProperty($parser, 'parser'); + $tokens = $innerParser->getTokens(); return new StmtsAndTokens($stmts, $tokens); } } diff --git a/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php b/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php index b93aca502..6ba537288 100644 --- a/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php +++ b/vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpParser\Parser; -use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem; use PhpParser\Node; use PhpParser\Node\Stmt\Expression; use PhpParser\NodeTraverser; @@ -15,20 +15,17 @@ final class SimplePhpParser { /** * @readonly - * @var \PhpParser\Parser */ - private $phpParser; + private Parser $phpParser; /** * @readonly - * @var \PhpParser\NodeTraverser */ - private $nodeTraverser; + private NodeTraverser $nodeTraverser; public function __construct() { $parserFactory = new ParserFactory(); - $this->phpParser = $parserFactory->create(ParserFactory::ONLY_PHP7); - $this->nodeTraverser = new NodeTraverser(); - $this->nodeTraverser->addVisitor(new AssignedToNodeVisitor()); + $this->phpParser = $parserFactory->createForNewestSupportedVersion(); + $this->nodeTraverser = new NodeTraverser(new AssignedToNodeVisitor()); } /** * @api tests diff --git a/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php b/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php index ce2ecbb7d..eaa5c53e3 100644 --- a/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php +++ b/vendor/rector/rector/src/PhpParser/Printer/BetterStandardPrinter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PhpParser\Printer; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Comment; use PhpParser\Node; use PhpParser\Node\Arg; @@ -11,26 +11,33 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrowFunction; +use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\CallLike; -use PhpParser\Node\Expr\Closure; +use PhpParser\Node\Expr\Instanceof_; +use PhpParser\Node\Expr\Match_; use PhpParser\Node\Expr\MethodCall; +use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Expr\Yield_; -use PhpParser\Node\Param; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\EncapsedStringPart; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\InterpolatedStringPart; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; -use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Declare_; +use PhpParser\Node\Stmt\InlineHTML; use PhpParser\Node\Stmt\Nop; use PhpParser\PrettyPrinter\Standard; +use PHPStan\Node\AnonymousClassNode; use PHPStan\Node\Expr\AlwaysRememberedExpr; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; +use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; +use Rector\Util\NewLineSplitter; +use Rector\Util\StringUtils; /** * @see \Rector\Tests\PhpParser\Printer\BetterStandardPrinterTest * @@ -39,10 +46,9 @@ final class BetterStandardPrinter extends Standard { /** - * @var string - * @see https://regex101.com/r/DrsMY4/1 + * @readonly */ - private const QUOTED_SLASH_REGEX = "#'|\\\\(?=[\\\\']|\$)#"; + private ExprAnalyzer $exprAnalyzer; /** * Remove extra spaces before new Nop_ nodes * @see https://regex101.com/r/iSvroO/1 @@ -50,19 +56,14 @@ final class BetterStandardPrinter extends Standard */ private const EXTRA_SPACE_BEFORE_NOP_REGEX = '#^[ \\t]+$#m'; /** - * @see https://regex101.com/r/qZiqGo/13 + * @see https://regex101.com/r/UluSYL/1 * @var string */ - private const REPLACE_COLON_WITH_SPACE_REGEX = '#(^.*function .*\\(.*\\)) : #'; - public function __construct() + private const SPACED_NEW_START_REGEX = '#^new\\s+#'; + public function __construct(ExprAnalyzer $exprAnalyzer) { - parent::__construct(['shortArraySyntax' => \true]); - // print return type double colon right after the bracket "function(): string" - $this->initializeInsertionMap(); - $this->insertionMap['Stmt_ClassMethod->returnType'] = [')', \false, ': ', null]; - $this->insertionMap['Stmt_Function->returnType'] = [')', \false, ': ', null]; - $this->insertionMap['Expr_Closure->returnType'] = [')', \false, ': ', null]; - $this->insertionMap['Expr_ArrowFunction->returnType'] = [')', \false, ': ', null]; + $this->exprAnalyzer = $exprAnalyzer; + parent::__construct(); } /** * @param Node[] $stmts @@ -106,15 +107,38 @@ public function prettyPrintFile(array $stmts) : string */ public function pFileWithoutNamespace(FileWithoutNamespace $fileWithoutNamespace) : string { - $content = $this->pStmts($fileWithoutNamespace->stmts, \false); - return \ltrim($content); + return $this->pStmts($fileWithoutNamespace->stmts); + } + /** + * @api magic method in parent + */ + public function pInterpolatedStringPart(InterpolatedStringPart $interpolatedStringPart) : string + { + return $interpolatedStringPart->value; } - protected function p(Node $node, $parentFormatPreserved = \false) : string + protected function p(Node $node, int $precedence = self::MAX_PRECEDENCE, int $lhsPrecedence = self::MAX_PRECEDENCE, bool $parentFormatPreserved = \false) : string { + // handle already AlwaysRememberedExpr + // @see https://github.com/rectorphp/rector/issues/8815#issuecomment-2503453191 while ($node instanceof AlwaysRememberedExpr) { $node = $node->getExpr(); } - $content = parent::p($node, $parentFormatPreserved); + // handle overlapped origNode is Match_ + // and its subnodes still have AlwaysRememberedExpr + $originalNode = $node->getAttribute(AttributeKey::ORIGINAL_NODE); + if ($originalNode instanceof Match_) { + $subNodeNames = $node->getSubNodeNames(); + foreach ($subNodeNames as $subNodeName) { + while ($originalNode->{$subNodeName} instanceof AlwaysRememberedExpr) { + $originalNode->{$subNodeName} = $originalNode->{$subNodeName}->getExpr(); + } + } + } + $this->wrapBinaryOp($node); + $content = parent::p($node, $precedence, $lhsPrecedence, $parentFormatPreserved); + if ($node instanceof New_ && $node->class instanceof AnonymousClassNode && !StringUtils::isMatch($content, self::SPACED_NEW_START_REGEX)) { + $content = 'new ' . $content; + } return $node->getAttribute(AttributeKey::WRAPPED_IN_PARENTHESES) === \true ? '(' . $content . ')' : $content; } protected function pAttributeGroup(AttributeGroup $attributeGroup) : string @@ -126,16 +150,16 @@ protected function pAttributeGroup(AttributeGroup $attributeGroup) : string } return $ret; } - protected function pExpr_ArrowFunction(ArrowFunction $arrowFunction) : string + protected function pExpr_ArrowFunction(ArrowFunction $arrowFunction, int $precedence, int $lhsPrecedence) : string { if (!$arrowFunction->hasAttribute(AttributeKey::COMMENT_CLOSURE_RETURN_MIRRORED)) { - return parent::pExpr_ArrowFunction($arrowFunction); + return parent::pExpr_ArrowFunction($arrowFunction, $precedence, $lhsPrecedence); } $expr = $arrowFunction->expr; /** @var Comment[] $comments */ $comments = $expr->getAttribute(AttributeKey::COMMENTS) ?? []; if ($comments === []) { - return parent::pExpr_ArrowFunction($arrowFunction); + return parent::pExpr_ArrowFunction($arrowFunction, $precedence, $lhsPrecedence); } $indent = $this->resolveIndentSpaces(); $text = "\n" . $indent; @@ -143,7 +167,7 @@ protected function pExpr_ArrowFunction(ArrowFunction $arrowFunction) : string $commentText = $key > 0 ? $indent . $comment->getText() : $comment->getText(); $text .= $commentText . "\n"; } - return $this->pAttrGroups($arrowFunction->attrGroups, \true) . ($arrowFunction->static ? 'static ' : '') . 'fn' . ($arrowFunction->byRef ? '&' : '') . '(' . $this->pCommaSeparated($arrowFunction->params) . ')' . ($arrowFunction->returnType instanceof Node ? ': ' . $this->p($arrowFunction->returnType) : '') . ' =>' . $text . $indent . $this->p($arrowFunction->expr); + return $this->pPrefixOp(ArrowFunction::class, $this->pAttrGroups($arrowFunction->attrGroups, \true) . $this->pStatic($arrowFunction->static) . 'fn' . ($arrowFunction->byRef ? '&' : '') . '(' . $this->pMaybeMultiline($arrowFunction->params, $this->phpVersion->supportsTrailingCommaInParamList()) . ')' . ($arrowFunction->returnType instanceof Node ? ': ' . $this->p($arrowFunction->returnType) : '') . ' =>' . $text . $indent, $arrowFunction->expr, $precedence, $lhsPrecedence); } /** * This allows to use both spaces and tabs vs. original space-only @@ -182,13 +206,12 @@ protected function outdent() : void /** * @param mixed[] $nodes * @param mixed[] $origNodes - * @param int|null $fixup */ - protected function pArray(array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeType, string $subNodeName, $fixup) : ?string + protected function pArray(array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeClass, string $subNodeName, ?int $fixup) : ?string { // reindex positions for printer $nodes = \array_values($nodes); - $content = parent::pArray($nodes, $origNodes, $pos, $indentAdjustment, $parentNodeType, $subNodeName, $fixup); + $content = parent::pArray($nodes, $origNodes, $pos, $indentAdjustment, $parentNodeClass, $subNodeName, $fixup); if ($content === null) { return $content; } @@ -197,48 +220,21 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent } return Strings::replace($content, self::EXTRA_SPACE_BEFORE_NOP_REGEX); } - /** - * Do not preslash all slashes (parent behavior), but only those: - * - * - followed by "\" - * - by "'" - * - or the end of the string - * - * Prevents `Vendor\Class` => `Vendor\\Class`. - */ - protected function pSingleQuotedString(string $string) : string - { - return "'" . Strings::replace($string, self::QUOTED_SLASH_REGEX, '\\\\$0') . "'"; - } /** * Emulates 1_000 in PHP 7.3- version */ - protected function pScalar_DNumber(DNumber $dNumber) : string - { - if ($this->shouldPrintNewRawValue($dNumber)) { - return (string) $dNumber->getAttribute(AttributeKey::RAW_VALUE); - } - return parent::pScalar_DNumber($dNumber); - } - /** - * Add space: - * "use(" - * ↓ - * "use (" - */ - protected function pExpr_Closure(Closure $closure) : string + protected function pScalar_Float(Float_ $float) : string { - $closureContent = parent::pExpr_Closure($closure); - if ($closure->uses === []) { - return $closureContent; + if ($this->shouldPrintNewRawValue($float)) { + return (string) $float->getAttribute(AttributeKey::RAW_VALUE); } - return \str_replace(' use(', ' use (', (string) $closureContent); + return parent::pScalar_Float($float); } /** * Do not add "()" on Expressions * @see https://github.com/rectorphp/rector/pull/401#discussion_r181487199 */ - protected function pExpr_Yield(Yield_ $yield) : string + protected function pExpr_Yield(Yield_ $yield, int $precedence, int $lhsPrecedence) : string { if (!$yield->value instanceof Expr) { return 'yield'; @@ -248,14 +244,10 @@ protected function pExpr_Yield(Yield_ $yield) : string return \sprintf('%syield %s%s%s', $shouldAddBrackets ? '(' : '', $yield->key instanceof Expr ? $this->p($yield->key) . ' => ' : '', $this->p($yield->value), $shouldAddBrackets ? ')' : ''); } /** - * Print arrays in short [] by default, - * to prevent manual explicit array shortening. + * Print new lined array items when newlined_array_print is set to true */ protected function pExpr_Array(Array_ $array) : string { - if (!$array->hasAttribute(AttributeKey::KIND)) { - $array->setAttribute(AttributeKey::KIND, Array_::KIND_SHORT); - } if ($array->getAttribute(AttributeKey::NEWLINED_ARRAY_PRINT) === \true) { $printedArray = '['; $printedArray .= $this->pCommaSeparatedMultiline($array->items, \true); @@ -268,6 +260,10 @@ protected function pExpr_Array(Array_ $array) : string */ protected function pScalar_String(String_ $string) : string { + if ($string->getAttribute(AttributeKey::DOC_INDENTATION) === '__REMOVED__') { + $content = parent::pScalar_String($string); + return $this->cleanStartIndentationOnHeredocNowDoc($content); + } $isRegularPattern = (bool) $string->getAttribute(AttributeKey::IS_REGULAR_PATTERN, \false); if (!$isRegularPattern) { return parent::pScalar_String($string); @@ -281,20 +277,6 @@ protected function pScalar_String(String_ $string) : string } return parent::pScalar_String($string); } - /** - * "...$params) : ReturnType" - * ↓ - * "...$params): ReturnType" - */ - protected function pStmt_ClassMethod(ClassMethod $classMethod) : string - { - $content = parent::pStmt_ClassMethod($classMethod); - if (!$classMethod->returnType instanceof Node) { - return $content; - } - // this approach is chosen, to keep changes in parent pStmt_ClassMethod() updated - return Strings::replace($content, self::REPLACE_COLON_WITH_SPACE_REGEX, '$1: '); - } /** * It remove all spaces extra to parent */ @@ -303,82 +285,96 @@ protected function pStmt_Declare(Declare_ $declare) : string $declareString = parent::pStmt_Declare($declare); return Strings::replace($declareString, '#\\s+#'); } - protected function pExpr_Ternary(Ternary $ternary) : string + protected function pExpr_Ternary(Ternary $ternary, int $precedence, int $lhsPrecedence) : string { $kind = $ternary->getAttribute(AttributeKey::KIND); - if ($kind === 'wrapped_with_brackets') { - $pExprTernary = parent::pExpr_Ternary($ternary); + if ($kind === AttributeKey::WRAPPED_IN_PARENTHESES) { + $pExprTernary = parent::pExpr_Ternary($ternary, $precedence, $lhsPrecedence); return '(' . $pExprTernary . ')'; } - return parent::pExpr_Ternary($ternary); - } - protected function pScalar_EncapsedStringPart(EncapsedStringPart $encapsedStringPart) : string - { - // parent throws exception, but we need to compare string - return '`' . $encapsedStringPart->value . '`'; + return parent::pExpr_Ternary($ternary, $precedence, $lhsPrecedence); } - protected function pCommaSeparated(array $nodes) : string + protected function pScalar_InterpolatedString(InterpolatedString $interpolatedString) : string { - $result = parent::pCommaSeparated($nodes); - $last = \end($nodes); - if ($last instanceof Node) { - $trailingComma = $last->getAttribute(AttributeKey::FUNC_ARGS_TRAILING_COMMA); - if ($trailingComma === \false) { - $result = \rtrim($result, ','); - } + $content = parent::pScalar_InterpolatedString($interpolatedString); + if ($interpolatedString->getAttribute(AttributeKey::DOC_INDENTATION) === '__REMOVED__') { + return $this->cleanStartIndentationOnHeredocNowDoc($content); } - return $result; - } - /** - * Override parent pModifiers to set position of final and abstract modifier early, so instead of - * - * public final const MY_CONSTANT = "Hello world!"; - * - * it should be - * - * final public const MY_CONSTANT = "Hello world!"; - * - * @see https://github.com/rectorphp/rector/issues/6963 - * @see https://github.com/nikic/PHP-Parser/pull/826 - */ - protected function pModifiers(int $modifiers) : string - { - return (($modifiers & Class_::MODIFIER_FINAL) !== 0 ? 'final ' : '') . (($modifiers & Class_::MODIFIER_ABSTRACT) !== 0 ? 'abstract ' : '') . (($modifiers & Class_::MODIFIER_PUBLIC) !== 0 ? 'public ' : '') . (($modifiers & Class_::MODIFIER_PROTECTED) !== 0 ? 'protected ' : '') . (($modifiers & Class_::MODIFIER_PRIVATE) !== 0 ? 'private ' : '') . (($modifiers & Class_::MODIFIER_STATIC) !== 0 ? 'static ' : '') . (($modifiers & Class_::MODIFIER_READONLY) !== 0 ? 'readonly ' : ''); + return $content; } /** * Invoke re-print even if only raw value was changed. * That allows PHPStan to use int strict types, while changing the value with literal "_" - * @return int|string */ - protected function pScalar_LNumber(LNumber $lNumber) + protected function pScalar_Int(Int_ $int) : string { - if ($this->shouldPrintNewRawValue($lNumber)) { - return (string) $lNumber->getAttribute(AttributeKey::RAW_VALUE); + if ($this->shouldPrintNewRawValue($int)) { + return (string) $int->getAttribute(AttributeKey::RAW_VALUE); } - return parent::pScalar_LNumber($lNumber); + return parent::pScalar_Int($int); } protected function pExpr_MethodCall(MethodCall $methodCall) : string { + if (!$methodCall->var instanceof CallLike) { + return parent::pExpr_MethodCall($methodCall); + } if (SimpleParameterProvider::provideBoolParameter(Option::NEW_LINE_ON_FLUENT_CALL) === \false) { return parent::pExpr_MethodCall($methodCall); } - if ($methodCall->var instanceof CallLike) { - foreach ($methodCall->args as $arg) { - if (!$arg instanceof Arg) { - continue; - } - $arg->value->setAttribute(AttributeKey::ORIGINAL_NODE, null); + foreach ($methodCall->args as $arg) { + if (!$arg instanceof Arg) { + continue; } - return $this->pDereferenceLhs($methodCall->var) . "\n" . $this->resolveIndentSpaces() . '->' . $this->pObjectProperty($methodCall->name) . '(' . $this->pMaybeMultiline($methodCall->args) . ')'; + $arg->value->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } + return $this->pDereferenceLhs($methodCall->var) . "\n" . $this->resolveIndentSpaces() . '->' . $this->pObjectProperty($methodCall->name) . '(' . $this->pMaybeMultiline($methodCall->args) . ')'; + } + protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode, int $precedence, int $lhsPrecedence) : string + { + $this->wrapAssign($leftNode, $rightNode); + return parent::pInfixOp($class, $leftNode, $operatorString, $rightNode, $precedence, $lhsPrecedence); + } + protected function pExpr_Instanceof(Instanceof_ $instanceof, int $precedence, int $lhsPrecedence) : string + { + $this->wrapAssign($instanceof->expr, $instanceof->class); + return parent::pExpr_Instanceof($instanceof, $precedence, $lhsPrecedence); + } + private function wrapBinaryOp(Node $node) : void + { + if ($this->exprAnalyzer->isExprWithExprPropertyWrappable($node)) { + $node->expr->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } + if (!$node instanceof BinaryOp) { + return; + } + if ($node->getAttribute(AttributeKey::ORIGINAL_NODE) instanceof Node) { + return; + } + if ($node->left instanceof BinaryOp && $node->left->getAttribute(AttributeKey::ORIGINAL_NODE) instanceof Node) { + $node->left->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } + if ($node->right instanceof BinaryOp && $node->right->getAttribute(AttributeKey::ORIGINAL_NODE) instanceof Node) { + $node->right->setAttribute(AttributeKey::ORIGINAL_NODE, null); } - return parent::pExpr_MethodCall($methodCall); } /** - * Keep attributes on newlines + * ensure left side is assign and right side is just created + * + * @see https://github.com/rectorphp/rector-src/pull/6668 + * @see https://github.com/rectorphp/rector/issues/8980 + * @see https://github.com/rectorphp/rector-src/pull/6653 */ - protected function pParam(Param $param) : string + private function wrapAssign(Node $leftNode, Node $rightNode) : void { - return $this->pAttrGroups($param->attrGroups) . $this->pModifiers($param->flags) . ($param->type instanceof Node ? $this->p($param->type) . ' ' : '') . ($param->byRef ? '&' : '') . ($param->variadic ? '...' : '') . $this->p($param->var) . ($param->default instanceof Expr ? ' = ' . $this->p($param->default) : ''); + if ($leftNode instanceof Assign && $leftNode->getStartTokenPos() > 0 && $rightNode->getStartTokenPos() < 0) { + $leftNode->setAttribute(AttributeKey::WRAPPED_IN_PARENTHESES, \true); + } + } + private function cleanStartIndentationOnHeredocNowDoc(string $content) : string + { + $lines = NewLineSplitter::split($content); + $trimmedLines = \array_map('ltrim', $lines); + return \implode("\n", $trimmedLines); } private function resolveIndentSpaces() : string { @@ -393,7 +389,7 @@ private function getIndentCharacter() : string return SimpleParameterProvider::provideStringParameter(Option::INDENT_CHAR, ' '); } /** - * @param \PhpParser\Node\Scalar\LNumber|\PhpParser\Node\Scalar\DNumber $lNumber + * @param \PhpParser\Node\Scalar\Int_|\PhpParser\Node\Scalar\Float_ $lNumber */ private function shouldPrintNewRawValue($lNumber) : bool { @@ -416,12 +412,18 @@ private function resolveNewStmts(array $stmts) : array */ private function containsNop(array $nodes) : bool { + $hasNop = \false; foreach ($nodes as $node) { + // early false when visited Node is InlineHTML + if ($node instanceof InlineHTML) { + return \false; + } + // use flag to avoid next is InlineHTML that returns early if ($node instanceof Nop) { - return \true; + $hasNop = \true; } } - return \false; + return $hasNop; } private function wrapValueWith(String_ $string, string $wrap) : string { diff --git a/vendor/rector/rector/src/PhpParser/ValueObject/StmtsAndTokens.php b/vendor/rector/rector/src/PhpParser/ValueObject/StmtsAndTokens.php index a8395e8d4..6dc2da686 100644 --- a/vendor/rector/rector/src/PhpParser/ValueObject/StmtsAndTokens.php +++ b/vendor/rector/rector/src/PhpParser/ValueObject/StmtsAndTokens.php @@ -4,21 +4,22 @@ namespace Rector\PhpParser\ValueObject; use PhpParser\Node\Stmt; +use PhpParser\Token; final class StmtsAndTokens { /** * @var Stmt[] * @readonly */ - private $stmts; + private array $stmts; /** - * @var array + * @var array * @readonly */ - private $tokens; + private array $tokens; /** * @param Stmt[] $stmts - * @param array $tokens + * @param array $tokens */ public function __construct(array $stmts, array $tokens) { @@ -33,7 +34,7 @@ public function getStmts() : array return $this->stmts; } /** - * @return array + * @return array */ public function getTokens() : array { diff --git a/vendor/rector/rector/src/PostRector/Application/PostFileProcessor.php b/vendor/rector/rector/src/PostRector/Application/PostFileProcessor.php index bb3f6d76a..d9bc948d3 100644 --- a/vendor/rector/rector/src/PostRector/Application/PostFileProcessor.php +++ b/vendor/rector/rector/src/PostRector/Application/PostFileProcessor.php @@ -22,43 +22,36 @@ final class PostFileProcessor implements ResetableInterface { /** * @readonly - * @var \Rector\Skipper\Skipper\Skipper */ - private $skipper; + private Skipper $skipper; /** * @readonly - * @var \Rector\PostRector\Rector\UseAddingPostRector */ - private $useAddingPostRector; + private UseAddingPostRector $useAddingPostRector; /** * @readonly - * @var \Rector\PostRector\Rector\NameImportingPostRector */ - private $nameImportingPostRector; + private NameImportingPostRector $nameImportingPostRector; /** * @readonly - * @var \Rector\PostRector\Rector\ClassRenamingPostRector */ - private $classRenamingPostRector; + private ClassRenamingPostRector $classRenamingPostRector; /** * @readonly - * @var \Rector\PostRector\Rector\DocblockNameImportingPostRector */ - private $docblockNameImportingPostRector; + private DocblockNameImportingPostRector $docblockNameImportingPostRector; /** * @readonly - * @var \Rector\PostRector\Rector\UnusedImportRemovingPostRector */ - private $unusedImportRemovingPostRector; + private UnusedImportRemovingPostRector $unusedImportRemovingPostRector; /** * @readonly - * @var \Rector\Configuration\RenamedClassesDataCollector */ - private $renamedClassesDataCollector; + private RenamedClassesDataCollector $renamedClassesDataCollector; /** * @var PostRectorInterface[] */ - private $postRectors = []; + private array $postRectors = []; public function __construct(Skipper $skipper, UseAddingPostRector $useAddingPostRector, NameImportingPostRector $nameImportingPostRector, ClassRenamingPostRector $classRenamingPostRector, DocblockNameImportingPostRector $docblockNameImportingPostRector, UnusedImportRemovingPostRector $unusedImportRemovingPostRector, RenamedClassesDataCollector $renamedClassesDataCollector) { $this->skipper = $skipper; @@ -86,8 +79,7 @@ public function traverse(array $stmts, File $file) : array if ($this->shouldSkipPostRector($postRector, $file->getFilePath(), $stmts)) { continue; } - $nodeTraverser = new NodeTraverser(); - $nodeTraverser->addVisitor($postRector); + $nodeTraverser = new NodeTraverser($postRector); $stmts = $nodeTraverser->traverse($stmts); } return $stmts; diff --git a/vendor/rector/rector/src/PostRector/Collector/UseNodesToAddCollector.php b/vendor/rector/rector/src/PostRector/Collector/UseNodesToAddCollector.php index aed09556f..00a1e87c6 100644 --- a/vendor/rector/rector/src/PostRector/Collector/UseNodesToAddCollector.php +++ b/vendor/rector/rector/src/PostRector/Collector/UseNodesToAddCollector.php @@ -14,26 +14,24 @@ final class UseNodesToAddCollector { /** * @readonly - * @var \Rector\Application\Provider\CurrentFileProvider */ - private $currentFileProvider; + private CurrentFileProvider $currentFileProvider; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @var array */ - private $constantUseImportTypesInFilePath = []; + private array $constantUseImportTypesInFilePath = []; /** * @var array */ - private $functionUseImportTypesInFilePath = []; + private array $functionUseImportTypesInFilePath = []; /** * @var array */ - private $useImportTypesInFilePath = []; + private array $useImportTypesInFilePath = []; public function __construct(CurrentFileProvider $currentFileProvider, UseImportsResolver $useImportsResolver) { $this->currentFileProvider = $currentFileProvider; diff --git a/vendor/rector/rector/src/PostRector/Guard/AddUseStatementGuard.php b/vendor/rector/rector/src/PostRector/Guard/AddUseStatementGuard.php index b8a8aa41d..aa2e2f008 100644 --- a/vendor/rector/rector/src/PostRector/Guard/AddUseStatementGuard.php +++ b/vendor/rector/rector/src/PostRector/Guard/AddUseStatementGuard.php @@ -11,13 +11,12 @@ final class AddUseStatementGuard { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @var array */ - private $shouldTraverseOnFiles = []; + private array $shouldTraverseOnFiles = []; public function __construct(BetterNodeFinder $betterNodeFinder) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php b/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php index af588d681..340727f8f 100644 --- a/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/AbstractPostRector.php @@ -7,7 +7,7 @@ use PhpParser\NodeVisitorAbstract; use Rector\PostRector\Contract\Rector\PostRectorInterface; use Rector\ValueObject\Application\File; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; abstract class AbstractPostRector extends NodeVisitorAbstract implements PostRectorInterface { /** diff --git a/vendor/rector/rector/src/PostRector/Rector/ClassRenamingPostRector.php b/vendor/rector/rector/src/PostRector/Rector/ClassRenamingPostRector.php index 180b246dc..b624e1b23 100644 --- a/vendor/rector/rector/src/PostRector/Rector/ClassRenamingPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/ClassRenamingPostRector.php @@ -4,52 +4,34 @@ namespace Rector\PostRector\Rector; use PhpParser\Node; -use PhpParser\Node\Name; -use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Namespace_; -use PHPStan\Analyser\Scope; use Rector\CodingStyle\Application\UseImportsRemover; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Configuration\RenamedClassesDataCollector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\Renaming\Collector\RenamedNameCollector; -use Rector\Renaming\NodeManipulator\ClassRenamer; final class ClassRenamingPostRector extends \Rector\PostRector\Rector\AbstractPostRector { /** * @readonly - * @var \Rector\Renaming\NodeManipulator\ClassRenamer */ - private $classRenamer; + private RenamedClassesDataCollector $renamedClassesDataCollector; /** * @readonly - * @var \Rector\Configuration\RenamedClassesDataCollector */ - private $renamedClassesDataCollector; + private UseImportsRemover $useImportsRemover; /** * @readonly - * @var \Rector\CodingStyle\Application\UseImportsRemover */ - private $useImportsRemover; - /** - * @readonly - * @var \Rector\Renaming\Collector\RenamedNameCollector - */ - private $renamedNameCollector; - /** - * @var \Rector\PhpParser\Node\CustomNode\FileWithoutNamespace|\PhpParser\Node\Stmt\Namespace_|null - */ - private $rootNode = null; + private RenamedNameCollector $renamedNameCollector; /** * @var array */ - private $oldToNewClasses = []; - public function __construct(ClassRenamer $classRenamer, RenamedClassesDataCollector $renamedClassesDataCollector, UseImportsRemover $useImportsRemover, RenamedNameCollector $renamedNameCollector) + private array $oldToNewClasses = []; + public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, UseImportsRemover $useImportsRemover, RenamedNameCollector $renamedNameCollector) { - $this->classRenamer = $classRenamer; $this->renamedClassesDataCollector = $renamedClassesDataCollector; $this->useImportsRemover = $useImportsRemover; $this->renamedNameCollector = $renamedNameCollector; @@ -60,32 +42,17 @@ public function __construct(ClassRenamer $classRenamer, RenamedClassesDataCollec */ public function beforeTraverse(array $nodes) : array { - // ensure reset early on every run to avoid reuse existing value - $this->rootNode = $this->resolveRootNode($nodes); - return $nodes; - } - public function enterNode(Node $node) : ?Node - { - // no longer need post rename - if (!$node instanceof Name) { - return null; - } - /** @var Scope|null $scope */ - $scope = $node->getAttribute(AttributeKey::SCOPE); - if ($node instanceof FullyQualified) { - $result = $this->classRenamer->renameNode($node, $this->oldToNewClasses, $scope); - } else { - $result = $this->resolveResultWithPhpAttributeName($node, $scope); - } if (!SimpleParameterProvider::provideBoolParameter(Option::AUTO_IMPORT_NAMES)) { - return $result; + return $nodes; } - if (!$this->rootNode instanceof FileWithoutNamespace && !$this->rootNode instanceof Namespace_) { - return $result; + foreach ($nodes as $node) { + if ($node instanceof FileWithoutNamespace || $node instanceof Namespace_) { + $removedUses = $this->renamedClassesDataCollector->getOldClasses(); + $node->stmts = $this->useImportsRemover->removeImportsFromStmts($node->stmts, $removedUses); + break; + } } - $removedUses = $this->renamedClassesDataCollector->getOldClasses(); - $this->rootNode->stmts = $this->useImportsRemover->removeImportsFromStmts($this->rootNode->stmts, $removedUses); - return $result; + return $nodes; } /** * @param Node[] $nodes @@ -101,25 +68,4 @@ public function shouldTraverse(array $stmts) : bool $this->oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses(); return $this->oldToNewClasses !== []; } - private function resolveResultWithPhpAttributeName(Name $name, ?Scope $scope) : ?FullyQualified - { - $phpAttributeName = $name->getAttribute(AttributeKey::PHP_ATTRIBUTE_NAME); - if (\is_string($phpAttributeName)) { - return $this->classRenamer->renameNode(new FullyQualified($phpAttributeName, $name->getAttributes()), $this->oldToNewClasses, $scope); - } - return null; - } - /** - * @param Stmt[] $nodes - * @return \Rector\PhpParser\Node\CustomNode\FileWithoutNamespace|\PhpParser\Node\Stmt\Namespace_|null - */ - private function resolveRootNode(array $nodes) - { - foreach ($nodes as $node) { - if ($node instanceof FileWithoutNamespace || $node instanceof Namespace_) { - return $node; - } - } - return null; - } } diff --git a/vendor/rector/rector/src/PostRector/Rector/DocblockNameImportingPostRector.php b/vendor/rector/rector/src/PostRector/Rector/DocblockNameImportingPostRector.php index 127139bb0..82b6c265b 100644 --- a/vendor/rector/rector/src/PostRector/Rector/DocblockNameImportingPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/DocblockNameImportingPostRector.php @@ -15,24 +15,20 @@ final class DocblockNameImportingPostRector extends \Rector\PostRector\Rector\Ab { /** * @readonly - * @var \Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockNameImporter */ - private $docBlockNameImporter; + private DocBlockNameImporter $docBlockNameImporter; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\PostRector\Guard\AddUseStatementGuard */ - private $addUseStatementGuard; + private AddUseStatementGuard $addUseStatementGuard; public function __construct(DocBlockNameImporter $docBlockNameImporter, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater, AddUseStatementGuard $addUseStatementGuard) { $this->docBlockNameImporter = $docBlockNameImporter; @@ -40,10 +36,7 @@ public function __construct(DocBlockNameImporter $docBlockNameImporter, PhpDocIn $this->docBlockUpdater = $docBlockUpdater; $this->addUseStatementGuard = $addUseStatementGuard; } - /** - * @return \PhpParser\Node|int|null - */ - public function enterNode(Node $node) + public function enterNode(Node $node) : ?\PhpParser\Node { if (!$node instanceof Stmt && !$node instanceof Param) { return null; diff --git a/vendor/rector/rector/src/PostRector/Rector/NameImportingPostRector.php b/vendor/rector/rector/src/PostRector/Rector/NameImportingPostRector.php index 04ae50586..c13a0cc73 100644 --- a/vendor/rector/rector/src/PostRector/Rector/NameImportingPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/NameImportingPostRector.php @@ -15,38 +15,35 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo { /** * @readonly - * @var \Rector\CodingStyle\Node\NameImporter */ - private $nameImporter; + private NameImporter $nameImporter; /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; /** * @readonly - * @var \Rector\PostRector\Guard\AddUseStatementGuard */ - private $addUseStatementGuard; + private AddUseStatementGuard $addUseStatementGuard; /** * @var array */ - private $currentUses = []; + private array $currentUses = []; public function __construct(NameImporter $nameImporter, UseImportsResolver $useImportsResolver, AddUseStatementGuard $addUseStatementGuard) { $this->nameImporter = $nameImporter; $this->useImportsResolver = $useImportsResolver; $this->addUseStatementGuard = $addUseStatementGuard; } - public function beforeTraverse(array $nodes) + /** + * @return Stmt[] + */ + public function beforeTraverse(array $nodes) : array { $this->currentUses = $this->useImportsResolver->resolve(); return $nodes; } - /** - * @return \PhpParser\Node|int|null - */ - public function enterNode(Node $node) + public function enterNode(Node $node) : ?\PhpParser\Node { if (!$node instanceof FullyQualified) { return null; diff --git a/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php b/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php index ab5685813..a2d1f4cee 100644 --- a/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/UnusedImportRemovingPostRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PostRector\Rector; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Comment; use PhpParser\Comment\Doc; use PhpParser\Node; @@ -11,9 +11,10 @@ use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Namespace_; +use PhpParser\Node\Stmt\Nop; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; -use PhpParser\NodeTraverser; +use PhpParser\Node\UseItem; +use PhpParser\NodeVisitor; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; @@ -22,14 +23,12 @@ final class UnusedImportRemovingPostRector extends \Rector\PostRector\Rector\Abs { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, PhpDocInfoFactory $phpDocInfoFactory) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -64,7 +63,13 @@ public function enterNode(Node $node) : ?Node $hasChanged = \true; } if ($stmt->uses === []) { - unset($node->stmts[$key]); + $comments = $node->stmts[$key]->getComments(); + if ($key === 0 && $comments !== []) { + $node->stmts[$key] = new Nop(); + $node->stmts[$key]->setAttribute(AttributeKey::COMMENTS, $comments); + } else { + unset($node->stmts[$key]); + } } } if ($hasChanged === \false) { @@ -82,7 +87,7 @@ private function findNonUseImportNames($namespace) : array $names = []; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($namespace->stmts, static function (Node $node) use(&$names) { if ($node instanceof Use_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Name) { return null; @@ -112,9 +117,7 @@ private function findNamesInDocBlocks($namespace) : array if ($comments === []) { return null; } - $docs = \array_filter($comments, static function (Comment $comment) : bool { - return $comment instanceof Doc; - }); + $docs = \array_filter($comments, static fn(Comment $comment): bool => $comment instanceof Doc); if ($docs === []) { return null; } @@ -150,9 +153,9 @@ private function resolveUsedPhpAndDocNames($namespace) : array /** * @param string[] $names */ - private function isUseImportUsed(UseUse $useUse, bool $isCaseSensitive, array $names, ?string $namespaceName) : bool + private function isUseImportUsed(UseItem $useItem, bool $isCaseSensitive, array $names, ?string $namespaceName) : bool { - $comparedName = $useUse->alias instanceof Identifier ? $useUse->alias->toString() : $useUse->name->toString(); + $comparedName = $useItem->alias instanceof Identifier ? $useItem->alias->toString() : $useItem->name->toString(); if (!$isCaseSensitive) { $comparedName = \strtolower($comparedName); } @@ -166,10 +169,16 @@ private function isUseImportUsed(UseUse $useUse, bool $isCaseSensitive, array $n } // match partial import foreach ($names as $name) { + if (\strncmp($name, '\\', \strlen('\\')) === 0) { + continue; + } if ($this->isSubNamespace($name, $comparedName, $namespacedPrefix)) { return \true; } if (\strncmp($name, $lastName . '\\', \strlen($lastName . '\\')) !== 0) { + if (\strncmp($name, $comparedName . '\\', \strlen($comparedName . '\\')) === 0) { + return \true; + } continue; } if ($namespaceName === null) { diff --git a/vendor/rector/rector/src/PostRector/Rector/UseAddingPostRector.php b/vendor/rector/rector/src/PostRector/Rector/UseAddingPostRector.php index e7e6974f0..7fcc3f6d1 100644 --- a/vendor/rector/rector/src/PostRector/Rector/UseAddingPostRector.php +++ b/vendor/rector/rector/src/PostRector/Rector/UseAddingPostRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Namespace_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\CodingStyle\Application\UseImportsAdder; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpParser\Node\CustomNode\FileWithoutNamespace; @@ -16,19 +16,16 @@ final class UseAddingPostRector extends \Rector\PostRector\Rector\AbstractPostRe { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\CodingStyle\Application\UseImportsAdder */ - private $useImportsAdder; + private UseImportsAdder $useImportsAdder; /** * @readonly - * @var \Rector\PostRector\Collector\UseNodesToAddCollector */ - private $useNodesToAddCollector; + private UseNodesToAddCollector $useNodesToAddCollector; public function __construct(TypeFactory $typeFactory, UseImportsAdder $useImportsAdder, UseNodesToAddCollector $useNodesToAddCollector) { $this->typeFactory = $typeFactory; @@ -72,7 +69,7 @@ public function enterNode(Node $node) : int * visitor per execution, using stop traversal here is safe, * ref https://github.com/rectorphp/rector-src/blob/fc1e742fa4d9861ccdc5933f3b53613b8223438d/src/PostRector/Application/PostFileProcessor.php#L59-L61 */ - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } /** * @param Stmt[] $nodes diff --git a/vendor/rector/rector/src/PostRector/ValueObject/PropertyMetadata.php b/vendor/rector/rector/src/PostRector/ValueObject/PropertyMetadata.php index 5aee79a14..8f9355c91 100644 --- a/vendor/rector/rector/src/PostRector/ValueObject/PropertyMetadata.php +++ b/vendor/rector/rector/src/PostRector/ValueObject/PropertyMetadata.php @@ -3,26 +3,23 @@ declare (strict_types=1); namespace Rector\PostRector\ValueObject; -use PhpParser\Node\Stmt\Class_; +use PhpParser\Modifiers; use PHPStan\Type\Type; final class PropertyMetadata { /** * @readonly - * @var string */ - private $name; + private string $name; /** * @readonly - * @var \PHPStan\Type\Type|null */ - private $type; + private ?Type $type; /** * @readonly - * @var int */ - private $flags = Class_::MODIFIER_PRIVATE; - public function __construct(string $name, ?Type $type, int $flags = Class_::MODIFIER_PRIVATE) + private int $flags = Modifiers::PRIVATE; + public function __construct(string $name, ?Type $type, int $flags = Modifiers::PRIVATE) { $this->name = $name; $this->type = $type; diff --git a/vendor/rector/rector/src/Rector/AbstractRector.php b/vendor/rector/rector/src/Rector/AbstractRector.php index 15413ef28..1f3337111 100644 --- a/vendor/rector/rector/src/Rector/AbstractRector.php +++ b/vendor/rector/rector/src/Rector/AbstractRector.php @@ -5,23 +5,25 @@ use PhpParser\Node; use PhpParser\Node\Name; +use PhpParser\Node\PropertyItem; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Const_; use PhpParser\Node\Stmt\InlineHTML; use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Nop; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; use PhpParser\Node\Stmt\Trait_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; use PHPStan\Analyser\MutatingScope; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use Rector\Application\ChangedNodeScopeRefresher; +use Rector\Application\NodeAttributeReIndexer; use Rector\Application\Provider\CurrentFileProvider; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\ChangesReporting\ValueObject\RectorWithLineChange; +use Rector\Contract\Rector\HTMLAverseRectorInterface; use Rector\Contract\Rector\RectorInterface; use Rector\Exception\ShouldNotHappenException; use Rector\NodeDecorator\CreatedByRuleDecorator; @@ -47,56 +49,23 @@ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInter B) Remove the Node: - return NodeTraverser::REMOVE_NODE; + return \\PhpParser\\NodeVisitor::REMOVE_NODE; CODE_SAMPLE; - /** - * @var \Rector\NodeNameResolver\NodeNameResolver - */ - protected $nodeNameResolver; - /** - * @var \Rector\NodeTypeResolver\NodeTypeResolver - */ - protected $nodeTypeResolver; - /** - * @var \Rector\PhpParser\Node\NodeFactory - */ - protected $nodeFactory; - /** - * @var \Rector\PhpParser\Comparing\NodeComparator - */ - protected $nodeComparator; - /** - * @var \Rector\ValueObject\Application\File - */ - protected $file; - /** - * @var \Rector\Skipper\Skipper\Skipper - */ - protected $skipper; - /** - * @var \Rector\Application\ChangedNodeScopeRefresher - */ - private $changedNodeScopeRefresher; - /** - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser - */ - private $simpleCallableNodeTraverser; - /** - * @var \Rector\Application\Provider\CurrentFileProvider - */ - private $currentFileProvider; + protected NodeNameResolver $nodeNameResolver; + protected NodeTypeResolver $nodeTypeResolver; + protected NodeFactory $nodeFactory; + protected NodeComparator $nodeComparator; + protected File $file; + protected Skipper $skipper; + private ChangedNodeScopeRefresher $changedNodeScopeRefresher; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; + private CurrentFileProvider $currentFileProvider; /** * @var array */ - private $nodesToReturn = []; - /** - * @var \Rector\NodeDecorator\CreatedByRuleDecorator - */ - private $createdByRuleDecorator; - /** - * @var int|null - */ - private $toBeRemovedNodeId; + private array $nodesToReturn = []; + private CreatedByRuleDecorator $createdByRuleDecorator; + private ?int $toBeRemovedNodeId = null; public function autowire(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeFactory $nodeFactory, Skipper $skipper, NodeComparator $nodeComparator, CurrentFileProvider $currentFileProvider, CreatedByRuleDecorator $createdByRuleDecorator, ChangedNodeScopeRefresher $changedNodeScopeRefresher) : void { $this->nodeNameResolver = $nodeNameResolver; @@ -130,27 +99,30 @@ public final function enterNode(Node $node) if (!$this->isMatchingNodeType($node)) { return null; } + if (\is_a($this, HTMLAverseRectorInterface::class, \true) && $this->file->containsHTML()) { + return null; + } $filePath = $this->file->getFilePath(); if ($this->skipper->shouldSkipCurrentNode($this, $filePath, static::class, $node)) { return null; } - $this->changedNodeScopeRefresher->reIndexNodeAttributes($node); // ensure origNode pulled before refactor to avoid changed during refactor, ref https://3v4l.org/YMEGN $originalNode = $node->getAttribute(AttributeKey::ORIGINAL_NODE) ?? $node; + NodeAttributeReIndexer::reIndexNodeAttributes($node); $refactoredNode = $this->refactor($node); // @see NodeTraverser::* codes, e.g. removal of node of stopping the traversing - if ($refactoredNode === NodeTraverser::REMOVE_NODE) { + if ($refactoredNode === NodeVisitor::REMOVE_NODE) { $this->toBeRemovedNodeId = \spl_object_id($originalNode); // notify this rule changing code - $rectorWithLineChange = new RectorWithLineChange(static::class, $originalNode->getLine()); + $rectorWithLineChange = new RectorWithLineChange(static::class, $originalNode->getStartLine()); $this->file->addRectorClassWithLine($rectorWithLineChange); return $originalNode; } if (\is_int($refactoredNode)) { $this->createdByRuleDecorator->decorate($node, $originalNode, static::class); - if (!\in_array($refactoredNode, [NodeTraverser::DONT_TRAVERSE_CHILDREN, NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN], \true)) { + if (!\in_array($refactoredNode, [NodeVisitor::DONT_TRAVERSE_CHILDREN, NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN], \true)) { // notify this rule changing code - $rectorWithLineChange = new RectorWithLineChange(static::class, $originalNode->getLine()); + $rectorWithLineChange = new RectorWithLineChange(static::class, $originalNode->getStartLine()); $this->file->addRectorClassWithLine($rectorWithLineChange); return $refactoredNode; } @@ -172,7 +144,7 @@ public final function enterNode(Node $node) * see"infinite recursion" in https://github.com/nikic/PHP-Parser/blob/master/doc/component/Walking_the_AST.markdown * @return mixed[]|int|\PhpParser\Node|null */ - public function leaveNode(Node $node) + public final function leaveNode(Node $node) { if ($node->hasAttribute(AttributeKey::ORIGINAL_NODE)) { return null; @@ -180,7 +152,7 @@ public function leaveNode(Node $node) $objectId = \spl_object_id($node); if ($this->toBeRemovedNodeId === $objectId) { $this->toBeRemovedNodeId = null; - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } return $this->nodesToReturn[$objectId] ?? $node; } @@ -202,7 +174,7 @@ protected function isNames(Node $node, array $names) : bool * @return ($node is Node\Param ? string : * ($node is ClassMethod ? string : * ($node is Property ? string : - * ($node is PropertyProperty ? string : + * ($node is PropertyItem ? string : * ($node is Trait_ ? string : * ($node is Interface_ ? string : * ($node is Const_ ? string : @@ -262,9 +234,7 @@ private function decorateCurrentAndChildren(Node $node) : void // 1. registered in getNodesTypes() method // 2. different with current node type, as already decorated above // - $otherTypes = \array_filter($this->getNodeTypes(), static function (string $nodeType) use($node) : bool { - return $nodeType !== \get_class($node); - }); + $otherTypes = \array_filter($this->getNodeTypes(), static fn(string $nodeType): bool => $nodeType !== \get_class($node)); if ($otherTypes === []) { return; } @@ -282,7 +252,7 @@ private function postRefactorProcess(Node $originalNode, Node $node, $refactored { /** @var non-empty-array|Node $refactoredNode */ $this->createdByRuleDecorator->decorate($refactoredNode, $originalNode, static::class); - $rectorWithLineChange = new RectorWithLineChange(static::class, $originalNode->getLine()); + $rectorWithLineChange = new RectorWithLineChange(static::class, $originalNode->getStartLine()); $this->file->addRectorClassWithLine($rectorWithLineChange); /** @var MutatingScope|null $currentScope */ $currentScope = $node->getAttribute(AttributeKey::SCOPE); diff --git a/vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php b/vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php deleted file mode 100644 index a79e85883..000000000 --- a/vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php +++ /dev/null @@ -1,29 +0,0 @@ -getAttribute(AttributeKey::SCOPE); - if (!$currentScope instanceof Scope) { - $errorMessage = \sprintf('Scope not available on "%s" node, but is required by a refactorWithScope() method of "%s" rule. Fix scope refresh on changed nodes first', \get_class($node), static::class); - throw new ShouldNotHappenException($errorMessage); - } - return $this->refactorWithScope($node, $currentScope); - } -} diff --git a/vendor/rector/rector/src/Reflection/ClassModifierChecker.php b/vendor/rector/rector/src/Reflection/ClassModifierChecker.php index d2b39b81f..5c2349c48 100644 --- a/vendor/rector/rector/src/Reflection/ClassModifierChecker.php +++ b/vendor/rector/rector/src/Reflection/ClassModifierChecker.php @@ -9,9 +9,8 @@ final class ClassModifierChecker { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private \Rector\Reflection\ReflectionResolver $reflectionResolver; public function __construct(\Rector\Reflection\ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; diff --git a/vendor/rector/rector/src/Reflection/MethodReflectionResolver.php b/vendor/rector/rector/src/Reflection/MethodReflectionResolver.php index 1fafda84f..6d717c715 100644 --- a/vendor/rector/rector/src/Reflection/MethodReflectionResolver.php +++ b/vendor/rector/rector/src/Reflection/MethodReflectionResolver.php @@ -10,9 +10,8 @@ final class MethodReflectionResolver { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/src/Reflection/ReflectionResolver.php b/vendor/rector/rector/src/Reflection/ReflectionResolver.php index 8b2b69e5e..fe95c3bb4 100644 --- a/vendor/rector/rector/src/Reflection/ReflectionResolver.php +++ b/vendor/rector/rector/src/Reflection/ReflectionResolver.php @@ -24,41 +24,37 @@ use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\BenevolentUnionType; use PHPStan\Type\TypeCombinator; -use PHPStan\Type\TypeWithClassName; use Rector\Exception\ShouldNotHappenException; use Rector\NodeAnalyzer\ClassAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; +use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; use Rector\ValueObject\MethodName; final class ReflectionResolver { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\Reflection\MethodReflectionResolver */ - private $methodReflectionResolver; + private \Rector\Reflection\MethodReflectionResolver $methodReflectionResolver; public function __construct(ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver, ClassAnalyzer $classAnalyzer, \Rector\Reflection\MethodReflectionResolver $methodReflectionResolver) { $this->reflectionProvider = $reflectionProvider; @@ -99,10 +95,10 @@ public function resolveClassReflection(?Node $node) : ?ClassReflection public function resolveClassReflectionSourceObject($node) : ?ClassReflection { $objectType = $node instanceof StaticCall || $node instanceof StaticPropertyFetch ? $this->nodeTypeResolver->getType($node->class) : $this->nodeTypeResolver->getType($node->var); - if (!$objectType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($objectType); + if ($className === null) { return null; } - $className = $objectType->getClassName(); if (!$this->reflectionProvider->hasClass($className)) { return null; } @@ -144,7 +140,7 @@ public function resolveMethodReflection(string $className, string $methodName, ? public function resolveMethodReflectionFromStaticCall(StaticCall $staticCall) : ?MethodReflection { $objectType = $this->nodeTypeResolver->getType($staticCall->class); - if ($objectType instanceof ShortenedObjectType) { + if ($objectType instanceof ShortenedObjectType || $objectType instanceof AliasedObjectType) { /** @var array $classNames */ $classNames = [$objectType->getFullyQualifiedName()]; } else { @@ -170,7 +166,8 @@ public function resolveMethodReflectionFromMethodCall(MethodCall $methodCall) : if ($callerType instanceof BenevolentUnionType) { $callerType = TypeCombinator::removeFalsey($callerType); } - if (!$callerType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($callerType); + if ($className === null) { return null; } $methodName = $this->nodeNameResolver->getName($methodCall->name); @@ -178,7 +175,7 @@ public function resolveMethodReflectionFromMethodCall(MethodCall $methodCall) : return null; } $scope = $methodCall->getAttribute(AttributeKey::SCOPE); - return $this->resolveMethodReflection($callerType->getClassName(), $methodName, $scope); + return $this->resolveMethodReflection($className, $methodName, $scope); } /** * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\StaticCall $call @@ -204,26 +201,27 @@ public function resolveMethodReflectionFromClassMethod(ClassMethod $classMethod, $methodName = $this->nodeNameResolver->getName($classMethod); return $this->resolveMethodReflection($className, $methodName, $scope); } - public function resolveFunctionReflectionFromFunction(Function_ $function, Scope $scope) : ?FunctionReflection + public function resolveFunctionReflectionFromFunction(Function_ $function) : ?FunctionReflection { $name = $this->nodeNameResolver->getName($function); if ($name === null) { return null; } $functionName = new Name($name); - if ($this->reflectionProvider->hasFunction($functionName, $scope)) { - return $this->reflectionProvider->getFunction($functionName, $scope); + if ($this->reflectionProvider->hasFunction($functionName, null)) { + return $this->reflectionProvider->getFunction($functionName, null); } return null; } public function resolveMethodReflectionFromNew(New_ $new) : ?MethodReflection { $newClassType = $this->nodeTypeResolver->getType($new->class); - if (!$newClassType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($newClassType); + if ($className === null) { return null; } $scope = $new->getAttribute(AttributeKey::SCOPE); - return $this->resolveMethodReflection($newClassType->getClassName(), MethodName::CONSTRUCT, $scope); + return $this->resolveMethodReflection($className, MethodName::CONSTRUCT, $scope); } /** * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch @@ -235,13 +233,14 @@ public function resolvePropertyReflectionFromPropertyFetch($propertyFetch) : ?Ph return null; } $fetcheeType = $propertyFetch instanceof PropertyFetch ? $this->nodeTypeResolver->getType($propertyFetch->var) : $this->nodeTypeResolver->getType($propertyFetch->class); - if (!$fetcheeType instanceof TypeWithClassName) { + $className = ClassNameFromObjectTypeResolver::resolve($fetcheeType); + if ($className === null) { return null; } - if (!$this->reflectionProvider->hasClass($fetcheeType->getClassName())) { + if (!$this->reflectionProvider->hasClass($className)) { return null; } - $classReflection = $this->reflectionProvider->getClass($fetcheeType->getClassName()); + $classReflection = $this->reflectionProvider->getClass($className); if (!$classReflection->hasProperty($propertyName)) { return null; } @@ -260,12 +259,12 @@ public function resolvePropertyReflectionFromPropertyFetch($propertyFetch) : ?Ph */ private function resolveFunctionReflectionFromFuncCall(FuncCall $funcCall) { - $scope = $funcCall->getAttribute(AttributeKey::SCOPE); if (!$funcCall->name instanceof Name) { return null; } - if ($this->reflectionProvider->hasFunction($funcCall->name, $scope)) { - return $this->reflectionProvider->getFunction($funcCall->name, $scope); + $functionName = new Name((string) $this->nodeNameResolver->getName($funcCall)); + if ($this->reflectionProvider->hasFunction($functionName, null)) { + return $this->reflectionProvider->getFunction($functionName, null); } return null; } diff --git a/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php b/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php index a5e4188cd..86fa26e49 100644 --- a/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php +++ b/vendor/rector/rector/src/Reporting/DeprecatedRulesReporter.php @@ -6,14 +6,13 @@ use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class DeprecatedRulesReporter { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; public function __construct(SymfonyStyle $symfonyStyle) { $this->symfonyStyle = $symfonyStyle; diff --git a/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php b/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php index 904b6a89f..16ec5229a 100644 --- a/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php +++ b/vendor/rector/rector/src/Reporting/MissConfigurationReporter.php @@ -7,19 +7,17 @@ use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Configuration\VendorMissAnalyseGuard; use Rector\PostRector\Contract\Rector\PostRectorInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class MissConfigurationReporter { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @readonly - * @var \Rector\Configuration\VendorMissAnalyseGuard */ - private $vendorMissAnalyseGuard; + private VendorMissAnalyseGuard $vendorMissAnalyseGuard; public function __construct(SymfonyStyle $symfonyStyle, VendorMissAnalyseGuard $vendorMissAnalyseGuard) { $this->symfonyStyle = $symfonyStyle; @@ -30,13 +28,13 @@ public function reportSkippedNeverRegisteredRules() : void $registeredRules = SimpleParameterProvider::provideArrayParameter(Option::REGISTERED_RECTOR_RULES); $skippedRules = SimpleParameterProvider::provideArrayParameter(Option::SKIPPED_RECTOR_RULES); $neverRegisteredSkippedRules = \array_unique(\array_diff($skippedRules, $registeredRules)); - foreach ($neverRegisteredSkippedRules as $neverRegisteredSkippedRule) { - // post rules are registered in a different way - if (\is_a($neverRegisteredSkippedRule, PostRectorInterface::class, \true)) { - continue; - } - $this->symfonyStyle->warning(\sprintf('Skipped rule "%s" is never registered. You can remove it from "->withSkip()"', $neverRegisteredSkippedRule)); + // remove special PostRectorInterface rules, they are registered in a different way + $neverRegisteredSkippedRules = \array_filter($neverRegisteredSkippedRules, fn($skippedRule): bool => !\is_a($skippedRule, PostRectorInterface::class, \true)); + if ($neverRegisteredSkippedRules === []) { + return; } + $this->symfonyStyle->warning(\sprintf('%s never registered. You can remove %s from "->withSkip()"', \count($neverRegisteredSkippedRules) > 1 ? 'These skipped rules are' : 'This skipped rule is', \count($neverRegisteredSkippedRules) > 1 ? 'them' : 'it')); + $this->symfonyStyle->listing($neverRegisteredSkippedRules); } /** * @param string[] $filePaths diff --git a/vendor/rector/rector/src/Set/Contract/SetListInterface.php b/vendor/rector/rector/src/Set/Contract/SetListInterface.php deleted file mode 100644 index e72a7a1d6..000000000 --- a/vendor/rector/rector/src/Set/Contract/SetListInterface.php +++ /dev/null @@ -1,12 +0,0 @@ -setProviderCollector = $setProviderCollector; + $this->installedPackageResolver = $installedPackageResolver; } /** * @return ComposerTriggeredSet[] @@ -26,33 +31,27 @@ public function __construct(SetProviderCollector $setProviderCollector) public function matchComposerTriggered(string $groupName) : array { $matchedSets = []; - foreach ($this->setProviderCollector->provideSets() as $set) { - if (!$set instanceof ComposerTriggeredSet) { - continue; - } - if ($set->getGroupName() === $groupName) { - $matchedSets[] = $set; + foreach ($this->setProviderCollector->provideComposerTriggeredSets() as $composerTriggeredSet) { + if ($composerTriggeredSet->getGroupName() === $groupName) { + $matchedSets[] = $composerTriggeredSet; } } return $matchedSets; } /** - * @param string[] $setGroups + * @param SetGroup::*[] $setGroups * @return string[] */ public function matchBySetGroups(array $setGroups) : array { - $installedPackageResolver = new InstalledPackageResolver(); - $installedComposerPackages = $installedPackageResolver->resolve(\getcwd()); + $installedComposerPackages = $this->installedPackageResolver->resolve(); $groupLoadedSets = []; foreach ($setGroups as $setGroup) { $composerTriggeredSets = $this->matchComposerTriggered($setGroup); foreach ($composerTriggeredSets as $composerTriggeredSet) { if ($composerTriggeredSet->matchInstalledPackages($installedComposerPackages)) { - // @todo add debug note somewhere - // echo sprintf('Loaded "%s" set as it meets the conditions', $composerTriggeredSet->getSetFilePath()); // it matched composer package + version requirements → load set - $groupLoadedSets[] = $composerTriggeredSet->getSetFilePath(); + $groupLoadedSets[] = \realpath($composerTriggeredSet->getSetFilePath()); } } } diff --git a/vendor/rector/rector/src/Set/SetProvider/CoreSetProvider.php b/vendor/rector/rector/src/Set/SetProvider/CoreSetProvider.php index 1aa675341..859fe9462 100644 --- a/vendor/rector/rector/src/Set/SetProvider/CoreSetProvider.php +++ b/vendor/rector/rector/src/Set/SetProvider/CoreSetProvider.php @@ -6,6 +6,7 @@ use Rector\Set\Contract\SetInterface; use Rector\Set\Contract\SetProviderInterface; use Rector\Set\Enum\SetGroup; +use Rector\Set\ValueObject\ComposerTriggeredSet; use Rector\Set\ValueObject\Set; final class CoreSetProvider implements SetProviderInterface { @@ -14,6 +15,6 @@ final class CoreSetProvider implements SetProviderInterface */ public function provide() : array { - return [new Set(SetGroup::CORE, 'Code Quality', __DIR__ . '/../../../config/set/code-quality.php'), new Set(SetGroup::CORE, 'Coding Style', __DIR__ . '/../../../config/set/coding-style.php'), new Set(SetGroup::CORE, 'Dead Code', __DIR__ . '/../../../config/set/dead-code.php'), new Set(SetGroup::CORE, 'DateTime to Carbon', __DIR__ . '/../../../config/set/datetime-to-carbon.php'), new Set(SetGroup::CORE, 'Instanceof', __DIR__ . '/../../../config/set/instanceof.php'), new Set(SetGroup::CORE, 'Early return', __DIR__ . '/../../../config/set/early-return.php'), new Set(SetGroup::CORE, 'Gmagick to Imagick', __DIR__ . '/../../../config/set/gmagick-to-imagick.php'), new Set(SetGroup::CORE, 'Naming', __DIR__ . '/../../../config/set/naming.php'), new Set(SetGroup::CORE, 'Privatization', __DIR__ . '/../../../config/set/privatization.php'), new Set(SetGroup::CORE, 'Strict Booleans', __DIR__ . '/../../../config/set/strict-booleans.php'), new Set(SetGroup::CORE, 'Type Declarations', __DIR__ . '/../../../config/set/type-declaration.php')]; + return [new Set(SetGroup::CORE, 'Code Quality', __DIR__ . '/../../../config/set/code-quality.php'), new Set(SetGroup::CORE, 'Coding Style', __DIR__ . '/../../../config/set/coding-style.php'), new Set(SetGroup::CORE, 'Dead Code', __DIR__ . '/../../../config/set/dead-code.php'), new Set(SetGroup::CORE, 'DateTime to Carbon', __DIR__ . '/../../../config/set/datetime-to-carbon.php'), new Set(SetGroup::CORE, 'Instanceof', __DIR__ . '/../../../config/set/instanceof.php'), new Set(SetGroup::CORE, 'Early return', __DIR__ . '/../../../config/set/early-return.php'), new Set(SetGroup::CORE, 'Gmagick to Imagick', __DIR__ . '/../../../config/set/gmagick-to-imagick.php'), new Set(SetGroup::CORE, 'Naming', __DIR__ . '/../../../config/set/naming.php'), new Set(SetGroup::CORE, 'Privatization', __DIR__ . '/../../../config/set/privatization.php'), new Set(SetGroup::CORE, 'Strict Booleans', __DIR__ . '/../../../config/set/strict-booleans.php'), new Set(SetGroup::CORE, 'Type Declarations', __DIR__ . '/../../../config/set/type-declaration.php'), new ComposerTriggeredSet(SetGroup::NETTE_UTILS, 'nette/utils', '4.0', __DIR__ . '/../../../config/set/nette-utils/nette-utils4.php')]; } } diff --git a/vendor/rector/rector/src/Set/SetProvider/PHPSetProvider.php b/vendor/rector/rector/src/Set/SetProvider/PHPSetProvider.php index 77521f107..b84d8e3ab 100644 --- a/vendor/rector/rector/src/Set/SetProvider/PHPSetProvider.php +++ b/vendor/rector/rector/src/Set/SetProvider/PHPSetProvider.php @@ -14,6 +14,6 @@ final class PHPSetProvider implements SetProviderInterface */ public function provide() : array { - return [new Set(SetGroup::PHP, 'PHP 5.3', __DIR__ . '/../../../config/set/php53.php'), new Set(SetGroup::PHP, 'PHP 5.4', __DIR__ . '/../../../config/set/php54.php'), new Set(SetGroup::PHP, 'PHP 5.5', __DIR__ . '/../../../config/set/php55.php'), new Set(SetGroup::PHP, 'PHP 5.6', __DIR__ . '/../../../config/set/php56.php'), new Set(SetGroup::PHP, 'PHP 7.0', __DIR__ . '/../../../config/set/php70.php'), new Set(SetGroup::PHP, 'PHP 7.1', __DIR__ . '/../../../config/set/php71.php'), new Set(SetGroup::PHP, 'PHP 7.2', __DIR__ . '/../../../config/set/php72.php'), new Set(SetGroup::PHP, 'PHP 7.3', __DIR__ . '/../../../config/set/php73.php'), new Set(SetGroup::PHP, 'PHP 7.4', __DIR__ . '/../../../config/set/php74.php'), new Set(SetGroup::PHP, 'PHP 8.0', __DIR__ . '/../../../config/set/php80.php'), new Set(SetGroup::PHP, 'PHP 8.1', __DIR__ . '/../../../config/set/php81.php'), new Set(SetGroup::PHP, 'PHP 8.2', __DIR__ . '/../../../config/set/php82.php'), new Set(SetGroup::PHP, 'PHP 8.3', __DIR__ . '/../../../config/set/php83.php'), new Set(SetGroup::PHP, 'PHP 8.4', __DIR__ . '/../../../config/set/php84.php'), new Set(SetGroup::PHP, 'Polyfills', __DIR__ . '/../../../config/set/php-polyfills.php')]; + return [new Set(SetGroup::PHP, 'PHP 5.3', __DIR__ . '/../../../config/set/php53.php'), new Set(SetGroup::PHP, 'PHP 5.4', __DIR__ . '/../../../config/set/php54.php'), new Set(SetGroup::PHP, 'PHP 5.5', __DIR__ . '/../../../config/set/php55.php'), new Set(SetGroup::PHP, 'PHP 5.6', __DIR__ . '/../../../config/set/php56.php'), new Set(SetGroup::PHP, 'PHP 7.0', __DIR__ . '/../../../config/set/php70.php'), new Set(SetGroup::PHP, 'PHP 7.1', __DIR__ . '/../../../config/set/php71.php'), new Set(SetGroup::PHP, 'PHP 7.2', __DIR__ . '/../../../config/set/php72.php'), new Set(SetGroup::PHP, 'PHP 7.3', __DIR__ . '/../../../config/set/php73.php'), new Set(SetGroup::PHP, 'PHP 7.4', __DIR__ . '/../../../config/set/php74.php'), new Set(SetGroup::PHP, 'PHP 8.0', __DIR__ . '/../../../config/set/php80.php'), new Set(SetGroup::PHP, 'PHP 8.1', __DIR__ . '/../../../config/set/php81.php'), new Set(SetGroup::PHP, 'PHP 8.2', __DIR__ . '/../../../config/set/php82.php'), new Set(SetGroup::PHP, 'PHP 8.3', __DIR__ . '/../../../config/set/php83.php'), new Set(SetGroup::PHP, 'PHP 8.4', __DIR__ . '/../../../config/set/php84.php'), new Set(SetGroup::PHP, 'PHP 8.5', __DIR__ . '/../../../config/set/php85.php'), new Set(SetGroup::PHP, 'Polyfills', __DIR__ . '/../../../config/set/php-polyfills.php')]; } } diff --git a/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php b/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php index d635332df..11ec6a372 100644 --- a/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php +++ b/vendor/rector/rector/src/Set/ValueObject/ComposerTriggeredSet.php @@ -3,9 +3,10 @@ declare (strict_types=1); namespace Rector\Set\ValueObject; +use RectorPrefix202506\Composer\Semver\Semver; use Rector\Composer\ValueObject\InstalledPackage; use Rector\Set\Contract\SetInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api used by extensions */ @@ -13,24 +14,20 @@ final class ComposerTriggeredSet implements SetInterface { /** * @readonly - * @var string */ - private $groupName; + private string $groupName; /** * @readonly - * @var string */ - private $packageName; + private string $packageName; /** * @readonly - * @var string */ - private $version; + private string $version; /** * @readonly - * @var string */ - private $setFilePath; + private string $setFilePath; /** * @var string * @see https://regex101.com/r/ioYomu/1 @@ -62,7 +59,7 @@ public function matchInstalledPackages(array $installedPackages) : bool if ($installedPackage->getName() !== $this->packageName) { continue; } - return \version_compare($installedPackage->getVersion(), $this->version) !== -1; + return Semver::satisfies($installedPackage->getVersion(), '^' . $this->version); } return \false; } diff --git a/vendor/rector/rector/src/Set/ValueObject/LevelSetList.php b/vendor/rector/rector/src/Set/ValueObject/LevelSetList.php index c8b784be8..27c07650b 100644 --- a/vendor/rector/rector/src/Set/ValueObject/LevelSetList.php +++ b/vendor/rector/rector/src/Set/ValueObject/LevelSetList.php @@ -3,12 +3,15 @@ declare (strict_types=1); namespace Rector\Set\ValueObject; -use Rector\Set\Contract\SetListInterface; /** * @api */ -final class LevelSetList implements SetListInterface +final class LevelSetList { + /** + * @var string + */ + public const UP_TO_PHP_85 = __DIR__ . '/../../../config/set/level/up-to-php85.php'; /** * @var string */ diff --git a/vendor/rector/rector/src/Set/ValueObject/Set.php b/vendor/rector/rector/src/Set/ValueObject/Set.php index f2672e5f1..1f278eccc 100644 --- a/vendor/rector/rector/src/Set/ValueObject/Set.php +++ b/vendor/rector/rector/src/Set/ValueObject/Set.php @@ -4,7 +4,7 @@ namespace Rector\Set\ValueObject; use Rector\Set\Contract\SetInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api used by extensions */ @@ -12,19 +12,16 @@ final class Set implements SetInterface { /** * @readonly - * @var string */ - private $groupName; + private string $groupName; /** * @readonly - * @var string */ - private $setName; + private string $setName; /** * @readonly - * @var string */ - private $setFilePath; + private string $setFilePath; public function __construct(string $groupName, string $setName, string $setFilePath) { $this->groupName = $groupName; diff --git a/vendor/rector/rector/src/Set/ValueObject/SetList.php b/vendor/rector/rector/src/Set/ValueObject/SetList.php index 19798cfe5..ddb536b39 100644 --- a/vendor/rector/rector/src/Set/ValueObject/SetList.php +++ b/vendor/rector/rector/src/Set/ValueObject/SetList.php @@ -3,11 +3,10 @@ declare (strict_types=1); namespace Rector\Set\ValueObject; -use Rector\Set\Contract\SetListInterface; /** * @api */ -final class SetList implements SetListInterface +final class SetList { /** * @internal @@ -104,6 +103,10 @@ final class SetList implements SetListInterface * @var string */ public const PHP_84 = __DIR__ . '/../../../config/set/php84.php'; + /** + * @var string + */ + public const PHP_85 = __DIR__ . '/../../../config/set/php85.php'; /** * @var string */ @@ -124,4 +127,8 @@ final class SetList implements SetListInterface * @var string */ public const CARBON = __DIR__ . '/../../../config/set/datetime-to-carbon.php'; + /** + * @var string + */ + public const BEHAT_ANNOTATIONS_TO_ATTRIBUTES = __DIR__ . '/../../../config/set/behat-annotations-to-attributes.php'; } diff --git a/vendor/rector/rector/src/Skipper/FileSystem/FnMatchPathNormalizer.php b/vendor/rector/rector/src/Skipper/FileSystem/FnMatchPathNormalizer.php index 8c9f2fce4..3952f33d1 100644 --- a/vendor/rector/rector/src/Skipper/FileSystem/FnMatchPathNormalizer.php +++ b/vendor/rector/rector/src/Skipper/FileSystem/FnMatchPathNormalizer.php @@ -14,7 +14,6 @@ public function normalizeForFnmatch(string $path) : string return '*' . \trim($path, '*') . '*'; } if (\strpos($path, '..') !== \false) { - /** @var string|false $realPath */ $realPath = \realpath($path); if ($realPath === \false) { return ''; diff --git a/vendor/rector/rector/src/Skipper/Matcher/FileInfoMatcher.php b/vendor/rector/rector/src/Skipper/Matcher/FileInfoMatcher.php index 610a046a8..fc744c775 100644 --- a/vendor/rector/rector/src/Skipper/Matcher/FileInfoMatcher.php +++ b/vendor/rector/rector/src/Skipper/Matcher/FileInfoMatcher.php @@ -11,19 +11,16 @@ final class FileInfoMatcher { /** * @readonly - * @var \Rector\Skipper\FileSystem\FnMatchPathNormalizer */ - private $fnMatchPathNormalizer; + private FnMatchPathNormalizer $fnMatchPathNormalizer; /** * @readonly - * @var \Rector\Skipper\Fnmatcher */ - private $fnmatcher; + private Fnmatcher $fnmatcher; /** * @readonly - * @var \Rector\Skipper\RealpathMatcher */ - private $realpathMatcher; + private RealpathMatcher $realpathMatcher; public function __construct(FnMatchPathNormalizer $fnMatchPathNormalizer, Fnmatcher $fnmatcher, RealpathMatcher $realpathMatcher) { $this->fnMatchPathNormalizer = $fnMatchPathNormalizer; diff --git a/vendor/rector/rector/src/Skipper/RealpathMatcher.php b/vendor/rector/rector/src/Skipper/RealpathMatcher.php index ea6f5c07e..faade9ef2 100644 --- a/vendor/rector/rector/src/Skipper/RealpathMatcher.php +++ b/vendor/rector/rector/src/Skipper/RealpathMatcher.php @@ -8,26 +8,22 @@ final class RealpathMatcher { public function match(string $matchingPath, string $filePath) : bool { - /** @var string|false $realPathMatchingPath */ $realPathMatchingPath = \realpath($matchingPath); if ($realPathMatchingPath === \false) { return \false; } - /** @var string|false $realpathFilePath */ $realpathFilePath = \realpath($filePath); if ($realpathFilePath === \false) { return \false; } $normalizedMatchingPath = PathNormalizer::normalize($realPathMatchingPath); $normalizedFilePath = PathNormalizer::normalize($realpathFilePath); - // skip define direct path - if (\is_file($normalizedMatchingPath)) { - return $normalizedMatchingPath === $normalizedFilePath; + // skip define direct path exactly equal + if ($normalizedMatchingPath === $normalizedFilePath) { + return \true; } // ensure add / suffix to ensure no same prefix directory - if (\is_dir($normalizedMatchingPath)) { - $normalizedMatchingPath = \rtrim($normalizedMatchingPath, '/') . '/'; - } - return \strncmp($normalizedFilePath, $normalizedMatchingPath, \strlen($normalizedMatchingPath)) === 0; + $suffixedMatchingPath = \rtrim($normalizedMatchingPath, '/') . '/'; + return \strncmp($normalizedFilePath, $suffixedMatchingPath, \strlen($suffixedMatchingPath)) === 0; } } diff --git a/vendor/rector/rector/src/Skipper/SkipCriteriaResolver/SkippedPathsResolver.php b/vendor/rector/rector/src/Skipper/SkipCriteriaResolver/SkippedPathsResolver.php index 1b6327d15..54fd7549f 100644 --- a/vendor/rector/rector/src/Skipper/SkipCriteriaResolver/SkippedPathsResolver.php +++ b/vendor/rector/rector/src/Skipper/SkipCriteriaResolver/SkippedPathsResolver.php @@ -14,9 +14,8 @@ final class SkippedPathsResolver { /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; /** * @var null|string[] */ diff --git a/vendor/rector/rector/src/Skipper/SkipVoter/ClassSkipVoter.php b/vendor/rector/rector/src/Skipper/SkipVoter/ClassSkipVoter.php index 4ff051c06..ed2572fda 100644 --- a/vendor/rector/rector/src/Skipper/SkipVoter/ClassSkipVoter.php +++ b/vendor/rector/rector/src/Skipper/SkipVoter/ClassSkipVoter.php @@ -10,19 +10,16 @@ final class ClassSkipVoter { /** * @readonly - * @var \Rector\Skipper\Skipper\SkipSkipper */ - private $skipSkipper; + private SkipSkipper $skipSkipper; /** * @readonly - * @var \Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver */ - private $skippedClassResolver; + private SkippedClassResolver $skippedClassResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(SkipSkipper $skipSkipper, SkippedClassResolver $skippedClassResolver, ReflectionProvider $reflectionProvider) { $this->skipSkipper = $skipSkipper; diff --git a/vendor/rector/rector/src/Skipper/Skipper/PathSkipper.php b/vendor/rector/rector/src/Skipper/Skipper/PathSkipper.php index 566ecf882..6e4b24857 100644 --- a/vendor/rector/rector/src/Skipper/Skipper/PathSkipper.php +++ b/vendor/rector/rector/src/Skipper/Skipper/PathSkipper.php @@ -9,14 +9,12 @@ final class PathSkipper { /** * @readonly - * @var \Rector\Skipper\Matcher\FileInfoMatcher */ - private $fileInfoMatcher; + private FileInfoMatcher $fileInfoMatcher; /** * @readonly - * @var \Rector\Skipper\SkipCriteriaResolver\SkippedPathsResolver */ - private $skippedPathsResolver; + private SkippedPathsResolver $skippedPathsResolver; public function __construct(FileInfoMatcher $fileInfoMatcher, SkippedPathsResolver $skippedPathsResolver) { $this->fileInfoMatcher = $fileInfoMatcher; diff --git a/vendor/rector/rector/src/Skipper/Skipper/SkipSkipper.php b/vendor/rector/rector/src/Skipper/Skipper/SkipSkipper.php index 27358b2e3..21408513f 100644 --- a/vendor/rector/rector/src/Skipper/Skipper/SkipSkipper.php +++ b/vendor/rector/rector/src/Skipper/Skipper/SkipSkipper.php @@ -8,9 +8,8 @@ final class SkipSkipper { /** * @readonly - * @var \Rector\Skipper\Matcher\FileInfoMatcher */ - private $fileInfoMatcher; + private FileInfoMatcher $fileInfoMatcher; public function __construct(FileInfoMatcher $fileInfoMatcher) { $this->fileInfoMatcher = $fileInfoMatcher; diff --git a/vendor/rector/rector/src/Skipper/Skipper/Skipper.php b/vendor/rector/rector/src/Skipper/Skipper/Skipper.php index 58a4d66c2..8f2a623cf 100644 --- a/vendor/rector/rector/src/Skipper/Skipper/Skipper.php +++ b/vendor/rector/rector/src/Skipper/Skipper/Skipper.php @@ -15,19 +15,16 @@ final class Skipper { /** * @readonly - * @var \Rector\ProcessAnalyzer\RectifiedAnalyzer */ - private $rectifiedAnalyzer; + private RectifiedAnalyzer $rectifiedAnalyzer; /** * @readonly - * @var \Rector\Skipper\Skipper\PathSkipper */ - private $pathSkipper; + private \Rector\Skipper\Skipper\PathSkipper $pathSkipper; /** * @readonly - * @var \Rector\Skipper\SkipVoter\ClassSkipVoter */ - private $classSkipVoter; + private ClassSkipVoter $classSkipVoter; public function __construct(RectifiedAnalyzer $rectifiedAnalyzer, \Rector\Skipper\Skipper\PathSkipper $pathSkipper, ClassSkipVoter $classSkipVoter) { $this->rectifiedAnalyzer = $rectifiedAnalyzer; diff --git a/vendor/rector/rector/src/StaticReflection/DynamicSourceLocatorDecorator.php b/vendor/rector/rector/src/StaticReflection/DynamicSourceLocatorDecorator.php index f23c9ad0b..94d40c672 100644 --- a/vendor/rector/rector/src/StaticReflection/DynamicSourceLocatorDecorator.php +++ b/vendor/rector/rector/src/StaticReflection/DynamicSourceLocatorDecorator.php @@ -14,19 +14,16 @@ final class DynamicSourceLocatorDecorator { /** * @readonly - * @var \Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider */ - private $dynamicSourceLocatorProvider; + private DynamicSourceLocatorProvider $dynamicSourceLocatorProvider; /** * @readonly - * @var \Rector\FileSystem\FileAndDirectoryFilter */ - private $fileAndDirectoryFilter; + private FileAndDirectoryFilter $fileAndDirectoryFilter; /** * @readonly - * @var \Rector\FileSystem\FilesystemTweaker */ - private $filesystemTweaker; + private FilesystemTweaker $filesystemTweaker; public function __construct(DynamicSourceLocatorProvider $dynamicSourceLocatorProvider, FileAndDirectoryFilter $fileAndDirectoryFilter, FilesystemTweaker $filesystemTweaker) { $this->dynamicSourceLocatorProvider = $dynamicSourceLocatorProvider; @@ -35,20 +32,22 @@ public function __construct(DynamicSourceLocatorProvider $dynamicSourceLocatorPr } /** * @param string[] $paths + * @return string[] */ - public function addPaths(array $paths) : void + public function addPaths(array $paths) : array { if ($paths === []) { - return; + return []; } $paths = $this->filesystemTweaker->resolveWithFnmatch($paths); $files = $this->fileAndDirectoryFilter->filterFiles($paths); $this->dynamicSourceLocatorProvider->addFiles($files); $directories = $this->fileAndDirectoryFilter->filterDirectories($paths); $this->dynamicSourceLocatorProvider->addDirectories($directories); + return \array_merge($files, $directories); } - public function isPathsEmpty() : bool + public function arePathsEmpty() : bool { - return $this->dynamicSourceLocatorProvider->isPathsEmpty(); + return $this->dynamicSourceLocatorProvider->arePathsEmpty(); } } diff --git a/vendor/rector/rector/src/StaticTypeMapper/Mapper/PhpParserNodeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/Mapper/PhpParserNodeMapper.php index 75d7c2da9..ce1028325 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/Mapper/PhpParserNodeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/Mapper/PhpParserNodeMapper.php @@ -13,7 +13,7 @@ final class PhpParserNodeMapper * @var PhpParserNodeMapperInterface[] * @readonly */ - private $phpParserNodeMappers; + private iterable $phpParserNodeMappers; /** * @param PhpParserNodeMapperInterface[] $phpParserNodeMappers */ diff --git a/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php index 590c21abf..564d233d6 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php @@ -3,7 +3,8 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\Mapper; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; +use PHPStan\Type\Accessory\AccessoryArrayListType; use PHPStan\Type\Accessory\AccessoryNonEmptyStringType; use PHPStan\Type\Accessory\NonEmptyArrayType; use PHPStan\Type\ArrayType; @@ -22,6 +23,7 @@ use PHPStan\Type\ResourceType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use PHPStan\Type\TypeCombinator; use PHPStan\Type\VoidType; final class ScalarStringToTypeMapper { @@ -50,6 +52,9 @@ public function mapScalarStringToType(string $scalarName) : Type } return new $objectType(); } + if ($loweredScalarName === 'list') { + return TypeCombinator::intersect(new ArrayType(new MixedType(), new MixedType()), new AccessoryArrayListType()); + } if ($loweredScalarName === 'array') { return new ArrayType(new MixedType(), new MixedType()); } diff --git a/vendor/rector/rector/src/StaticTypeMapper/Naming/NameScopeFactory.php b/vendor/rector/rector/src/StaticTypeMapper/Naming/NameScopeFactory.php index 349fdae7d..19e2c28b0 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/Naming/NameScopeFactory.php +++ b/vendor/rector/rector/src/StaticTypeMapper/Naming/NameScopeFactory.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use PHPStan\Analyser\NameScope; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; @@ -19,9 +19,8 @@ final class NameScopeFactory { /** * @readonly - * @var \Rector\Naming\Naming\UseImportsResolver */ - private $useImportsResolver; + private UseImportsResolver $useImportsResolver; public function __construct(UseImportsResolver $useImportsResolver) { $this->useImportsResolver = $useImportsResolver; @@ -51,7 +50,7 @@ private function resolveUseNamesByAlias(array $useNodes) : array foreach ($useNodes as $useNode) { $prefix = $this->useImportsResolver->resolvePrefix($useNode); foreach ($useNode->uses as $useUse) { - /** @var UseUse $useUse */ + /** @var UseItem $useUse */ $aliasName = $useUse->getAlias()->name; // uses must be lowercase, as PHPStan lowercases it $lowercasedAliasName = \strtolower($aliasName); diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php index 7975cb0a1..de8258e1e 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpDoc/PhpDocTypeMapper.php @@ -9,7 +9,7 @@ use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Tests\StaticTypeMapper\PhpDoc\PhpDocTypeMapperTest */ @@ -19,12 +19,11 @@ final class PhpDocTypeMapper * @var PhpDocTypeMapperInterface[] * @readonly */ - private $phpDocTypeMappers; + private array $phpDocTypeMappers; /** * @readonly - * @var \PHPStan\PhpDoc\TypeNodeResolver */ - private $typeNodeResolver; + private TypeNodeResolver $typeNodeResolver; /** * @param PhpDocTypeMapperInterface[] $phpDocTypeMappers */ diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php index 584d46739..59b00722e 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IdentifierPhpDocTypeMapper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\PhpDocParser; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\Analyser\NameScope; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; @@ -36,24 +36,20 @@ final class IdentifierPhpDocTypeMapper implements PhpDocTypeMapperInterface { /** * @readonly - * @var \Rector\TypeDeclaration\PHPStan\ObjectTypeSpecifier */ - private $objectTypeSpecifier; + private ObjectTypeSpecifier $objectTypeSpecifier; /** * @readonly - * @var \Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper */ - private $scalarStringToTypeMapper; + private ScalarStringToTypeMapper $scalarStringToTypeMapper; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ObjectTypeSpecifier $objectTypeSpecifier, ScalarStringToTypeMapper $scalarStringToTypeMapper, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver) { $this->objectTypeSpecifier = $objectTypeSpecifier; @@ -94,19 +90,22 @@ public function mapIdentifierTypeNode(IdentifierTypeNode $identifierTypeNode, No if ($loweredName === 'iterable') { return new IterableType(new MixedType(), new MixedType()); } + $withPreslash = \false; if (\strncmp($identifierTypeNode->name, '\\', \strlen('\\')) === 0) { $typeWithoutPreslash = Strings::substring($identifierTypeNode->name, 1); $objectType = new FullyQualifiedObjectType($typeWithoutPreslash); + $withPreslash = \true; } else { if ($identifierTypeNode->name === 'scalar') { // pseudo type, see https://www.php.net/manual/en/language.types.intro.php $scalarTypes = [new BooleanType(), new StringType(), new IntegerType(), new FloatType()]; return new UnionType($scalarTypes); } + $identifierTypeNode->name = \ltrim($identifierTypeNode->name, '@'); $objectType = new ObjectType($identifierTypeNode->name); } $scope = $node->getAttribute(AttributeKey::SCOPE); - return $this->objectTypeSpecifier->narrowToFullyQualifiedOrAliasedObjectType($node, $objectType, $scope); + return $this->objectTypeSpecifier->narrowToFullyQualifiedOrAliasedObjectType($node, $objectType, $scope, $withPreslash); } /** * @return \PHPStan\Type\MixedType|\Rector\StaticTypeMapper\ValueObject\Type\SelfObjectType diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IntersectionPhpDocTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IntersectionPhpDocTypeMapper.php index fe5928fe9..45b526b98 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IntersectionPhpDocTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/IntersectionPhpDocTypeMapper.php @@ -19,9 +19,8 @@ final class IntersectionPhpDocTypeMapper implements PhpDocTypeMapperInterface { /** * @readonly - * @var \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper */ - private $identifierPhpDocTypeMapper; + private \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper; public function __construct(\Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper) { $this->identifierPhpDocTypeMapper = $identifierPhpDocTypeMapper; diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/NullablePhpDocTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/NullablePhpDocTypeMapper.php index 705e9bec9..5175d4694 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/NullablePhpDocTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/NullablePhpDocTypeMapper.php @@ -20,14 +20,12 @@ final class NullablePhpDocTypeMapper implements PhpDocTypeMapperInterface { /** * @readonly - * @var \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper */ - private $identifierPhpDocTypeMapper; + private \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper; /** * @readonly - * @var \PHPStan\PhpDoc\TypeNodeResolver */ - private $typeNodeResolver; + private TypeNodeResolver $typeNodeResolver; public function __construct(\Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper, TypeNodeResolver $typeNodeResolver) { $this->identifierPhpDocTypeMapper = $identifierPhpDocTypeMapper; diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/UnionPhpDocTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/UnionPhpDocTypeMapper.php index cfdcc848c..fe030b74c 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/UnionPhpDocTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpDocParser/UnionPhpDocTypeMapper.php @@ -20,24 +20,20 @@ final class UnionPhpDocTypeMapper implements PhpDocTypeMapperInterface { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper */ - private $identifierPhpDocTypeMapper; + private \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpDocParser\IntersectionPhpDocTypeMapper */ - private $intersectionPhpDocTypeMapper; + private \Rector\StaticTypeMapper\PhpDocParser\IntersectionPhpDocTypeMapper $intersectionPhpDocTypeMapper; /** * @readonly - * @var \PHPStan\PhpDoc\TypeNodeResolver */ - private $typeNodeResolver; + private TypeNodeResolver $typeNodeResolver; public function __construct(TypeFactory $typeFactory, \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper, \Rector\StaticTypeMapper\PhpDocParser\IntersectionPhpDocTypeMapper $intersectionPhpDocTypeMapper, TypeNodeResolver $typeNodeResolver) { $this->typeFactory = $typeFactory; diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php index a753c5892..f9a9e2fb6 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php @@ -15,9 +15,8 @@ final class IdentifierNodeMapper implements PhpParserNodeMapperInterface { /** * @readonly - * @var \Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper */ - private $scalarStringToTypeMapper; + private ScalarStringToTypeMapper $scalarStringToTypeMapper; public function __construct(ScalarStringToTypeMapper $scalarStringToTypeMapper) { $this->scalarStringToTypeMapper = $scalarStringToTypeMapper; diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IntersectionTypeNodeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IntersectionTypeNodeMapper.php index b15e86359..f307fdedb 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IntersectionTypeNodeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/IntersectionTypeNodeMapper.php @@ -16,19 +16,16 @@ final class IntersectionTypeNodeMapper implements PhpParserNodeMapperInterface { /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper */ - private $fullyQualifiedNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\NameNodeMapper */ - private $nameNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\NameNodeMapper $nameNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper */ - private $identifierNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper $identifierNodeMapper; public function __construct(\Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper, \Rector\StaticTypeMapper\PhpParser\NameNodeMapper $nameNodeMapper, \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper $identifierNodeMapper) { $this->fullyQualifiedNodeMapper = $fullyQualifiedNodeMapper; diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NameNodeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NameNodeMapper.php index 1a6a8a81e..8121e19a3 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NameNodeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NameNodeMapper.php @@ -25,14 +25,12 @@ final class NameNodeMapper implements PhpParserNodeMapperInterface { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper */ - private $fullyQualifiedNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper; public function __construct(ReflectionResolver $reflectionResolver, \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper) { $this->reflectionResolver = $reflectionResolver; diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NullableTypeNodeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NullableTypeNodeMapper.php index f0e6a277d..068b82c78 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NullableTypeNodeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/NullableTypeNodeMapper.php @@ -18,24 +18,20 @@ final class NullableTypeNodeMapper implements PhpParserNodeMapperInterface { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper */ - private $fullyQualifiedNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\NameNodeMapper */ - private $nameNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\NameNodeMapper $nameNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper */ - private $identifierNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper $identifierNodeMapper; public function __construct(TypeFactory $typeFactory, \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper, \Rector\StaticTypeMapper\PhpParser\NameNodeMapper $nameNodeMapper, \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper $identifierNodeMapper) { $this->typeFactory = $typeFactory; diff --git a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/UnionTypeNodeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/UnionTypeNodeMapper.php index d8479b220..d0257c73c 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/PhpParser/UnionTypeNodeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/PhpParser/UnionTypeNodeMapper.php @@ -18,29 +18,24 @@ final class UnionTypeNodeMapper implements PhpParserNodeMapperInterface { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper */ - private $fullyQualifiedNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\NameNodeMapper */ - private $nameNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\NameNodeMapper $nameNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper */ - private $identifierNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper $identifierNodeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpParser\IntersectionTypeNodeMapper */ - private $intersectionTypeNodeMapper; + private \Rector\StaticTypeMapper\PhpParser\IntersectionTypeNodeMapper $intersectionTypeNodeMapper; public function __construct(TypeFactory $typeFactory, \Rector\StaticTypeMapper\PhpParser\FullyQualifiedNodeMapper $fullyQualifiedNodeMapper, \Rector\StaticTypeMapper\PhpParser\NameNodeMapper $nameNodeMapper, \Rector\StaticTypeMapper\PhpParser\IdentifierNodeMapper $identifierNodeMapper, \Rector\StaticTypeMapper\PhpParser\IntersectionTypeNodeMapper $intersectionTypeNodeMapper) { $this->typeFactory = $typeFactory; diff --git a/vendor/rector/rector/src/StaticTypeMapper/Resolver/ClassNameFromObjectTypeResolver.php b/vendor/rector/rector/src/StaticTypeMapper/Resolver/ClassNameFromObjectTypeResolver.php new file mode 100644 index 000000000..86f883e7b --- /dev/null +++ b/vendor/rector/rector/src/StaticTypeMapper/Resolver/ClassNameFromObjectTypeResolver.php @@ -0,0 +1,17 @@ +getObjectClassNames(); + if (\count($objectClassNames) !== 1) { + return null; + } + return $objectClassNames[0]; + } +} diff --git a/vendor/rector/rector/src/StaticTypeMapper/StaticTypeMapper.php b/vendor/rector/rector/src/StaticTypeMapper/StaticTypeMapper.php index 626b91c52..6139913ab 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/StaticTypeMapper.php +++ b/vendor/rector/rector/src/StaticTypeMapper/StaticTypeMapper.php @@ -30,24 +30,20 @@ final class StaticTypeMapper { /** * @readonly - * @var \Rector\StaticTypeMapper\Naming\NameScopeFactory */ - private $nameScopeFactory; + private NameScopeFactory $nameScopeFactory; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper */ - private $phpStanStaticTypeMapper; + private PHPStanStaticTypeMapper $phpStanStaticTypeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\PhpDoc\PhpDocTypeMapper */ - private $phpDocTypeMapper; + private PhpDocTypeMapper $phpDocTypeMapper; /** * @readonly - * @var \Rector\StaticTypeMapper\Mapper\PhpParserNodeMapper */ - private $phpParserNodeMapper; + private PhpParserNodeMapper $phpParserNodeMapper; public function __construct(NameScopeFactory $nameScopeFactory, PHPStanStaticTypeMapper $phpStanStaticTypeMapper, PhpDocTypeMapper $phpDocTypeMapper, PhpParserNodeMapper $phpParserNodeMapper) { $this->nameScopeFactory = $nameScopeFactory; diff --git a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/AliasedObjectType.php b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/AliasedObjectType.php index 08a261020..4e3f8cacd 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/AliasedObjectType.php +++ b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/AliasedObjectType.php @@ -5,10 +5,10 @@ use PhpParser\Node\Name; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; -use PHPStan\Type\TypeWithClassName; +use Rector\StaticTypeMapper\Resolver\ClassNameFromObjectTypeResolver; /** * @api */ @@ -16,9 +16,8 @@ final class AliasedObjectType extends ObjectType { /** * @readonly - * @var string */ - private $fullyQualifiedClass; + private string $fullyQualifiedClass; public function __construct(string $alias, string $fullyQualifiedClass) { $this->fullyQualifiedClass = $fullyQualifiedClass; @@ -34,8 +33,8 @@ public function getFullyQualifiedName() : string public function getUseNode(int $useType) : Use_ { $name = new Name($this->fullyQualifiedClass); - $useUse = new UseUse($name, $this->getClassName()); - $use = new Use_([$useUse]); + $useItem = new UseItem($name, $this->getClassName()); + $use = new Use_([$useItem]); $use->type = $useType; return $use; } @@ -52,12 +51,13 @@ public function areShortNamesEqual($comparedObjectType) : bool } public function equals(Type $type) : bool { + $className = ClassNameFromObjectTypeResolver::resolve($type); // compare with FQN classes - if ($type instanceof TypeWithClassName) { + if ($className !== null) { if ($type instanceof self && $this->fullyQualifiedClass === $type->getFullyQualifiedName()) { return \true; } - if ($this->fullyQualifiedClass === $type->getClassName()) { + if ($this->fullyQualifiedClass === $className) { return \true; } } diff --git a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php index 21e6bdd9b..837ddb85e 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php +++ b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedObjectType.php @@ -3,10 +3,10 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\ValueObject\Type; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Name; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; use PHPStan\Type\ObjectType; use Rector\NodeTypeResolver\Node\AttributeKey; /** @@ -46,8 +46,8 @@ public function getShortNameNode() : Name public function getUseNode(int $useType) : Use_ { $name = new Name($this->getClassName()); - $useUse = new UseUse($name); - $use = new Use_([$useUse]); + $useItem = new UseItem($name); + $use = new Use_([$useItem]); $use->type = $useType; return $use; } diff --git a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedGenericObjectType.php b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedGenericObjectType.php index 88dee113e..c43bb9cd8 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedGenericObjectType.php +++ b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedGenericObjectType.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\ValueObject\Type; -use PHPStan\TrinaryLogic; use PHPStan\Type\Generic\GenericObjectType; +use PHPStan\Type\IsSuperTypeOfResult; use PHPStan\Type\Type; /** * @api @@ -15,7 +15,7 @@ final class ShortenedGenericObjectType extends GenericObjectType * @var class-string * @readonly */ - private $fullyQualifiedName; + private string $fullyQualifiedName; /** * @param class-string $fullyQualifiedName */ @@ -24,7 +24,7 @@ public function __construct(string $shortName, array $types, string $fullyQualif $this->fullyQualifiedName = $fullyQualifiedName; parent::__construct($shortName, $types); } - public function isSuperTypeOf(Type $type) : TrinaryLogic + public function isSuperTypeOf(Type $type) : IsSuperTypeOfResult { $genericObjectType = new GenericObjectType($this->fullyQualifiedName, $this->getTypes()); return $genericObjectType->isSuperTypeOf($type); diff --git a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedObjectType.php b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedObjectType.php index 66626aa4d..768176f53 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedObjectType.php +++ b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/ShortenedObjectType.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\StaticTypeMapper\ValueObject\Type; -use PHPStan\TrinaryLogic; +use PHPStan\Type\IsSuperTypeOfResult; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; /** @@ -15,7 +15,7 @@ final class ShortenedObjectType extends ObjectType * @var class-string * @readonly */ - private $fullyQualifiedName; + private string $fullyQualifiedName; /** * @param class-string $fullyQualifiedName */ @@ -24,7 +24,7 @@ public function __construct(string $shortName, string $fullyQualifiedName) $this->fullyQualifiedName = $fullyQualifiedName; parent::__construct($shortName); } - public function isSuperTypeOf(Type $type) : TrinaryLogic + public function isSuperTypeOf(Type $type) : IsSuperTypeOfResult { $fullyQualifiedObjectType = new ObjectType($this->fullyQualifiedName); return $fullyQualifiedObjectType->isSuperTypeOf($type); diff --git a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/SimpleStaticType.php b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/SimpleStaticType.php index f6b934369..661adb531 100644 --- a/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/SimpleStaticType.php +++ b/vendor/rector/rector/src/StaticTypeMapper/ValueObject/Type/SimpleStaticType.php @@ -8,9 +8,8 @@ final class SimpleStaticType extends StaticType { /** * @readonly - * @var string */ - private $className; + private string $className; public function __construct(string $className) { $this->className = $className; diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php b/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php index 580402786..ac509d07a 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureFileFinder.php @@ -4,7 +4,7 @@ namespace Rector\Testing\Fixture; use Iterator; -use RectorPrefix202411\Symfony\Component\Finder\Finder; +use RectorPrefix202506\Symfony\Component\Finder\Finder; final class FixtureFileFinder { /** diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php b/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php index cf4c17d40..a85507d75 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureFileUpdater.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\Fixture; -use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem; final class FixtureFileUpdater { /** diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php b/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php index 9768a02b8..bddcc3ce7 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureSplitter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\Fixture; -use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem; /** * @api */ diff --git a/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php b/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php index 23e29807c..b749066b1 100644 --- a/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php +++ b/vendor/rector/rector/src/Testing/Fixture/FixtureTempFileDumper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\Fixture; -use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem; /** * @api used in tests */ diff --git a/vendor/rector/rector/src/Testing/PHPUnit/AbstractLazyTestCase.php b/vendor/rector/rector/src/Testing/PHPUnit/AbstractLazyTestCase.php index 9a7d10c49..c37b8ff56 100644 --- a/vendor/rector/rector/src/Testing/PHPUnit/AbstractLazyTestCase.php +++ b/vendor/rector/rector/src/Testing/PHPUnit/AbstractLazyTestCase.php @@ -8,10 +8,13 @@ use Rector\DependencyInjection\LazyContainerFactory; abstract class AbstractLazyTestCase extends TestCase { - /** - * @var \Rector\Config\RectorConfig|null - */ - protected static $rectorConfig; + protected static ?RectorConfig $rectorConfig = null; + protected function setUp() : void + { + // this is needed to have always the same preloaded nikic/php-parser classes + // in both bare AbstractLazyTestCase lazy tests and AbstractRectorTestCase tests + $this->includePreloadFilesAndScoperAutoload(); + } /** * @api * @param string[] $configFiles @@ -41,4 +44,22 @@ protected static function getContainer() : RectorConfig self::$rectorConfig->boot(); return self::$rectorConfig; } + protected function isWindows() : bool + { + return \strncasecmp(\PHP_OS, 'WIN', 3) === 0; + } + private function includePreloadFilesAndScoperAutoload() : void + { + if (\file_exists(__DIR__ . '/../../../preload.php')) { + if (\file_exists(__DIR__ . '/../../../vendor')) { + require_once __DIR__ . '/../../../preload.php'; + // test case in rector split package + } elseif (\file_exists(__DIR__ . '/../../../../../../vendor')) { + require_once __DIR__ . '/../../../preload-split-package.php'; + } + } + if (\file_exists(__DIR__ . '/../../../vendor/scoper-autoload.php')) { + require_once __DIR__ . '/../../../vendor/scoper-autoload.php'; + } + } } diff --git a/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php b/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php index 1c0390887..358556395 100644 --- a/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php +++ b/vendor/rector/rector/src/Testing/PHPUnit/AbstractRectorTestCase.php @@ -3,10 +3,10 @@ declare (strict_types=1); namespace Rector\Testing\PHPUnit; -use RectorPrefix202411\Illuminate\Container\RewindableGenerator; +use RectorPrefix202506\Illuminate\Container\RewindableGenerator; use Iterator; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Strings; use PHPUnit\Framework\ExpectationFailedException; use Rector\Application\ApplicationFileProcessor; use Rector\Autoloading\AdditionalAutoloader; @@ -32,22 +32,13 @@ */ abstract class AbstractRectorTestCase extends \Rector\Testing\PHPUnit\AbstractLazyTestCase implements RectorTestInterface { - /** - * @var \Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider - */ - private $dynamicSourceLocatorProvider; - /** - * @var \Rector\Application\ApplicationFileProcessor - */ - private $applicationFileProcessor; - /** - * @var string|null - */ - private $inputFilePath; + private DynamicSourceLocatorProvider $dynamicSourceLocatorProvider; + private ApplicationFileProcessor $applicationFileProcessor; + private ?string $inputFilePath = null; /** * @var array */ - private static $cacheByRuleAndConfig = []; + private static array $cacheByRuleAndConfig = []; /** * Restore default parameters */ @@ -64,7 +55,7 @@ public static function tearDownAfterClass() : void } protected function setUp() : void { - $this->includePreloadFilesAndScoperAutoload(); + parent::setUp(); $configFile = $this->provideConfigFilePath(); // cleanup all registered rectors, so you can use only the new ones $rectorConfig = self::getContainer(); @@ -111,11 +102,7 @@ protected static function yieldFilesFromDirectory(string $directory, string $suf { return FixtureFileFinder::yieldDirectory($directory, $suffix); } - protected function isWindows() : bool - { - return \strncasecmp(\PHP_OS, 'WIN', 3) === 0; - } - protected function doTestFile(string $fixtureFilePath) : void + protected function doTestFile(string $fixtureFilePath, bool $includeFixtureDirectoryAsSource = \false) : void { // prepare input file contents and expected file output contents $fixtureFileContents = FileSystem::read($fixtureFilePath); @@ -135,7 +122,16 @@ protected function doTestFile(string $fixtureFilePath) : void } // write temp file FileSystem::write($inputFilePath, $inputFileContents, null); - $this->doTestFileMatchesExpectedContent($inputFilePath, $inputFileContents, $expectedFileContents, $fixtureFilePath); + $this->doTestFileMatchesExpectedContent($inputFilePath, $inputFileContents, $expectedFileContents, $fixtureFilePath, $includeFixtureDirectoryAsSource); + } + protected function doTestFileExpectingWarningAboutRuleApplied(string $fixtureFilePath, string $expectedRuleApplied) : void + { + \ob_start(); + $this->doTestFile($fixtureFilePath); + $content = \ob_get_clean(); + $fixtureName = \basename($fixtureFilePath); + $testClass = static::class; + $this->assertSame(\PHP_EOL . 'WARNING: On fixture file "' . $fixtureName . '" for test "' . $testClass . '"' . \PHP_EOL . 'File not changed but some Rector rules applied:' . \PHP_EOL . ' * ' . $expectedRuleApplied . \PHP_EOL, $content); } private function forgetRectorsRules() : void { @@ -156,36 +152,25 @@ private function forgetRectorsRules() : void return $afterResolvingCallbacks; }); } - private function includePreloadFilesAndScoperAutoload() : void - { - if (\file_exists(__DIR__ . '/../../../preload.php')) { - if (\file_exists(__DIR__ . '/../../../vendor')) { - require_once __DIR__ . '/../../../preload.php'; - // test case in rector split package - } elseif (\file_exists(__DIR__ . '/../../../../../../vendor')) { - require_once __DIR__ . '/../../../preload-split-package.php'; - } - } - if (\file_exists(__DIR__ . '/../../../vendor/scoper-autoload.php')) { - require_once __DIR__ . '/../../../vendor/scoper-autoload.php'; - } - } - private function doTestFileMatchesExpectedContent(string $originalFilePath, string $inputFileContents, string $expectedFileContents, string $fixtureFilePath) : void + private function doTestFileMatchesExpectedContent(string $originalFilePath, string $inputFileContents, string $expectedFileContents, string $fixtureFilePath, bool $includeFixtureDirectoryAsSource) : void { SimpleParameterProvider::setParameter(Option::SOURCE, [$originalFilePath]); // the file is now changed (if any rule matches) - $rectorTestResult = $this->processFilePath($originalFilePath); + $rectorTestResult = $this->processFilePath($originalFilePath, $includeFixtureDirectoryAsSource); $changedContents = $rectorTestResult->getChangedContents(); $fixtureFilename = \basename($fixtureFilePath); $failureMessage = \sprintf('Failed on fixture file "%s"', $fixtureFilename); + $numAppliedRectorClasses = \count($rectorTestResult->getAppliedRectorClasses()); // give more context about used rules in case of set testing - if (\count($rectorTestResult->getAppliedRectorClasses()) > 1) { - $failureMessage .= \PHP_EOL . \PHP_EOL; - $failureMessage .= 'Applied Rector rules:' . \PHP_EOL; + $appliedRulesList = ''; + if ($numAppliedRectorClasses > 0) { foreach ($rectorTestResult->getAppliedRectorClasses() as $appliedRectorClass) { - $failureMessage .= ' * ' . $appliedRectorClass . \PHP_EOL; + $appliedRulesList .= ' * ' . $appliedRectorClass . \PHP_EOL; } } + if ($numAppliedRectorClasses > 1) { + $failureMessage .= \PHP_EOL . \PHP_EOL . 'Applied Rector rules:' . \PHP_EOL . $appliedRulesList; + } try { $this->assertSame($expectedFileContents, $changedContents, $failureMessage); } catch (ExpectationFailedException $exception) { @@ -193,10 +178,19 @@ private function doTestFileMatchesExpectedContent(string $originalFilePath, stri // if not exact match, check the regex version (useful for generated hashes/uuids in the code) $this->assertStringMatchesFormat($expectedFileContents, $changedContents, $failureMessage); } + if ($inputFileContents === $expectedFileContents && $numAppliedRectorClasses > 0) { + $failureMessage = \PHP_EOL . \sprintf('WARNING: On fixture file "%s" for test "%s"', $fixtureFilename, static::class) . \PHP_EOL . 'File not changed but some Rector rules applied:' . \PHP_EOL . $appliedRulesList; + echo $failureMessage; + } } - private function processFilePath(string $filePath) : RectorTestResult + private function processFilePath(string $filePath, bool $includeFixtureDirectoryAsSource) : RectorTestResult { - $this->dynamicSourceLocatorProvider->setFilePath($filePath); + if ($includeFixtureDirectoryAsSource) { + $fixtureDirectory = \dirname($filePath); + $this->dynamicSourceLocatorProvider->addDirectories([$fixtureDirectory]); + } else { + $this->dynamicSourceLocatorProvider->setFilePath($filePath); + } /** @var ConfigurationFactory $configurationFactory */ $configurationFactory = $this->make(ConfigurationFactory::class); $configuration = $configurationFactory->createForTests([$filePath]); diff --git a/vendor/rector/rector/src/Testing/PHPUnit/AbstractTestCase.php b/vendor/rector/rector/src/Testing/PHPUnit/AbstractTestCase.php deleted file mode 100644 index ae4395a0c..000000000 --- a/vendor/rector/rector/src/Testing/PHPUnit/AbstractTestCase.php +++ /dev/null @@ -1,34 +0,0 @@ - $type - * @return T - */ - protected function getService(string $type) : object - { - return $this->make($type); - } -} diff --git a/vendor/rector/rector/src/Testing/PHPUnit/ValueObject/RectorTestResult.php b/vendor/rector/rector/src/Testing/PHPUnit/ValueObject/RectorTestResult.php index 4d5623b6e..6b55a922d 100644 --- a/vendor/rector/rector/src/Testing/PHPUnit/ValueObject/RectorTestResult.php +++ b/vendor/rector/rector/src/Testing/PHPUnit/ValueObject/RectorTestResult.php @@ -12,14 +12,12 @@ final class RectorTestResult { /** * @readonly - * @var string */ - private $changedContents; + private string $changedContents; /** * @readonly - * @var \Rector\ValueObject\ProcessResult */ - private $processResult; + private ProcessResult $processResult; public function __construct(string $changedContents, ProcessResult $processResult) { $this->changedContents = $changedContents; @@ -35,7 +33,7 @@ public function getChangedContents() : string public function getAppliedRectorClasses() : array { $rectorClasses = []; - foreach ($this->processResult->getFileDiffs() as $fileDiff) { + foreach ($this->processResult->getFileDiffs(\false) as $fileDiff) { $rectorClasses = \array_merge($rectorClasses, $fileDiff->getRectorClasses()); } \sort($rectorClasses); diff --git a/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php b/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php index d69ef0f38..d3f0eea43 100644 --- a/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php +++ b/vendor/rector/rector/src/Testing/TestingParser/TestingParser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Testing\TestingParser; -use RectorPrefix202411\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\FileSystem; use PhpParser\Node; use Rector\Application\Provider\CurrentFileProvider; use Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator; @@ -17,24 +17,20 @@ final class TestingParser { /** * @readonly - * @var \Rector\PhpParser\Parser\RectorParser */ - private $rectorParser; + private RectorParser $rectorParser; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator */ - private $nodeScopeAndMetadataDecorator; + private NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator; /** * @readonly - * @var \Rector\Application\Provider\CurrentFileProvider */ - private $currentFileProvider; + private CurrentFileProvider $currentFileProvider; /** * @readonly - * @var \Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider */ - private $dynamicSourceLocatorProvider; + private DynamicSourceLocatorProvider $dynamicSourceLocatorProvider; public function __construct(RectorParser $rectorParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, CurrentFileProvider $currentFileProvider, DynamicSourceLocatorProvider $dynamicSourceLocatorProvider) { $this->rectorParser = $rectorParser; diff --git a/vendor/rector/rector/src/Util/ArrayParametersMerger.php b/vendor/rector/rector/src/Util/ArrayParametersMerger.php index ba1ef547e..4de0f3660 100644 --- a/vendor/rector/rector/src/Util/ArrayParametersMerger.php +++ b/vendor/rector/rector/src/Util/ArrayParametersMerger.php @@ -8,7 +8,7 @@ final class ArrayParametersMerger /** * Merges configurations. Left has higher priority than right one. * - * @autor David Grudl (https://davidgrudl.com) + * @author David Grudl (https://davidgrudl.com) * @source https://github.com/nette/di/blob/8eb90721a131262f17663e50aee0032a62d0ef08/src/DI/Config/Helpers.php#L31 * @param mixed $left * @param mixed $right @@ -17,9 +17,7 @@ final class ArrayParametersMerger public function merge($left, $right) { if (\is_array($left) && \is_array($right)) { - return $this->mergeLeftToRightWithCallable($left, $right, function ($leftValue, $rightValue) { - return $this->merge($leftValue, $rightValue); - }); + return $this->mergeLeftToRightWithCallable($left, $right, fn($leftValue, $rightValue) => $this->merge($leftValue, $rightValue)); } if ($left !== null) { return $left; diff --git a/vendor/rector/rector/src/Util/FileHasher.php b/vendor/rector/rector/src/Util/FileHasher.php index 27de016e0..eeae1f119 100644 --- a/vendor/rector/rector/src/Util/FileHasher.php +++ b/vendor/rector/rector/src/Util/FileHasher.php @@ -10,14 +10,14 @@ final class FileHasher { /** - * cryptographic insecure hasing of a string + * cryptographic insecure hashing of a string */ public function hash(string $string) : string { return \hash($this->getAlgo(), $string); } /** - * cryptographic insecure hasing of files + * cryptographic insecure hashing of files * * @param string[] $files */ diff --git a/vendor/rector/rector/src/Util/MemoryLimiter.php b/vendor/rector/rector/src/Util/MemoryLimiter.php index 716344f8d..1d809ac7e 100644 --- a/vendor/rector/rector/src/Util/MemoryLimiter.php +++ b/vendor/rector/rector/src/Util/MemoryLimiter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\Exception\Configuration\InvalidConfigurationException; use Rector\ValueObject\Configuration; /** diff --git a/vendor/rector/rector/src/Util/NewLineSplitter.php b/vendor/rector/rector/src/Util/NewLineSplitter.php index 65fdc1497..c19ab9d9e 100644 --- a/vendor/rector/rector/src/Util/NewLineSplitter.php +++ b/vendor/rector/rector/src/Util/NewLineSplitter.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; final class NewLineSplitter { /** diff --git a/vendor/rector/rector/src/Util/NodePrinter.php b/vendor/rector/rector/src/Util/NodePrinter.php index d2c5cb618..4640543be 100644 --- a/vendor/rector/rector/src/Util/NodePrinter.php +++ b/vendor/rector/rector/src/Util/NodePrinter.php @@ -3,17 +3,16 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use Rector\CustomRules\SimpleNodeDumper; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; final class NodePrinter { /** * @readonly - * @var \Symfony\Component\Console\Style\SymfonyStyle */ - private $symfonyStyle; + private SymfonyStyle $symfonyStyle; /** * @var string * @see https://regex101.com/r/Fe8n73/1 @@ -42,12 +41,8 @@ public function printNodes($nodes) : void private function addConsoleColors(string $contents) : string { // decorate class names - $colorContents = Strings::replace($contents, self::CLASS_NAME_REGEX, static function (array $match) : string { - return '' . $match['class_name'] . '('; - }); + $colorContents = Strings::replace($contents, self::CLASS_NAME_REGEX, static fn(array $match): string => '' . $match['class_name'] . '('); // decorate keys - return Strings::replace($colorContents, self::PROPERTY_KEY_REGEX, static function (array $match) : string { - return '' . $match['key'] . ':'; - }); + return Strings::replace($colorContents, self::PROPERTY_KEY_REGEX, static fn(array $match): string => '' . $match['key'] . ':'); } } diff --git a/vendor/rector/rector/src/Util/StringUtils.php b/vendor/rector/rector/src/Util/StringUtils.php index b585bb202..79785f036 100644 --- a/vendor/rector/rector/src/Util/StringUtils.php +++ b/vendor/rector/rector/src/Util/StringUtils.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Util; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; final class StringUtils { public static function isMatch(string $value, string $regex) : bool diff --git a/vendor/rector/rector/src/Validation/RectorAssert.php b/vendor/rector/rector/src/Validation/RectorAssert.php index d6c08ebb4..7aa8a1d19 100644 --- a/vendor/rector/rector/src/Validation/RectorAssert.php +++ b/vendor/rector/rector/src/Validation/RectorAssert.php @@ -4,7 +4,7 @@ namespace Rector\Validation; use Rector\Util\StringUtils; -use RectorPrefix202411\Webmozart\Assert\InvalidArgumentException; +use RectorPrefix202506\Webmozart\Assert\InvalidArgumentException; /** * @see \Rector\Tests\Validation\RectorAssertTest */ diff --git a/vendor/rector/rector/src/Validation/RectorConfigValidator.php b/vendor/rector/rector/src/Validation/RectorConfigValidator.php index c12fff6e5..fbae7c7ba 100644 --- a/vendor/rector/rector/src/Validation/RectorConfigValidator.php +++ b/vendor/rector/rector/src/Validation/RectorConfigValidator.php @@ -52,7 +52,7 @@ public static function ensureRectorRulesExist(array $skip) : void foreach ($nonExistingRules as $nonExistingRule) { $nonExistingRulesString .= ' * ' . $nonExistingRule . \PHP_EOL; } - throw new ShouldNotHappenException('These rules from "$rectorConfig->skip()" does not exist - remove them or fix their names:' . \PHP_EOL . $nonExistingRulesString); + throw new ShouldNotHappenException('These rules from "$rectorConfig->skip()" do not exist - remove them or fix their names:' . \PHP_EOL . $nonExistingRulesString); } /** * @param mixed $value diff --git a/vendor/rector/rector/src/ValueObject/Application/File.php b/vendor/rector/rector/src/ValueObject/Application/File.php index bad7b1e65..10b02a1a0 100644 --- a/vendor/rector/rector/src/ValueObject/Application/File.php +++ b/vendor/rector/rector/src/ValueObject/Application/File.php @@ -5,6 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\InlineHTML; +use PhpParser\NodeFinder; +use PhpParser\Token; use Rector\ChangesReporting\ValueObject\RectorWithLineChange; use Rector\Exception\ShouldNotHappenException; use Rector\ValueObject\Reporting\FileDiff; @@ -12,42 +15,35 @@ final class File { /** * @readonly - * @var string */ - private $filePath; - /** - * @var string - */ - private $fileContent; - /** - * @var bool - */ - private $hasChanged = \false; + private string $filePath; + private string $fileContent; + private bool $hasChanged = \false; /** * @readonly - * @var string - */ - private $originalFileContent; - /** - * @var \Rector\ValueObject\Reporting\FileDiff|null */ - private $fileDiff; + private string $originalFileContent; + private ?FileDiff $fileDiff = null; /** * @var Node[] */ - private $oldStmts = []; + private array $oldStmts = []; /** * @var Node[] */ - private $newStmts = []; + private array $newStmts = []; /** - * @var array + * @var array */ - private $oldTokens = []; + private array $oldTokens = []; /** * @var RectorWithLineChange[] */ - private $rectorWithLineChanges = []; + private array $rectorWithLineChanges = []; + /** + * Cached result per file + */ + private ?bool $containsHtml = null; public function __construct(string $filePath, string $fileContent) { $this->filePath = $filePath; @@ -93,7 +89,7 @@ public function getFileDiff() : ?FileDiff /** * @param Stmt[] $newStmts * @param Stmt[] $oldStmts - * @param array $oldTokens + * @param array $oldTokens */ public function hydrateStmtsAndTokens(array $newStmts, array $oldStmts, array $oldTokens) : void { @@ -119,7 +115,7 @@ public function getNewStmts() : array return $this->newStmts; } /** - * @return array + * @return array */ public function getOldTokens() : array { @@ -143,4 +139,13 @@ public function getRectorWithLineChanges() : array { return $this->rectorWithLineChanges; } + public function containsHTML() : bool + { + if ($this->containsHtml !== null) { + return $this->containsHtml; + } + $nodeFinder = new NodeFinder(); + $this->containsHtml = (bool) $nodeFinder->findFirstInstanceOf($this->oldStmts, InlineHTML::class); + return $this->containsHtml; + } } diff --git a/vendor/rector/rector/src/ValueObject/Bootstrap/BootstrapConfigs.php b/vendor/rector/rector/src/ValueObject/Bootstrap/BootstrapConfigs.php index 4d7e91b5c..1d44c1c5c 100644 --- a/vendor/rector/rector/src/ValueObject/Bootstrap/BootstrapConfigs.php +++ b/vendor/rector/rector/src/ValueObject/Bootstrap/BootstrapConfigs.php @@ -7,14 +7,13 @@ final class BootstrapConfigs { /** * @readonly - * @var string|null */ - private $mainConfigFile; + private ?string $mainConfigFile; /** * @var string[] * @readonly */ - private $setConfigFiles; + private array $setConfigFiles; /** * @param string[] $setConfigFiles */ diff --git a/vendor/rector/rector/src/ValueObject/Configuration.php b/vendor/rector/rector/src/ValueObject/Configuration.php index 87c333e00..8390ea882 100644 --- a/vendor/rector/rector/src/ValueObject/Configuration.php +++ b/vendor/rector/rector/src/ValueObject/Configuration.php @@ -4,44 +4,42 @@ namespace Rector\ValueObject; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; -use RectorPrefix202411\Webmozart\Assert\Assert; +use Rector\Configuration\Option; +use Rector\Configuration\Parameter\SimpleParameterProvider; +use Rector\ValueObject\Configuration\LevelOverflow; +use RectorPrefix202506\Webmozart\Assert\Assert; final class Configuration { /** * @readonly - * @var bool */ - private $isDryRun = \false; + private bool $isDryRun = \false; /** * @readonly - * @var bool */ - private $showProgressBar = \true; + private bool $showProgressBar = \true; /** * @readonly - * @var bool */ - private $shouldClearCache = \false; + private bool $shouldClearCache = \false; /** * @readonly - * @var string */ - private $outputFormat = ConsoleOutputFormatter::NAME; + private string $outputFormat = ConsoleOutputFormatter::NAME; /** * @var string[] * @readonly */ - private $fileExtensions = ['php']; + private array $fileExtensions = ['php']; /** * @var string[] * @readonly */ - private $paths = []; + private array $paths = []; /** * @readonly - * @var bool */ - private $showDiffs = \true; + private bool $showDiffs = \true; /** * @readonly * @var string|null @@ -54,9 +52,8 @@ final class Configuration private $parallelIdentifier = null; /** * @readonly - * @var bool */ - private $isParallel = \false; + private bool $isParallel = \false; /** * @readonly * @var string|null @@ -64,19 +61,31 @@ final class Configuration private $memoryLimit = null; /** * @readonly - * @var bool */ - private $isDebug = \false; + private bool $isDebug = \false; /** * @readonly - * @var bool */ - private $reportingWithRealPath = \false; + private bool $reportingWithRealPath = \false; + /** + * @readonly + */ + private ?string $onlyRule = null; + /** + * @readonly + */ + private ?string $onlySuffix = null; + /** + * @var LevelOverflow[] + * @readonly + */ + private array $levelOverflows = []; /** * @param string[] $fileExtensions * @param string[] $paths + * @param LevelOverflow[] $levelOverflows */ - 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 $reportingWithRealPath = \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 $reportingWithRealPath = \false, ?string $onlyRule = null, ?string $onlySuffix = null, array $levelOverflows = []) { $this->isDryRun = $isDryRun; $this->showProgressBar = $showProgressBar; @@ -91,6 +100,9 @@ public function __construct(bool $isDryRun = \false, bool $showProgressBar = \tr $this->memoryLimit = $memoryLimit; $this->isDebug = $isDebug; $this->reportingWithRealPath = $reportingWithRealPath; + $this->onlyRule = $onlyRule; + $this->onlySuffix = $onlySuffix; + $this->levelOverflows = $levelOverflows; } public function isDryRun() : bool { @@ -112,6 +124,10 @@ public function getFileExtensions() : array Assert::notEmpty($this->fileExtensions); return $this->fileExtensions; } + public function getOnlyRule() : ?string + { + return $this->onlyRule; + } /** * @return string[] */ @@ -151,4 +167,25 @@ public function isReportingWithRealPath() : bool { return $this->reportingWithRealPath; } + public function getOnlySuffix() : ?string + { + return $this->onlySuffix; + } + /** + * @return LevelOverflow[] + */ + public function getLevelOverflows() : array + { + return $this->levelOverflows; + } + /** + * @return string[] + */ + public function getBothSetAndRulesDuplicatedRegistrations() : array + { + $rootStandaloneRegisteredRules = SimpleParameterProvider::provideArrayParameter(Option::ROOT_STANDALONE_REGISTERED_RULES); + $setRegisteredRules = SimpleParameterProvider::provideArrayParameter(Option::SET_REGISTERED_RULES); + $ruleDuplicatedRegistrations = \array_intersect($rootStandaloneRegisteredRules, $setRegisteredRules); + return \array_unique($ruleDuplicatedRegistrations); + } } diff --git a/vendor/rector/rector/src/ValueObject/Configuration/LevelOverflow.php b/vendor/rector/rector/src/ValueObject/Configuration/LevelOverflow.php new file mode 100644 index 000000000..a7d4f79c3 --- /dev/null +++ b/vendor/rector/rector/src/ValueObject/Configuration/LevelOverflow.php @@ -0,0 +1,56 @@ +configurationName = $configurationName; + $this->level = $level; + $this->ruleCount = $ruleCount; + $this->suggestedRuleset = $suggestedRuleset; + $this->suggestedSetListConstant = $suggestedSetListConstant; + } + public function getConfigurationName() : string + { + return $this->configurationName; + } + public function getLevel() : int + { + return $this->level; + } + public function getRuleCount() : int + { + return $this->ruleCount; + } + public function getSuggestedRuleset() : string + { + return $this->suggestedRuleset; + } + public function getSuggestedSetListConstant() : string + { + return $this->suggestedSetListConstant; + } +} diff --git a/vendor/rector/rector/src/ValueObject/Error/SystemError.php b/vendor/rector/rector/src/ValueObject/Error/SystemError.php index 9b40d61d4..2f9716bb1 100644 --- a/vendor/rector/rector/src/ValueObject/Error/SystemError.php +++ b/vendor/rector/rector/src/ValueObject/Error/SystemError.php @@ -3,15 +3,15 @@ declare (strict_types=1); namespace Rector\ValueObject\Error; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\Parallel\ValueObject\BridgeItem; -use RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface; +use RectorPrefix202506\Symplify\EasyParallel\Contract\SerializableInterface; final class SystemError implements SerializableInterface { /** * @readonly - * @var string */ - private $message; + private string $message; /** * @readonly * @var string|null @@ -38,10 +38,6 @@ public function getMessage() : string { return $this->message; } - public function getFile() : ?string - { - return $this->relativeFilePath; - } public function getLine() : ?int { return $this->line; @@ -72,9 +68,8 @@ public function jsonSerialize() : array } /** * @param mixed[] $json - * @return $this */ - public static function decode(array $json) : \RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface + public static function decode(array $json) : self { return new self($json[BridgeItem::MESSAGE], $json[BridgeItem::RELATIVE_FILE_PATH], $json[BridgeItem::LINE], $json[BridgeItem::RECTOR_CLASS]); } @@ -82,4 +77,12 @@ public function getRectorClass() : ?string { return $this->rectorClass; } + public function getRectorShortClass() : ?string + { + $rectorClass = $this->rectorClass; + if ($rectorClass !== null && $rectorClass !== '' && $rectorClass !== '0') { + return (string) Strings::after($rectorClass, '\\', -1); + } + return null; + } } diff --git a/vendor/rector/rector/src/ValueObject/FileProcessResult.php b/vendor/rector/rector/src/ValueObject/FileProcessResult.php index 0ad0a13c2..b3da24c1a 100644 --- a/vendor/rector/rector/src/ValueObject/FileProcessResult.php +++ b/vendor/rector/rector/src/ValueObject/FileProcessResult.php @@ -5,19 +5,18 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class FileProcessResult { /** * @var SystemError[] * @readonly */ - private $systemErrors; + private array $systemErrors; /** * @readonly - * @var \Rector\ValueObject\Reporting\FileDiff|null */ - private $fileDiff; + private ?FileDiff $fileDiff; /** * @param SystemError[] $systemErrors */ diff --git a/vendor/rector/rector/src/ValueObject/FuncCallAndExpr.php b/vendor/rector/rector/src/ValueObject/FuncCallAndExpr.php index 2bdb1ea8a..c345748ad 100644 --- a/vendor/rector/rector/src/ValueObject/FuncCallAndExpr.php +++ b/vendor/rector/rector/src/ValueObject/FuncCallAndExpr.php @@ -9,14 +9,12 @@ final class FuncCallAndExpr { /** * @readonly - * @var \PhpParser\Node\Expr\FuncCall */ - private $funcCall; + private FuncCall $funcCall; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $expr; + private Expr $expr; public function __construct(FuncCall $funcCall, Expr $expr) { $this->funcCall = $funcCall; diff --git a/vendor/rector/rector/src/ValueObject/PhpVersion.php b/vendor/rector/rector/src/ValueObject/PhpVersion.php index cf6fdc70a..c80dce4b1 100644 --- a/vendor/rector/rector/src/ValueObject/PhpVersion.php +++ b/vendor/rector/rector/src/ValueObject/PhpVersion.php @@ -68,6 +68,10 @@ final class PhpVersion * @var int */ public const PHP_84 = 80400; + /** + * @var int + */ + public const PHP_85 = 80500; /** * @var int */ diff --git a/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php b/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php index ef7271a67..b3a54a18f 100644 --- a/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php +++ b/vendor/rector/rector/src/ValueObject/PhpVersionFeature.php @@ -240,6 +240,11 @@ final class PhpVersionFeature * @var int */ public const ARRAY_KEY_FIRST_LAST = \Rector\ValueObject\PhpVersion::PHP_73; + /** + * @var int + * @see https://php.watch/versions/8.5/array_first-array_last + */ + public const ARRAY_FIRST_LAST = \Rector\ValueObject\PhpVersion::PHP_85; /** * @var int */ @@ -504,6 +509,11 @@ final class PhpVersionFeature * @var int */ public const READONLY_CLASS = \Rector\ValueObject\PhpVersion::PHP_82; + /** + * @see https://www.php.net/manual/en/migration83.new-features.php#migration83.new-features.core.readonly-modifier-improvements + * @var int + */ + public const READONLY_ANONYMOUS_CLASS = \Rector\ValueObject\PhpVersion::PHP_83; /** * @see https://wiki.php.net/rfc/mixed_type_v2 * @var int @@ -550,11 +560,31 @@ final class PhpVersionFeature * @var int */ public const TYPED_CLASS_CONSTANTS = \Rector\ValueObject\PhpVersion::PHP_83; + /** + * @see https://wiki.php.net/rfc/dynamic_class_constant_fetch + * @var int + */ + public const DYNAMIC_CLASS_CONST_FETCH = \Rector\ValueObject\PhpVersion::PHP_83; /** * @see https://wiki.php.net/rfc/deprecate-implicitly-nullable-types * @var int */ public const DEPRECATE_IMPLICIT_NULLABLE_PARAM_TYPE = \Rector\ValueObject\PhpVersion::PHP_84; + /** + * @see https://wiki.php.net/rfc/new_without_parentheses + * @var int + */ + public const NEW_METHOD_CALL_WITHOUT_PARENTHESES = \Rector\ValueObject\PhpVersion::PHP_84; + /** + * @see https://wiki.php.net/rfc/correctly_name_the_rounding_mode_and_make_it_an_enum + * @var int + */ + public const ROUNDING_MODES = \Rector\ValueObject\PhpVersion::PHP_84; + /** + * @see https://php.watch/versions/8.4/csv-functions-escape-parameter + * @var int + */ + public const REQUIRED_ESCAPE_PARAMETER = \Rector\ValueObject\PhpVersion::PHP_84; /** * @see https://www.php.net/manual/en/migration83.deprecated.php#migration83.deprecated.ldap * @var int @@ -566,4 +596,9 @@ final class PhpVersionFeature * @var int */ public const DEPRECATE_GET_CLASS_WITHOUT_ARGS = \Rector\ValueObject\PhpVersion::PHP_83; + /** + * @see https://wiki.php.net/rfc/deprecated_attribute + * @var int + */ + public const DEPRECATED_ATTRIBUTE = \Rector\ValueObject\PhpVersion::PHP_84; } diff --git a/vendor/rector/rector/src/ValueObject/ProcessResult.php b/vendor/rector/rector/src/ValueObject/ProcessResult.php index 234bd9a28..b85116c46 100644 --- a/vendor/rector/rector/src/ValueObject/ProcessResult.php +++ b/vendor/rector/rector/src/ValueObject/ProcessResult.php @@ -5,18 +5,18 @@ use Rector\ValueObject\Error\SystemError; use Rector\ValueObject\Reporting\FileDiff; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class ProcessResult { /** * @var SystemError[] */ - private $systemErrors; + private array $systemErrors; /** * @var FileDiff[] * @readonly */ - private $fileDiffs; + private array $fileDiffs; /** * @param SystemError[] $systemErrors * @param FileDiff[] $fileDiffs @@ -38,8 +38,11 @@ public function getSystemErrors() : array /** * @return FileDiff[] */ - public function getFileDiffs() : array + public function getFileDiffs(bool $onlyWithChanges = \true) : array { + if ($onlyWithChanges) { + return \array_filter($this->fileDiffs, fn(FileDiff $fileDiff): bool => $fileDiff->getDiff() !== ''); + } return $this->fileDiffs; } /** diff --git a/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php b/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php index 75a1c02dd..93b002ee2 100644 --- a/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php +++ b/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php @@ -3,43 +3,42 @@ declare (strict_types=1); namespace Rector\ValueObject\Reporting; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\ChangesReporting\ValueObject\RectorWithLineChange; use Rector\Contract\Rector\RectorInterface; use Rector\Parallel\ValueObject\BridgeItem; -use RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symplify\EasyParallel\Contract\SerializableInterface; +use RectorPrefix202506\Webmozart\Assert\Assert; final class FileDiff implements SerializableInterface { /** * @readonly - * @var string */ - private $relativeFilePath; + private string $relativeFilePath; /** * @readonly - * @var string */ - private $diff; + private string $diff; /** * @readonly - * @var string */ - private $diffConsoleFormatted; + private string $diffConsoleFormatted; /** * @var RectorWithLineChange[] * @readonly */ - private $rectorsWithLineChanges = []; + private array $rectorsWithLineChanges = []; /** * @var string - * @se https://regex101.com/r/AUPIX4/1 + * @see https://en.wikipedia.org/wiki/Diff#Unified_format + * @see https://regex101.com/r/AUPIX4/2 */ - private const FIRST_LINE_REGEX = '#@@(.*?)(?<' . self::FIRST_LINE_KEY . '>\\d+)(.*?)@@#'; + private const DIFF_HUNK_HEADER_REGEX = '#@@(.*?)(?<' . self::FIRST_LINE_KEY . '>\\d+)(,(?<' . self::LINE_RANGE_KEY . '>\\d+))?(.*?)@@#'; /** * @var string */ private const FIRST_LINE_KEY = 'first_line'; + private const LINE_RANGE_KEY = 'line_range'; /** * @param RectorWithLineChange[] $rectorsWithLineChanges */ @@ -98,12 +97,27 @@ public function getRectorClasses() : array } public function getFirstLineNumber() : ?int { - $match = Strings::match($this->diff, self::FIRST_LINE_REGEX); + $match = Strings::match($this->diff, self::DIFF_HUNK_HEADER_REGEX); // probably some error in diff if (!isset($match[self::FIRST_LINE_KEY])) { return null; } - return (int) $match[self::FIRST_LINE_KEY] - 1; + return (int) $match[self::FIRST_LINE_KEY]; + } + public function getLastLineNumber() : ?int + { + $match = Strings::match($this->diff, self::DIFF_HUNK_HEADER_REGEX); + $firstLine = $this->getFirstLineNumber(); + // probably some error in diff + if (!isset($match[self::LINE_RANGE_KEY])) { + return $firstLine; + } + // line range is not mandatory + if ($match[self::LINE_RANGE_KEY] === '') { + return $firstLine; + } + $lineRange = (int) $match[self::LINE_RANGE_KEY]; + return $firstLine + $lineRange; } /** * @return array{relative_file_path: string, diff: string, diff_console_formatted: string, rectors_with_line_changes: RectorWithLineChange[]} @@ -114,9 +128,8 @@ public function jsonSerialize() : array } /** * @param array $json - * @return $this */ - public static function decode(array $json) : \RectorPrefix202411\Symplify\EasyParallel\Contract\SerializableInterface + public static function decode(array $json) : self { $rectorWithLineChanges = []; foreach ($json[BridgeItem::RECTORS_WITH_LINE_CHANGES] as $rectorWithLineChangesJson) { diff --git a/vendor/rector/rector/src/ValueObject/SprintfStringAndArgs.php b/vendor/rector/rector/src/ValueObject/SprintfStringAndArgs.php index 0e2c54657..d3562f399 100644 --- a/vendor/rector/rector/src/ValueObject/SprintfStringAndArgs.php +++ b/vendor/rector/rector/src/ValueObject/SprintfStringAndArgs.php @@ -9,14 +9,13 @@ final class SprintfStringAndArgs { /** * @readonly - * @var \PhpParser\Node\Scalar\String_ */ - private $string; + private String_ $string; /** * @var Expr[] * @readonly */ - private $arrayItems; + private array $arrayItems; /** * @param Expr[] $arrayItems */ diff --git a/vendor/rector/rector/src/ValueObject/Visibility.php b/vendor/rector/rector/src/ValueObject/Visibility.php index c8f7aa9b3..a3fb27e7e 100644 --- a/vendor/rector/rector/src/ValueObject/Visibility.php +++ b/vendor/rector/rector/src/ValueObject/Visibility.php @@ -3,35 +3,35 @@ declare (strict_types=1); namespace Rector\ValueObject; -use PhpParser\Node\Stmt\Class_; +use PhpParser\Modifiers; final class Visibility { /** * @var int */ - public const PUBLIC = Class_::MODIFIER_PUBLIC; + public const PUBLIC = Modifiers::PUBLIC; /** * @var int */ - public const PROTECTED = Class_::MODIFIER_PROTECTED; + public const PROTECTED = Modifiers::PROTECTED; /** * @var int */ - public const PRIVATE = Class_::MODIFIER_PRIVATE; + public const PRIVATE = Modifiers::PRIVATE; /** * @var int */ - public const STATIC = Class_::MODIFIER_STATIC; + public const STATIC = Modifiers::STATIC; /** * @var int */ - public const ABSTRACT = Class_::MODIFIER_ABSTRACT; + public const ABSTRACT = Modifiers::ABSTRACT; /** * @var int */ - public const FINAL = Class_::MODIFIER_FINAL; + public const FINAL = Modifiers::FINAL; /** * @var int */ - public const READONLY = Class_::MODIFIER_READONLY; + public const READONLY = Modifiers::READONLY; } diff --git a/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php b/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php index 548124e5e..01e1b48a2 100644 --- a/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php +++ b/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php @@ -12,19 +12,16 @@ final class ClassMethodParamVendorLockResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionResolver $reflectionResolver, FilePathHelper $filePathHelper) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php b/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php index 1b2e515d9..7c70f83bd 100644 --- a/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php +++ b/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php @@ -6,7 +6,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; -use PHPStan\Reflection\FunctionVariantWithPhpDocs; +use PHPStan\Reflection\ExtendedFunctionVariant; use PHPStan\Reflection\MethodReflection; use PHPStan\Type\MixedType; use Rector\FileSystem\FilePathHelper; @@ -18,24 +18,20 @@ final class ClassMethodReturnTypeOverrideGuard { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\FileSystem\FilePathHelper */ - private $filePathHelper; + private FilePathHelper $filePathHelper; /** * @readonly - * @var \Rector\NodeAnalyzer\MagicClassMethodAnalyzer */ - private $magicClassMethodAnalyzer; + private MagicClassMethodAnalyzer $magicClassMethodAnalyzer; public function __construct(ReflectionResolver $reflectionResolver, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, FilePathHelper $filePathHelper, MagicClassMethodAnalyzer $magicClassMethodAnalyzer) { $this->reflectionResolver = $reflectionResolver; @@ -73,7 +69,7 @@ private function isReturnTypeChangeAllowed(ClassMethod $classMethod, Scope $scop return !$this->parentClassMethodTypeOverrideGuard->hasParentClassMethod($classMethod); } $parametersAcceptor = ParametersAcceptorSelectorVariantsWrapper::select($parentClassMethodReflection, $classMethod, $scope); - if ($parametersAcceptor instanceof FunctionVariantWithPhpDocs && !$parametersAcceptor->getNativeReturnType() instanceof MixedType) { + if ($parametersAcceptor instanceof ExtendedFunctionVariant && !$parametersAcceptor->getNativeReturnType() instanceof MixedType) { return \false; } $classReflection = $parentClassMethodReflection->getDeclaringClass(); diff --git a/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnVendorLockResolver.php b/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnVendorLockResolver.php index 4e96aefa6..83bafd1b7 100644 --- a/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnVendorLockResolver.php +++ b/vendor/rector/rector/src/VendorLocker/NodeVendorLocker/ClassMethodReturnVendorLockResolver.php @@ -5,7 +5,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\ClassReflection; -use PHPStan\Reflection\FunctionVariantWithPhpDocs; +use PHPStan\Reflection\ExtendedFunctionVariant; use PHPStan\Type\MixedType; use Rector\NodeAnalyzer\MagicClassMethodAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; @@ -14,19 +14,16 @@ final class ClassMethodReturnVendorLockResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\MagicClassMethodAnalyzer */ - private $magicClassMethodAnalyzer; + private MagicClassMethodAnalyzer $magicClassMethodAnalyzer; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionResolver $reflectionResolver, MagicClassMethodAnalyzer $magicClassMethodAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; @@ -64,7 +61,7 @@ private function isVendorLockedByAncestors(ClassReflection $classReflection, str } $parentClassMethodReflection = $ancestorClassReflections->getNativeMethod($methodName); $parametersAcceptor = $parentClassMethodReflection->getVariants()[0]; - if (!$parametersAcceptor instanceof FunctionVariantWithPhpDocs) { + if (!$parametersAcceptor instanceof ExtendedFunctionVariant) { continue; } // here we count only on strict types, not on docs diff --git a/vendor/rector/rector/src/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/vendor/rector/rector/src/VendorLocker/ParentClassMethodTypeOverrideGuard.php index 552c89207..b6f4e34ad 100644 --- a/vendor/rector/rector/src/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/vendor/rector/rector/src/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\VendorLocker; +use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\MethodReflection; @@ -17,29 +18,24 @@ final class ParentClassMethodTypeOverrideGuard { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator */ - private $typeComparator; + private TypeComparator $typeComparator; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\Reflection\ClassReflectionAnalyzer */ - private $classReflectionAnalyzer; + private ClassReflectionAnalyzer $classReflectionAnalyzer; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionResolver $reflectionResolver, TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper, ClassReflectionAnalyzer $classReflectionAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; @@ -75,7 +71,7 @@ public function getParentClassMethod($classMethod) : ?MethodReflection } public function shouldSkipReturnTypeChange(ClassMethod $classMethod, Type $parentType) : bool { - if ($classMethod->returnType === null) { + if (!$classMethod->returnType instanceof Node) { return \false; } $currentReturnType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($classMethod->returnType); @@ -118,6 +114,12 @@ private function resolveParentClassMethod($classMethod) : ?MethodReflection } return $interfaceReflection->getNativeMethod($methodName); } + foreach ($classReflection->getTraits() as $traitReflection) { + if (!$traitReflection->hasNativeMethod($methodName)) { + continue; + } + return $traitReflection->getNativeMethod($methodName); + } return null; } private function hasClassParent(ClassReflection $classReflection) : bool diff --git a/vendor/rector/rector/src/VersionBonding/PhpVersionedFilter.php b/vendor/rector/rector/src/VersionBonding/PhpVersionedFilter.php index fbf24fff4..ffdbda6fc 100644 --- a/vendor/rector/rector/src/VersionBonding/PhpVersionedFilter.php +++ b/vendor/rector/rector/src/VersionBonding/PhpVersionedFilter.php @@ -12,22 +12,20 @@ final class PhpVersionedFilter { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\Php\PolyfillPackagesProvider */ - private $polyfillPackagesProvider; + private PolyfillPackagesProvider $polyfillPackagesProvider; public function __construct(PhpVersionProvider $phpVersionProvider, PolyfillPackagesProvider $polyfillPackagesProvider) { $this->phpVersionProvider = $phpVersionProvider; $this->polyfillPackagesProvider = $polyfillPackagesProvider; } /** - * @param array $rectors - * @return array + * @param list $rectors + * @return list */ public function filter(array $rectors) : array { diff --git a/vendor/rector/rector/src/functions/node_helper.php b/vendor/rector/rector/src/functions/node_helper.php index 520027530..2b27366ed 100644 --- a/vendor/rector/rector/src/functions/node_helper.php +++ b/vendor/rector/rector/src/functions/node_helper.php @@ -1,14 +1,14 @@ make(SymfonyStyleFactory::class)->create(); + $rectorStyle = Container::getInstance()->make(SymfonyStyleFactory::class)->create(); // we turn up the verbosity so it's visible in tests overriding the // default which is to be quite during tests - $symfonyStyle->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); - $symfonyStyle->newLine(); - $nodePrinter = new NodePrinter($symfonyStyle); + $rectorStyle->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); + $rectorStyle->newLine(); + $nodePrinter = new NodePrinter($rectorStyle); $nodePrinter->printNodes($node); } } diff --git a/vendor/rector/rector/stubs-rector/Internal/NativeClasses.php b/vendor/rector/rector/stubs-rector/Internal/NativeClasses.php index 8ab696cc1..b3226f757 100644 --- a/vendor/rector/rector/stubs-rector/Internal/NativeClasses.php +++ b/vendor/rector/rector/stubs-rector/Internal/NativeClasses.php @@ -11,6 +11,42 @@ public function getTypes() } } +if (PHP_VERSION_ID < 80000 && ! class_exists('ReflectionAttribute', false)) { + class ReflectionAttribute + { + + public const IS_INSTANCEOF = 2; + + public function getName(): string + { + } + + public function getTarget(): int + { + } + + public function isRepeated(): bool + { + } + + public function getArguments(): array + { + } + + public function newInstance(): object + { + } + + private function __clone() + { + } + + private function __construct() + { + } + } +} + if (PHP_VERSION_ID < 80000 && ! class_exists('Attribute', false)) { #[Attribute(Attribute::TARGET_CLASS)] class Attribute @@ -78,3 +114,16 @@ final class ReturnTypeWillChange { } } + +if (PHP_VERSION_ID < 80100 && ! class_exists('ReflectionIntersectionType', false)) { + class ReflectionIntersectionType extends ReflectionType + { + + /** @return ReflectionType[] */ + public function getTypes() + { + return []; + } + + } +} diff --git a/vendor/rector/rector/templates/custom-rule/utils/rector/src/Rector/__Name__.php b/vendor/rector/rector/templates/custom-rule/utils/rector/src/Rector/__Name__.php index d4bf30ee8..fbbccf28b 100644 --- a/vendor/rector/rector/templates/custom-rule/utils/rector/src/Rector/__Name__.php +++ b/vendor/rector/rector/templates/custom-rule/utils/rector/src/Rector/__Name__.php @@ -6,29 +6,12 @@ use PhpParser\Node; use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; -use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\TypeDeclaration\Rector\__Name__\__Name__Test */ final class __Name__ extends AbstractRector { - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('// @todo fill the description', [ - new CodeSample( - <<<'CODE_SAMPLE' -// @todo fill code before -CODE_SAMPLE - , - <<<'CODE_SAMPLE' -// @todo fill code after -CODE_SAMPLE - ), - ]); - } - /** * @return array> */ diff --git a/vendor/rector/rector/templates/rector.php.dist b/vendor/rector/rector/templates/rector.php.dist index 66de15a7c..93ac72766 100644 --- a/vendor/rector/rector/templates/rector.php.dist +++ b/vendor/rector/rector/templates/rector.php.dist @@ -10,4 +10,6 @@ __PATHS__ ]) // uncomment to reach your current PHP version // ->withPhpSets() - ->withTypeCoverageLevel(0); + ->withTypeCoverageLevel(0) + ->withDeadCodeLevel(0) + ->withCodeQualityLevel(0); diff --git a/vendor/rector/rector/vendor/autoload.php b/vendor/rector/rector/vendor/autoload.php index c22dc0f0f..0e665d8c4 100644 --- a/vendor/rector/rector/vendor/autoload.php +++ b/vendor/rector/rector/vendor/autoload.php @@ -14,12 +14,9 @@ echo $err; } } - trigger_error( - $err, - E_USER_ERROR - ); + throw new RuntimeException($err); } require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7::getLoader(); +return ComposerAutoloaderInit78fb90a05527c4e1e3e0271783524c1e::getLoader(); diff --git a/vendor/rector/rector/vendor/bin/php-parse b/vendor/rector/rector/vendor/bin/php-parse index 0502be1db..5bb34028f 100755 --- a/vendor/rector/rector/vendor/bin/php-parse +++ b/vendor/rector/rector/vendor/bin/php-parse @@ -8,12 +8,12 @@ * * @generated */ -namespace RectorPrefix202411\Composer; +namespace RectorPrefix202506\Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; $GLOBALS['_composer_autoload_path'] = __DIR__ . '/..' . '/autoload.php'; if (\PHP_VERSION_ID < 80000) { - if (!\class_exists('RectorPrefix202411\\Composer\\BinProxyWrapper')) { + if (!\class_exists('RectorPrefix202506\\Composer\\BinProxyWrapper')) { /** * @internal */ @@ -87,7 +87,7 @@ if (\PHP_VERSION_ID < 80000) { } } } - if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'RectorPrefix202411\\Composer\\BinProxyWrapper')) { + if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'RectorPrefix202506\\Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/nikic/php-parser/bin/php-parse'; } } diff --git a/vendor/rector/rector/vendor/bin/yaml-lint b/vendor/rector/rector/vendor/bin/yaml-lint index 83ede1401..5ef534eb9 100755 --- a/vendor/rector/rector/vendor/bin/yaml-lint +++ b/vendor/rector/rector/vendor/bin/yaml-lint @@ -8,12 +8,12 @@ * * @generated */ -namespace RectorPrefix202411\Composer; +namespace RectorPrefix202506\Composer; $GLOBALS['_composer_bin_dir'] = __DIR__; $GLOBALS['_composer_autoload_path'] = __DIR__ . '/..' . '/autoload.php'; if (\PHP_VERSION_ID < 80000) { - if (!\class_exists('RectorPrefix202411\\Composer\\BinProxyWrapper')) { + if (!\class_exists('RectorPrefix202506\\Composer\\BinProxyWrapper')) { /** * @internal */ @@ -87,7 +87,7 @@ if (\PHP_VERSION_ID < 80000) { } } } - if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'RectorPrefix202411\\Composer\\BinProxyWrapper')) { + if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'RectorPrefix202506\\Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/symfony/yaml/Resources/bin/yaml-lint'; } } diff --git a/vendor/rector/rector/vendor/clue/ndjson-react/composer.json b/vendor/rector/rector/vendor/clue/ndjson-react/composer.json index 70848ea3b..797aa89dd 100644 --- a/vendor/rector/rector/vendor/clue/ndjson-react/composer.json +++ b/vendor/rector/rector/vendor/clue/ndjson-react/composer.json @@ -27,12 +27,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Clue\\React\\NDJson\\": "src\/" + "RectorPrefix202506\\Clue\\React\\NDJson\\": "src\/" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\Clue\\Tests\\React\\NDJson\\": "tests\/" + "RectorPrefix202506\\Clue\\Tests\\React\\NDJson\\": "tests\/" } } } \ No newline at end of file diff --git a/vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php b/vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php index 9c8ca22c3..42e6c0a69 100644 --- a/vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php +++ b/vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php @@ -1,11 +1,11 @@ }|array{}|null */ private static $installed; + /** + * @var bool + */ + private static $installedIsLocalDir; /** * @var bool|null */ @@ -53,7 +62,7 @@ public static function getInstalledPackages() if (1 === \count($packages)) { return $packages[0]; } - return \array_keys(\array_flip(\call_user_func_array('RectorPrefix202411\\array_merge', $packages))); + return \array_keys(\array_flip(\call_user_func_array('RectorPrefix202506\\array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' @@ -269,6 +278,21 @@ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = \false; + } + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = \strtr(__DIR__, '\\', '/'); + } + return self::$selfDir; } /** * @return array[] @@ -277,21 +301,29 @@ public static function reload($data) private static function getInstalled() { if (null === self::$canGetVendors) { - self::$canGetVendors = \method_exists('RectorPrefix202411\\Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); + self::$canGetVendors = \method_exists('RectorPrefix202506\\Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); + $copiedLocalDir = \false; if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = \strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (\is_file($vendorDir . '/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = (require $vendorDir . '/composer/installed.php'); - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && \strtr($vendorDir . '/composer', '\\', '/') === \strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[\count($installed) - 1]; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir . '/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = \true; } } + if (self::$installedIsLocalDir && $vendorDir . '/composer' === $selfDir) { + $copiedLocalDir = \true; + } } } if (null === self::$installed) { @@ -305,7 +337,7 @@ private static function getInstalled() self::$installed = array(); } } - if (self::$installed !== array()) { + if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } return $installed; diff --git a/vendor/rector/rector/vendor/composer/autoload_classmap.php b/vendor/rector/rector/vendor/composer/autoload_classmap.php index 38bb55237..1c5ee9902 100644 --- a/vendor/rector/rector/vendor/composer/autoload_classmap.php +++ b/vendor/rector/rector/vendor/composer/autoload_classmap.php @@ -9,6 +9,7 @@ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\Attribute' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', + 'PHPStan\\PhpDocParser\\Ast\\Comment' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Comment.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', @@ -20,7 +21,6 @@ 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', - 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\QuoteAwareConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\Node' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Node.php', 'PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', 'PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', @@ -86,6 +86,7 @@ 'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', 'PHPStan\\PhpDocParser\\Lexer\\Lexer' => $vendorDir . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', + 'PHPStan\\PhpDocParser\\ParserConfig' => $vendorDir . '/phpstan/phpdoc-parser/src/ParserConfig.php', 'PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', 'PHPStan\\PhpDocParser\\Parser\\ParserException' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', 'PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', @@ -125,24 +126,24 @@ 'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', 'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', 'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', + 'PhpParser\\Internal\\TokenPolyfill' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php', 'PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', 'PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', 'PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php', 'PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', + 'PhpParser\\Lexer\\TokenEmulator\\AsymmetricVisibilityTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\PropertyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', + 'PhpParser\\Modifiers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Modifiers.php', 'PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php', 'PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php', 'PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', @@ -153,16 +154,20 @@ 'PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', 'PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', 'PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', + 'PhpParser\\NodeVisitor\\CommentAnnotatingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php', 'PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', 'PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', 'PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', + 'PhpParser\\Node\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php', 'PhpParser\\Node\\Attribute' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', 'PhpParser\\Node\\AttributeGroup' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', + 'PhpParser\\Node\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php', 'PhpParser\\Node\\ComplexType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', 'PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', + 'PhpParser\\Node\\DeclareItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php', 'PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', 'PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', 'PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', @@ -261,6 +266,7 @@ 'PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', 'PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', 'PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', + 'PhpParser\\Node\\InterpolatedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php', 'PhpParser\\Node\\IntersectionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', 'PhpParser\\Node\\MatchArm' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', 'PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php', @@ -268,10 +274,15 @@ 'PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', 'PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', 'PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php', + 'PhpParser\\Node\\PropertyHook' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php', + 'PhpParser\\Node\\PropertyItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php', 'PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', 'PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', 'PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', + 'PhpParser\\Node\\Scalar\\Float_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php', + 'PhpParser\\Node\\Scalar\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php', + 'PhpParser\\Node\\Scalar\\InterpolatedString' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php', 'PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', 'PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', @@ -281,9 +292,12 @@ 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', 'PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', + 'PhpParser\\Node\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/StaticVar.php', 'PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', + 'PhpParser\\Node\\Stmt\\Block' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php', 'PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', 'PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', 'PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', @@ -322,7 +336,6 @@ 'PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', 'PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', 'PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', - 'PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', 'PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', @@ -334,664 +347,668 @@ 'PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', 'PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', 'PhpParser\\Node\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', + 'PhpParser\\Node\\UseItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UseItem.php', 'PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', 'PhpParser\\Node\\VariadicPlaceholder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', 'PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php', 'PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', 'PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', - 'PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', - 'PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', 'PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', - 'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', + 'PhpParser\\Parser\\Php8' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php8.php', + 'PhpParser\\PhpVersion' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PhpVersion.php', + 'PhpParser\\PrettyPrinter' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter.php', 'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', 'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', - 'RectorPrefix202411\\Clue\\React\\NDJson\\Decoder' => $vendorDir . '/clue/ndjson-react/src/Decoder.php', - 'RectorPrefix202411\\Clue\\React\\NDJson\\Encoder' => $vendorDir . '/clue/ndjson-react/src/Encoder.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchStrictGroupsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => $vendorDir . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchFlags.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => $vendorDir . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', - 'RectorPrefix202411\\Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', - 'RectorPrefix202411\\Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', - 'RectorPrefix202411\\Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', - 'RectorPrefix202411\\Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\UnexpectedNullMatchException' => $vendorDir . '/composer/pcre/src/UnexpectedNullMatchException.php', - 'RectorPrefix202411\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', - 'RectorPrefix202411\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', - 'RectorPrefix202411\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', - 'RectorPrefix202411\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', - 'RectorPrefix202411\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\CachedWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Inflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Language' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\LanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\NoopWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Pattern' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Patterns' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Ruleset' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitution' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitutions' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformation' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformations' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Word' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\RulesetInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\WordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', - 'RectorPrefix202411\\Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/EventEmitter.php', - 'RectorPrefix202411\\Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/EventEmitterInterface.php', - 'RectorPrefix202411\\Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/EventEmitterTrait.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => $vendorDir . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Diagnoser' => $vendorDir . '/fidry/cpu-core-counter/src/Diagnoser.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => $vendorDir . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\ParallelisationResult' => $vendorDir . '/fidry/cpu-core-counter/src/ParallelisationResult.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Auth' => $vendorDir . '/illuminate/container/Attributes/Auth.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Authenticated' => $vendorDir . '/illuminate/container/Attributes/Authenticated.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Cache' => $vendorDir . '/illuminate/container/Attributes/Cache.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Config' => $vendorDir . '/illuminate/container/Attributes/Config.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\CurrentUser' => $vendorDir . '/illuminate/container/Attributes/CurrentUser.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\DB' => $vendorDir . '/illuminate/container/Attributes/DB.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Database' => $vendorDir . '/illuminate/container/Attributes/Database.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Log' => $vendorDir . '/illuminate/container/Attributes/Log.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\RouteParameter' => $vendorDir . '/illuminate/container/Attributes/RouteParameter.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Storage' => $vendorDir . '/illuminate/container/Attributes/Storage.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Tag' => $vendorDir . '/illuminate/container/Attributes/Tag.php', - 'RectorPrefix202411\\Illuminate\\Container\\BoundMethod' => $vendorDir . '/illuminate/container/BoundMethod.php', - 'RectorPrefix202411\\Illuminate\\Container\\Container' => $vendorDir . '/illuminate/container/Container.php', - 'RectorPrefix202411\\Illuminate\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/container/ContextualBindingBuilder.php', - 'RectorPrefix202411\\Illuminate\\Container\\EntryNotFoundException' => $vendorDir . '/illuminate/container/EntryNotFoundException.php', - 'RectorPrefix202411\\Illuminate\\Container\\RewindableGenerator' => $vendorDir . '/illuminate/container/RewindableGenerator.php', - 'RectorPrefix202411\\Illuminate\\Container\\Util' => $vendorDir . '/illuminate/container/Util.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/illuminate/contracts/Auth/Access/Authorizable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/illuminate/contracts/Auth/Access/Gate.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/illuminate/contracts/Auth/Authenticatable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/illuminate/contracts/Auth/CanResetPassword.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/illuminate/contracts/Auth/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/illuminate/contracts/Auth/Guard.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/illuminate/contracts/Auth/MustVerifyEmail.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/illuminate/contracts/Auth/PasswordBroker.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/illuminate/contracts/Auth/StatefulGuard.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/illuminate/contracts/Auth/SupportsBasicAuth.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/illuminate/contracts/Auth/UserProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/illuminate/contracts/Broadcasting/Broadcaster.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/illuminate/contracts/Broadcasting/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => $vendorDir . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/illuminate/contracts/Bus/Dispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/illuminate/contracts/Bus/QueueingDispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/illuminate/contracts/Cache/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/illuminate/contracts/Cache/Lock.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/illuminate/contracts/Cache/LockProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Cache/LockTimeoutException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/illuminate/contracts/Cache/Repository.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/illuminate/contracts/Cache/Store.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Concurrency\\Driver' => $vendorDir . '/illuminate/contracts/Concurrency/Driver.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/illuminate/contracts/Config/Repository.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/illuminate/contracts/Console/Application.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Isolatable' => $vendorDir . '/illuminate/contracts/Console/Isolatable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/illuminate/contracts/Console/Kernel.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => $vendorDir . '/illuminate/contracts/Console/PromptsForMissingInput.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/illuminate/contracts/Container/BindingResolutionException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\CircularDependencyException' => $vendorDir . '/illuminate/contracts/Container/CircularDependencyException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/illuminate/contracts/Container/Container.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualAttribute' => $vendorDir . '/illuminate/contracts/Container/ContextualAttribute.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/contracts/Container/ContextualBindingBuilder.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/illuminate/contracts/Cookie/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/illuminate/contracts/Cookie/QueueingFactory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Builder.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Castable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/illuminate/contracts/Database/Events/MigrationEvent.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/illuminate/contracts/Database/ModelIdentifier.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Builder' => $vendorDir . '/illuminate/contracts/Database/Query/Builder.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => $vendorDir . '/illuminate/contracts/Database/Query/ConditionExpression.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Expression' => $vendorDir . '/illuminate/contracts/Database/Query/Expression.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/illuminate/contracts/Debug/ExceptionHandler.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ShouldntReport' => $vendorDir . '/illuminate/contracts/Debug/ShouldntReport.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/illuminate/contracts/Encryption/DecryptException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/illuminate/contracts/Encryption/EncryptException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/illuminate/contracts/Encryption/Encrypter.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => $vendorDir . '/illuminate/contracts/Encryption/StringEncrypter.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/illuminate/contracts/Events/Dispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/illuminate/contracts/Filesystem/Cloud.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/illuminate/contracts/Filesystem/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/illuminate/contracts/Filesystem/FileNotFoundException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/illuminate/contracts/Filesystem/Filesystem.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Filesystem/LockTimeoutException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/illuminate/contracts/Foundation/Application.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/illuminate/contracts/Foundation/CachesConfiguration.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/illuminate/contracts/Foundation/CachesRoutes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => $vendorDir . '/illuminate/contracts/Foundation/ExceptionRenderer.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => $vendorDir . '/illuminate/contracts/Foundation/MaintenanceMode.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/illuminate/contracts/Hashing/Hasher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/illuminate/contracts/Http/Kernel.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Attachable' => $vendorDir . '/illuminate/contracts/Mail/Attachable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/illuminate/contracts/Mail/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/illuminate/contracts/Mail/MailQueue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/illuminate/contracts/Mail/Mailable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/illuminate/contracts/Mail/Mailer.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/illuminate/contracts/Notifications/Dispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/illuminate/contracts/Notifications/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => $vendorDir . '/illuminate/contracts/Pagination/CursorPaginator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/illuminate/contracts/Pagination/Paginator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/illuminate/contracts/Pipeline/Hub.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/illuminate/contracts/Pipeline/Pipeline.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\InvokedProcess' => $vendorDir . '/illuminate/contracts/Process/InvokedProcess.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\ProcessResult' => $vendorDir . '/illuminate/contracts/Process/ProcessResult.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ClearableQueue' => $vendorDir . '/illuminate/contracts/Queue/ClearableQueue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/illuminate/contracts/Queue/EntityNotFoundException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/illuminate/contracts/Queue/EntityResolver.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/illuminate/contracts/Queue/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/illuminate/contracts/Queue/Job.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/illuminate/contracts/Queue/Monitor.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/illuminate/contracts/Queue/Queue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/illuminate/contracts/Queue/QueueableCollection.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUnique.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/illuminate/contracts/Routing/Registrar.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/illuminate/contracts/Routing/ResponseFactory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/illuminate/contracts/Routing/UrlGenerator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/illuminate/contracts/Routing/UrlRoutable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => $vendorDir . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/illuminate/contracts/Session/Session.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/illuminate/contracts/Support/Arrayable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/illuminate/contracts/Support/DeferrableProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/illuminate/contracts/Support/DeferringDisplayableValue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/illuminate/contracts/Support/Htmlable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/illuminate/contracts/Support/Jsonable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/illuminate/contracts/Support/MessageBag.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/illuminate/contracts/Support/MessageProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/illuminate/contracts/Support/Renderable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/illuminate/contracts/Support/Responsable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\ValidatedData' => $vendorDir . '/illuminate/contracts/Support/ValidatedData.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/illuminate/contracts/Translation/HasLocalePreference.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/illuminate/contracts/Translation/Loader.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/illuminate/contracts/Translation/Translator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\DataAwareRule' => $vendorDir . '/illuminate/contracts/Validation/DataAwareRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/illuminate/contracts/Validation/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/illuminate/contracts/Validation/ImplicitRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\InvokableRule' => $vendorDir . '/illuminate/contracts/Validation/InvokableRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/illuminate/contracts/Validation/Rule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => $vendorDir . '/illuminate/contracts/Validation/UncompromisedVerifier.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidationRule' => $vendorDir . '/illuminate/contracts/Validation/ValidationRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/illuminate/contracts/Validation/Validator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => $vendorDir . '/illuminate/contracts/Validation/ValidatorAwareRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/illuminate/contracts/View/Engine.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/illuminate/contracts/View/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\View' => $vendorDir . '/illuminate/contracts/View/View.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\ViewCompilationException' => $vendorDir . '/illuminate/contracts/View/ViewCompilationException.php', - 'RectorPrefix202411\\Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php', - 'RectorPrefix202411\\Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php', - 'RectorPrefix202411\\Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php', - 'RectorPrefix202411\\Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php', - 'RectorPrefix202411\\Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php', - 'RectorPrefix202411\\Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php', - 'RectorPrefix202411\\Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php', - 'RectorPrefix202411\\Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php', - 'RectorPrefix202411\\Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php', - 'RectorPrefix202411\\Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php', - 'RectorPrefix202411\\Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php', - 'RectorPrefix202411\\Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php', - 'RectorPrefix202411\\Nette\\Utils\\FileInfo' => $vendorDir . '/nette/utils/src/Utils/FileInfo.php', - 'RectorPrefix202411\\Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php', - 'RectorPrefix202411\\Nette\\Utils\\Finder' => $vendorDir . '/nette/utils/src/Utils/Finder.php', - 'RectorPrefix202411\\Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php', - 'RectorPrefix202411\\Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php', - 'RectorPrefix202411\\Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php', - 'RectorPrefix202411\\Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php', - 'RectorPrefix202411\\Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php', - 'RectorPrefix202411\\Nette\\Utils\\ImageColor' => $vendorDir . '/nette/utils/src/Utils/ImageColor.php', - 'RectorPrefix202411\\Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\ImageType' => $vendorDir . '/nette/utils/src/Utils/ImageType.php', - 'RectorPrefix202411\\Nette\\Utils\\Iterables' => $vendorDir . '/nette/utils/src/Utils/Iterables.php', - 'RectorPrefix202411\\Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php', - 'RectorPrefix202411\\Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php', - 'RectorPrefix202411\\Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php', - 'RectorPrefix202411\\Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php', - 'RectorPrefix202411\\Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', - 'RectorPrefix202411\\Nette\\Utils\\ReflectionMethod' => $vendorDir . '/nette/utils/src/Utils/ReflectionMethod.php', - 'RectorPrefix202411\\Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', - 'RectorPrefix202411\\Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php', - 'RectorPrefix202411\\Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetector' => $vendorDir . '/ondram/ci-detector/src/CiDetector.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetectorInterface' => $vendorDir . '/ondram/ci-detector/src/CiDetectorInterface.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AbstractCi' => $vendorDir . '/ondram/ci-detector/src/Ci/AbstractCi.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AppVeyor' => $vendorDir . '/ondram/ci-detector/src/Ci/AppVeyor.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => $vendorDir . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AzurePipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/AzurePipelines.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Bamboo' => $vendorDir . '/ondram/ci-detector/src/Ci/Bamboo.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Buddy' => $vendorDir . '/ondram/ci-detector/src/Ci/Buddy.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\CiInterface' => $vendorDir . '/ondram/ci-detector/src/Ci/CiInterface.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Circle' => $vendorDir . '/ondram/ci-detector/src/Ci/Circle.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Codeship' => $vendorDir . '/ondram/ci-detector/src/Ci/Codeship.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Continuousphp' => $vendorDir . '/ondram/ci-detector/src/Ci/Continuousphp.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Drone' => $vendorDir . '/ondram/ci-detector/src/Ci/Drone.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitHubActions' => $vendorDir . '/ondram/ci-detector/src/Ci/GitHubActions.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitLab' => $vendorDir . '/ondram/ci-detector/src/Ci/GitLab.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Jenkins' => $vendorDir . '/ondram/ci-detector/src/Ci/Jenkins.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\SourceHut' => $vendorDir . '/ondram/ci-detector/src/Ci/SourceHut.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\TeamCity' => $vendorDir . '/ondram/ci-detector/src/Ci/TeamCity.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Travis' => $vendorDir . '/ondram/ci-detector/src/Ci/Travis.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Wercker' => $vendorDir . '/ondram/ci-detector/src/Ci/Wercker.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Env' => $vendorDir . '/ondram/ci-detector/src/Env.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => $vendorDir . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\TrinaryLogic' => $vendorDir . '/ondram/ci-detector/src/TrinaryLogic.php', - 'RectorPrefix202411\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', - 'RectorPrefix202411\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', - 'RectorPrefix202411\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', - 'RectorPrefix202411\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', - 'RectorPrefix202411\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', - 'RectorPrefix202411\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', - 'RectorPrefix202411\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', - 'RectorPrefix202411\\Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', - 'RectorPrefix202411\\Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', - 'RectorPrefix202411\\Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', - 'RectorPrefix202411\\React\\Cache\\ArrayCache' => $vendorDir . '/react/cache/src/ArrayCache.php', - 'RectorPrefix202411\\React\\Cache\\CacheInterface' => $vendorDir . '/react/cache/src/CacheInterface.php', - 'RectorPrefix202411\\React\\ChildProcess\\Process' => $vendorDir . '/react/child-process/src/Process.php', - 'RectorPrefix202411\\React\\Dns\\BadServerException' => $vendorDir . '/react/dns/src/BadServerException.php', - 'RectorPrefix202411\\React\\Dns\\Config\\Config' => $vendorDir . '/react/dns/src/Config/Config.php', - 'RectorPrefix202411\\React\\Dns\\Config\\HostsFile' => $vendorDir . '/react/dns/src/Config/HostsFile.php', - 'RectorPrefix202411\\React\\Dns\\Model\\Message' => $vendorDir . '/react/dns/src/Model/Message.php', - 'RectorPrefix202411\\React\\Dns\\Model\\Record' => $vendorDir . '/react/dns/src/Model/Record.php', - 'RectorPrefix202411\\React\\Dns\\Protocol\\BinaryDumper' => $vendorDir . '/react/dns/src/Protocol/BinaryDumper.php', - 'RectorPrefix202411\\React\\Dns\\Protocol\\Parser' => $vendorDir . '/react/dns/src/Protocol/Parser.php', - 'RectorPrefix202411\\React\\Dns\\Query\\CachingExecutor' => $vendorDir . '/react/dns/src/Query/CachingExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\CancellationException' => $vendorDir . '/react/dns/src/Query/CancellationException.php', - 'RectorPrefix202411\\React\\Dns\\Query\\CoopExecutor' => $vendorDir . '/react/dns/src/Query/CoopExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\ExecutorInterface' => $vendorDir . '/react/dns/src/Query/ExecutorInterface.php', - 'RectorPrefix202411\\React\\Dns\\Query\\FallbackExecutor' => $vendorDir . '/react/dns/src/Query/FallbackExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\HostsFileExecutor' => $vendorDir . '/react/dns/src/Query/HostsFileExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\Query' => $vendorDir . '/react/dns/src/Query/Query.php', - 'RectorPrefix202411\\React\\Dns\\Query\\RetryExecutor' => $vendorDir . '/react/dns/src/Query/RetryExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\SelectiveTransportExecutor' => $vendorDir . '/react/dns/src/Query/SelectiveTransportExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\TcpTransportExecutor' => $vendorDir . '/react/dns/src/Query/TcpTransportExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutException' => $vendorDir . '/react/dns/src/Query/TimeoutException.php', - 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutExecutor' => $vendorDir . '/react/dns/src/Query/TimeoutExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\UdpTransportExecutor' => $vendorDir . '/react/dns/src/Query/UdpTransportExecutor.php', - 'RectorPrefix202411\\React\\Dns\\RecordNotFoundException' => $vendorDir . '/react/dns/src/RecordNotFoundException.php', - 'RectorPrefix202411\\React\\Dns\\Resolver\\Factory' => $vendorDir . '/react/dns/src/Resolver/Factory.php', - 'RectorPrefix202411\\React\\Dns\\Resolver\\Resolver' => $vendorDir . '/react/dns/src/Resolver/Resolver.php', - 'RectorPrefix202411\\React\\Dns\\Resolver\\ResolverInterface' => $vendorDir . '/react/dns/src/Resolver/ResolverInterface.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtEvLoop' => $vendorDir . '/react/event-loop/src/ExtEvLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtEventLoop' => $vendorDir . '/react/event-loop/src/ExtEventLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtLibevLoop' => $vendorDir . '/react/event-loop/src/ExtLibevLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtLibeventLoop' => $vendorDir . '/react/event-loop/src/ExtLibeventLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtUvLoop' => $vendorDir . '/react/event-loop/src/ExtUvLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\Factory' => $vendorDir . '/react/event-loop/src/Factory.php', - 'RectorPrefix202411\\React\\EventLoop\\Loop' => $vendorDir . '/react/event-loop/src/Loop.php', - 'RectorPrefix202411\\React\\EventLoop\\LoopInterface' => $vendorDir . '/react/event-loop/src/LoopInterface.php', - 'RectorPrefix202411\\React\\EventLoop\\SignalsHandler' => $vendorDir . '/react/event-loop/src/SignalsHandler.php', - 'RectorPrefix202411\\React\\EventLoop\\StreamSelectLoop' => $vendorDir . '/react/event-loop/src/StreamSelectLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\Tick\\FutureTickQueue' => $vendorDir . '/react/event-loop/src/Tick/FutureTickQueue.php', - 'RectorPrefix202411\\React\\EventLoop\\TimerInterface' => $vendorDir . '/react/event-loop/src/TimerInterface.php', - 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timer' => $vendorDir . '/react/event-loop/src/Timer/Timer.php', - 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timers' => $vendorDir . '/react/event-loop/src/Timer/Timers.php', - 'RectorPrefix202411\\React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php', - 'RectorPrefix202411\\React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php', - 'RectorPrefix202411\\React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php', - 'RectorPrefix202411\\React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php', - 'RectorPrefix202411\\React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php', - 'RectorPrefix202411\\React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php', - 'RectorPrefix202411\\React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php', - 'RectorPrefix202411\\React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php', - 'RectorPrefix202411\\React\\Socket\\Connection' => $vendorDir . '/react/socket/src/Connection.php', - 'RectorPrefix202411\\React\\Socket\\ConnectionInterface' => $vendorDir . '/react/socket/src/ConnectionInterface.php', - 'RectorPrefix202411\\React\\Socket\\Connector' => $vendorDir . '/react/socket/src/Connector.php', - 'RectorPrefix202411\\React\\Socket\\ConnectorInterface' => $vendorDir . '/react/socket/src/ConnectorInterface.php', - 'RectorPrefix202411\\React\\Socket\\DnsConnector' => $vendorDir . '/react/socket/src/DnsConnector.php', - 'RectorPrefix202411\\React\\Socket\\FdServer' => $vendorDir . '/react/socket/src/FdServer.php', - 'RectorPrefix202411\\React\\Socket\\FixedUriConnector' => $vendorDir . '/react/socket/src/FixedUriConnector.php', - 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnectionBuilder' => $vendorDir . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', - 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnector' => $vendorDir . '/react/socket/src/HappyEyeBallsConnector.php', - 'RectorPrefix202411\\React\\Socket\\LimitingServer' => $vendorDir . '/react/socket/src/LimitingServer.php', - 'RectorPrefix202411\\React\\Socket\\SecureConnector' => $vendorDir . '/react/socket/src/SecureConnector.php', - 'RectorPrefix202411\\React\\Socket\\SecureServer' => $vendorDir . '/react/socket/src/SecureServer.php', - 'RectorPrefix202411\\React\\Socket\\Server' => $vendorDir . '/react/socket/src/Server.php', - 'RectorPrefix202411\\React\\Socket\\ServerInterface' => $vendorDir . '/react/socket/src/ServerInterface.php', - 'RectorPrefix202411\\React\\Socket\\SocketServer' => $vendorDir . '/react/socket/src/SocketServer.php', - 'RectorPrefix202411\\React\\Socket\\StreamEncryption' => $vendorDir . '/react/socket/src/StreamEncryption.php', - 'RectorPrefix202411\\React\\Socket\\TcpConnector' => $vendorDir . '/react/socket/src/TcpConnector.php', - 'RectorPrefix202411\\React\\Socket\\TcpServer' => $vendorDir . '/react/socket/src/TcpServer.php', - 'RectorPrefix202411\\React\\Socket\\TimeoutConnector' => $vendorDir . '/react/socket/src/TimeoutConnector.php', - 'RectorPrefix202411\\React\\Socket\\UnixConnector' => $vendorDir . '/react/socket/src/UnixConnector.php', - 'RectorPrefix202411\\React\\Socket\\UnixServer' => $vendorDir . '/react/socket/src/UnixServer.php', - 'RectorPrefix202411\\React\\Stream\\CompositeStream' => $vendorDir . '/react/stream/src/CompositeStream.php', - 'RectorPrefix202411\\React\\Stream\\DuplexResourceStream' => $vendorDir . '/react/stream/src/DuplexResourceStream.php', - 'RectorPrefix202411\\React\\Stream\\DuplexStreamInterface' => $vendorDir . '/react/stream/src/DuplexStreamInterface.php', - 'RectorPrefix202411\\React\\Stream\\ReadableResourceStream' => $vendorDir . '/react/stream/src/ReadableResourceStream.php', - 'RectorPrefix202411\\React\\Stream\\ReadableStreamInterface' => $vendorDir . '/react/stream/src/ReadableStreamInterface.php', - 'RectorPrefix202411\\React\\Stream\\ThroughStream' => $vendorDir . '/react/stream/src/ThroughStream.php', - 'RectorPrefix202411\\React\\Stream\\Util' => $vendorDir . '/react/stream/src/Util.php', - 'RectorPrefix202411\\React\\Stream\\WritableResourceStream' => $vendorDir . '/react/stream/src/WritableResourceStream.php', - 'RectorPrefix202411\\React\\Stream\\WritableStreamInterface' => $vendorDir . '/react/stream/src/WritableStreamInterface.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Debug\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => $vendorDir . '/symfony/process/Exception/RunProcessFailedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => $vendorDir . '/symfony/process/Messenger/RunProcessContext.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => $vendorDir . '/symfony/process/Messenger/RunProcessMessage.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => $vendorDir . '/symfony/process/Messenger/RunProcessMessageHandler.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpSubprocess' => $vendorDir . '/symfony/process/PhpSubprocess.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => $vendorDir . '/symfony/service-contracts/ServiceCollectionInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => $vendorDir . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => $vendorDir . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\CpuCoreCountProvider' => $vendorDir . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Action' => $vendorDir . '/symplify/easy-parallel/src/Enum/Action.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Content' => $vendorDir . '/symplify/easy-parallel/src/Enum/Content.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactCommand' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactCommand.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactEvent' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactEvent.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => $vendorDir . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => $vendorDir . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ScheduleFactory' => $vendorDir . '/symplify/easy-parallel/src/ScheduleFactory.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\Schedule' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/Schedule.php', - 'RectorPrefix202411\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', - 'RectorPrefix202411\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', - 'RectorPrefix202411\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', + 'PhpParser\\Token' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Token.php', + 'RectorPrefix202506\\Clue\\React\\NDJson\\Decoder' => $vendorDir . '/clue/ndjson-react/src/Decoder.php', + 'RectorPrefix202506\\Clue\\React\\NDJson\\Encoder' => $vendorDir . '/clue/ndjson-react/src/Encoder.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchStrictGroupsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => $vendorDir . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchFlags.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => $vendorDir . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', + 'RectorPrefix202506\\Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', + 'RectorPrefix202506\\Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', + 'RectorPrefix202506\\Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', + 'RectorPrefix202506\\Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\UnexpectedNullMatchException' => $vendorDir . '/composer/pcre/src/UnexpectedNullMatchException.php', + 'RectorPrefix202506\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', + 'RectorPrefix202506\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', + 'RectorPrefix202506\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', + 'RectorPrefix202506\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', + 'RectorPrefix202506\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\CachedWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Inflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Language' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\LanguageInflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\NoopWordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Pattern' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Patterns' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Ruleset' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Substitution' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Substitutions' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Transformation' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Transformations' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Word' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\RulesetInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\WordInflector' => $vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', + 'RectorPrefix202506\\Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/EventEmitter.php', + 'RectorPrefix202506\\Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/EventEmitterInterface.php', + 'RectorPrefix202506\\Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/EventEmitterTrait.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => $vendorDir . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Diagnoser' => $vendorDir . '/fidry/cpu-core-counter/src/Diagnoser.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => $vendorDir . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => $vendorDir . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\ParallelisationResult' => $vendorDir . '/fidry/cpu-core-counter/src/ParallelisationResult.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Auth' => $vendorDir . '/illuminate/container/Attributes/Auth.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Authenticated' => $vendorDir . '/illuminate/container/Attributes/Authenticated.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Cache' => $vendorDir . '/illuminate/container/Attributes/Cache.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Config' => $vendorDir . '/illuminate/container/Attributes/Config.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\CurrentUser' => $vendorDir . '/illuminate/container/Attributes/CurrentUser.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\DB' => $vendorDir . '/illuminate/container/Attributes/DB.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Database' => $vendorDir . '/illuminate/container/Attributes/Database.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Log' => $vendorDir . '/illuminate/container/Attributes/Log.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\RouteParameter' => $vendorDir . '/illuminate/container/Attributes/RouteParameter.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Storage' => $vendorDir . '/illuminate/container/Attributes/Storage.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Tag' => $vendorDir . '/illuminate/container/Attributes/Tag.php', + 'RectorPrefix202506\\Illuminate\\Container\\BoundMethod' => $vendorDir . '/illuminate/container/BoundMethod.php', + 'RectorPrefix202506\\Illuminate\\Container\\Container' => $vendorDir . '/illuminate/container/Container.php', + 'RectorPrefix202506\\Illuminate\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/container/ContextualBindingBuilder.php', + 'RectorPrefix202506\\Illuminate\\Container\\EntryNotFoundException' => $vendorDir . '/illuminate/container/EntryNotFoundException.php', + 'RectorPrefix202506\\Illuminate\\Container\\RewindableGenerator' => $vendorDir . '/illuminate/container/RewindableGenerator.php', + 'RectorPrefix202506\\Illuminate\\Container\\Util' => $vendorDir . '/illuminate/container/Util.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/illuminate/contracts/Auth/Access/Gate.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/illuminate/contracts/Auth/Authenticatable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/illuminate/contracts/Auth/CanResetPassword.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/illuminate/contracts/Auth/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/illuminate/contracts/Auth/Guard.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/illuminate/contracts/Auth/PasswordBroker.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/illuminate/contracts/Auth/StatefulGuard.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/illuminate/contracts/Auth/UserProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/illuminate/contracts/Broadcasting/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => $vendorDir . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/illuminate/contracts/Bus/Dispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/illuminate/contracts/Cache/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/illuminate/contracts/Cache/Lock.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/illuminate/contracts/Cache/LockProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/illuminate/contracts/Cache/Repository.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/illuminate/contracts/Cache/Store.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Concurrency\\Driver' => $vendorDir . '/illuminate/contracts/Concurrency/Driver.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/illuminate/contracts/Config/Repository.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/illuminate/contracts/Console/Application.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\Isolatable' => $vendorDir . '/illuminate/contracts/Console/Isolatable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/illuminate/contracts/Console/Kernel.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => $vendorDir . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/illuminate/contracts/Container/BindingResolutionException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\CircularDependencyException' => $vendorDir . '/illuminate/contracts/Container/CircularDependencyException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/illuminate/contracts/Container/Container.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\ContextualAttribute' => $vendorDir . '/illuminate/contracts/Container/ContextualAttribute.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/illuminate/contracts/Cookie/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/illuminate/contracts/Database/ModelIdentifier.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Query\\Builder' => $vendorDir . '/illuminate/contracts/Database/Query/Builder.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => $vendorDir . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Query\\Expression' => $vendorDir . '/illuminate/contracts/Database/Query/Expression.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Debug\\ShouldntReport' => $vendorDir . '/illuminate/contracts/Debug/ShouldntReport.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/illuminate/contracts/Encryption/DecryptException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/illuminate/contracts/Encryption/EncryptException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/illuminate/contracts/Encryption/Encrypter.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => $vendorDir . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/illuminate/contracts/Events/Dispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/illuminate/contracts/Filesystem/Cloud.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/illuminate/contracts/Filesystem/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/illuminate/contracts/Filesystem/Filesystem.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/illuminate/contracts/Foundation/Application.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => $vendorDir . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => $vendorDir . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/illuminate/contracts/Hashing/Hasher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/illuminate/contracts/Http/Kernel.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Attachable' => $vendorDir . '/illuminate/contracts/Mail/Attachable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/illuminate/contracts/Mail/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/illuminate/contracts/Mail/MailQueue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/illuminate/contracts/Mail/Mailable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/illuminate/contracts/Mail/Mailer.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/illuminate/contracts/Notifications/Dispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/illuminate/contracts/Notifications/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => $vendorDir . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/illuminate/contracts/Pagination/Paginator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/illuminate/contracts/Pipeline/Hub.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/illuminate/contracts/Pipeline/Pipeline.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Process\\InvokedProcess' => $vendorDir . '/illuminate/contracts/Process/InvokedProcess.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Process\\ProcessResult' => $vendorDir . '/illuminate/contracts/Process/ProcessResult.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ClearableQueue' => $vendorDir . '/illuminate/contracts/Queue/ClearableQueue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/illuminate/contracts/Queue/EntityResolver.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/illuminate/contracts/Queue/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/illuminate/contracts/Queue/Job.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/illuminate/contracts/Queue/Monitor.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/illuminate/contracts/Queue/Queue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/illuminate/contracts/Queue/QueueableCollection.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/illuminate/contracts/Routing/Registrar.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/illuminate/contracts/Routing/ResponseFactory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/illuminate/contracts/Routing/UrlGenerator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/illuminate/contracts/Routing/UrlRoutable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => $vendorDir . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/illuminate/contracts/Session/Session.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/illuminate/contracts/Support/Arrayable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/illuminate/contracts/Support/DeferrableProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/illuminate/contracts/Support/Htmlable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/illuminate/contracts/Support/Jsonable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/illuminate/contracts/Support/MessageBag.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/illuminate/contracts/Support/MessageProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/illuminate/contracts/Support/Renderable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/illuminate/contracts/Support/Responsable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\ValidatedData' => $vendorDir . '/illuminate/contracts/Support/ValidatedData.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/illuminate/contracts/Translation/Loader.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/illuminate/contracts/Translation/Translator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\DataAwareRule' => $vendorDir . '/illuminate/contracts/Validation/DataAwareRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/illuminate/contracts/Validation/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/illuminate/contracts/Validation/ImplicitRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\InvokableRule' => $vendorDir . '/illuminate/contracts/Validation/InvokableRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/illuminate/contracts/Validation/Rule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => $vendorDir . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ValidationRule' => $vendorDir . '/illuminate/contracts/Validation/ValidationRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/illuminate/contracts/Validation/Validator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => $vendorDir . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/illuminate/contracts/View/Engine.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/illuminate/contracts/View/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\View' => $vendorDir . '/illuminate/contracts/View/View.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\ViewCompilationException' => $vendorDir . '/illuminate/contracts/View/ViewCompilationException.php', + 'RectorPrefix202506\\Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php', + 'RectorPrefix202506\\Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php', + 'RectorPrefix202506\\Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php', + 'RectorPrefix202506\\Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php', + 'RectorPrefix202506\\Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php', + 'RectorPrefix202506\\Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\ShouldNotHappenException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php', + 'RectorPrefix202506\\Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php', + 'RectorPrefix202506\\Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php', + 'RectorPrefix202506\\Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php', + 'RectorPrefix202506\\Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php', + 'RectorPrefix202506\\Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php', + 'RectorPrefix202506\\Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php', + 'RectorPrefix202506\\Nette\\Utils\\FileInfo' => $vendorDir . '/nette/utils/src/Utils/FileInfo.php', + 'RectorPrefix202506\\Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php', + 'RectorPrefix202506\\Nette\\Utils\\Finder' => $vendorDir . '/nette/utils/src/Utils/Finder.php', + 'RectorPrefix202506\\Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php', + 'RectorPrefix202506\\Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php', + 'RectorPrefix202506\\Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php', + 'RectorPrefix202506\\Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php', + 'RectorPrefix202506\\Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php', + 'RectorPrefix202506\\Nette\\Utils\\ImageColor' => $vendorDir . '/nette/utils/src/Utils/ImageColor.php', + 'RectorPrefix202506\\Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\ImageType' => $vendorDir . '/nette/utils/src/Utils/ImageType.php', + 'RectorPrefix202506\\Nette\\Utils\\Iterables' => $vendorDir . '/nette/utils/src/Utils/Iterables.php', + 'RectorPrefix202506\\Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php', + 'RectorPrefix202506\\Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php', + 'RectorPrefix202506\\Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php', + 'RectorPrefix202506\\Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php', + 'RectorPrefix202506\\Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', + 'RectorPrefix202506\\Nette\\Utils\\ReflectionMethod' => $vendorDir . '/nette/utils/src/Utils/ReflectionMethod.php', + 'RectorPrefix202506\\Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', + 'RectorPrefix202506\\Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php', + 'RectorPrefix202506\\Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\CiDetector' => $vendorDir . '/ondram/ci-detector/src/CiDetector.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\CiDetectorInterface' => $vendorDir . '/ondram/ci-detector/src/CiDetectorInterface.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AbstractCi' => $vendorDir . '/ondram/ci-detector/src/Ci/AbstractCi.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AppVeyor' => $vendorDir . '/ondram/ci-detector/src/Ci/AppVeyor.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => $vendorDir . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AzurePipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/AzurePipelines.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Bamboo' => $vendorDir . '/ondram/ci-detector/src/Ci/Bamboo.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => $vendorDir . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Buddy' => $vendorDir . '/ondram/ci-detector/src/Ci/Buddy.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\CiInterface' => $vendorDir . '/ondram/ci-detector/src/Ci/CiInterface.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Circle' => $vendorDir . '/ondram/ci-detector/src/Ci/Circle.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Codeship' => $vendorDir . '/ondram/ci-detector/src/Ci/Codeship.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Continuousphp' => $vendorDir . '/ondram/ci-detector/src/Ci/Continuousphp.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Drone' => $vendorDir . '/ondram/ci-detector/src/Ci/Drone.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\GitHubActions' => $vendorDir . '/ondram/ci-detector/src/Ci/GitHubActions.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\GitLab' => $vendorDir . '/ondram/ci-detector/src/Ci/GitLab.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Jenkins' => $vendorDir . '/ondram/ci-detector/src/Ci/Jenkins.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\SourceHut' => $vendorDir . '/ondram/ci-detector/src/Ci/SourceHut.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\TeamCity' => $vendorDir . '/ondram/ci-detector/src/Ci/TeamCity.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Travis' => $vendorDir . '/ondram/ci-detector/src/Ci/Travis.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Wercker' => $vendorDir . '/ondram/ci-detector/src/Ci/Wercker.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Env' => $vendorDir . '/ondram/ci-detector/src/Env.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => $vendorDir . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\TrinaryLogic' => $vendorDir . '/ondram/ci-detector/src/TrinaryLogic.php', + 'RectorPrefix202506\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', + 'RectorPrefix202506\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', + 'RectorPrefix202506\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', + 'RectorPrefix202506\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', + 'RectorPrefix202506\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', + 'RectorPrefix202506\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', + 'RectorPrefix202506\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', + 'RectorPrefix202506\\Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', + 'RectorPrefix202506\\Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', + 'RectorPrefix202506\\Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', + 'RectorPrefix202506\\React\\Cache\\ArrayCache' => $vendorDir . '/react/cache/src/ArrayCache.php', + 'RectorPrefix202506\\React\\Cache\\CacheInterface' => $vendorDir . '/react/cache/src/CacheInterface.php', + 'RectorPrefix202506\\React\\ChildProcess\\Process' => $vendorDir . '/react/child-process/src/Process.php', + 'RectorPrefix202506\\React\\Dns\\BadServerException' => $vendorDir . '/react/dns/src/BadServerException.php', + 'RectorPrefix202506\\React\\Dns\\Config\\Config' => $vendorDir . '/react/dns/src/Config/Config.php', + 'RectorPrefix202506\\React\\Dns\\Config\\HostsFile' => $vendorDir . '/react/dns/src/Config/HostsFile.php', + 'RectorPrefix202506\\React\\Dns\\Model\\Message' => $vendorDir . '/react/dns/src/Model/Message.php', + 'RectorPrefix202506\\React\\Dns\\Model\\Record' => $vendorDir . '/react/dns/src/Model/Record.php', + 'RectorPrefix202506\\React\\Dns\\Protocol\\BinaryDumper' => $vendorDir . '/react/dns/src/Protocol/BinaryDumper.php', + 'RectorPrefix202506\\React\\Dns\\Protocol\\Parser' => $vendorDir . '/react/dns/src/Protocol/Parser.php', + 'RectorPrefix202506\\React\\Dns\\Query\\CachingExecutor' => $vendorDir . '/react/dns/src/Query/CachingExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\CancellationException' => $vendorDir . '/react/dns/src/Query/CancellationException.php', + 'RectorPrefix202506\\React\\Dns\\Query\\CoopExecutor' => $vendorDir . '/react/dns/src/Query/CoopExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\ExecutorInterface' => $vendorDir . '/react/dns/src/Query/ExecutorInterface.php', + 'RectorPrefix202506\\React\\Dns\\Query\\FallbackExecutor' => $vendorDir . '/react/dns/src/Query/FallbackExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\HostsFileExecutor' => $vendorDir . '/react/dns/src/Query/HostsFileExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\Query' => $vendorDir . '/react/dns/src/Query/Query.php', + 'RectorPrefix202506\\React\\Dns\\Query\\RetryExecutor' => $vendorDir . '/react/dns/src/Query/RetryExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\SelectiveTransportExecutor' => $vendorDir . '/react/dns/src/Query/SelectiveTransportExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\TcpTransportExecutor' => $vendorDir . '/react/dns/src/Query/TcpTransportExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\TimeoutException' => $vendorDir . '/react/dns/src/Query/TimeoutException.php', + 'RectorPrefix202506\\React\\Dns\\Query\\TimeoutExecutor' => $vendorDir . '/react/dns/src/Query/TimeoutExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\UdpTransportExecutor' => $vendorDir . '/react/dns/src/Query/UdpTransportExecutor.php', + 'RectorPrefix202506\\React\\Dns\\RecordNotFoundException' => $vendorDir . '/react/dns/src/RecordNotFoundException.php', + 'RectorPrefix202506\\React\\Dns\\Resolver\\Factory' => $vendorDir . '/react/dns/src/Resolver/Factory.php', + 'RectorPrefix202506\\React\\Dns\\Resolver\\Resolver' => $vendorDir . '/react/dns/src/Resolver/Resolver.php', + 'RectorPrefix202506\\React\\Dns\\Resolver\\ResolverInterface' => $vendorDir . '/react/dns/src/Resolver/ResolverInterface.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtEvLoop' => $vendorDir . '/react/event-loop/src/ExtEvLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtEventLoop' => $vendorDir . '/react/event-loop/src/ExtEventLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtLibevLoop' => $vendorDir . '/react/event-loop/src/ExtLibevLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtLibeventLoop' => $vendorDir . '/react/event-loop/src/ExtLibeventLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtUvLoop' => $vendorDir . '/react/event-loop/src/ExtUvLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\Factory' => $vendorDir . '/react/event-loop/src/Factory.php', + 'RectorPrefix202506\\React\\EventLoop\\Loop' => $vendorDir . '/react/event-loop/src/Loop.php', + 'RectorPrefix202506\\React\\EventLoop\\LoopInterface' => $vendorDir . '/react/event-loop/src/LoopInterface.php', + 'RectorPrefix202506\\React\\EventLoop\\SignalsHandler' => $vendorDir . '/react/event-loop/src/SignalsHandler.php', + 'RectorPrefix202506\\React\\EventLoop\\StreamSelectLoop' => $vendorDir . '/react/event-loop/src/StreamSelectLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\Tick\\FutureTickQueue' => $vendorDir . '/react/event-loop/src/Tick/FutureTickQueue.php', + 'RectorPrefix202506\\React\\EventLoop\\TimerInterface' => $vendorDir . '/react/event-loop/src/TimerInterface.php', + 'RectorPrefix202506\\React\\EventLoop\\Timer\\Timer' => $vendorDir . '/react/event-loop/src/Timer/Timer.php', + 'RectorPrefix202506\\React\\EventLoop\\Timer\\Timers' => $vendorDir . '/react/event-loop/src/Timer/Timers.php', + 'RectorPrefix202506\\React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php', + 'RectorPrefix202506\\React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php', + 'RectorPrefix202506\\React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php', + 'RectorPrefix202506\\React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php', + 'RectorPrefix202506\\React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php', + 'RectorPrefix202506\\React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php', + 'RectorPrefix202506\\React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php', + 'RectorPrefix202506\\React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php', + 'RectorPrefix202506\\React\\Socket\\Connection' => $vendorDir . '/react/socket/src/Connection.php', + 'RectorPrefix202506\\React\\Socket\\ConnectionInterface' => $vendorDir . '/react/socket/src/ConnectionInterface.php', + 'RectorPrefix202506\\React\\Socket\\Connector' => $vendorDir . '/react/socket/src/Connector.php', + 'RectorPrefix202506\\React\\Socket\\ConnectorInterface' => $vendorDir . '/react/socket/src/ConnectorInterface.php', + 'RectorPrefix202506\\React\\Socket\\DnsConnector' => $vendorDir . '/react/socket/src/DnsConnector.php', + 'RectorPrefix202506\\React\\Socket\\FdServer' => $vendorDir . '/react/socket/src/FdServer.php', + 'RectorPrefix202506\\React\\Socket\\FixedUriConnector' => $vendorDir . '/react/socket/src/FixedUriConnector.php', + 'RectorPrefix202506\\React\\Socket\\HappyEyeBallsConnectionBuilder' => $vendorDir . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', + 'RectorPrefix202506\\React\\Socket\\HappyEyeBallsConnector' => $vendorDir . '/react/socket/src/HappyEyeBallsConnector.php', + 'RectorPrefix202506\\React\\Socket\\LimitingServer' => $vendorDir . '/react/socket/src/LimitingServer.php', + 'RectorPrefix202506\\React\\Socket\\SecureConnector' => $vendorDir . '/react/socket/src/SecureConnector.php', + 'RectorPrefix202506\\React\\Socket\\SecureServer' => $vendorDir . '/react/socket/src/SecureServer.php', + 'RectorPrefix202506\\React\\Socket\\Server' => $vendorDir . '/react/socket/src/Server.php', + 'RectorPrefix202506\\React\\Socket\\ServerInterface' => $vendorDir . '/react/socket/src/ServerInterface.php', + 'RectorPrefix202506\\React\\Socket\\SocketServer' => $vendorDir . '/react/socket/src/SocketServer.php', + 'RectorPrefix202506\\React\\Socket\\StreamEncryption' => $vendorDir . '/react/socket/src/StreamEncryption.php', + 'RectorPrefix202506\\React\\Socket\\TcpConnector' => $vendorDir . '/react/socket/src/TcpConnector.php', + 'RectorPrefix202506\\React\\Socket\\TcpServer' => $vendorDir . '/react/socket/src/TcpServer.php', + 'RectorPrefix202506\\React\\Socket\\TimeoutConnector' => $vendorDir . '/react/socket/src/TimeoutConnector.php', + 'RectorPrefix202506\\React\\Socket\\UnixConnector' => $vendorDir . '/react/socket/src/UnixConnector.php', + 'RectorPrefix202506\\React\\Socket\\UnixServer' => $vendorDir . '/react/socket/src/UnixServer.php', + 'RectorPrefix202506\\React\\Stream\\CompositeStream' => $vendorDir . '/react/stream/src/CompositeStream.php', + 'RectorPrefix202506\\React\\Stream\\DuplexResourceStream' => $vendorDir . '/react/stream/src/DuplexResourceStream.php', + 'RectorPrefix202506\\React\\Stream\\DuplexStreamInterface' => $vendorDir . '/react/stream/src/DuplexStreamInterface.php', + 'RectorPrefix202506\\React\\Stream\\ReadableResourceStream' => $vendorDir . '/react/stream/src/ReadableResourceStream.php', + 'RectorPrefix202506\\React\\Stream\\ReadableStreamInterface' => $vendorDir . '/react/stream/src/ReadableStreamInterface.php', + 'RectorPrefix202506\\React\\Stream\\ThroughStream' => $vendorDir . '/react/stream/src/ThroughStream.php', + 'RectorPrefix202506\\React\\Stream\\Util' => $vendorDir . '/react/stream/src/Util.php', + 'RectorPrefix202506\\React\\Stream\\WritableResourceStream' => $vendorDir . '/react/stream/src/WritableResourceStream.php', + 'RectorPrefix202506\\React\\Stream\\WritableStreamInterface' => $vendorDir . '/react/stream/src/WritableStreamInterface.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Debug\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => $vendorDir . '/symfony/process/Exception/RunProcessFailedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => $vendorDir . '/symfony/process/Messenger/RunProcessContext.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => $vendorDir . '/symfony/process/Messenger/RunProcessMessage.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => $vendorDir . '/symfony/process/Messenger/RunProcessMessageHandler.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\PhpSubprocess' => $vendorDir . '/symfony/process/PhpSubprocess.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => $vendorDir . '/symfony/service-contracts/ServiceCollectionInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => $vendorDir . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => $vendorDir . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\CpuCoreCountProvider' => $vendorDir . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\Action' => $vendorDir . '/symplify/easy-parallel/src/Enum/Action.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\Content' => $vendorDir . '/symplify/easy-parallel/src/Enum/Content.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\ReactCommand' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactCommand.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\ReactEvent' => $vendorDir . '/symplify/easy-parallel/src/Enum/ReactEvent.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => $vendorDir . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => $vendorDir . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ScheduleFactory' => $vendorDir . '/symplify/easy-parallel/src/ScheduleFactory.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\Schedule' => $vendorDir . '/symplify/easy-parallel/src/ValueObject/Schedule.php', + 'RectorPrefix202506\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', + 'RectorPrefix202506\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', + 'RectorPrefix202506\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', 'Rector\\Application\\ApplicationFileProcessor' => $baseDir . '/src/Application/ApplicationFileProcessor.php', 'Rector\\Application\\ChangedNodeScopeRefresher' => $baseDir . '/src/Application/ChangedNodeScopeRefresher.php', 'Rector\\Application\\FileProcessor' => $baseDir . '/src/Application/FileProcessor.php', + 'Rector\\Application\\NodeAttributeReIndexer' => $baseDir . '/src/Application/NodeAttributeReIndexer.php', 'Rector\\Application\\Provider\\CurrentFileProvider' => $baseDir . '/src/Application/Provider/CurrentFileProvider.php', 'Rector\\Application\\VersionResolver' => $baseDir . '/src/Application/VersionResolver.php', 'Rector\\Arguments\\ArgumentDefaultValueReplacer' => $baseDir . '/rules/Arguments/ArgumentDefaultValueReplacer.php', @@ -1032,7 +1049,6 @@ 'Rector\\BetterPhpDocParser\\PhpDocNodeVisitor\\UnionTypeNodePhpDocNodeVisitor' => $baseDir . '/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\ArrayItemClassNameDecorator' => $baseDir . '/src/BetterPhpDocParser/PhpDocParser/ArrayItemClassNameDecorator.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterPhpDocParser' => $baseDir . '/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php', - 'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterTypeParser' => $baseDir . '/src/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\ClassAnnotationMatcher' => $baseDir . '/src/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\ConstExprClassNameDecorator' => $baseDir . '/src/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\DoctrineAnnotationDecorator' => $baseDir . '/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php', @@ -1083,6 +1099,9 @@ 'Rector\\Carbon\\Rector\\New_\\DateTimeInstanceToCarbonRector' => $baseDir . '/rules/Carbon/Rector/New_/DateTimeInstanceToCarbonRector.php', 'Rector\\ChangesReporting\\Contract\\Output\\OutputFormatterInterface' => $baseDir . '/src/ChangesReporting/Contract/Output/OutputFormatterInterface.php', 'Rector\\ChangesReporting\\Output\\ConsoleOutputFormatter' => $baseDir . '/src/ChangesReporting/Output/ConsoleOutputFormatter.php', + 'Rector\\ChangesReporting\\Output\\GitHubOutputFormatter' => $baseDir . '/src/ChangesReporting/Output/GitHubOutputFormatter.php', + 'Rector\\ChangesReporting\\Output\\GitlabOutputFormatter' => $baseDir . '/src/ChangesReporting/Output/GitlabOutputFormatter.php', + 'Rector\\ChangesReporting\\Output\\JUnitOutputFormatter' => $baseDir . '/src/ChangesReporting/Output/JUnitOutputFormatter.php', 'Rector\\ChangesReporting\\Output\\JsonOutputFormatter' => $baseDir . '/src/ChangesReporting/Output/JsonOutputFormatter.php', 'Rector\\ChangesReporting\\ValueObjectFactory\\ErrorFactory' => $baseDir . '/src/ChangesReporting/ValueObjectFactory/ErrorFactory.php', 'Rector\\ChangesReporting\\ValueObjectFactory\\FileDiffFactory' => $baseDir . '/src/ChangesReporting/ValueObjectFactory/FileDiffFactory.php', @@ -1175,6 +1194,7 @@ 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\AliasClassNameImportSkipVoter' => $baseDir . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/AliasClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\ClassLikeNameClassNameImportSkipVoter' => $baseDir . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\FullyQualifiedNameClassNameImportSkipVoter' => $baseDir . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php', + 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\ReservedClassNameImportSkipVoter' => $baseDir . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ReservedClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\UsesClassNameImportSkipVoter' => $baseDir . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/UsesClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipper' => $baseDir . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php', 'Rector\\CodingStyle\\ClassNameImport\\ShortNameResolver' => $baseDir . '/rules/CodingStyle/ClassNameImport/ShortNameResolver.php', @@ -1198,6 +1218,7 @@ 'Rector\\CodingStyle\\Rector\\Closure\\StaticClosureRector' => $baseDir . '/rules/CodingStyle/Rector/Closure/StaticClosureRector.php', 'Rector\\CodingStyle\\Rector\\Encapsed\\EncapsedStringsToSprintfRector' => $baseDir . '/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php', 'Rector\\CodingStyle\\Rector\\Encapsed\\WrapEncapsedVariableInCurlyBracesRector' => $baseDir . '/rules/CodingStyle/Rector/Encapsed/WrapEncapsedVariableInCurlyBracesRector.php', + 'Rector\\CodingStyle\\Rector\\Enum_\\EnumCaseToPascalCaseRector' => $baseDir . '/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php', 'Rector\\CodingStyle\\Rector\\Foreach_\\MultiDimensionalArrayToArrayDestructRector' => $baseDir . '/rules/CodingStyle/Rector/Foreach_/MultiDimensionalArrayToArrayDestructRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\ArraySpreadInsteadOfArrayMergeRector' => $baseDir . '/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\CallUserFuncArrayToVariadicRector' => $baseDir . '/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php', @@ -1207,6 +1228,7 @@ 'Rector\\CodingStyle\\Rector\\FuncCall\\FunctionFirstClassCallableRector' => $baseDir . '/rules/CodingStyle/Rector/FuncCall/FunctionFirstClassCallableRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\StrictArraySearchRector' => $baseDir . '/rules/CodingStyle/Rector/FuncCall/StrictArraySearchRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\VersionCompareFuncCallToConstantRector' => $baseDir . '/rules/CodingStyle/Rector/FuncCall/VersionCompareFuncCallToConstantRector.php', + 'Rector\\CodingStyle\\Rector\\FunctionLike\\FunctionLikeToFirstClassCallableRector' => $baseDir . '/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php', 'Rector\\CodingStyle\\Rector\\If_\\NullableCompareToNullRector' => $baseDir . '/rules/CodingStyle/Rector/If_/NullableCompareToNullRector.php', 'Rector\\CodingStyle\\Rector\\PostInc\\PostIncDecToPreIncDecRector' => $baseDir . '/rules/CodingStyle/Rector/PostInc/PostIncDecToPreIncDecRector.php', 'Rector\\CodingStyle\\Rector\\Property\\SplitGroupedPropertiesRector' => $baseDir . '/rules/CodingStyle/Rector/Property/SplitGroupedPropertiesRector.php', @@ -1225,14 +1247,17 @@ 'Rector\\Composer\\InstalledPackageResolver' => $baseDir . '/src/Composer/InstalledPackageResolver.php', 'Rector\\Composer\\ValueObject\\InstalledPackage' => $baseDir . '/src/Composer/ValueObject/InstalledPackage.php', 'Rector\\Config\\Level\\CodeQualityLevel' => $baseDir . '/src/Config/Level/CodeQualityLevel.php', + 'Rector\\Config\\Level\\CodingStyleLevel' => $baseDir . '/src/Config/Level/CodingStyleLevel.php', 'Rector\\Config\\Level\\DeadCodeLevel' => $baseDir . '/src/Config/Level/DeadCodeLevel.php', 'Rector\\Config\\Level\\TypeDeclarationLevel' => $baseDir . '/src/Config/Level/TypeDeclarationLevel.php', 'Rector\\Config\\RectorConfig' => $baseDir . '/src/Config/RectorConfig.php', 'Rector\\Config\\RegisteredService' => $baseDir . '/src/Config/RegisteredService.php', 'Rector\\Configuration\\ConfigInitializer' => $baseDir . '/src/Configuration/ConfigInitializer.php', 'Rector\\Configuration\\ConfigurationFactory' => $baseDir . '/src/Configuration/ConfigurationFactory.php', + 'Rector\\Configuration\\ConfigurationRuleFilter' => $baseDir . '/src/Configuration/ConfigurationRuleFilter.php', 'Rector\\Configuration\\Deprecation\\Contract\\DeprecatedInterface' => $baseDir . '/src/Configuration/Deprecation/Contract/DeprecatedInterface.php', 'Rector\\Configuration\\Levels\\LevelRulesResolver' => $baseDir . '/src/Configuration/Levels/LevelRulesResolver.php', + 'Rector\\Configuration\\OnlyRuleResolver' => $baseDir . '/src/Configuration/OnlyRuleResolver.php', 'Rector\\Configuration\\Option' => $baseDir . '/src/Configuration/Option.php', 'Rector\\Configuration\\Parameter\\SimpleParameterProvider' => $baseDir . '/src/Configuration/Parameter/SimpleParameterProvider.php', 'Rector\\Configuration\\PhpLevelSetResolver' => $baseDir . '/src/Configuration/PhpLevelSetResolver.php', @@ -1257,8 +1282,8 @@ 'Rector\\Contract\\DependencyInjection\\ResetableInterface' => $baseDir . '/src/Contract/DependencyInjection/ResetableInterface.php', 'Rector\\Contract\\PhpParser\\Node\\StmtsAwareInterface' => $baseDir . '/src/Contract/PhpParser/Node/StmtsAwareInterface.php', 'Rector\\Contract\\Rector\\ConfigurableRectorInterface' => $baseDir . '/src/Contract/Rector/ConfigurableRectorInterface.php', + 'Rector\\Contract\\Rector\\HTMLAverseRectorInterface' => $baseDir . '/src/Contract/Rector/HTMLAverseRectorInterface.php', 'Rector\\Contract\\Rector\\RectorInterface' => $baseDir . '/src/Contract/Rector/RectorInterface.php', - 'Rector\\Contract\\Rector\\ScopeAwareRectorInterface' => $baseDir . '/src/Contract/Rector/ScopeAwareRectorInterface.php', 'Rector\\CustomRules\\SimpleNodeDumper' => $baseDir . '/src/CustomRules/SimpleNodeDumper.php', 'Rector\\DeadCode\\ConditionEvaluator' => $baseDir . '/rules/DeadCode/ConditionEvaluator.php', 'Rector\\DeadCode\\ConditionResolver' => $baseDir . '/rules/DeadCode/ConditionResolver.php', @@ -1286,11 +1311,13 @@ 'Rector\\DeadCode\\Rector\\Array_\\RemoveDuplicatedArrayKeyRector' => $baseDir . '/rules/DeadCode/Rector/Array_/RemoveDuplicatedArrayKeyRector.php', 'Rector\\DeadCode\\Rector\\Assign\\RemoveDoubleAssignRector' => $baseDir . '/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php', 'Rector\\DeadCode\\Rector\\Assign\\RemoveUnusedVariableAssignRector' => $baseDir . '/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php', + 'Rector\\DeadCode\\Rector\\Block\\ReplaceBlockToItsStmtsRector' => $baseDir . '/rules/DeadCode/Rector/Block/ReplaceBlockToItsStmtsRector.php', 'Rector\\DeadCode\\Rector\\BooleanAnd\\RemoveAndTrueRector' => $baseDir . '/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php', 'Rector\\DeadCode\\Rector\\Cast\\RecastingRemovalRector' => $baseDir . '/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php', 'Rector\\DeadCode\\Rector\\ClassConst\\RemoveUnusedPrivateClassConstantRector' => $baseDir . '/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveAnnotationRector' => $baseDir . '/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveTypedPropertyNonMockDocblockRector' => $baseDir . '/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveArgumentFromDefaultParentCallRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveArgumentFromDefaultParentCallRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveEmptyClassMethodRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveNullTagValueNodeRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedConstructorParamRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php', @@ -1298,6 +1325,7 @@ 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPromotedPropertyRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPublicMethodParameterRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessAssignFromPropertyPromotionRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessParamTagRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnExprInConstructRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnTagRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php', @@ -1309,6 +1337,7 @@ 'Rector\\DeadCode\\Rector\\For_\\RemoveDeadIfForeachForRector' => $baseDir . '/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php', 'Rector\\DeadCode\\Rector\\For_\\RemoveDeadLoopRector' => $baseDir . '/rules/DeadCode/Rector/For_/RemoveDeadLoopRector.php', 'Rector\\DeadCode\\Rector\\Foreach_\\RemoveUnusedForeachKeyRector' => $baseDir . '/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php', + 'Rector\\DeadCode\\Rector\\FuncCall\\RemoveFilterVarOnExactTypeRector' => $baseDir . '/rules/DeadCode/Rector/FuncCall/RemoveFilterVarOnExactTypeRector.php', 'Rector\\DeadCode\\Rector\\FunctionLike\\RemoveDeadReturnRector' => $baseDir . '/rules/DeadCode/Rector/FunctionLike/RemoveDeadReturnRector.php', 'Rector\\DeadCode\\Rector\\If_\\ReduceAlwaysFalseIfOrRector' => $baseDir . '/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php', 'Rector\\DeadCode\\Rector\\If_\\RemoveAlwaysTrueIfConditionRector' => $baseDir . '/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php', @@ -1328,6 +1357,7 @@ 'Rector\\DeadCode\\Rector\\Stmt\\RemoveUnreachableStatementRector' => $baseDir . '/rules/DeadCode/Rector/Stmt/RemoveUnreachableStatementRector.php', 'Rector\\DeadCode\\Rector\\Switch_\\RemoveDuplicatedCaseInSwitchRector' => $baseDir . '/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php', 'Rector\\DeadCode\\Rector\\Ternary\\TernaryToBooleanOrFalseToBooleanAndRector' => $baseDir . '/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php', + 'Rector\\DeadCode\\Rector\\TryCatch\\RemoveDeadCatchRector' => $baseDir . '/rules/DeadCode/Rector/TryCatch/RemoveDeadCatchRector.php', 'Rector\\DeadCode\\Rector\\TryCatch\\RemoveDeadTryCatchRector' => $baseDir . '/rules/DeadCode/Rector/TryCatch/RemoveDeadTryCatchRector.php', 'Rector\\DeadCode\\SideEffect\\PureFunctionDetector' => $baseDir . '/rules/DeadCode/SideEffect/PureFunctionDetector.php', 'Rector\\DeadCode\\SideEffect\\SideEffectNodeDetector' => $baseDir . '/rules/DeadCode/SideEffect/SideEffectNodeDetector.php', @@ -1341,6 +1371,7 @@ 'Rector\\DependencyInjection\\RectorContainerFactory' => $baseDir . '/src/DependencyInjection/RectorContainerFactory.php', 'Rector\\Differ\\DefaultDiffer' => $baseDir . '/src/Differ/DefaultDiffer.php', 'Rector\\Doctrine\\Bundle210\\Rector\\Class_\\EventSubscriberInterfaceToAttributeRector' => $vendorDir . '/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php', + 'Rector\\Doctrine\\Bundle230\\Rector\\Class_\\AddAnnotationToRepositoryRector' => $vendorDir . '/rector/rector-doctrine/rules/Bundle230/Rector/Class_/AddAnnotationToRepositoryRector.php', 'Rector\\Doctrine\\CodeQuality\\AttributeTransformer\\ClassAttributeTransformer\\EmbeddableClassAttributeTransformer' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EmbeddableClassAttributeTransformer.php', 'Rector\\Doctrine\\CodeQuality\\AttributeTransformer\\ClassAttributeTransformer\\EntityClassAttributeTransformer' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EntityClassAttributeTransformer.php', 'Rector\\Doctrine\\CodeQuality\\AttributeTransformer\\ClassAttributeTransformer\\InheritanceClassAttributeTransformer' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/InheritanceClassAttributeTransformer.php', @@ -1369,19 +1400,12 @@ 'Rector\\Doctrine\\CodeQuality\\Enum\\OdmMappingKey' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Enum/OdmMappingKey.php', 'Rector\\Doctrine\\CodeQuality\\Helper\\NodeValueNormalizer' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Helper/NodeValueNormalizer.php', 'Rector\\Doctrine\\CodeQuality\\NodeFactory\\AttributeFactory' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/NodeFactory/AttributeFactory.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\ExplicitRelationCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php', + 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\RemoveEmptyTableAttributeRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\YamlToAttributeDoctrineMappingRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/YamlToAttributeDoctrineMappingRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\CorrectDefaultTypesOnEntityPropertyRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/CorrectDefaultTypesOnEntityPropertyRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\ImproveDoctrineCollectionDocTypeInEntityRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\MakeEntityDateTimePropertyDateTimeInterfaceRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromColumnTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromDoctrineCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromToManyRelationTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromToOneRelationTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToOneRelationTypeRector.php', 'Rector\\Doctrine\\CodeQuality\\SetterCollectionResolver' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/SetterCollectionResolver.php', 'Rector\\Doctrine\\CodeQuality\\Utils\\CaseStringHelper' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Utils/CaseStringHelper.php', @@ -1390,13 +1414,20 @@ 'Rector\\Doctrine\\Dbal211\\Rector\\MethodCall\\ExtractArrayArgOnQueryBuilderSelectRector' => $vendorDir . '/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ExtractArrayArgOnQueryBuilderSelectRector.php', 'Rector\\Doctrine\\Dbal211\\Rector\\MethodCall\\ReplaceFetchAllMethodCallRector' => $vendorDir . '/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ReplaceFetchAllMethodCallRector.php', 'Rector\\Doctrine\\Dbal40\\Rector\\MethodCall\\ChangeCompositeExpressionAddMultipleWithWithRector' => $vendorDir . '/rector/rector-doctrine/rules/Dbal40/Rector/MethodCall/ChangeCompositeExpressionAddMultipleWithWithRector.php', + 'Rector\\Doctrine\\Dbal40\\Rector\\StmtsAwareInterface\\ExecuteQueryParamsToBindValueRector' => $vendorDir . '/rector/rector-doctrine/rules/Dbal40/Rector/StmtsAwareInterface/ExecuteQueryParamsToBindValueRector.php', + 'Rector\\Doctrine\\Dbal42\\Rector\\New_\\AddArrayResultColumnNamesRector' => $vendorDir . '/rector/rector-doctrine/rules/Dbal42/Rector/New_/AddArrayResultColumnNamesRector.php', + 'Rector\\Doctrine\\DoctrineFixture\\Rector\\MethodCall\\AddGetReferenceTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/DoctrineFixture/Rector/MethodCall/AddGetReferenceTypeRector.php', + 'Rector\\Doctrine\\DoctrineFixture\\Reflection\\ParameterTypeResolver' => $vendorDir . '/rector/rector-doctrine/rules/DoctrineFixture/Reflection/ParameterTypeResolver.php', + 'Rector\\Doctrine\\Enum\\DoctrineClass' => $vendorDir . '/rector/rector-doctrine/src/Enum/DoctrineClass.php', 'Rector\\Doctrine\\Enum\\MappingClass' => $vendorDir . '/rector/rector-doctrine/src/Enum/MappingClass.php', 'Rector\\Doctrine\\Enum\\OdmMappingClass' => $vendorDir . '/rector/rector-doctrine/src/Enum/OdmMappingClass.php', + 'Rector\\Doctrine\\Enum\\TestClass' => $vendorDir . '/rector/rector-doctrine/src/Enum/TestClass.php', 'Rector\\Doctrine\\NodeAnalyzer\\AttributeFinder' => $vendorDir . '/rector/rector-doctrine/src/NodeAnalyzer/AttributeFinder.php', 'Rector\\Doctrine\\NodeAnalyzer\\AttrinationFinder' => $vendorDir . '/rector/rector-doctrine/src/NodeAnalyzer/AttrinationFinder.php', 'Rector\\Doctrine\\NodeAnalyzer\\ConstructorAssignPropertyAnalyzer' => $vendorDir . '/rector/rector-doctrine/src/NodeAnalyzer/ConstructorAssignPropertyAnalyzer.php', 'Rector\\Doctrine\\NodeAnalyzer\\DoctrineEntityDetector' => $vendorDir . '/rector/rector-doctrine/src/NodeAnalyzer/DoctrineEntityDetector.php', 'Rector\\Doctrine\\NodeAnalyzer\\MethodUniqueReturnedPropertyResolver' => $vendorDir . '/rector/rector-doctrine/src/NodeAnalyzer/MethodUniqueReturnedPropertyResolver.php', + 'Rector\\Doctrine\\NodeAnalyzer\\RepositoryClassResolver' => $vendorDir . '/rector/rector-doctrine/src/NodeAnalyzer/RepositoryClassResolver.php', 'Rector\\Doctrine\\NodeAnalyzer\\TargetEntityResolver' => $vendorDir . '/rector/rector-doctrine/src/NodeAnalyzer/TargetEntityResolver.php', 'Rector\\Doctrine\\NodeFactory\\ArrayCollectionAssignFactory' => $vendorDir . '/rector/rector-doctrine/src/NodeFactory/ArrayCollectionAssignFactory.php', 'Rector\\Doctrine\\NodeFactory\\ValueAssignFactory' => $vendorDir . '/rector/rector-doctrine/src/NodeFactory/ValueAssignFactory.php', @@ -1407,6 +1438,8 @@ 'Rector\\Doctrine\\NodeManipulator\\ToOneRelationPropertyTypeResolver' => $vendorDir . '/rector/rector-doctrine/src/NodeManipulator/ToOneRelationPropertyTypeResolver.php', 'Rector\\Doctrine\\Orm214\\Rector\\Param\\ReplaceLifecycleEventArgsByDedicatedEventArgsRector' => $vendorDir . '/rector/rector-doctrine/rules/Orm214/Rector/Param/ReplaceLifecycleEventArgsByDedicatedEventArgsRector.php', 'Rector\\Doctrine\\Orm28\\Rector\\MethodCall\\IterateToToIterableRector' => $vendorDir . '/rector/rector-doctrine/rules/Orm28/Rector/MethodCall/IterateToToIterableRector.php', + 'Rector\\Doctrine\\Orm30\\Rector\\MethodCall\\CastDoctrineExprToStringRector' => $vendorDir . '/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/CastDoctrineExprToStringRector.php', + 'Rector\\Doctrine\\Orm30\\Rector\\MethodCall\\SetParametersArrayToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/SetParametersArrayToCollectionRector.php', 'Rector\\Doctrine\\PhpDocParser\\DoctrineDocBlockResolver' => $vendorDir . '/rector/rector-doctrine/src/PhpDocParser/DoctrineDocBlockResolver.php', 'Rector\\Doctrine\\PhpDoc\\ShortClassExpander' => $vendorDir . '/rector/rector-doctrine/src/PhpDoc/ShortClassExpander.php', 'Rector\\Doctrine\\Set\\DoctrineSetList' => $vendorDir . '/rector/rector-doctrine/src/Set/DoctrineSetList.php', @@ -1414,6 +1447,43 @@ 'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeFactory' => $vendorDir . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php', 'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeResolver' => $vendorDir . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php', 'Rector\\Doctrine\\TypeAnalyzer\\CollectionVarTagValueNodeResolver' => $vendorDir . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php', + 'Rector\\Doctrine\\TypedCollections\\DocBlockAnalyzer\\CollectionTagValueNodeAnalyzer' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php', + 'Rector\\Doctrine\\TypedCollections\\DocBlockProcessor\\UnionCollectionTagValueNodeNarrower' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php', + 'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\CollectionParamCallDetector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php', + 'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\EntityLikeClassDetector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Assign\\ArrayDimFetchAssignToAddCollectionCallRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Assign\\ArrayOffsetSetToSetCollectionCallRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayOffsetSetToSetCollectionCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionGetterNativeTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionParamTypeSetterToCollectionPropertyRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionSetterParamNativeTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\DefaultCollectionKeyRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowArrayCollectionToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowParamUnionToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowReturnUnionToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowReturnUnionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\RemoveNewArrayCollectionOutsideConstructorRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNewArrayCollectionOutsideConstructorRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\RemoveNullFromNullableCollectionTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\ReturnArrayToNewArrayCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnArrayToNewArrayCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\ReturnCollectionDocblockRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnCollectionDocblockRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\CompleteParamDocblockFromSetterToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteParamDocblockFromSetterToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\CompletePropertyDocblockFromToManyRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompletePropertyDocblockFromToManyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\CompleteReturnDocblockFromToManyRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteReturnDocblockFromToManyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\InitializeCollectionInConstructorRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/InitializeCollectionInConstructorRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Empty_\\EmptyOnCollectionToIsEmptyCallRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Empty_/EmptyOnCollectionToIsEmptyCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Expression\\RemoveAssertNotNullOnCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Expression\\RemoveCoalesceAssignOnCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveCoalesceAssignOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\FuncCall\\ArrayMapOnCollectionToArrayRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMapOnCollectionToArrayRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\FuncCall\\ArrayMergeOnCollectionToArrayRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMergeOnCollectionToArrayRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\FuncCall\\InArrayOnCollectionToContainsCallRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/InArrayOnCollectionToContainsCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\If_\\RemoveIfInstanceofCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIfInstanceofCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\If_\\RemoveIsArrayOnCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIsArrayOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\MethodCall\\AssertNullOnCollectionToAssertEmptyRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertNullOnCollectionToAssertEmptyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\MethodCall\\AssertSameCountOnCollectionToAssertCountRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\MethodCall\\SetArrayToNewCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/SetArrayToNewCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\New_\\RemoveNewArrayCollectionWrapRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/New_/RemoveNewArrayCollectionWrapRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\NullsafeMethodCall\\RemoveNullsafeOnCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/NullsafeMethodCall/RemoveNullsafeOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Property\\NarrowPropertyUnionToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Property/NarrowPropertyUnionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Property\\TypedPropertyFromToManyRelationTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\TypeAnalyzer\\CollectionTypeDetector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/TypeAnalyzer/CollectionTypeDetector.php', 'Rector\\DowngradePhp72\\NodeAnalyzer\\BuiltInMethodAnalyzer' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php', 'Rector\\DowngradePhp72\\NodeAnalyzer\\OverrideFromAnonymousClassMethodAnalyzer' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/OverrideFromAnonymousClassMethodAnalyzer.php', 'Rector\\DowngradePhp72\\NodeAnalyzer\\RegexFuncAnalyzer' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/RegexFuncAnalyzer.php', @@ -1437,6 +1507,7 @@ 'Rector\\DowngradePhp73\\Rector\\Unset_\\DowngradeTrailingCommasInUnsetRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/Unset_/DowngradeTrailingCommasInUnsetRector.php', 'Rector\\DowngradePhp73\\Tokenizer\\FollowedByCommaAnalyzer' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByCommaAnalyzer.php', 'Rector\\DowngradePhp73\\Tokenizer\\FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer.php', + 'Rector\\DowngradePhp73\\Tokenizer\\TrailingCommaRemover' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/TrailingCommaRemover.php', 'Rector\\DowngradePhp74\\Rector\\Array_\\DowngradeArraySpreadRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php', 'Rector\\DowngradePhp74\\Rector\\ArrowFunction\\ArrowFunctionToAnonymousFunctionRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ArrowFunction/ArrowFunctionToAnonymousFunctionRector.php', 'Rector\\DowngradePhp74\\Rector\\ClassMethod\\DowngradeContravariantArgumentTypeRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeContravariantArgumentTypeRector.php', @@ -1474,6 +1545,7 @@ 'Rector\\DowngradePhp80\\Rector\\FuncCall\\DowngradeStrStartsWithRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrStartsWithRector.php', 'Rector\\DowngradePhp80\\Rector\\FunctionLike\\DowngradeMixedTypeDeclarationRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeMixedTypeDeclarationRector.php', 'Rector\\DowngradePhp80\\Rector\\FunctionLike\\DowngradeUnionTypeDeclarationRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeUnionTypeDeclarationRector.php', + 'Rector\\DowngradePhp80\\Rector\\Instanceof_\\DowngradeInstanceofStringableRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradeInstanceofStringableRector.php', 'Rector\\DowngradePhp80\\Rector\\Instanceof_\\DowngradePhp80ResourceReturnToObjectRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradePhp80ResourceReturnToObjectRector.php', 'Rector\\DowngradePhp80\\Rector\\MethodCall\\DowngradeNamedArgumentRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeNamedArgumentRector.php', 'Rector\\DowngradePhp80\\Rector\\MethodCall\\DowngradeReflectionClassGetConstantsFilterRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionClassGetConstantsFilterRector.php', @@ -1503,9 +1575,16 @@ 'Rector\\DowngradePhp81\\Rector\\MethodCall\\DowngradeIsEnumRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/MethodCall/DowngradeIsEnumRector.php', 'Rector\\DowngradePhp81\\Rector\\Property\\DowngradeReadonlyPropertyRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Property/DowngradeReadonlyPropertyRector.php', 'Rector\\DowngradePhp81\\Rector\\StmtsAwareInterface\\DowngradeSetAccessibleReflectionPropertyRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/StmtsAwareInterface/DowngradeSetAccessibleReflectionPropertyRector.php', + 'Rector\\DowngradePhp82\\NodeManipulator\\DowngradeReadonlyClassManipulator' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp82/NodeManipulator/DowngradeReadonlyClassManipulator.php', 'Rector\\DowngradePhp82\\Rector\\Class_\\DowngradeReadonlyClassRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/Class_/DowngradeReadonlyClassRector.php', + 'Rector\\DowngradePhp82\\Rector\\FuncCall\\DowngradeIteratorCountToArrayRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FuncCall/DowngradeIteratorCountToArrayRector.php', 'Rector\\DowngradePhp82\\Rector\\FunctionLike\\DowngradeStandaloneNullTrueFalseReturnTypeRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FunctionLike/DowngradeStandaloneNullTrueFalseReturnTypeRector.php', + 'Rector\\DowngradePhp83\\Rector\\ClassConstFetch\\DowngradeDynamicClassConstFetchRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php', 'Rector\\DowngradePhp83\\Rector\\ClassConst\\DowngradeTypedClassConstRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConst/DowngradeTypedClassConstRector.php', + 'Rector\\DowngradePhp83\\Rector\\Class_\\DowngradeReadonlyAnonymousClassRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/Class_/DowngradeReadonlyAnonymousClassRector.php', + 'Rector\\DowngradePhp84\\Rector\\FuncCall\\DowngradeRoundingModeEnumRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php', + 'Rector\\DowngradePhp84\\Rector\\MethodCall\\DowngradeNewMethodCallWithoutParenthesesRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php', + 'Rector\\DowngradePhp85\\Rector\\FuncCall\\DowngradeArrayFirstLastRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp85/Rector/FuncCall/DowngradeArrayFirstLastRector.php', 'Rector\\EarlyReturn\\NodeTransformer\\ConditionInverter' => $baseDir . '/rules/EarlyReturn/NodeTransformer/ConditionInverter.php', 'Rector\\EarlyReturn\\Rector\\Foreach_\\ChangeNestedForeachIfsToEarlyContinueRector' => $baseDir . '/rules/EarlyReturn/Rector/Foreach_/ChangeNestedForeachIfsToEarlyContinueRector.php', 'Rector\\EarlyReturn\\Rector\\If_\\ChangeIfElseValueAssignToEarlyReturnRector' => $baseDir . '/rules/EarlyReturn/Rector/If_/ChangeIfElseValueAssignToEarlyReturnRector.php', @@ -1517,10 +1596,13 @@ 'Rector\\EarlyReturn\\Rector\\StmtsAwareInterface\\ReturnEarlyIfVariableRector' => $baseDir . '/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php', 'Rector\\EarlyReturn\\ValueObject\\BareSingleAssignIf' => $baseDir . '/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php', 'Rector\\Enum\\ClassName' => $baseDir . '/src/Enum/ClassName.php', + 'Rector\\Enum\\Config\\Defaults' => $baseDir . '/src/Enum/Config/Defaults.php', 'Rector\\Enum\\JsonConstant' => $vendorDir . '/rector/rector-downgrade-php/src/Enum/JsonConstant.php', 'Rector\\Enum\\ObjectReference' => $baseDir . '/src/Enum/ObjectReference.php', 'Rector\\Exception\\Cache\\CachingException' => $baseDir . '/src/Exception/Cache/CachingException.php', 'Rector\\Exception\\Configuration\\InvalidConfigurationException' => $baseDir . '/src/Exception/Configuration/InvalidConfigurationException.php', + 'Rector\\Exception\\Configuration\\RectorRuleNameAmbiguousException' => $baseDir . '/src/Exception/Configuration/RectorRuleNameAmbiguousException.php', + 'Rector\\Exception\\Configuration\\RectorRuleNotFoundException' => $baseDir . '/src/Exception/Configuration/RectorRuleNotFoundException.php', 'Rector\\Exception\\NotImplementedYetException' => $baseDir . '/src/Exception/NotImplementedYetException.php', 'Rector\\Exception\\Reflection\\MissingPrivatePropertyException' => $baseDir . '/src/Exception/Reflection/MissingPrivatePropertyException.php', 'Rector\\Exception\\ShouldNotHappenException' => $baseDir . '/src/Exception/ShouldNotHappenException.php', @@ -1535,9 +1617,6 @@ 'Rector\\FileSystem\\JsonFileSystem' => $baseDir . '/src/FileSystem/JsonFileSystem.php', 'Rector\\Git\\RepositoryHelper' => $baseDir . '/src/Git/RepositoryHelper.php', 'Rector\\Instanceof_\\Rector\\Ternary\\FlipNegatedTernaryInstanceofRector' => $baseDir . '/rules/Instanceof_/Rector/Ternary/FlipNegatedTernaryInstanceofRector.php', - 'Rector\\Naming\\AssignVariableNameResolver\\NewAssignVariableNameResolver' => $baseDir . '/rules/Naming/AssignVariableNameResolver/NewAssignVariableNameResolver.php', - 'Rector\\Naming\\AssignVariableNameResolver\\PropertyFetchAssignVariableNameResolver' => $baseDir . '/rules/Naming/AssignVariableNameResolver/PropertyFetchAssignVariableNameResolver.php', - 'Rector\\Naming\\Contract\\AssignVariableNameResolverInterface' => $baseDir . '/rules/Naming/Contract/AssignVariableNameResolverInterface.php', 'Rector\\Naming\\ExpectedNameResolver\\InflectorSingularResolver' => $baseDir . '/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php', 'Rector\\Naming\\ExpectedNameResolver\\MatchParamTypeExpectedNameResolver' => $baseDir . '/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php', 'Rector\\Naming\\ExpectedNameResolver\\MatchPropertyTypeExpectedNameResolver' => $baseDir . '/rules/Naming/ExpectedNameResolver/MatchPropertyTypeExpectedNameResolver.php', @@ -1552,7 +1631,7 @@ 'Rector\\Naming\\Naming\\AliasNameResolver' => $baseDir . '/rules/Naming/Naming/AliasNameResolver.php', 'Rector\\Naming\\Naming\\ConflictingNameResolver' => $baseDir . '/rules/Naming/Naming/ConflictingNameResolver.php', 'Rector\\Naming\\Naming\\ExpectedNameResolver' => $baseDir . '/rules/Naming/Naming/ExpectedNameResolver.php', - 'Rector\\Naming\\Naming\\OverridenExistingNamesResolver' => $baseDir . '/rules/Naming/Naming/OverridenExistingNamesResolver.php', + 'Rector\\Naming\\Naming\\OverriddenExistingNamesResolver' => $baseDir . '/rules/Naming/Naming/OverriddenExistingNamesResolver.php', 'Rector\\Naming\\Naming\\PropertyNaming' => $baseDir . '/rules/Naming/Naming/PropertyNaming.php', 'Rector\\Naming\\Naming\\UseImportsResolver' => $baseDir . '/rules/Naming/Naming/UseImportsResolver.php', 'Rector\\Naming\\Naming\\VariableNaming' => $baseDir . '/rules/Naming/Naming/VariableNaming.php', @@ -1578,6 +1657,7 @@ 'Rector\\Naming\\ValueObject\\VariableAndCallAssign' => $baseDir . '/rules/Naming/ValueObject/VariableAndCallAssign.php', 'Rector\\Naming\\ValueObject\\VariableAndCallForeach' => $baseDir . '/rules/Naming/ValueObject/VariableAndCallForeach.php', 'Rector\\Naming\\VariableRenamer' => $baseDir . '/rules/Naming/VariableRenamer.php', + 'Rector\\NetteUtils\\Rector\\StaticCall\\UtilsJsonStaticCallNamedArgRector' => $baseDir . '/rules/NetteUtils/Rector/StaticCall/UtilsJsonStaticCallNamedArgRector.php', 'Rector\\NodeAnalyzer\\ArgsAnalyzer' => $baseDir . '/src/NodeAnalyzer/ArgsAnalyzer.php', 'Rector\\NodeAnalyzer\\BinaryOpAnalyzer' => $baseDir . '/src/NodeAnalyzer/BinaryOpAnalyzer.php', 'Rector\\NodeAnalyzer\\CallAnalyzer' => $baseDir . '/src/NodeAnalyzer/CallAnalyzer.php', @@ -1606,6 +1686,7 @@ 'Rector\\NodeCollector\\ValueObject\\ArrayCallableDynamicMethod' => $baseDir . '/src/NodeCollector/ValueObject/ArrayCallableDynamicMethod.php', 'Rector\\NodeDecorator\\CreatedByRuleDecorator' => $baseDir . '/src/NodeDecorator/CreatedByRuleDecorator.php', 'Rector\\NodeDecorator\\PropertyTypeDecorator' => $baseDir . '/src/NodeDecorator/PropertyTypeDecorator.php', + 'Rector\\NodeDecorator\\StatementDepthAttributeDecorator' => $baseDir . '/src/NodeDecorator/StatementDepthAttributeDecorator.php', 'Rector\\NodeFactory\\ClassFromEnumFactory' => $vendorDir . '/rector/rector-downgrade-php/src/NodeFactory/ClassFromEnumFactory.php', 'Rector\\NodeFactory\\DoctrineAnnotationFactory' => $vendorDir . '/rector/rector-downgrade-php/src/NodeFactory/DoctrineAnnotationFactory.php', 'Rector\\NodeFactory\\NamedVariableFactory' => $vendorDir . '/rector/rector-downgrade-php/src/NodeFactory/NamedVariableFactory.php', @@ -1673,6 +1754,7 @@ 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\StaticVariableNodeVisitor' => $baseDir . '/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StaticVariableNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\StmtKeyNodeVisitor' => $baseDir . '/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StmtKeyNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\PHPStanNodeScopeResolver' => $baseDir . '/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php', + 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\RectorNodeScopeResolver' => $baseDir . '/src/NodeTypeResolver/PHPStan/Scope/RectorNodeScopeResolver.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\ScopeFactory' => $baseDir . '/src/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php', 'Rector\\NodeTypeResolver\\PHPStan\\TypeHasher' => $baseDir . '/src/NodeTypeResolver/PHPStan/TypeHasher.php', 'Rector\\NodeTypeResolver\\PHPStan\\Type\\StaticTypeAnalyzer' => $baseDir . '/src/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php', @@ -1707,6 +1789,7 @@ 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ClosureTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ConditionalTypeForParameterMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeForParameterMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ConditionalTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php', + 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ConstantArrayTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/ConstantArrayTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\FloatTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/FloatTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\GenericClassStringTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/GenericClassStringTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\HasMethodTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/HasMethodTypeMapper.php', @@ -1734,16 +1817,21 @@ 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\UnionTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\VoidTypeMapper' => $baseDir . '/src/PHPStanStaticTypeMapper/TypeMapper/VoidTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\Utils\\TypeUnwrapper' => $baseDir . '/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php', - 'Rector\\PHPStan\\NodeVisitor\\UnreachableStatementNodeVisitor' => $baseDir . '/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php', - 'Rector\\PHPStan\\NodeVisitor\\WrappedNodeRestoringNodeVisitor' => $baseDir . '/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php', + 'Rector\\PHPStan\\ScopeFetcher' => $baseDir . '/src/PHPStan/ScopeFetcher.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\ClassMethod\\DataProviderAnnotationToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\ClassMethod\\DependsAnnotationWithValueToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\ClassMethod\\TestWithAnnotationToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\AnnotationWithValueToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\CoversAnnotationWithValueToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php', + 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\RequiresAnnotationWithValueToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\TicketAnnotationToAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Enum\\NonAssertNonStaticMethods' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Enum/NonAssertNonStaticMethods.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\AssertMethodAnalyzer' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php', 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\DoctrineEntityDocumentAnalyser' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\NullableObjectAssignCollector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/NullableObjectAssignCollector.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\SetUpAssignedMockTypesResolver' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/SetUpAssignedMockTypesResolver.php', 'Rector\\PHPUnit\\CodeQuality\\NodeFactory\\NestedClosureAssertFactory' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\AddInstanceofAssertForNullableInstanceRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/AddInstanceofAssertForNullableInstanceRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\CreateMockToAnonymousClassRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\DataProviderArrayItemsNewLinedRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\EntityDocumentCreateMockToDirectNewRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php', @@ -1757,13 +1845,15 @@ 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\NarrowUnusedSetUpDefinedPropertyRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitSelfCallRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitThisCallRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\RemoveDataProviderParamKeysRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/RemoveDataProviderParamKeysRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SetUpBeforeClassToSetUpRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SingleMockPropertyTypeRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TestWithToDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TypeWillReturnCallableArrowFunctionRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\YieldDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\FuncCall\\AssertFuncCallToPHPUnitAssertRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareOnCountableWithMethodToAssertCountRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php', - 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareToSpecificMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertComparisonToSpecificMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEmptyNullableObjectToAssertInstanceofRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php', @@ -1784,11 +1874,16 @@ 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\SingleWithConsecutiveToWithRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/SingleWithConsecutiveToWithRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\UseSpecificWillMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\UseSpecificWithMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWithMethodRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Reflection\\MethodParametersAndReturnTypesResolver' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php', 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\MatchAndReturnMatch' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php', + 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\ParamTypesAndReturnType' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/ParamTypesAndReturnType.php', + 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\VariableNameToType' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToType.php', + 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\VariableNameToTypeCollection' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToTypeCollection.php', 'Rector\\PHPUnit\\Composer\\ProjectPackageVersionResolver' => $vendorDir . '/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php', 'Rector\\PHPUnit\\Enum\\AssertMethod' => $vendorDir . '/rector/rector-phpunit/src/Enum/AssertMethod.php', 'Rector\\PHPUnit\\Enum\\ConsecutiveMethodName' => $vendorDir . '/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php', 'Rector\\PHPUnit\\Enum\\ConsecutiveVariable' => $vendorDir . '/rector/rector-phpunit/src/Enum/ConsecutiveVariable.php', + 'Rector\\PHPUnit\\Enum\\PHPUnitClassName' => $vendorDir . '/rector/rector-phpunit/src/Enum/PHPUnitClassName.php', 'Rector\\PHPUnit\\MethodCallRemover' => $vendorDir . '/rector/rector-phpunit/src/MethodCallRemover.php', 'Rector\\PHPUnit\\Naming\\TestClassNameResolver' => $vendorDir . '/rector/rector-phpunit/src/Naming/TestClassNameResolver.php', 'Rector\\PHPUnit\\NodeAnalyzer\\ArgumentMover' => $vendorDir . '/rector/rector-phpunit/src/NodeAnalyzer/ArgumentMover.php', @@ -1807,13 +1902,16 @@ 'Rector\\PHPUnit\\PHPUnit100\\NodeDecorator\\WillReturnIfNodeDecorator' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php', 'Rector\\PHPUnit\\PHPUnit100\\NodeFactory\\WillReturnCallbackFactory' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\AddProphecyTraitRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\ParentTestClassConstructorRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/ParentTestClassConstructorRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\PublicDataProviderClassMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\RemoveNamedArgsInDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\StaticDataProviderClassMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php', - 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\AssertIssetToAssertObjectHasPropertyRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\PropertyExistsWithoutAssertRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/PropertyExistsWithoutAssertRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\RemoveSetMethodsMethodCallRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\ExpectsMethodCallDecorator' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php', 'Rector\\PHPUnit\\PHPUnit110\\Rector\\Class_\\NamedArgumentForDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php', + 'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\RemoveOverrideFinalConstructTestCaseRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php', 'Rector\\PHPUnit\\PHPUnit50\\Rector\\StaticCall\\GetMockRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php', 'Rector\\PHPUnit\\PHPUnit60\\Rector\\ClassMethod\\AddDoesNotPerformAssertionToNonAssertingTestRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/AddDoesNotPerformAssertionToNonAssertingTestRector.php', 'Rector\\PHPUnit\\PHPUnit60\\Rector\\ClassMethod\\ExceptionAnnotationRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/ExceptionAnnotationRector.php', @@ -1825,6 +1923,7 @@ 'Rector\\PHPUnit\\PHPUnit80\\Rector\\MethodCall\\SpecificAssertInternalTypeRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertInternalTypeRector.php', 'Rector\\PHPUnit\\PHPUnit90\\Rector\\Class_\\TestListenerToHooksRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit90/Rector/Class_/TestListenerToHooksRector.php', 'Rector\\PHPUnit\\PHPUnit90\\Rector\\MethodCall\\ExplicitPhpErrorApiRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ExplicitPhpErrorApiRector.php', + 'Rector\\PHPUnit\\PHPUnit90\\Rector\\MethodCall\\ReplaceAtMethodWithDesiredMatcherRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ReplaceAtMethodWithDesiredMatcherRector.php', 'Rector\\PHPUnit\\PHPUnit90\\Rector\\MethodCall\\SpecificAssertContainsWithoutIdentityRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php', 'Rector\\PHPUnit\\PhpDoc\\DataProviderMethodRenamer' => $vendorDir . '/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php', 'Rector\\PHPUnit\\PhpDoc\\PhpDocValueToNodeMapper' => $vendorDir . '/rector/rector-phpunit/src/PhpDoc/PhpDocValueToNodeMapper.php', @@ -1883,7 +1982,6 @@ 'Rector\\Php71\\Rector\\Assign\\AssignArrayToStringRector' => $baseDir . '/rules/Php71/Rector/Assign/AssignArrayToStringRector.php', 'Rector\\Php71\\Rector\\BinaryOp\\BinaryOpBetweenNumberAndStringRector' => $baseDir . '/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php', 'Rector\\Php71\\Rector\\BooleanOr\\IsIterableRector' => $baseDir . '/rules/Php71/Rector/BooleanOr/IsIterableRector.php', - 'Rector\\Php71\\Rector\\ClassConst\\PublicConstantVisibilityRector' => $baseDir . '/rules/Php71/Rector/ClassConst/PublicConstantVisibilityRector.php', 'Rector\\Php71\\Rector\\FuncCall\\RemoveExtraParametersRector' => $baseDir . '/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php', 'Rector\\Php71\\Rector\\List_\\ListToArrayDestructRector' => $baseDir . '/rules/Php71/Rector/List_/ListToArrayDestructRector.php', 'Rector\\Php71\\Rector\\TryCatch\\MultiExceptionCatchRector' => $baseDir . '/rules/Php71/Rector/TryCatch/MultiExceptionCatchRector.php', @@ -1957,6 +2055,7 @@ 'Rector\\Php80\\Rector\\ClassMethod\\FinalPrivateToPrivateVisibilityRector' => $baseDir . '/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php', 'Rector\\Php80\\Rector\\ClassMethod\\SetStateToStaticRector' => $baseDir . '/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php', 'Rector\\Php80\\Rector\\Class_\\AnnotationToAttributeRector' => $baseDir . '/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php', + 'Rector\\Php80\\Rector\\Class_\\AttributeValueResolver' => $baseDir . '/rules/Php80/Rector/Class_/AttributeValueResolver.php', 'Rector\\Php80\\Rector\\Class_\\ClassPropertyAssignToConstructorPromotionRector' => $baseDir . '/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php', 'Rector\\Php80\\Rector\\Class_\\StringableForToStringRector' => $baseDir . '/rules/Php80/Rector/Class_/StringableForToStringRector.php', 'Rector\\Php80\\Rector\\FuncCall\\ClassOnObjectRector' => $baseDir . '/rules/Php80/Rector/FuncCall/ClassOnObjectRector.php', @@ -1970,6 +2069,7 @@ 'Rector\\Php80\\ValueObjectFactory\\StrStartsWithFactory' => $baseDir . '/rules/Php80/ValueObjectFactory/StrStartsWithFactory.php', 'Rector\\Php80\\ValueObject\\AnnotationPropertyToAttributeClass' => $baseDir . '/rules/Php80/ValueObject/AnnotationPropertyToAttributeClass.php', 'Rector\\Php80\\ValueObject\\AnnotationToAttribute' => $baseDir . '/rules/Php80/ValueObject/AnnotationToAttribute.php', + 'Rector\\Php80\\ValueObject\\AttributeValueAndDocComment' => $baseDir . '/rules/Php80/ValueObject/AttributeValueAndDocComment.php', 'Rector\\Php80\\ValueObject\\CondAndExpr' => $baseDir . '/rules/Php80/ValueObject/CondAndExpr.php', 'Rector\\Php80\\ValueObject\\DoctrineTagAndAnnotationToAttribute' => $baseDir . '/rules/Php80/ValueObject/DoctrineTagAndAnnotationToAttribute.php', 'Rector\\Php80\\ValueObject\\MatchResult' => $baseDir . '/rules/Php80/ValueObject/MatchResult.php', @@ -1979,9 +2079,10 @@ '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\\CoalescePropertyAssignMatcher' => $baseDir . '/rules/Php81/NodeAnalyzer/CoalescePropertyAssignMatcher.php', 'Rector\\Php81\\NodeAnalyzer\\ComplexNewAnalyzer' => $baseDir . '/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php', 'Rector\\Php81\\NodeFactory\\EnumFactory' => $baseDir . '/rules/Php81/NodeFactory/EnumFactory.php', + 'Rector\\Php81\\NodeManipulator\\AttributeGroupNewLiner' => $baseDir . '/rules/Php81/NodeManipulator/AttributeGroupNewLiner.php', 'Rector\\Php81\\Rector\\Array_\\FirstClassCallableRector' => $baseDir . '/rules/Php81/Rector/Array_/FirstClassCallableRector.php', 'Rector\\Php81\\Rector\\ClassMethod\\NewInInitializerRector' => $baseDir . '/rules/Php81/Rector/ClassMethod/NewInInitializerRector.php', 'Rector\\Php81\\Rector\\Class_\\MyCLabsClassToEnumRector' => $baseDir . '/rules/Php81/Rector/Class_/MyCLabsClassToEnumRector.php', @@ -1989,7 +2090,9 @@ 'Rector\\Php81\\Rector\\FuncCall\\NullToStrictStringFuncCallArgRector' => $baseDir . '/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php', 'Rector\\Php81\\Rector\\MethodCall\\MyCLabsMethodCallToEnumConstRector' => $baseDir . '/rules/Php81/Rector/MethodCall/MyCLabsMethodCallToEnumConstRector.php', 'Rector\\Php81\\Rector\\MethodCall\\SpatieEnumMethodCallToEnumConstRector' => $baseDir . '/rules/Php81/Rector/MethodCall/SpatieEnumMethodCallToEnumConstRector.php', + 'Rector\\Php81\\Rector\\New_\\MyCLabsConstructorCallToEnumFromRector' => $baseDir . '/rules/Php81/Rector/New_/MyCLabsConstructorCallToEnumFromRector.php', 'Rector\\Php81\\Rector\\Property\\ReadOnlyPropertyRector' => $baseDir . '/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php', + 'Rector\\Php82\\NodeManipulator\\ReadonlyClassManipulator' => $baseDir . '/rules/Php82/NodeManipulator/ReadonlyClassManipulator.php', 'Rector\\Php82\\Rector\\Class_\\ReadOnlyClassRector' => $baseDir . '/rules/Php82/Rector/Class_/ReadOnlyClassRector.php', 'Rector\\Php82\\Rector\\Encapsed\\VariableInStringInterpolationFixerRector' => $baseDir . '/rules/Php82/Rector/Encapsed/VariableInStringInterpolationFixerRector.php', 'Rector\\Php82\\Rector\\FuncCall\\Utf8DecodeEncodeToMbConvertEncodingRector' => $baseDir . '/rules/Php82/Rector/FuncCall/Utf8DecodeEncodeToMbConvertEncodingRector.php', @@ -1997,9 +2100,16 @@ 'Rector\\Php82\\Rector\\Param\\AddSensitiveParameterAttributeRector' => $baseDir . '/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php', 'Rector\\Php83\\Rector\\ClassConst\\AddTypeToConstRector' => $baseDir . '/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php', 'Rector\\Php83\\Rector\\ClassMethod\\AddOverrideAttributeToOverriddenMethodsRector' => $baseDir . '/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php', + 'Rector\\Php83\\Rector\\Class_\\ReadOnlyAnonymousClassRector' => $baseDir . '/rules/Php83/Rector/Class_/ReadOnlyAnonymousClassRector.php', 'Rector\\Php83\\Rector\\FuncCall\\CombineHostPortLdapUriRector' => $baseDir . '/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php', + 'Rector\\Php83\\Rector\\FuncCall\\DynamicClassConstFetchRector' => $baseDir . '/rules/Php83/Rector/FuncCall/DynamicClassConstFetchRector.php', 'Rector\\Php83\\Rector\\FuncCall\\RemoveGetClassGetParentClassNoArgsRector' => $baseDir . '/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php', + 'Rector\\Php84\\Rector\\Class_\\DeprecatedAnnotationToDeprecatedAttributeRector' => $baseDir . '/rules/Php84/Rector/Class_/DeprecatedAnnotationToDeprecatedAttributeRector.php', + 'Rector\\Php84\\Rector\\FuncCall\\AddEscapeArgumentRector' => $baseDir . '/rules/Php84/Rector/FuncCall/AddEscapeArgumentRector.php', + 'Rector\\Php84\\Rector\\FuncCall\\RoundingModeEnumRector' => $baseDir . '/rules/Php84/Rector/FuncCall/RoundingModeEnumRector.php', + 'Rector\\Php84\\Rector\\MethodCall\\NewMethodCallWithoutParenthesesRector' => $baseDir . '/rules/Php84/Rector/MethodCall/NewMethodCallWithoutParenthesesRector.php', 'Rector\\Php84\\Rector\\Param\\ExplicitNullableParamTypeRector' => $baseDir . '/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php', + 'Rector\\Php85\\Rector\\ArrayDimFetch\\ArrayFirstLastRector' => $baseDir . '/rules/Php85/Rector/ArrayDimFetch/ArrayFirstLastRector.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper' => $baseDir . '/src/PhpAttribute/AnnotationToAttributeMapper.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper\\ArrayAnnotationToAttributeMapper' => $baseDir . '/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper\\ArrayItemNodeAnnotationToAttributeMapper' => $baseDir . '/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php', @@ -2030,8 +2140,6 @@ 'Rector\\PhpDocParser\\PhpDocParser\\PhpDocNodeVisitor\\CloningPhpDocNodeVisitor' => $baseDir . '/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CloningPhpDocNodeVisitor.php', 'Rector\\PhpDocParser\\PhpDocParser\\PhpDocNodeVisitor\\ParentConnectingPhpDocNodeVisitor' => $baseDir . '/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php', 'Rector\\PhpDocParser\\PhpDocParser\\ValueObject\\PhpDocAttributeKey' => $baseDir . '/src/PhpDocParser/PhpDocParser/ValueObject/PhpDocAttributeKey.php', - 'Rector\\PhpDocParser\\PhpParser\\SmartPhpParser' => $baseDir . '/src/PhpDocParser/PhpParser/SmartPhpParser.php', - 'Rector\\PhpDocParser\\PhpParser\\SmartPhpParserFactory' => $baseDir . '/src/PhpDocParser/PhpParser/SmartPhpParserFactory.php', 'Rector\\PhpDocParser\\ValueObject\\AttributeKey' => $baseDir . '/src/PhpDocParser/ValueObject/AttributeKey.php', 'Rector\\PhpParser\\AstResolver' => $baseDir . '/src/PhpParser/AstResolver.php', 'Rector\\PhpParser\\Comparing\\NodeComparator' => $baseDir . '/src/PhpParser/Comparing/NodeComparator.php', @@ -2082,7 +2190,6 @@ 'Rector\\RectorInstaller\\Plugin' => $vendorDir . '/rector/extension-installer/src/Plugin.php', 'Rector\\RectorInstaller\\PluginInstaller' => $vendorDir . '/rector/extension-installer/src/PluginInstaller.php', 'Rector\\Rector\\AbstractRector' => $baseDir . '/src/Rector/AbstractRector.php', - 'Rector\\Rector\\AbstractScopeAwareRector' => $baseDir . '/src/Rector/AbstractScopeAwareRector.php', 'Rector\\Reflection\\ClassModifierChecker' => $baseDir . '/src/Reflection/ClassModifierChecker.php', 'Rector\\Reflection\\ClassReflectionAnalyzer' => $baseDir . '/src/Reflection/ClassReflectionAnalyzer.php', 'Rector\\Reflection\\MethodReflectionResolver' => $baseDir . '/src/Reflection/MethodReflectionResolver.php', @@ -2125,7 +2232,6 @@ 'Rector\\Reporting\\DeprecatedRulesReporter' => $baseDir . '/src/Reporting/DeprecatedRulesReporter.php', 'Rector\\Reporting\\MissConfigurationReporter' => $baseDir . '/src/Reporting/MissConfigurationReporter.php', 'Rector\\Set\\Contract\\SetInterface' => $baseDir . '/src/Set/Contract/SetInterface.php', - 'Rector\\Set\\Contract\\SetListInterface' => $baseDir . '/src/Set/Contract/SetListInterface.php', 'Rector\\Set\\Contract\\SetProviderInterface' => $baseDir . '/src/Set/Contract/SetProviderInterface.php', 'Rector\\Set\\Enum\\SetGroup' => $baseDir . '/src/Set/Enum/SetGroup.php', 'Rector\\Set\\SetManager' => $baseDir . '/src/Set/SetManager.php', @@ -2167,6 +2273,7 @@ 'Rector\\StaticTypeMapper\\PhpParser\\NullableTypeNodeMapper' => $baseDir . '/src/StaticTypeMapper/PhpParser/NullableTypeNodeMapper.php', 'Rector\\StaticTypeMapper\\PhpParser\\StringNodeMapper' => $baseDir . '/src/StaticTypeMapper/PhpParser/StringNodeMapper.php', 'Rector\\StaticTypeMapper\\PhpParser\\UnionTypeNodeMapper' => $baseDir . '/src/StaticTypeMapper/PhpParser/UnionTypeNodeMapper.php', + 'Rector\\StaticTypeMapper\\Resolver\\ClassNameFromObjectTypeResolver' => $baseDir . '/src/StaticTypeMapper/Resolver/ClassNameFromObjectTypeResolver.php', 'Rector\\StaticTypeMapper\\StaticTypeMapper' => $baseDir . '/src/StaticTypeMapper/StaticTypeMapper.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\AliasedObjectType' => $baseDir . '/src/StaticTypeMapper/ValueObject/Type/AliasedObjectType.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\FullyQualifiedGenericObjectType' => $baseDir . '/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedGenericObjectType.php', @@ -2179,7 +2286,7 @@ 'Rector\\StaticTypeMapper\\ValueObject\\Type\\ShortenedGenericObjectType' => $baseDir . '/src/StaticTypeMapper/ValueObject/Type/ShortenedGenericObjectType.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\ShortenedObjectType' => $baseDir . '/src/StaticTypeMapper/ValueObject/Type/ShortenedObjectType.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\SimpleStaticType' => $baseDir . '/src/StaticTypeMapper/ValueObject/Type/SimpleStaticType.php', - 'Rector\\Strict\\NodeAnalyzer\\UnitializedPropertyAnalyzer' => $baseDir . '/rules/Strict/NodeAnalyzer/UnitializedPropertyAnalyzer.php', + 'Rector\\Strict\\NodeAnalyzer\\UninitializedPropertyAnalyzer' => $baseDir . '/rules/Strict/NodeAnalyzer/UninitializedPropertyAnalyzer.php', 'Rector\\Strict\\NodeFactory\\ExactCompareFactory' => $baseDir . '/rules/Strict/NodeFactory/ExactCompareFactory.php', 'Rector\\Strict\\Rector\\AbstractFalsyScalarRuleFixerRector' => $baseDir . '/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php', 'Rector\\Strict\\Rector\\BooleanNot\\BooleanInBooleanNotRuleFixerRector' => $baseDir . '/rules/Strict/Rector/BooleanNot/BooleanInBooleanNotRuleFixerRector.php', @@ -2194,7 +2301,10 @@ 'Rector\\Symfony\\Bridge\\Symfony\\Routing\\SymfonyRoutesProvider' => $vendorDir . '/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php', 'Rector\\Symfony\\BundleClassResolver' => $vendorDir . '/rector/rector-symfony/src/BundleClassResolver.php', 'Rector\\Symfony\\CodeQuality\\Enum\\ResponseClass' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Enum/ResponseClass.php', + 'Rector\\Symfony\\CodeQuality\\NodeAnalyzer\\AttributePresenceDetector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/NodeAnalyzer/AttributePresenceDetector.php', 'Rector\\Symfony\\CodeQuality\\NodeFactory\\SymfonyClosureFactory' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\AttributeGroup\\SingleConditionSecurityAttributeToIsGrantedRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/AttributeGroup/SingleConditionSecurityAttributeToIsGrantedRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\BinaryOp\\RequestIsMainRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/RequestIsMainRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\BinaryOp\\ResponseStatusCodeRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/ResponseStatusCodeRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\ActionSuffixRemoverRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\ParamTypeFromRouteRequiredRegexRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ParamTypeFromRouteRequiredRegexRector.php', @@ -2202,8 +2312,9 @@ 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\ResponseReturnTypeControllerActionRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ResponseReturnTypeControllerActionRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\TemplateAnnotationToThisRenderRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/TemplateAnnotationToThisRenderRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\EventListenerToEventSubscriberRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\InlineClassRoutePrefixRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\LoadValidatorMetadataToAnnotationRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php', - 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\MakeCommandLazyRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\SplitAndSecurityAttributeToIsGrantedRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/SplitAndSecurityAttributeToIsGrantedRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Closure\\StringExtensionToConfigBuilderRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\AssertSameResponseCodeWithDebugContentsRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\LiteralGetToRequestClassConstantRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php', @@ -2225,18 +2336,27 @@ 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceSetStringNameToClassNameRector' => $vendorDir . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSetStringNameToClassNameRector.php', 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceSettersToSettersAutodiscoveryRector' => $vendorDir . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSettersToSettersAutodiscoveryRector.php', 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceTagsToDefaultsAutoconfigureRector' => $vendorDir . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceTagsToDefaultsAutoconfigureRector.php', - 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServicesSetNameToSetTypeRector' => $vendorDir . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php', 'Rector\\Symfony\\Configs\\ValueObject\\ServiceArguments' => $vendorDir . '/rector/rector-symfony/rules/Configs/ValueObject/ServiceArguments.php', 'Rector\\Symfony\\Contract\\Bridge\\Symfony\\Routing\\SymfonyRoutesProviderInterface' => $vendorDir . '/rector/rector-symfony/src/Contract/Bridge/Symfony/Routing/SymfonyRoutesProviderInterface.php', 'Rector\\Symfony\\Contract\\EventReferenceToMethodNameInterface' => $vendorDir . '/rector/rector-symfony/src/Contract/EventReferenceToMethodNameInterface.php', 'Rector\\Symfony\\Contract\\Tag\\TagInterface' => $vendorDir . '/rector/rector-symfony/src/Contract/Tag/TagInterface.php', 'Rector\\Symfony\\DataProvider\\ServiceMapProvider' => $vendorDir . '/rector/rector-symfony/src/DataProvider/ServiceMapProvider.php', 'Rector\\Symfony\\DataProvider\\ServiceNameToTypeUniqueProvider' => $vendorDir . '/rector/rector-symfony/src/DataProvider/ServiceNameToTypeUniqueProvider.php', + 'Rector\\Symfony\\DependencyInjection\\NodeDecorator\\CommandConstructorDecorator' => $vendorDir . '/rector/rector-symfony/rules/DependencyInjection/NodeDecorator/CommandConstructorDecorator.php', + 'Rector\\Symfony\\DependencyInjection\\NodeFactory\\AutowireClassMethodFactory' => $vendorDir . '/rector/rector-symfony/rules/DependencyInjection/NodeFactory/AutowireClassMethodFactory.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Class_\\CommandGetByTypeToConstructorInjectionRector' => $vendorDir . '/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/CommandGetByTypeToConstructorInjectionRector.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Class_\\ControllerGetByTypeToConstructorInjectionRector' => $vendorDir . '/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/ControllerGetByTypeToConstructorInjectionRector.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Class_\\GetBySymfonyStringToConstructorInjectionRector' => $vendorDir . '/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/GetBySymfonyStringToConstructorInjectionRector.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Trait_\\TraitGetByTypeToInjectRector' => $vendorDir . '/rector/rector-symfony/rules/DependencyInjection/Rector/Trait_/TraitGetByTypeToInjectRector.php', + 'Rector\\Symfony\\DependencyInjection\\ThisGetTypeMatcher' => $vendorDir . '/rector/rector-symfony/rules/DependencyInjection/ThisGetTypeMatcher.php', 'Rector\\Symfony\\DowngradeSymfony70\\Rector\\Class_\\DowngradeSymfonyCommandAttributeRector' => $vendorDir . '/rector/rector-symfony/rules/DowngradeSymfony70/Rector/Class_/DowngradeSymfonyCommandAttributeRector.php', + 'Rector\\Symfony\\Enum\\CommandMethodName' => $vendorDir . '/rector/rector-symfony/src/Enum/CommandMethodName.php', + 'Rector\\Symfony\\Enum\\FosAnnotation' => $vendorDir . '/rector/rector-symfony/src/Enum/FosAnnotation.php', 'Rector\\Symfony\\Enum\\SensioAttribute' => $vendorDir . '/rector/rector-symfony/src/Enum/SensioAttribute.php', 'Rector\\Symfony\\Enum\\SymfonyAnnotation' => $vendorDir . '/rector/rector-symfony/src/Enum/SymfonyAnnotation.php', 'Rector\\Symfony\\Enum\\SymfonyAttribute' => $vendorDir . '/rector/rector-symfony/src/Enum/SymfonyAttribute.php', 'Rector\\Symfony\\Enum\\SymfonyClass' => $vendorDir . '/rector/rector-symfony/src/Enum/SymfonyClass.php', + 'Rector\\Symfony\\Enum\\TwigClass' => $vendorDir . '/rector/rector-symfony/src/Enum/TwigClass.php', 'Rector\\Symfony\\Exception\\XmlContainerNotExistsException' => $vendorDir . '/rector/rector-symfony/src/Exception/XmlContainerNotExistsException.php', 'Rector\\Symfony\\FormHelper\\FormTypeStringToTypeProvider' => $vendorDir . '/rector/rector-symfony/src/FormHelper/FormTypeStringToTypeProvider.php', 'Rector\\Symfony\\Helper\\MessengerHelper' => $vendorDir . '/rector/rector-symfony/src/Helper/MessengerHelper.php', @@ -2260,6 +2380,7 @@ 'Rector\\Symfony\\NodeAnalyzer\\SymfonyClosureExtensionMatcher' => $vendorDir . '/rector/rector-symfony/src/NodeAnalyzer/SymfonyClosureExtensionMatcher.php', 'Rector\\Symfony\\NodeAnalyzer\\SymfonyPhpClosureDetector' => $vendorDir . '/rector/rector-symfony/src/NodeAnalyzer/SymfonyPhpClosureDetector.php', 'Rector\\Symfony\\NodeAnalyzer\\SymfonyTestCaseAnalyzer' => $vendorDir . '/rector/rector-symfony/src/NodeAnalyzer/SymfonyTestCaseAnalyzer.php', + 'Rector\\Symfony\\NodeFactory\\Annotations\\AnnotationOrAttributeValueResolver' => $vendorDir . '/rector/rector-symfony/src/NodeFactory/Annotations/AnnotationOrAttributeValueResolver.php', 'Rector\\Symfony\\NodeFactory\\Annotations\\DoctrineAnnotationFromNewFactory' => $vendorDir . '/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationFromNewFactory.php', 'Rector\\Symfony\\NodeFactory\\Annotations\\DoctrineAnnotationKeyToValuesResolver' => $vendorDir . '/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationKeyToValuesResolver.php', 'Rector\\Symfony\\NodeFactory\\Annotations\\StringValueQuoteWrapper' => $vendorDir . '/rector/rector-symfony/src/NodeFactory/Annotations/StringValueQuoteWrapper.php', @@ -2278,6 +2399,11 @@ 'Rector\\Symfony\\Set\\FOSRestSetList' => $vendorDir . '/rector/rector-symfony/src/Set/FOSRestSetList.php', 'Rector\\Symfony\\Set\\JMSSetList' => $vendorDir . '/rector/rector-symfony/src/Set/JMSSetList.php', 'Rector\\Symfony\\Set\\SensiolabsSetList' => $vendorDir . '/rector/rector-symfony/src/Set/SensiolabsSetList.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony3SetProvider' => $vendorDir . '/rector/rector-symfony/src/Set/SetProvider/Symfony3SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony4SetProvider' => $vendorDir . '/rector/rector-symfony/src/Set/SetProvider/Symfony4SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony5SetProvider' => $vendorDir . '/rector/rector-symfony/src/Set/SetProvider/Symfony5SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony6SetProvider' => $vendorDir . '/rector/rector-symfony/src/Set/SetProvider/Symfony6SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony7SetProvider' => $vendorDir . '/rector/rector-symfony/src/Set/SetProvider/Symfony7SetProvider.php', 'Rector\\Symfony\\Set\\SetProvider\\SymfonySetProvider' => $vendorDir . '/rector/rector-symfony/src/Set/SetProvider/SymfonySetProvider.php', 'Rector\\Symfony\\Set\\SetProvider\\TwigSetProvider' => $vendorDir . '/rector/rector-symfony/src/Set/SetProvider/TwigSetProvider.php', 'Rector\\Symfony\\Set\\SwiftMailerSetList' => $vendorDir . '/rector/rector-symfony/src/Set/SwiftMailerSetList.php', @@ -2308,9 +2434,7 @@ 'Rector\\Symfony\\Symfony40\\Rector\\ConstFetch\\ConstraintUrlOptionRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony40/Rector/ConstFetch/ConstraintUrlOptionRector.php', 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\ContainerBuilderCompileEnvArgumentRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ContainerBuilderCompileEnvArgumentRector.php', 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\FormIsValidRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/FormIsValidRector.php', - 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\ProcessBuilderGetProcessRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ProcessBuilderGetProcessRector.php', 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\VarDumperTestTraitMethodArgsRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/VarDumperTestTraitMethodArgsRector.php', - 'Rector\\Symfony\\Symfony40\\Rector\\StaticCall\\ProcessBuilderInstanceRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony40/Rector/StaticCall/ProcessBuilderInstanceRector.php', 'Rector\\Symfony\\Symfony42\\Rector\\MethodCall\\ContainerGetToConstructorInjectionRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony42/Rector/MethodCall/ContainerGetToConstructorInjectionRector.php', 'Rector\\Symfony\\Symfony42\\Rector\\New_\\RootNodeTreeBuilderRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony42/Rector/New_/RootNodeTreeBuilderRector.php', 'Rector\\Symfony\\Symfony42\\Rector\\New_\\StringToArrayArgumentProcessRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php', @@ -2320,7 +2444,6 @@ 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\MakeDispatchFirstArgumentEventRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/MakeDispatchFirstArgumentEventRector.php', 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\WebTestCaseAssertIsSuccessfulRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertIsSuccessfulRector.php', 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\WebTestCaseAssertResponseCodeRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertResponseCodeRector.php', - 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\WebTestCaseAssertSelectorTextContainsRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php', 'Rector\\Symfony\\Symfony43\\Rector\\StmtsAwareInterface\\TwigBundleFilesystemLoaderToTwigRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony43/Rector/StmtsAwareInterface/TwigBundleFilesystemLoaderToTwigRector.php', 'Rector\\Symfony\\Symfony44\\Rector\\ClassMethod\\ConsoleExecuteReturnIntRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony44/Rector/ClassMethod/ConsoleExecuteReturnIntRector.php', 'Rector\\Symfony\\Symfony44\\Rector\\MethodCall\\AuthorizationCheckerIsGrantedExtractorRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony44/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php', @@ -2335,7 +2458,6 @@ 'Rector\\Symfony\\Symfony52\\Rector\\New_\\PropertyAccessorCreationBooleanToFlagsRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyAccessorCreationBooleanToFlagsRector.php', 'Rector\\Symfony\\Symfony52\\Rector\\New_\\PropertyPathMapperToDataMapperRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyPathMapperToDataMapperRector.php', 'Rector\\Symfony\\Symfony52\\Rector\\StaticCall\\BinaryFileResponseCreateToNewInstanceRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony52/Rector/StaticCall/BinaryFileResponseCreateToNewInstanceRector.php', - 'Rector\\Symfony\\Symfony53\\Rector\\Class_\\CommandDescriptionToPropertyRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony53/Rector/Class_/CommandDescriptionToPropertyRector.php', 'Rector\\Symfony\\Symfony53\\Rector\\StaticPropertyFetch\\KernelTestCaseContainerPropertyDeprecationRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony53/Rector/StaticPropertyFetch/KernelTestCaseContainerPropertyDeprecationRector.php', 'Rector\\Symfony\\Symfony60\\Rector\\FuncCall\\ReplaceServiceArgumentRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony60/Rector/FuncCall/ReplaceServiceArgumentRector.php', 'Rector\\Symfony\\Symfony60\\Rector\\MethodCall\\GetHelperControllerToServiceRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony60/Rector/MethodCall/GetHelperControllerToServiceRector.php', @@ -2351,7 +2473,18 @@ 'Rector\\Symfony\\Symfony62\\Rector\\MethodCall\\SimplifyFormRenderingRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony62/Rector/MethodCall/SimplifyFormRenderingRector.php', 'Rector\\Symfony\\Symfony63\\Rector\\Class_\\ParamAndEnvAttributeRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php', 'Rector\\Symfony\\Symfony63\\Rector\\Class_\\SignalableCommandInterfaceReturnTypeRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony63/Rector/Class_/SignalableCommandInterfaceReturnTypeRector.php', - 'Rector\\Symfony\\Symfony64\\Rector\\Class_\\ChangeRouteAttributeFromAnnotationSubnamespaceRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony64/Rector/Class_/ChangeRouteAttributeFromAnnotationSubnamespaceRector.php', + 'Rector\\Symfony\\Symfony72\\Rector\\StmtsAwareInterface\\PushRequestToRequestStackConstructorRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony72/Rector/StmtsAwareInterface/PushRequestToRequestStackConstructorRector.php', + 'Rector\\Symfony\\Symfony73\\GetMethodToAsTwigAttributeTransformer' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/GetMethodToAsTwigAttributeTransformer.php', + 'Rector\\Symfony\\Symfony73\\NodeAnalyzer\\CommandArgumentsAndOptionsResolver' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/CommandArgumentsAndOptionsResolver.php', + 'Rector\\Symfony\\Symfony73\\NodeAnalyzer\\LocalArrayMethodCallableMatcher' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/LocalArrayMethodCallableMatcher.php', + 'Rector\\Symfony\\Symfony73\\NodeFactory\\CommandInvokeParamsFactory' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php', + 'Rector\\Symfony\\Symfony73\\NodeRemover\\ReturnEmptyArrayMethodRemover' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/NodeRemover/ReturnEmptyArrayMethodRemover.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\CommandHelpToAttributeRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/CommandHelpToAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\GetFiltersToAsTwigFilterAttributeRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFiltersToAsTwigFilterAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\GetFunctionsToAsTwigFunctionAttributeRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFunctionsToAsTwigFunctionAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\InvokableCommandInputAttributeRector' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\ValueObject\\CommandArgument' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/ValueObject/CommandArgument.php', + 'Rector\\Symfony\\Symfony73\\ValueObject\\CommandOption' => $vendorDir . '/rector/rector-symfony/rules/Symfony73/ValueObject/CommandOption.php', 'Rector\\Symfony\\Twig134\\Rector\\Return_\\SimpleFunctionAndFilterRector' => $vendorDir . '/rector/rector-symfony/rules/Twig134/Rector/Return_/SimpleFunctionAndFilterRector.php', 'Rector\\Symfony\\TypeAnalyzer\\ArrayUnionResponseTypeAnalyzer' => $vendorDir . '/rector/rector-symfony/src/TypeAnalyzer/ArrayUnionResponseTypeAnalyzer.php', 'Rector\\Symfony\\TypeAnalyzer\\ContainerAwareAnalyzer' => $vendorDir . '/rector/rector-symfony/src/TypeAnalyzer/ContainerAwareAnalyzer.php', @@ -2383,7 +2516,6 @@ 'Rector\\Testing\\Fixture\\FixtureTempFileDumper' => $baseDir . '/src/Testing/Fixture/FixtureTempFileDumper.php', 'Rector\\Testing\\PHPUnit\\AbstractLazyTestCase' => $baseDir . '/src/Testing/PHPUnit/AbstractLazyTestCase.php', 'Rector\\Testing\\PHPUnit\\AbstractRectorTestCase' => $baseDir . '/src/Testing/PHPUnit/AbstractRectorTestCase.php', - 'Rector\\Testing\\PHPUnit\\AbstractTestCase' => $baseDir . '/src/Testing/PHPUnit/AbstractTestCase.php', 'Rector\\Testing\\PHPUnit\\StaticPHPUnitEnvironment' => $baseDir . '/src/Testing/PHPUnit/StaticPHPUnitEnvironment.php', 'Rector\\Testing\\PHPUnit\\ValueObject\\RectorTestResult' => $baseDir . '/src/Testing/PHPUnit/ValueObject/RectorTestResult.php', 'Rector\\Testing\\TestingParser\\TestingParser' => $baseDir . '/src/Testing/TestingParser/TestingParser.php', @@ -2517,6 +2649,9 @@ 'Rector\\TypeDeclaration\\Rector\\Closure\\ClosureReturnTypeRector' => $baseDir . '/rules/TypeDeclaration/Rector/Closure/ClosureReturnTypeRector.php', 'Rector\\TypeDeclaration\\Rector\\Empty_\\EmptyOnNullableObjectToInstanceOfRector' => $baseDir . '/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php', 'Rector\\TypeDeclaration\\Rector\\Expression\\InlineVarDocTagToAssertRector' => $baseDir . '/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php', + 'Rector\\TypeDeclaration\\Rector\\FuncCall\\AddArrowFunctionParamArrayWhereDimFetchRector' => $baseDir . '/rules/TypeDeclaration/Rector/FuncCall/AddArrowFunctionParamArrayWhereDimFetchRector.php', + 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeForArrayMapRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayMapRector.php', + 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeForArrayReduceRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayReduceRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromArgRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromIterableMethodCallRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromObjectRector' => $baseDir . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php', @@ -2544,7 +2679,6 @@ 'Rector\\TypeDeclaration\\TypeInferer\\ReturnTypeInferer\\ReturnedNodesReturnTypeInfererTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php', 'Rector\\TypeDeclaration\\TypeInferer\\SilentVoidResolver' => $baseDir . '/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php', 'Rector\\TypeDeclaration\\TypeInferer\\SplArrayFixedTypeNarrower' => $baseDir . '/rules/TypeDeclaration/TypeInferer/SplArrayFixedTypeNarrower.php', - 'Rector\\TypeDeclaration\\TypeNormalizer' => $baseDir . '/rules/TypeDeclaration/TypeNormalizer.php', 'Rector\\TypeDeclaration\\ValueObject\\AddClosureParamTypeFromArg' => $baseDir . '/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromArg.php', 'Rector\\TypeDeclaration\\ValueObject\\AddClosureParamTypeFromObject' => $baseDir . '/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromObject.php', 'Rector\\TypeDeclaration\\ValueObject\\AddParamTypeDeclaration' => $baseDir . '/rules/TypeDeclaration/ValueObject/AddParamTypeDeclaration.php', @@ -2553,7 +2687,6 @@ 'Rector\\TypeDeclaration\\ValueObject\\AddReturnTypeDeclaration' => $baseDir . '/rules/TypeDeclaration/ValueObject/AddReturnTypeDeclaration.php', 'Rector\\TypeDeclaration\\ValueObject\\AssignToVariable' => $baseDir . '/rules/TypeDeclaration/ValueObject/AssignToVariable.php', 'Rector\\TypeDeclaration\\ValueObject\\DataProviderNodes' => $baseDir . '/rules/TypeDeclaration/ValueObject/DataProviderNodes.php', - 'Rector\\TypeDeclaration\\ValueObject\\NestedArrayType' => $baseDir . '/rules/TypeDeclaration/ValueObject/NestedArrayType.php', 'Rector\\Util\\ArrayChecker' => $baseDir . '/src/Util/ArrayChecker.php', 'Rector\\Util\\ArrayParametersMerger' => $baseDir . '/src/Util/ArrayParametersMerger.php', 'Rector\\Util\\FileHasher' => $baseDir . '/src/Util/FileHasher.php', @@ -2569,6 +2702,7 @@ 'Rector\\ValueObject\\Bootstrap\\BootstrapConfigs' => $baseDir . '/src/ValueObject/Bootstrap/BootstrapConfigs.php', 'Rector\\ValueObject\\ClassMethodWillChangeReturnType' => $vendorDir . '/rector/rector-downgrade-php/src/ValueObject/ClassMethodWillChangeReturnType.php', 'Rector\\ValueObject\\Configuration' => $baseDir . '/src/ValueObject/Configuration.php', + 'Rector\\ValueObject\\Configuration\\LevelOverflow' => $baseDir . '/src/ValueObject/Configuration/LevelOverflow.php', 'Rector\\ValueObject\\Error\\SystemError' => $baseDir . '/src/ValueObject/Error/SystemError.php', 'Rector\\ValueObject\\FileProcessResult' => $baseDir . '/src/ValueObject/FileProcessResult.php', 'Rector\\ValueObject\\FuncCallAndExpr' => $baseDir . '/src/ValueObject/FuncCallAndExpr.php', diff --git a/vendor/rector/rector/vendor/composer/autoload_psr4.php b/vendor/rector/rector/vendor/composer/autoload_psr4.php index 20f9a02e1..85816cfef 100644 --- a/vendor/rector/rector/vendor/composer/autoload_psr4.php +++ b/vendor/rector/rector/vendor/composer/autoload_psr4.php @@ -14,34 +14,34 @@ 'Rector\\PHPUnit\\' => array($vendorDir . '/rector/rector-phpunit/src', $vendorDir . '/rector/rector-phpunit/rules'), 'Rector\\Doctrine\\' => array($vendorDir . '/rector/rector-doctrine/src', $vendorDir . '/rector/rector-doctrine/rules'), 'Rector\\' => array($baseDir . '/rules', $baseDir . '/src', $vendorDir . '/rector/rector-downgrade-php/src', $vendorDir . '/rector/rector-downgrade-php/rules'), - 'RectorPrefix202411\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), - 'RectorPrefix202411\\Symplify\\EasyParallel\\' => array($vendorDir . '/symplify/easy-parallel/src'), - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), - 'RectorPrefix202411\\Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), - 'RectorPrefix202411\\Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), - 'RectorPrefix202411\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), - 'RectorPrefix202411\\React\\Stream\\' => array($vendorDir . '/react/stream/src'), - 'RectorPrefix202411\\React\\Socket\\' => array($vendorDir . '/react/socket/src'), - 'RectorPrefix202411\\React\\Promise\\' => array($vendorDir . '/react/promise/src'), - 'RectorPrefix202411\\React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'), - 'RectorPrefix202411\\React\\Dns\\' => array($vendorDir . '/react/dns/src'), - 'RectorPrefix202411\\React\\ChildProcess\\' => array($vendorDir . '/react/child-process/src'), - 'RectorPrefix202411\\React\\Cache\\' => array($vendorDir . '/react/cache/src'), - 'RectorPrefix202411\\Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), - 'RectorPrefix202411\\Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'RectorPrefix202411\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'RectorPrefix202411\\OndraM\\CiDetector\\' => array($vendorDir . '/ondram/ci-detector/src'), - 'RectorPrefix202411\\Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), - 'RectorPrefix202411\\Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), - 'RectorPrefix202411\\Evenement\\' => array($vendorDir . '/evenement/evenement/src'), - 'RectorPrefix202411\\Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), - 'RectorPrefix202411\\Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), - 'RectorPrefix202411\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), - 'RectorPrefix202411\\Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), - 'RectorPrefix202411\\Clue\\React\\NDJson\\' => array($vendorDir . '/clue/ndjson-react/src'), + 'RectorPrefix202506\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), + 'RectorPrefix202506\\Symplify\\EasyParallel\\' => array($vendorDir . '/symplify/easy-parallel/src'), + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), + 'RectorPrefix202506\\Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), + 'RectorPrefix202506\\Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), + 'RectorPrefix202506\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'RectorPrefix202506\\React\\Stream\\' => array($vendorDir . '/react/stream/src'), + 'RectorPrefix202506\\React\\Socket\\' => array($vendorDir . '/react/socket/src'), + 'RectorPrefix202506\\React\\Promise\\' => array($vendorDir . '/react/promise/src'), + 'RectorPrefix202506\\React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'), + 'RectorPrefix202506\\React\\Dns\\' => array($vendorDir . '/react/dns/src'), + 'RectorPrefix202506\\React\\ChildProcess\\' => array($vendorDir . '/react/child-process/src'), + 'RectorPrefix202506\\React\\Cache\\' => array($vendorDir . '/react/cache/src'), + 'RectorPrefix202506\\Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), + 'RectorPrefix202506\\Psr\\Log\\' => array($vendorDir . '/psr/log/src'), + 'RectorPrefix202506\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'RectorPrefix202506\\OndraM\\CiDetector\\' => array($vendorDir . '/ondram/ci-detector/src'), + 'RectorPrefix202506\\Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), + 'RectorPrefix202506\\Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), + 'RectorPrefix202506\\Evenement\\' => array($vendorDir . '/evenement/evenement/src'), + 'RectorPrefix202506\\Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), + 'RectorPrefix202506\\Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), + 'RectorPrefix202506\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), + 'RectorPrefix202506\\Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), + 'RectorPrefix202506\\Clue\\React\\NDJson\\' => array($vendorDir . '/clue/ndjson-react/src'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), ); diff --git a/vendor/rector/rector/vendor/composer/autoload_real.php b/vendor/rector/rector/vendor/composer/autoload_real.php index f74af415e..bb1ad66e7 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 ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7 +class ComposerAutoloaderInit78fb90a05527c4e1e3e0271783524c1e { private static $loader; @@ -22,17 +22,17 @@ public static function getLoader() return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit78fb90a05527c4e1e3e0271783524c1e', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit78fb90a05527c4e1e3e0271783524c1e', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit78fb90a05527c4e1e3e0271783524c1e::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInit78fb90a05527c4e1e3e0271783524c1e::$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 d3446c721..6f1b83b4e 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 ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 +class ComposerStaticInit78fb90a05527c4e1e3e0271783524c1e { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -27,34 +27,34 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PHPUnit\\' => 15, 'Rector\\Doctrine\\' => 16, 'Rector\\' => 7, - 'RectorPrefix202411\\Webmozart\\Assert\\' => 36, - 'RectorPrefix202411\\Symplify\\EasyParallel\\' => 41, - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\' => 45, - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\' => 42, - 'RectorPrefix202411\\Symfony\\Component\\Process\\' => 45, - 'RectorPrefix202411\\Symfony\\Component\\Finder\\' => 44, - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\' => 48, - 'RectorPrefix202411\\Symfony\\Component\\Console\\' => 45, - 'RectorPrefix202411\\React\\Stream\\' => 32, - 'RectorPrefix202411\\React\\Socket\\' => 32, - 'RectorPrefix202411\\React\\Promise\\' => 33, - 'RectorPrefix202411\\React\\EventLoop\\' => 35, - 'RectorPrefix202411\\React\\Dns\\' => 29, - 'RectorPrefix202411\\React\\ChildProcess\\' => 38, - 'RectorPrefix202411\\React\\Cache\\' => 31, - 'RectorPrefix202411\\Psr\\SimpleCache\\' => 35, - 'RectorPrefix202411\\Psr\\Log\\' => 27, - 'RectorPrefix202411\\Psr\\Container\\' => 33, - 'RectorPrefix202411\\OndraM\\CiDetector\\' => 37, - 'RectorPrefix202411\\Illuminate\\Contracts\\' => 40, - 'RectorPrefix202411\\Illuminate\\Container\\' => 40, - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\' => 40, - 'RectorPrefix202411\\Evenement\\' => 29, - 'RectorPrefix202411\\Doctrine\\Inflector\\' => 38, - 'RectorPrefix202411\\Composer\\XdebugHandler\\' => 42, - 'RectorPrefix202411\\Composer\\Semver\\' => 35, - 'RectorPrefix202411\\Composer\\Pcre\\' => 33, - 'RectorPrefix202411\\Clue\\React\\NDJson\\' => 37, + 'RectorPrefix202506\\Webmozart\\Assert\\' => 36, + 'RectorPrefix202506\\Symplify\\EasyParallel\\' => 41, + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\' => 45, + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\' => 42, + 'RectorPrefix202506\\Symfony\\Component\\Process\\' => 45, + 'RectorPrefix202506\\Symfony\\Component\\Finder\\' => 44, + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\' => 48, + 'RectorPrefix202506\\Symfony\\Component\\Console\\' => 45, + 'RectorPrefix202506\\React\\Stream\\' => 32, + 'RectorPrefix202506\\React\\Socket\\' => 32, + 'RectorPrefix202506\\React\\Promise\\' => 33, + 'RectorPrefix202506\\React\\EventLoop\\' => 35, + 'RectorPrefix202506\\React\\Dns\\' => 29, + 'RectorPrefix202506\\React\\ChildProcess\\' => 38, + 'RectorPrefix202506\\React\\Cache\\' => 31, + 'RectorPrefix202506\\Psr\\SimpleCache\\' => 35, + 'RectorPrefix202506\\Psr\\Log\\' => 27, + 'RectorPrefix202506\\Psr\\Container\\' => 33, + 'RectorPrefix202506\\OndraM\\CiDetector\\' => 37, + 'RectorPrefix202506\\Illuminate\\Contracts\\' => 40, + 'RectorPrefix202506\\Illuminate\\Container\\' => 40, + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\' => 40, + 'RectorPrefix202506\\Evenement\\' => 29, + 'RectorPrefix202506\\Doctrine\\Inflector\\' => 38, + 'RectorPrefix202506\\Composer\\XdebugHandler\\' => 42, + 'RectorPrefix202506\\Composer\\Semver\\' => 35, + 'RectorPrefix202506\\Composer\\Pcre\\' => 33, + 'RectorPrefix202506\\Clue\\React\\NDJson\\' => 37, ), 'P' => array ( @@ -102,115 +102,115 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 2 => __DIR__ . '/..' . '/rector/rector-downgrade-php/src', 3 => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules', ), - 'RectorPrefix202411\\Webmozart\\Assert\\' => + 'RectorPrefix202506\\Webmozart\\Assert\\' => array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), - 'RectorPrefix202411\\Symplify\\EasyParallel\\' => + 'RectorPrefix202506\\Symplify\\EasyParallel\\' => array ( 0 => __DIR__ . '/..' . '/symplify/easy-parallel/src', ), - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\' => + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\' => + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\' => array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), - 'RectorPrefix202411\\Symfony\\Component\\Process\\' => + 'RectorPrefix202506\\Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), - 'RectorPrefix202411\\Symfony\\Component\\Finder\\' => + 'RectorPrefix202506\\Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\' => + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), - 'RectorPrefix202411\\Symfony\\Component\\Console\\' => + 'RectorPrefix202506\\Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), - 'RectorPrefix202411\\React\\Stream\\' => + 'RectorPrefix202506\\React\\Stream\\' => array ( 0 => __DIR__ . '/..' . '/react/stream/src', ), - 'RectorPrefix202411\\React\\Socket\\' => + 'RectorPrefix202506\\React\\Socket\\' => array ( 0 => __DIR__ . '/..' . '/react/socket/src', ), - 'RectorPrefix202411\\React\\Promise\\' => + 'RectorPrefix202506\\React\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/react/promise/src', ), - 'RectorPrefix202411\\React\\EventLoop\\' => + 'RectorPrefix202506\\React\\EventLoop\\' => array ( 0 => __DIR__ . '/..' . '/react/event-loop/src', ), - 'RectorPrefix202411\\React\\Dns\\' => + 'RectorPrefix202506\\React\\Dns\\' => array ( 0 => __DIR__ . '/..' . '/react/dns/src', ), - 'RectorPrefix202411\\React\\ChildProcess\\' => + 'RectorPrefix202506\\React\\ChildProcess\\' => array ( 0 => __DIR__ . '/..' . '/react/child-process/src', ), - 'RectorPrefix202411\\React\\Cache\\' => + 'RectorPrefix202506\\React\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/react/cache/src', ), - 'RectorPrefix202411\\Psr\\SimpleCache\\' => + 'RectorPrefix202506\\Psr\\SimpleCache\\' => array ( 0 => __DIR__ . '/..' . '/psr/simple-cache/src', ), - 'RectorPrefix202411\\Psr\\Log\\' => + 'RectorPrefix202506\\Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), - 'RectorPrefix202411\\Psr\\Container\\' => + 'RectorPrefix202506\\Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), - 'RectorPrefix202411\\OndraM\\CiDetector\\' => + 'RectorPrefix202506\\OndraM\\CiDetector\\' => array ( 0 => __DIR__ . '/..' . '/ondram/ci-detector/src', ), - 'RectorPrefix202411\\Illuminate\\Contracts\\' => + 'RectorPrefix202506\\Illuminate\\Contracts\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/contracts', ), - 'RectorPrefix202411\\Illuminate\\Container\\' => + 'RectorPrefix202506\\Illuminate\\Container\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/container', ), - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\' => + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\' => array ( 0 => __DIR__ . '/..' . '/fidry/cpu-core-counter/src', ), - 'RectorPrefix202411\\Evenement\\' => + 'RectorPrefix202506\\Evenement\\' => array ( 0 => __DIR__ . '/..' . '/evenement/evenement/src', ), - 'RectorPrefix202411\\Doctrine\\Inflector\\' => + 'RectorPrefix202506\\Doctrine\\Inflector\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector', ), - 'RectorPrefix202411\\Composer\\XdebugHandler\\' => + 'RectorPrefix202506\\Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', ), - 'RectorPrefix202411\\Composer\\Semver\\' => + 'RectorPrefix202506\\Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), - 'RectorPrefix202411\\Composer\\Pcre\\' => + 'RectorPrefix202506\\Composer\\Pcre\\' => array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), - 'RectorPrefix202411\\Clue\\React\\NDJson\\' => + 'RectorPrefix202506\\Clue\\React\\NDJson\\' => array ( 0 => __DIR__ . '/..' . '/clue/ndjson-react/src', ), @@ -228,6 +228,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', 'PHPStan\\PhpDocParser\\Ast\\Attribute' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', + 'PHPStan\\PhpDocParser\\Ast\\Comment' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Comment.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', @@ -239,7 +240,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', - 'PHPStan\\PhpDocParser\\Ast\\ConstExpr\\QuoteAwareConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php', 'PHPStan\\PhpDocParser\\Ast\\Node' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Node.php', 'PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', 'PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', @@ -305,6 +305,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', 'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', 'PHPStan\\PhpDocParser\\Lexer\\Lexer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', + 'PHPStan\\PhpDocParser\\ParserConfig' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/ParserConfig.php', 'PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', 'PHPStan\\PhpDocParser\\Parser\\ParserException' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', 'PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', @@ -344,24 +345,24 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', 'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', 'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', + 'PhpParser\\Internal\\TokenPolyfill' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php', 'PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', 'PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', 'PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php', 'PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', + 'PhpParser\\Lexer\\TokenEmulator\\AsymmetricVisibilityTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', - 'PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', + 'PhpParser\\Lexer\\TokenEmulator\\PropertyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', 'PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', + 'PhpParser\\Modifiers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Modifiers.php', 'PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php', 'PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php', 'PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', @@ -372,16 +373,20 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', 'PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', 'PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', + 'PhpParser\\NodeVisitor\\CommentAnnotatingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php', 'PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', 'PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', 'PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', 'PhpParser\\NodeVisitor\\NodeConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', 'PhpParser\\NodeVisitor\\ParentConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', 'PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', + 'PhpParser\\Node\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php', 'PhpParser\\Node\\Attribute' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', 'PhpParser\\Node\\AttributeGroup' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', + 'PhpParser\\Node\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php', 'PhpParser\\Node\\ComplexType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', 'PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', + 'PhpParser\\Node\\DeclareItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php', 'PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', 'PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', 'PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', @@ -480,6 +485,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', 'PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', 'PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', + 'PhpParser\\Node\\InterpolatedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php', 'PhpParser\\Node\\IntersectionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', 'PhpParser\\Node\\MatchArm' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', 'PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php', @@ -487,10 +493,15 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', 'PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', 'PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php', + 'PhpParser\\Node\\PropertyHook' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php', + 'PhpParser\\Node\\PropertyItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php', 'PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', 'PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', 'PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', 'PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', + 'PhpParser\\Node\\Scalar\\Float_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php', + 'PhpParser\\Node\\Scalar\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php', + 'PhpParser\\Node\\Scalar\\InterpolatedString' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php', 'PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', 'PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', @@ -500,9 +511,12 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', + 'PhpParser\\Node\\Scalar\\MagicConst\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php', 'PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', 'PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', + 'PhpParser\\Node\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/StaticVar.php', 'PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', + 'PhpParser\\Node\\Stmt\\Block' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php', 'PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', 'PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', 'PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', @@ -541,7 +555,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', 'PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', 'PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', - 'PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', 'PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', 'PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', @@ -553,664 +566,668 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', 'PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', 'PhpParser\\Node\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', + 'PhpParser\\Node\\UseItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UseItem.php', 'PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', 'PhpParser\\Node\\VariadicPlaceholder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', 'PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php', 'PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', 'PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', - 'PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', - 'PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', 'PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', - 'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', + 'PhpParser\\Parser\\Php8' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php8.php', + 'PhpParser\\PhpVersion' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PhpVersion.php', + 'PhpParser\\PrettyPrinter' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter.php', 'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', 'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', - 'RectorPrefix202411\\Clue\\React\\NDJson\\Decoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Decoder.php', - 'RectorPrefix202411\\Clue\\React\\NDJson\\Encoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Encoder.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchStrictGroupsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchFlags.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', - 'RectorPrefix202411\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', - 'RectorPrefix202411\\Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', - 'RectorPrefix202411\\Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', - 'RectorPrefix202411\\Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', - 'RectorPrefix202411\\Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', - 'RectorPrefix202411\\Composer\\Pcre\\UnexpectedNullMatchException' => __DIR__ . '/..' . '/composer/pcre/src/UnexpectedNullMatchException.php', - 'RectorPrefix202411\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', - 'RectorPrefix202411\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', - 'RectorPrefix202411\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', - 'RectorPrefix202411\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', - 'RectorPrefix202411\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', - 'RectorPrefix202411\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', - 'RectorPrefix202411\\Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\CachedWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Inflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Language' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\LanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\NoopWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Pattern' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Patterns' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Ruleset' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitution' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Substitutions' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformation' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Transformations' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\Rules\\Word' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\RulesetInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', - 'RectorPrefix202411\\Doctrine\\Inflector\\WordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', - 'RectorPrefix202411\\Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitter.php', - 'RectorPrefix202411\\Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterInterface.php', - 'RectorPrefix202411\\Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterTrait.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Diagnoser' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Diagnoser.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', - 'RectorPrefix202411\\Fidry\\CpuCoreCounter\\ParallelisationResult' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/ParallelisationResult.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Auth' => __DIR__ . '/..' . '/illuminate/container/Attributes/Auth.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Authenticated' => __DIR__ . '/..' . '/illuminate/container/Attributes/Authenticated.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Cache' => __DIR__ . '/..' . '/illuminate/container/Attributes/Cache.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Config' => __DIR__ . '/..' . '/illuminate/container/Attributes/Config.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\CurrentUser' => __DIR__ . '/..' . '/illuminate/container/Attributes/CurrentUser.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\DB' => __DIR__ . '/..' . '/illuminate/container/Attributes/DB.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Database' => __DIR__ . '/..' . '/illuminate/container/Attributes/Database.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Log' => __DIR__ . '/..' . '/illuminate/container/Attributes/Log.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\RouteParameter' => __DIR__ . '/..' . '/illuminate/container/Attributes/RouteParameter.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Storage' => __DIR__ . '/..' . '/illuminate/container/Attributes/Storage.php', - 'RectorPrefix202411\\Illuminate\\Container\\Attributes\\Tag' => __DIR__ . '/..' . '/illuminate/container/Attributes/Tag.php', - 'RectorPrefix202411\\Illuminate\\Container\\BoundMethod' => __DIR__ . '/..' . '/illuminate/container/BoundMethod.php', - 'RectorPrefix202411\\Illuminate\\Container\\Container' => __DIR__ . '/..' . '/illuminate/container/Container.php', - 'RectorPrefix202411\\Illuminate\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/container/ContextualBindingBuilder.php', - 'RectorPrefix202411\\Illuminate\\Container\\EntryNotFoundException' => __DIR__ . '/..' . '/illuminate/container/EntryNotFoundException.php', - 'RectorPrefix202411\\Illuminate\\Container\\RewindableGenerator' => __DIR__ . '/..' . '/illuminate/container/RewindableGenerator.php', - 'RectorPrefix202411\\Illuminate\\Container\\Util' => __DIR__ . '/..' . '/illuminate/container/Util.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Authorizable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Gate.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Authenticatable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/illuminate/contracts/Auth/CanResetPassword.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Guard.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/illuminate/contracts/Auth/MustVerifyEmail.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBroker.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/StatefulGuard.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/illuminate/contracts/Auth/SupportsBasicAuth.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/illuminate/contracts/Auth/UserProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Broadcaster.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/Dispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/QueueingDispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Lock.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockTimeoutException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Repository.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Store.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Concurrency\\Driver' => __DIR__ . '/..' . '/illuminate/contracts/Concurrency/Driver.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Config/Repository.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Console/Application.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Isolatable' => __DIR__ . '/..' . '/illuminate/contracts/Console/Isolatable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Console/Kernel.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => __DIR__ . '/..' . '/illuminate/contracts/Console/PromptsForMissingInput.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/illuminate/contracts/Container/BindingResolutionException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\CircularDependencyException' => __DIR__ . '/..' . '/illuminate/contracts/Container/CircularDependencyException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/illuminate/contracts/Container/Container.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualAttribute' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualAttribute.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualBindingBuilder.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/QueueingFactory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Builder.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Castable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/illuminate/contracts/Database/Events/MigrationEvent.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/illuminate/contracts/Database/ModelIdentifier.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Builder.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/ConditionExpression.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Database\\Query\\Expression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Expression.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ExceptionHandler.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Debug\\ShouldntReport' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ShouldntReport.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/DecryptException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/EncryptException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/Encrypter.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/StringEncrypter.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Events/Dispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Cloud.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/FileNotFoundException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Filesystem.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/LockTimeoutException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/Application.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesConfiguration.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesRoutes.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/ExceptionRenderer.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/MaintenanceMode.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/illuminate/contracts/Hashing/Hasher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Http/Kernel.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Attachable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Attachable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/illuminate/contracts/Mail/MailQueue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailer.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Dispatcher.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/CursorPaginator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/Paginator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Hub.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Pipeline.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\InvokedProcess' => __DIR__ . '/..' . '/illuminate/contracts/Process/InvokedProcess.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Process\\ProcessResult' => __DIR__ . '/..' . '/illuminate/contracts/Process/ProcessResult.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ClearableQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ClearableQueue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityNotFoundException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityResolver.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Job.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Monitor.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Queue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableCollection.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableEntity.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUnique.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connection.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connector.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Redis/LimiterTimeoutException.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/BindingRegistrar.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/Registrar.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/illuminate/contracts/Routing/ResponseFactory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlGenerator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlRoutable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => __DIR__ . '/..' . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/illuminate/contracts/Session/Session.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Arrayable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferrableProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferringDisplayableValue.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Htmlable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Jsonable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageBag.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageProvider.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Renderable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Responsable.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Support\\ValidatedData' => __DIR__ . '/..' . '/illuminate/contracts/Support/ValidatedData.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/illuminate/contracts/Translation/HasLocalePreference.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Loader.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Translator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\DataAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/DataAwareRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ImplicitRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\InvokableRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/InvokableRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Rule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => __DIR__ . '/..' . '/illuminate/contracts/Validation/UncompromisedVerifier.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidationRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidationRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Validator.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatorAwareRule.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/illuminate/contracts/View/Engine.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/View/Factory.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/illuminate/contracts/View/View.php', - 'RectorPrefix202411\\Illuminate\\Contracts\\View\\ViewCompilationException' => __DIR__ . '/..' . '/illuminate/contracts/View/ViewCompilationException.php', - 'RectorPrefix202411\\Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php', - 'RectorPrefix202411\\Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php', - 'RectorPrefix202411\\Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php', - 'RectorPrefix202411\\Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', - 'RectorPrefix202411\\Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php', - 'RectorPrefix202411\\Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php', - 'RectorPrefix202411\\Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php', - 'RectorPrefix202411\\Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php', - 'RectorPrefix202411\\Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php', - 'RectorPrefix202411\\Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php', - 'RectorPrefix202411\\Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php', - 'RectorPrefix202411\\Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php', - 'RectorPrefix202411\\Nette\\Utils\\FileInfo' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileInfo.php', - 'RectorPrefix202411\\Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php', - 'RectorPrefix202411\\Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/utils/src/Utils/Finder.php', - 'RectorPrefix202411\\Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php', - 'RectorPrefix202411\\Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php', - 'RectorPrefix202411\\Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php', - 'RectorPrefix202411\\Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', - 'RectorPrefix202411\\Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php', - 'RectorPrefix202411\\Nette\\Utils\\ImageColor' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageColor.php', - 'RectorPrefix202411\\Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\ImageType' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageType.php', - 'RectorPrefix202411\\Nette\\Utils\\Iterables' => __DIR__ . '/..' . '/nette/utils/src/Utils/Iterables.php', - 'RectorPrefix202411\\Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php', - 'RectorPrefix202411\\Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php', - 'RectorPrefix202411\\Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php', - 'RectorPrefix202411\\Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php', - 'RectorPrefix202411\\Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', - 'RectorPrefix202411\\Nette\\Utils\\ReflectionMethod' => __DIR__ . '/..' . '/nette/utils/src/Utils/ReflectionMethod.php', - 'RectorPrefix202411\\Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', - 'RectorPrefix202411\\Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php', - 'RectorPrefix202411\\Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'RectorPrefix202411\\Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetector' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetector.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\CiDetectorInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetectorInterface.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AbstractCi' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AbstractCi.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AppVeyor' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AppVeyor.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\AzurePipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AzurePipelines.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Bamboo' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Bamboo.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Buddy' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Buddy.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\CiInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/CiInterface.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Circle' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Circle.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Codeship' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Codeship.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Continuousphp' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Continuousphp.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Drone' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Drone.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitHubActions' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitHubActions.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\GitLab' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitLab.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Jenkins' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Jenkins.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\SourceHut' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/SourceHut.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\TeamCity' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/TeamCity.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Travis' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Travis.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Ci\\Wercker' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Wercker.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Env' => __DIR__ . '/..' . '/ondram/ci-detector/src/Env.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => __DIR__ . '/..' . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', - 'RectorPrefix202411\\OndraM\\CiDetector\\TrinaryLogic' => __DIR__ . '/..' . '/ondram/ci-detector/src/TrinaryLogic.php', - 'RectorPrefix202411\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', - 'RectorPrefix202411\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', - 'RectorPrefix202411\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', - 'RectorPrefix202411\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', - 'RectorPrefix202411\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', - 'RectorPrefix202411\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', - 'RectorPrefix202411\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', - 'RectorPrefix202411\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', - 'RectorPrefix202411\\Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', - 'RectorPrefix202411\\Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', - 'RectorPrefix202411\\Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', - 'RectorPrefix202411\\React\\Cache\\ArrayCache' => __DIR__ . '/..' . '/react/cache/src/ArrayCache.php', - 'RectorPrefix202411\\React\\Cache\\CacheInterface' => __DIR__ . '/..' . '/react/cache/src/CacheInterface.php', - 'RectorPrefix202411\\React\\ChildProcess\\Process' => __DIR__ . '/..' . '/react/child-process/src/Process.php', - 'RectorPrefix202411\\React\\Dns\\BadServerException' => __DIR__ . '/..' . '/react/dns/src/BadServerException.php', - 'RectorPrefix202411\\React\\Dns\\Config\\Config' => __DIR__ . '/..' . '/react/dns/src/Config/Config.php', - 'RectorPrefix202411\\React\\Dns\\Config\\HostsFile' => __DIR__ . '/..' . '/react/dns/src/Config/HostsFile.php', - 'RectorPrefix202411\\React\\Dns\\Model\\Message' => __DIR__ . '/..' . '/react/dns/src/Model/Message.php', - 'RectorPrefix202411\\React\\Dns\\Model\\Record' => __DIR__ . '/..' . '/react/dns/src/Model/Record.php', - 'RectorPrefix202411\\React\\Dns\\Protocol\\BinaryDumper' => __DIR__ . '/..' . '/react/dns/src/Protocol/BinaryDumper.php', - 'RectorPrefix202411\\React\\Dns\\Protocol\\Parser' => __DIR__ . '/..' . '/react/dns/src/Protocol/Parser.php', - 'RectorPrefix202411\\React\\Dns\\Query\\CachingExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CachingExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\CancellationException' => __DIR__ . '/..' . '/react/dns/src/Query/CancellationException.php', - 'RectorPrefix202411\\React\\Dns\\Query\\CoopExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CoopExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\ExecutorInterface' => __DIR__ . '/..' . '/react/dns/src/Query/ExecutorInterface.php', - 'RectorPrefix202411\\React\\Dns\\Query\\FallbackExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/FallbackExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\HostsFileExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/HostsFileExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\Query' => __DIR__ . '/..' . '/react/dns/src/Query/Query.php', - 'RectorPrefix202411\\React\\Dns\\Query\\RetryExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/RetryExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\SelectiveTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/SelectiveTransportExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\TcpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TcpTransportExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutException' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutException.php', - 'RectorPrefix202411\\React\\Dns\\Query\\TimeoutExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutExecutor.php', - 'RectorPrefix202411\\React\\Dns\\Query\\UdpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/UdpTransportExecutor.php', - 'RectorPrefix202411\\React\\Dns\\RecordNotFoundException' => __DIR__ . '/..' . '/react/dns/src/RecordNotFoundException.php', - 'RectorPrefix202411\\React\\Dns\\Resolver\\Factory' => __DIR__ . '/..' . '/react/dns/src/Resolver/Factory.php', - 'RectorPrefix202411\\React\\Dns\\Resolver\\Resolver' => __DIR__ . '/..' . '/react/dns/src/Resolver/Resolver.php', - 'RectorPrefix202411\\React\\Dns\\Resolver\\ResolverInterface' => __DIR__ . '/..' . '/react/dns/src/Resolver/ResolverInterface.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtEvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEvLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtEventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEventLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtLibevLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibevLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtLibeventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibeventLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\ExtUvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtUvLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\Factory' => __DIR__ . '/..' . '/react/event-loop/src/Factory.php', - 'RectorPrefix202411\\React\\EventLoop\\Loop' => __DIR__ . '/..' . '/react/event-loop/src/Loop.php', - 'RectorPrefix202411\\React\\EventLoop\\LoopInterface' => __DIR__ . '/..' . '/react/event-loop/src/LoopInterface.php', - 'RectorPrefix202411\\React\\EventLoop\\SignalsHandler' => __DIR__ . '/..' . '/react/event-loop/src/SignalsHandler.php', - 'RectorPrefix202411\\React\\EventLoop\\StreamSelectLoop' => __DIR__ . '/..' . '/react/event-loop/src/StreamSelectLoop.php', - 'RectorPrefix202411\\React\\EventLoop\\Tick\\FutureTickQueue' => __DIR__ . '/..' . '/react/event-loop/src/Tick/FutureTickQueue.php', - 'RectorPrefix202411\\React\\EventLoop\\TimerInterface' => __DIR__ . '/..' . '/react/event-loop/src/TimerInterface.php', - 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timer' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timer.php', - 'RectorPrefix202411\\React\\EventLoop\\Timer\\Timers' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timers.php', - 'RectorPrefix202411\\React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php', - 'RectorPrefix202411\\React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php', - 'RectorPrefix202411\\React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php', - 'RectorPrefix202411\\React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php', - 'RectorPrefix202411\\React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php', - 'RectorPrefix202411\\React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php', - 'RectorPrefix202411\\React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php', - 'RectorPrefix202411\\React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php', - 'RectorPrefix202411\\React\\Socket\\Connection' => __DIR__ . '/..' . '/react/socket/src/Connection.php', - 'RectorPrefix202411\\React\\Socket\\ConnectionInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectionInterface.php', - 'RectorPrefix202411\\React\\Socket\\Connector' => __DIR__ . '/..' . '/react/socket/src/Connector.php', - 'RectorPrefix202411\\React\\Socket\\ConnectorInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectorInterface.php', - 'RectorPrefix202411\\React\\Socket\\DnsConnector' => __DIR__ . '/..' . '/react/socket/src/DnsConnector.php', - 'RectorPrefix202411\\React\\Socket\\FdServer' => __DIR__ . '/..' . '/react/socket/src/FdServer.php', - 'RectorPrefix202411\\React\\Socket\\FixedUriConnector' => __DIR__ . '/..' . '/react/socket/src/FixedUriConnector.php', - 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnectionBuilder' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', - 'RectorPrefix202411\\React\\Socket\\HappyEyeBallsConnector' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnector.php', - 'RectorPrefix202411\\React\\Socket\\LimitingServer' => __DIR__ . '/..' . '/react/socket/src/LimitingServer.php', - 'RectorPrefix202411\\React\\Socket\\SecureConnector' => __DIR__ . '/..' . '/react/socket/src/SecureConnector.php', - 'RectorPrefix202411\\React\\Socket\\SecureServer' => __DIR__ . '/..' . '/react/socket/src/SecureServer.php', - 'RectorPrefix202411\\React\\Socket\\Server' => __DIR__ . '/..' . '/react/socket/src/Server.php', - 'RectorPrefix202411\\React\\Socket\\ServerInterface' => __DIR__ . '/..' . '/react/socket/src/ServerInterface.php', - 'RectorPrefix202411\\React\\Socket\\SocketServer' => __DIR__ . '/..' . '/react/socket/src/SocketServer.php', - 'RectorPrefix202411\\React\\Socket\\StreamEncryption' => __DIR__ . '/..' . '/react/socket/src/StreamEncryption.php', - 'RectorPrefix202411\\React\\Socket\\TcpConnector' => __DIR__ . '/..' . '/react/socket/src/TcpConnector.php', - 'RectorPrefix202411\\React\\Socket\\TcpServer' => __DIR__ . '/..' . '/react/socket/src/TcpServer.php', - 'RectorPrefix202411\\React\\Socket\\TimeoutConnector' => __DIR__ . '/..' . '/react/socket/src/TimeoutConnector.php', - 'RectorPrefix202411\\React\\Socket\\UnixConnector' => __DIR__ . '/..' . '/react/socket/src/UnixConnector.php', - 'RectorPrefix202411\\React\\Socket\\UnixServer' => __DIR__ . '/..' . '/react/socket/src/UnixServer.php', - 'RectorPrefix202411\\React\\Stream\\CompositeStream' => __DIR__ . '/..' . '/react/stream/src/CompositeStream.php', - 'RectorPrefix202411\\React\\Stream\\DuplexResourceStream' => __DIR__ . '/..' . '/react/stream/src/DuplexResourceStream.php', - 'RectorPrefix202411\\React\\Stream\\DuplexStreamInterface' => __DIR__ . '/..' . '/react/stream/src/DuplexStreamInterface.php', - 'RectorPrefix202411\\React\\Stream\\ReadableResourceStream' => __DIR__ . '/..' . '/react/stream/src/ReadableResourceStream.php', - 'RectorPrefix202411\\React\\Stream\\ReadableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/ReadableStreamInterface.php', - 'RectorPrefix202411\\React\\Stream\\ThroughStream' => __DIR__ . '/..' . '/react/stream/src/ThroughStream.php', - 'RectorPrefix202411\\React\\Stream\\Util' => __DIR__ . '/..' . '/react/stream/src/Util.php', - 'RectorPrefix202411\\React\\Stream\\WritableResourceStream' => __DIR__ . '/..' . '/react/stream/src/WritableResourceStream.php', - 'RectorPrefix202411\\React\\Stream\\WritableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/WritableStreamInterface.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', - 'RectorPrefix202411\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Command\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Debug\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', - 'RectorPrefix202411\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', - 'RectorPrefix202411\\Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', - 'RectorPrefix202411\\Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/RunProcessFailedException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessContext.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessage.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessageHandler.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\PhpSubprocess' => __DIR__ . '/..' . '/symfony/process/PhpSubprocess.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', - 'RectorPrefix202411\\Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php', - 'RectorPrefix202411\\Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceCollectionInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', - 'RectorPrefix202411\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\CpuCoreCountProvider' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Action' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Action.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\Content' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Content.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactCommand' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactCommand.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Enum\\ReactEvent' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactEvent.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ScheduleFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ScheduleFactory.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', - 'RectorPrefix202411\\Symplify\\EasyParallel\\ValueObject\\Schedule' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/Schedule.php', - 'RectorPrefix202411\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', - 'RectorPrefix202411\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', - 'RectorPrefix202411\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', + 'PhpParser\\Token' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Token.php', + 'RectorPrefix202506\\Clue\\React\\NDJson\\Decoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Decoder.php', + 'RectorPrefix202506\\Clue\\React\\NDJson\\Encoder' => __DIR__ . '/..' . '/clue/ndjson-react/src/Encoder.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchStrictGroupsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregMatchFlags' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchFlags.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', + 'RectorPrefix202506\\Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', + 'RectorPrefix202506\\Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', + 'RectorPrefix202506\\Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', + 'RectorPrefix202506\\Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', + 'RectorPrefix202506\\Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', + 'RectorPrefix202506\\Composer\\Pcre\\UnexpectedNullMatchException' => __DIR__ . '/..' . '/composer/pcre/src/UnexpectedNullMatchException.php', + 'RectorPrefix202506\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', + 'RectorPrefix202506\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', + 'RectorPrefix202506\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', + 'RectorPrefix202506\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', + 'RectorPrefix202506\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', + 'RectorPrefix202506\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', + 'RectorPrefix202506\\Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\CachedWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\GenericLanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Inflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Language' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Language.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\LanguageInflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\NoopWordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\English\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\French\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\NorwegianBokmal\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Pattern' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Patterns' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Portuguese\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Ruleset' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Spanish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Substitution' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Substitutions' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Transformation' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Transformations' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\Inflectible' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\InflectorFactory' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\Rules' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Turkish\\Uninflected' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\Rules\\Word' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\RulesetInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php', + 'RectorPrefix202506\\Doctrine\\Inflector\\WordInflector' => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php', + 'RectorPrefix202506\\Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitter.php', + 'RectorPrefix202506\\Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterInterface.php', + 'RectorPrefix202506\\Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterTrait.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Diagnoser' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Diagnoser.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Executor\\ProcOpenExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcOpenExecutor.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Executor\\ProcessExecutor' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Executor/ProcessExecutor.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CmiCmdletPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CmiCmdletPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\EnvVariableFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/EnvVariableFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\LscpuLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\LscpuPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/LscpuPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\OnlyInPowerShellFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyInPowerShellFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyOnOSFamilyFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\SkipOnOSFamilyFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/SkipOnOSFamilyFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\WindowsRegistryLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', + 'RectorPrefix202506\\Fidry\\CpuCoreCounter\\ParallelisationResult' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/ParallelisationResult.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Auth' => __DIR__ . '/..' . '/illuminate/container/Attributes/Auth.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Authenticated' => __DIR__ . '/..' . '/illuminate/container/Attributes/Authenticated.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Cache' => __DIR__ . '/..' . '/illuminate/container/Attributes/Cache.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Config' => __DIR__ . '/..' . '/illuminate/container/Attributes/Config.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\CurrentUser' => __DIR__ . '/..' . '/illuminate/container/Attributes/CurrentUser.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\DB' => __DIR__ . '/..' . '/illuminate/container/Attributes/DB.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Database' => __DIR__ . '/..' . '/illuminate/container/Attributes/Database.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Log' => __DIR__ . '/..' . '/illuminate/container/Attributes/Log.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\RouteParameter' => __DIR__ . '/..' . '/illuminate/container/Attributes/RouteParameter.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Storage' => __DIR__ . '/..' . '/illuminate/container/Attributes/Storage.php', + 'RectorPrefix202506\\Illuminate\\Container\\Attributes\\Tag' => __DIR__ . '/..' . '/illuminate/container/Attributes/Tag.php', + 'RectorPrefix202506\\Illuminate\\Container\\BoundMethod' => __DIR__ . '/..' . '/illuminate/container/BoundMethod.php', + 'RectorPrefix202506\\Illuminate\\Container\\Container' => __DIR__ . '/..' . '/illuminate/container/Container.php', + 'RectorPrefix202506\\Illuminate\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/container/ContextualBindingBuilder.php', + 'RectorPrefix202506\\Illuminate\\Container\\EntryNotFoundException' => __DIR__ . '/..' . '/illuminate/container/EntryNotFoundException.php', + 'RectorPrefix202506\\Illuminate\\Container\\RewindableGenerator' => __DIR__ . '/..' . '/illuminate/container/RewindableGenerator.php', + 'RectorPrefix202506\\Illuminate\\Container\\Util' => __DIR__ . '/..' . '/illuminate/container/Util.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Gate.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Authenticatable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/illuminate/contracts/Auth/CanResetPassword.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Guard.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBroker.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/StatefulGuard.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/illuminate/contracts/Auth/UserProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/Dispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Lock.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Repository.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Store.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Concurrency\\Driver' => __DIR__ . '/..' . '/illuminate/contracts/Concurrency/Driver.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Config/Repository.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Console/Application.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\Isolatable' => __DIR__ . '/..' . '/illuminate/contracts/Console/Isolatable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Console/Kernel.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => __DIR__ . '/..' . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/illuminate/contracts/Container/BindingResolutionException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\CircularDependencyException' => __DIR__ . '/..' . '/illuminate/contracts/Container/CircularDependencyException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/illuminate/contracts/Container/Container.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\ContextualAttribute' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualAttribute.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/illuminate/contracts/Database/ModelIdentifier.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Query\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Builder.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Database\\Query\\Expression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Expression.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Debug\\ShouldntReport' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ShouldntReport.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/DecryptException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/EncryptException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/Encrypter.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Events/Dispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Cloud.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Filesystem.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/Application.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/illuminate/contracts/Hashing/Hasher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Http/Kernel.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Attachable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Attachable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/illuminate/contracts/Mail/MailQueue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailer.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Dispatcher.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/Paginator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Hub.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Pipeline.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Process\\InvokedProcess' => __DIR__ . '/..' . '/illuminate/contracts/Process/InvokedProcess.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Process\\ProcessResult' => __DIR__ . '/..' . '/illuminate/contracts/Process/ProcessResult.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ClearableQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ClearableQueue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityResolver.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Job.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Monitor.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Queue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableCollection.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableEntity.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connection.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connector.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/Registrar.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/illuminate/contracts/Routing/ResponseFactory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlGenerator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlRoutable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => __DIR__ . '/..' . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/illuminate/contracts/Session/Session.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Arrayable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferrableProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Htmlable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Jsonable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageBag.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageProvider.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Renderable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Responsable.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Support\\ValidatedData' => __DIR__ . '/..' . '/illuminate/contracts/Support/ValidatedData.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Loader.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Translator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\DataAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/DataAwareRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ImplicitRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\InvokableRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/InvokableRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Rule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => __DIR__ . '/..' . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ValidationRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidationRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Validator.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/illuminate/contracts/View/Engine.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/View/Factory.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/illuminate/contracts/View/View.php', + 'RectorPrefix202506\\Illuminate\\Contracts\\View\\ViewCompilationException' => __DIR__ . '/..' . '/illuminate/contracts/View/ViewCompilationException.php', + 'RectorPrefix202506\\Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php', + 'RectorPrefix202506\\Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php', + 'RectorPrefix202506\\Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php', + 'RectorPrefix202506\\Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', + 'RectorPrefix202506\\Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php', + 'RectorPrefix202506\\Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\ShouldNotHappenException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php', + 'RectorPrefix202506\\Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php', + 'RectorPrefix202506\\Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php', + 'RectorPrefix202506\\Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php', + 'RectorPrefix202506\\Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php', + 'RectorPrefix202506\\Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php', + 'RectorPrefix202506\\Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php', + 'RectorPrefix202506\\Nette\\Utils\\FileInfo' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileInfo.php', + 'RectorPrefix202506\\Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php', + 'RectorPrefix202506\\Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/utils/src/Utils/Finder.php', + 'RectorPrefix202506\\Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php', + 'RectorPrefix202506\\Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php', + 'RectorPrefix202506\\Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php', + 'RectorPrefix202506\\Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', + 'RectorPrefix202506\\Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php', + 'RectorPrefix202506\\Nette\\Utils\\ImageColor' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageColor.php', + 'RectorPrefix202506\\Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\ImageType' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageType.php', + 'RectorPrefix202506\\Nette\\Utils\\Iterables' => __DIR__ . '/..' . '/nette/utils/src/Utils/Iterables.php', + 'RectorPrefix202506\\Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php', + 'RectorPrefix202506\\Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php', + 'RectorPrefix202506\\Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php', + 'RectorPrefix202506\\Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php', + 'RectorPrefix202506\\Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', + 'RectorPrefix202506\\Nette\\Utils\\ReflectionMethod' => __DIR__ . '/..' . '/nette/utils/src/Utils/ReflectionMethod.php', + 'RectorPrefix202506\\Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', + 'RectorPrefix202506\\Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php', + 'RectorPrefix202506\\Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RectorPrefix202506\\Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\CiDetector' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetector.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\CiDetectorInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/CiDetectorInterface.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AbstractCi' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AbstractCi.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AppVeyor' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AppVeyor.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AwsCodeBuild' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AwsCodeBuild.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\AzurePipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/AzurePipelines.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Bamboo' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Bamboo.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\BitbucketPipelines' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/BitbucketPipelines.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Buddy' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Buddy.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\CiInterface' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/CiInterface.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Circle' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Circle.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Codeship' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Codeship.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Continuousphp' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Continuousphp.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Drone' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Drone.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\GitHubActions' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitHubActions.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\GitLab' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/GitLab.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Jenkins' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Jenkins.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\SourceHut' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/SourceHut.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\TeamCity' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/TeamCity.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Travis' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Travis.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Ci\\Wercker' => __DIR__ . '/..' . '/ondram/ci-detector/src/Ci/Wercker.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Env' => __DIR__ . '/..' . '/ondram/ci-detector/src/Env.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\Exception\\CiNotDetectedException' => __DIR__ . '/..' . '/ondram/ci-detector/src/Exception/CiNotDetectedException.php', + 'RectorPrefix202506\\OndraM\\CiDetector\\TrinaryLogic' => __DIR__ . '/..' . '/ondram/ci-detector/src/TrinaryLogic.php', + 'RectorPrefix202506\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', + 'RectorPrefix202506\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', + 'RectorPrefix202506\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', + 'RectorPrefix202506\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', + 'RectorPrefix202506\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', + 'RectorPrefix202506\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', + 'RectorPrefix202506\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', + 'RectorPrefix202506\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', + 'RectorPrefix202506\\Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', + 'RectorPrefix202506\\Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', + 'RectorPrefix202506\\Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', + 'RectorPrefix202506\\React\\Cache\\ArrayCache' => __DIR__ . '/..' . '/react/cache/src/ArrayCache.php', + 'RectorPrefix202506\\React\\Cache\\CacheInterface' => __DIR__ . '/..' . '/react/cache/src/CacheInterface.php', + 'RectorPrefix202506\\React\\ChildProcess\\Process' => __DIR__ . '/..' . '/react/child-process/src/Process.php', + 'RectorPrefix202506\\React\\Dns\\BadServerException' => __DIR__ . '/..' . '/react/dns/src/BadServerException.php', + 'RectorPrefix202506\\React\\Dns\\Config\\Config' => __DIR__ . '/..' . '/react/dns/src/Config/Config.php', + 'RectorPrefix202506\\React\\Dns\\Config\\HostsFile' => __DIR__ . '/..' . '/react/dns/src/Config/HostsFile.php', + 'RectorPrefix202506\\React\\Dns\\Model\\Message' => __DIR__ . '/..' . '/react/dns/src/Model/Message.php', + 'RectorPrefix202506\\React\\Dns\\Model\\Record' => __DIR__ . '/..' . '/react/dns/src/Model/Record.php', + 'RectorPrefix202506\\React\\Dns\\Protocol\\BinaryDumper' => __DIR__ . '/..' . '/react/dns/src/Protocol/BinaryDumper.php', + 'RectorPrefix202506\\React\\Dns\\Protocol\\Parser' => __DIR__ . '/..' . '/react/dns/src/Protocol/Parser.php', + 'RectorPrefix202506\\React\\Dns\\Query\\CachingExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CachingExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\CancellationException' => __DIR__ . '/..' . '/react/dns/src/Query/CancellationException.php', + 'RectorPrefix202506\\React\\Dns\\Query\\CoopExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CoopExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\ExecutorInterface' => __DIR__ . '/..' . '/react/dns/src/Query/ExecutorInterface.php', + 'RectorPrefix202506\\React\\Dns\\Query\\FallbackExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/FallbackExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\HostsFileExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/HostsFileExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\Query' => __DIR__ . '/..' . '/react/dns/src/Query/Query.php', + 'RectorPrefix202506\\React\\Dns\\Query\\RetryExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/RetryExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\SelectiveTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/SelectiveTransportExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\TcpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TcpTransportExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\TimeoutException' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutException.php', + 'RectorPrefix202506\\React\\Dns\\Query\\TimeoutExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutExecutor.php', + 'RectorPrefix202506\\React\\Dns\\Query\\UdpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/UdpTransportExecutor.php', + 'RectorPrefix202506\\React\\Dns\\RecordNotFoundException' => __DIR__ . '/..' . '/react/dns/src/RecordNotFoundException.php', + 'RectorPrefix202506\\React\\Dns\\Resolver\\Factory' => __DIR__ . '/..' . '/react/dns/src/Resolver/Factory.php', + 'RectorPrefix202506\\React\\Dns\\Resolver\\Resolver' => __DIR__ . '/..' . '/react/dns/src/Resolver/Resolver.php', + 'RectorPrefix202506\\React\\Dns\\Resolver\\ResolverInterface' => __DIR__ . '/..' . '/react/dns/src/Resolver/ResolverInterface.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtEvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEvLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtEventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEventLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtLibevLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibevLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtLibeventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibeventLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\ExtUvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtUvLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\Factory' => __DIR__ . '/..' . '/react/event-loop/src/Factory.php', + 'RectorPrefix202506\\React\\EventLoop\\Loop' => __DIR__ . '/..' . '/react/event-loop/src/Loop.php', + 'RectorPrefix202506\\React\\EventLoop\\LoopInterface' => __DIR__ . '/..' . '/react/event-loop/src/LoopInterface.php', + 'RectorPrefix202506\\React\\EventLoop\\SignalsHandler' => __DIR__ . '/..' . '/react/event-loop/src/SignalsHandler.php', + 'RectorPrefix202506\\React\\EventLoop\\StreamSelectLoop' => __DIR__ . '/..' . '/react/event-loop/src/StreamSelectLoop.php', + 'RectorPrefix202506\\React\\EventLoop\\Tick\\FutureTickQueue' => __DIR__ . '/..' . '/react/event-loop/src/Tick/FutureTickQueue.php', + 'RectorPrefix202506\\React\\EventLoop\\TimerInterface' => __DIR__ . '/..' . '/react/event-loop/src/TimerInterface.php', + 'RectorPrefix202506\\React\\EventLoop\\Timer\\Timer' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timer.php', + 'RectorPrefix202506\\React\\EventLoop\\Timer\\Timers' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timers.php', + 'RectorPrefix202506\\React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php', + 'RectorPrefix202506\\React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php', + 'RectorPrefix202506\\React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php', + 'RectorPrefix202506\\React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php', + 'RectorPrefix202506\\React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php', + 'RectorPrefix202506\\React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php', + 'RectorPrefix202506\\React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php', + 'RectorPrefix202506\\React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php', + 'RectorPrefix202506\\React\\Socket\\Connection' => __DIR__ . '/..' . '/react/socket/src/Connection.php', + 'RectorPrefix202506\\React\\Socket\\ConnectionInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectionInterface.php', + 'RectorPrefix202506\\React\\Socket\\Connector' => __DIR__ . '/..' . '/react/socket/src/Connector.php', + 'RectorPrefix202506\\React\\Socket\\ConnectorInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectorInterface.php', + 'RectorPrefix202506\\React\\Socket\\DnsConnector' => __DIR__ . '/..' . '/react/socket/src/DnsConnector.php', + 'RectorPrefix202506\\React\\Socket\\FdServer' => __DIR__ . '/..' . '/react/socket/src/FdServer.php', + 'RectorPrefix202506\\React\\Socket\\FixedUriConnector' => __DIR__ . '/..' . '/react/socket/src/FixedUriConnector.php', + 'RectorPrefix202506\\React\\Socket\\HappyEyeBallsConnectionBuilder' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnectionBuilder.php', + 'RectorPrefix202506\\React\\Socket\\HappyEyeBallsConnector' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnector.php', + 'RectorPrefix202506\\React\\Socket\\LimitingServer' => __DIR__ . '/..' . '/react/socket/src/LimitingServer.php', + 'RectorPrefix202506\\React\\Socket\\SecureConnector' => __DIR__ . '/..' . '/react/socket/src/SecureConnector.php', + 'RectorPrefix202506\\React\\Socket\\SecureServer' => __DIR__ . '/..' . '/react/socket/src/SecureServer.php', + 'RectorPrefix202506\\React\\Socket\\Server' => __DIR__ . '/..' . '/react/socket/src/Server.php', + 'RectorPrefix202506\\React\\Socket\\ServerInterface' => __DIR__ . '/..' . '/react/socket/src/ServerInterface.php', + 'RectorPrefix202506\\React\\Socket\\SocketServer' => __DIR__ . '/..' . '/react/socket/src/SocketServer.php', + 'RectorPrefix202506\\React\\Socket\\StreamEncryption' => __DIR__ . '/..' . '/react/socket/src/StreamEncryption.php', + 'RectorPrefix202506\\React\\Socket\\TcpConnector' => __DIR__ . '/..' . '/react/socket/src/TcpConnector.php', + 'RectorPrefix202506\\React\\Socket\\TcpServer' => __DIR__ . '/..' . '/react/socket/src/TcpServer.php', + 'RectorPrefix202506\\React\\Socket\\TimeoutConnector' => __DIR__ . '/..' . '/react/socket/src/TimeoutConnector.php', + 'RectorPrefix202506\\React\\Socket\\UnixConnector' => __DIR__ . '/..' . '/react/socket/src/UnixConnector.php', + 'RectorPrefix202506\\React\\Socket\\UnixServer' => __DIR__ . '/..' . '/react/socket/src/UnixServer.php', + 'RectorPrefix202506\\React\\Stream\\CompositeStream' => __DIR__ . '/..' . '/react/stream/src/CompositeStream.php', + 'RectorPrefix202506\\React\\Stream\\DuplexResourceStream' => __DIR__ . '/..' . '/react/stream/src/DuplexResourceStream.php', + 'RectorPrefix202506\\React\\Stream\\DuplexStreamInterface' => __DIR__ . '/..' . '/react/stream/src/DuplexStreamInterface.php', + 'RectorPrefix202506\\React\\Stream\\ReadableResourceStream' => __DIR__ . '/..' . '/react/stream/src/ReadableResourceStream.php', + 'RectorPrefix202506\\React\\Stream\\ReadableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/ReadableStreamInterface.php', + 'RectorPrefix202506\\React\\Stream\\ThroughStream' => __DIR__ . '/..' . '/react/stream/src/ThroughStream.php', + 'RectorPrefix202506\\React\\Stream\\Util' => __DIR__ . '/..' . '/react/stream/src/Util.php', + 'RectorPrefix202506\\React\\Stream\\WritableResourceStream' => __DIR__ . '/..' . '/react/stream/src/WritableResourceStream.php', + 'RectorPrefix202506\\React\\Stream\\WritableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/WritableStreamInterface.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', + 'RectorPrefix202506\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Command\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Debug\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', + 'RectorPrefix202506\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', + 'RectorPrefix202506\\Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', + 'RectorPrefix202506\\Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/RunProcessFailedException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessContext.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessage.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessageHandler.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\PhpSubprocess' => __DIR__ . '/..' . '/symfony/process/PhpSubprocess.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', + 'RectorPrefix202506\\Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php', + 'RectorPrefix202506\\Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceCollectionInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'RectorPrefix202506\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\CommandLine\\WorkerCommandLineFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Contract\\SerializableInterface' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Contract/SerializableInterface.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\CpuCoreCountProvider' => __DIR__ . '/..' . '/symplify/easy-parallel/src/CpuCoreCountProvider.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\Action' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Action.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\Content' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/Content.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\ReactCommand' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactCommand.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Enum\\ReactEvent' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Enum/ReactEvent.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Exception\\ParallelShouldNotHappenException' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Exception/ParallelShouldNotHappenException.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\Reflection\\CommandFromReflectionFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/Reflection/CommandFromReflectionFactory.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ScheduleFactory' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ScheduleFactory.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\EasyParallelConfig' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/EasyParallelConfig.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\ParallelProcess' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ParallelProcess.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\ProcessPool' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/ProcessPool.php', + 'RectorPrefix202506\\Symplify\\EasyParallel\\ValueObject\\Schedule' => __DIR__ . '/..' . '/symplify/easy-parallel/src/ValueObject/Schedule.php', + 'RectorPrefix202506\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', + 'RectorPrefix202506\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', + 'RectorPrefix202506\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', 'Rector\\Application\\ApplicationFileProcessor' => __DIR__ . '/../..' . '/src/Application/ApplicationFileProcessor.php', 'Rector\\Application\\ChangedNodeScopeRefresher' => __DIR__ . '/../..' . '/src/Application/ChangedNodeScopeRefresher.php', 'Rector\\Application\\FileProcessor' => __DIR__ . '/../..' . '/src/Application/FileProcessor.php', + 'Rector\\Application\\NodeAttributeReIndexer' => __DIR__ . '/../..' . '/src/Application/NodeAttributeReIndexer.php', 'Rector\\Application\\Provider\\CurrentFileProvider' => __DIR__ . '/../..' . '/src/Application/Provider/CurrentFileProvider.php', 'Rector\\Application\\VersionResolver' => __DIR__ . '/../..' . '/src/Application/VersionResolver.php', 'Rector\\Arguments\\ArgumentDefaultValueReplacer' => __DIR__ . '/../..' . '/rules/Arguments/ArgumentDefaultValueReplacer.php', @@ -1251,7 +1268,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\BetterPhpDocParser\\PhpDocNodeVisitor\\UnionTypeNodePhpDocNodeVisitor' => __DIR__ . '/../..' . '/src/BetterPhpDocParser/PhpDocNodeVisitor/UnionTypeNodePhpDocNodeVisitor.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\ArrayItemClassNameDecorator' => __DIR__ . '/../..' . '/src/BetterPhpDocParser/PhpDocParser/ArrayItemClassNameDecorator.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterPhpDocParser' => __DIR__ . '/../..' . '/src/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php', - 'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterTypeParser' => __DIR__ . '/../..' . '/src/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\ClassAnnotationMatcher' => __DIR__ . '/../..' . '/src/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\ConstExprClassNameDecorator' => __DIR__ . '/../..' . '/src/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php', 'Rector\\BetterPhpDocParser\\PhpDocParser\\DoctrineAnnotationDecorator' => __DIR__ . '/../..' . '/src/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php', @@ -1302,6 +1318,9 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Carbon\\Rector\\New_\\DateTimeInstanceToCarbonRector' => __DIR__ . '/../..' . '/rules/Carbon/Rector/New_/DateTimeInstanceToCarbonRector.php', 'Rector\\ChangesReporting\\Contract\\Output\\OutputFormatterInterface' => __DIR__ . '/../..' . '/src/ChangesReporting/Contract/Output/OutputFormatterInterface.php', 'Rector\\ChangesReporting\\Output\\ConsoleOutputFormatter' => __DIR__ . '/../..' . '/src/ChangesReporting/Output/ConsoleOutputFormatter.php', + 'Rector\\ChangesReporting\\Output\\GitHubOutputFormatter' => __DIR__ . '/../..' . '/src/ChangesReporting/Output/GitHubOutputFormatter.php', + 'Rector\\ChangesReporting\\Output\\GitlabOutputFormatter' => __DIR__ . '/../..' . '/src/ChangesReporting/Output/GitlabOutputFormatter.php', + 'Rector\\ChangesReporting\\Output\\JUnitOutputFormatter' => __DIR__ . '/../..' . '/src/ChangesReporting/Output/JUnitOutputFormatter.php', 'Rector\\ChangesReporting\\Output\\JsonOutputFormatter' => __DIR__ . '/../..' . '/src/ChangesReporting/Output/JsonOutputFormatter.php', 'Rector\\ChangesReporting\\ValueObjectFactory\\ErrorFactory' => __DIR__ . '/../..' . '/src/ChangesReporting/ValueObjectFactory/ErrorFactory.php', 'Rector\\ChangesReporting\\ValueObjectFactory\\FileDiffFactory' => __DIR__ . '/../..' . '/src/ChangesReporting/ValueObjectFactory/FileDiffFactory.php', @@ -1394,6 +1413,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\AliasClassNameImportSkipVoter' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/AliasClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\ClassLikeNameClassNameImportSkipVoter' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\FullyQualifiedNameClassNameImportSkipVoter' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php', + 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\ReservedClassNameImportSkipVoter' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ReservedClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipVoter\\UsesClassNameImportSkipVoter' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/UsesClassNameImportSkipVoter.php', 'Rector\\CodingStyle\\ClassNameImport\\ClassNameImportSkipper' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php', 'Rector\\CodingStyle\\ClassNameImport\\ShortNameResolver' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ShortNameResolver.php', @@ -1417,6 +1437,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\CodingStyle\\Rector\\Closure\\StaticClosureRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/Closure/StaticClosureRector.php', 'Rector\\CodingStyle\\Rector\\Encapsed\\EncapsedStringsToSprintfRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php', 'Rector\\CodingStyle\\Rector\\Encapsed\\WrapEncapsedVariableInCurlyBracesRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/Encapsed/WrapEncapsedVariableInCurlyBracesRector.php', + 'Rector\\CodingStyle\\Rector\\Enum_\\EnumCaseToPascalCaseRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php', 'Rector\\CodingStyle\\Rector\\Foreach_\\MultiDimensionalArrayToArrayDestructRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/Foreach_/MultiDimensionalArrayToArrayDestructRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\ArraySpreadInsteadOfArrayMergeRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\CallUserFuncArrayToVariadicRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php', @@ -1426,6 +1447,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\CodingStyle\\Rector\\FuncCall\\FunctionFirstClassCallableRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/FuncCall/FunctionFirstClassCallableRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\StrictArraySearchRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/FuncCall/StrictArraySearchRector.php', 'Rector\\CodingStyle\\Rector\\FuncCall\\VersionCompareFuncCallToConstantRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/FuncCall/VersionCompareFuncCallToConstantRector.php', + 'Rector\\CodingStyle\\Rector\\FunctionLike\\FunctionLikeToFirstClassCallableRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/FunctionLike/FunctionLikeToFirstClassCallableRector.php', 'Rector\\CodingStyle\\Rector\\If_\\NullableCompareToNullRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/If_/NullableCompareToNullRector.php', 'Rector\\CodingStyle\\Rector\\PostInc\\PostIncDecToPreIncDecRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/PostInc/PostIncDecToPreIncDecRector.php', 'Rector\\CodingStyle\\Rector\\Property\\SplitGroupedPropertiesRector' => __DIR__ . '/../..' . '/rules/CodingStyle/Rector/Property/SplitGroupedPropertiesRector.php', @@ -1444,14 +1466,17 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Composer\\InstalledPackageResolver' => __DIR__ . '/../..' . '/src/Composer/InstalledPackageResolver.php', 'Rector\\Composer\\ValueObject\\InstalledPackage' => __DIR__ . '/../..' . '/src/Composer/ValueObject/InstalledPackage.php', 'Rector\\Config\\Level\\CodeQualityLevel' => __DIR__ . '/../..' . '/src/Config/Level/CodeQualityLevel.php', + 'Rector\\Config\\Level\\CodingStyleLevel' => __DIR__ . '/../..' . '/src/Config/Level/CodingStyleLevel.php', 'Rector\\Config\\Level\\DeadCodeLevel' => __DIR__ . '/../..' . '/src/Config/Level/DeadCodeLevel.php', 'Rector\\Config\\Level\\TypeDeclarationLevel' => __DIR__ . '/../..' . '/src/Config/Level/TypeDeclarationLevel.php', 'Rector\\Config\\RectorConfig' => __DIR__ . '/../..' . '/src/Config/RectorConfig.php', 'Rector\\Config\\RegisteredService' => __DIR__ . '/../..' . '/src/Config/RegisteredService.php', 'Rector\\Configuration\\ConfigInitializer' => __DIR__ . '/../..' . '/src/Configuration/ConfigInitializer.php', 'Rector\\Configuration\\ConfigurationFactory' => __DIR__ . '/../..' . '/src/Configuration/ConfigurationFactory.php', + 'Rector\\Configuration\\ConfigurationRuleFilter' => __DIR__ . '/../..' . '/src/Configuration/ConfigurationRuleFilter.php', 'Rector\\Configuration\\Deprecation\\Contract\\DeprecatedInterface' => __DIR__ . '/../..' . '/src/Configuration/Deprecation/Contract/DeprecatedInterface.php', 'Rector\\Configuration\\Levels\\LevelRulesResolver' => __DIR__ . '/../..' . '/src/Configuration/Levels/LevelRulesResolver.php', + 'Rector\\Configuration\\OnlyRuleResolver' => __DIR__ . '/../..' . '/src/Configuration/OnlyRuleResolver.php', 'Rector\\Configuration\\Option' => __DIR__ . '/../..' . '/src/Configuration/Option.php', 'Rector\\Configuration\\Parameter\\SimpleParameterProvider' => __DIR__ . '/../..' . '/src/Configuration/Parameter/SimpleParameterProvider.php', 'Rector\\Configuration\\PhpLevelSetResolver' => __DIR__ . '/../..' . '/src/Configuration/PhpLevelSetResolver.php', @@ -1476,8 +1501,8 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Contract\\DependencyInjection\\ResetableInterface' => __DIR__ . '/../..' . '/src/Contract/DependencyInjection/ResetableInterface.php', 'Rector\\Contract\\PhpParser\\Node\\StmtsAwareInterface' => __DIR__ . '/../..' . '/src/Contract/PhpParser/Node/StmtsAwareInterface.php', 'Rector\\Contract\\Rector\\ConfigurableRectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/ConfigurableRectorInterface.php', + 'Rector\\Contract\\Rector\\HTMLAverseRectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/HTMLAverseRectorInterface.php', 'Rector\\Contract\\Rector\\RectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/RectorInterface.php', - 'Rector\\Contract\\Rector\\ScopeAwareRectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/ScopeAwareRectorInterface.php', 'Rector\\CustomRules\\SimpleNodeDumper' => __DIR__ . '/../..' . '/src/CustomRules/SimpleNodeDumper.php', 'Rector\\DeadCode\\ConditionEvaluator' => __DIR__ . '/../..' . '/rules/DeadCode/ConditionEvaluator.php', 'Rector\\DeadCode\\ConditionResolver' => __DIR__ . '/../..' . '/rules/DeadCode/ConditionResolver.php', @@ -1505,11 +1530,13 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DeadCode\\Rector\\Array_\\RemoveDuplicatedArrayKeyRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Array_/RemoveDuplicatedArrayKeyRector.php', 'Rector\\DeadCode\\Rector\\Assign\\RemoveDoubleAssignRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php', 'Rector\\DeadCode\\Rector\\Assign\\RemoveUnusedVariableAssignRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php', + 'Rector\\DeadCode\\Rector\\Block\\ReplaceBlockToItsStmtsRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Block/ReplaceBlockToItsStmtsRector.php', 'Rector\\DeadCode\\Rector\\BooleanAnd\\RemoveAndTrueRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php', 'Rector\\DeadCode\\Rector\\Cast\\RecastingRemovalRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php', 'Rector\\DeadCode\\Rector\\ClassConst\\RemoveUnusedPrivateClassConstantRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveAnnotationRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveTypedPropertyNonMockDocblockRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassLike/RemoveTypedPropertyNonMockDocblockRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveArgumentFromDefaultParentCallRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveArgumentFromDefaultParentCallRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveEmptyClassMethodRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveNullTagValueNodeRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedConstructorParamRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php', @@ -1517,6 +1544,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPromotedPropertyRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPublicMethodParameterRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessAssignFromPropertyPromotionRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessAssignFromPropertyPromotionRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessParamTagRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnExprInConstructRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnTagRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php', @@ -1528,6 +1556,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DeadCode\\Rector\\For_\\RemoveDeadIfForeachForRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php', 'Rector\\DeadCode\\Rector\\For_\\RemoveDeadLoopRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/For_/RemoveDeadLoopRector.php', 'Rector\\DeadCode\\Rector\\Foreach_\\RemoveUnusedForeachKeyRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php', + 'Rector\\DeadCode\\Rector\\FuncCall\\RemoveFilterVarOnExactTypeRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/FuncCall/RemoveFilterVarOnExactTypeRector.php', 'Rector\\DeadCode\\Rector\\FunctionLike\\RemoveDeadReturnRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/FunctionLike/RemoveDeadReturnRector.php', 'Rector\\DeadCode\\Rector\\If_\\ReduceAlwaysFalseIfOrRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php', 'Rector\\DeadCode\\Rector\\If_\\RemoveAlwaysTrueIfConditionRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php', @@ -1547,6 +1576,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DeadCode\\Rector\\Stmt\\RemoveUnreachableStatementRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Stmt/RemoveUnreachableStatementRector.php', 'Rector\\DeadCode\\Rector\\Switch_\\RemoveDuplicatedCaseInSwitchRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Switch_/RemoveDuplicatedCaseInSwitchRector.php', 'Rector\\DeadCode\\Rector\\Ternary\\TernaryToBooleanOrFalseToBooleanAndRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php', + 'Rector\\DeadCode\\Rector\\TryCatch\\RemoveDeadCatchRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/TryCatch/RemoveDeadCatchRector.php', 'Rector\\DeadCode\\Rector\\TryCatch\\RemoveDeadTryCatchRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/TryCatch/RemoveDeadTryCatchRector.php', 'Rector\\DeadCode\\SideEffect\\PureFunctionDetector' => __DIR__ . '/../..' . '/rules/DeadCode/SideEffect/PureFunctionDetector.php', 'Rector\\DeadCode\\SideEffect\\SideEffectNodeDetector' => __DIR__ . '/../..' . '/rules/DeadCode/SideEffect/SideEffectNodeDetector.php', @@ -1560,6 +1590,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DependencyInjection\\RectorContainerFactory' => __DIR__ . '/../..' . '/src/DependencyInjection/RectorContainerFactory.php', 'Rector\\Differ\\DefaultDiffer' => __DIR__ . '/../..' . '/src/Differ/DefaultDiffer.php', 'Rector\\Doctrine\\Bundle210\\Rector\\Class_\\EventSubscriberInterfaceToAttributeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php', + 'Rector\\Doctrine\\Bundle230\\Rector\\Class_\\AddAnnotationToRepositoryRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Bundle230/Rector/Class_/AddAnnotationToRepositoryRector.php', 'Rector\\Doctrine\\CodeQuality\\AttributeTransformer\\ClassAttributeTransformer\\EmbeddableClassAttributeTransformer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EmbeddableClassAttributeTransformer.php', 'Rector\\Doctrine\\CodeQuality\\AttributeTransformer\\ClassAttributeTransformer\\EntityClassAttributeTransformer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EntityClassAttributeTransformer.php', 'Rector\\Doctrine\\CodeQuality\\AttributeTransformer\\ClassAttributeTransformer\\InheritanceClassAttributeTransformer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/InheritanceClassAttributeTransformer.php', @@ -1588,19 +1619,12 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Doctrine\\CodeQuality\\Enum\\OdmMappingKey' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Enum/OdmMappingKey.php', 'Rector\\Doctrine\\CodeQuality\\Helper\\NodeValueNormalizer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Helper/NodeValueNormalizer.php', 'Rector\\Doctrine\\CodeQuality\\NodeFactory\\AttributeFactory' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/NodeFactory/AttributeFactory.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\ExplicitRelationCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php', + 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\RemoveEmptyTableAttributeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\YamlToAttributeDoctrineMappingRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/YamlToAttributeDoctrineMappingRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\CorrectDefaultTypesOnEntityPropertyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/CorrectDefaultTypesOnEntityPropertyRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\ImproveDoctrineCollectionDocTypeInEntityRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\MakeEntityDateTimePropertyDateTimeInterfaceRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromColumnTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromDoctrineCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php', - 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromToManyRelationTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Property\\TypedPropertyFromToOneRelationTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToOneRelationTypeRector.php', 'Rector\\Doctrine\\CodeQuality\\SetterCollectionResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/SetterCollectionResolver.php', 'Rector\\Doctrine\\CodeQuality\\Utils\\CaseStringHelper' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Utils/CaseStringHelper.php', @@ -1609,13 +1633,20 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Doctrine\\Dbal211\\Rector\\MethodCall\\ExtractArrayArgOnQueryBuilderSelectRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ExtractArrayArgOnQueryBuilderSelectRector.php', 'Rector\\Doctrine\\Dbal211\\Rector\\MethodCall\\ReplaceFetchAllMethodCallRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ReplaceFetchAllMethodCallRector.php', 'Rector\\Doctrine\\Dbal40\\Rector\\MethodCall\\ChangeCompositeExpressionAddMultipleWithWithRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Dbal40/Rector/MethodCall/ChangeCompositeExpressionAddMultipleWithWithRector.php', + 'Rector\\Doctrine\\Dbal40\\Rector\\StmtsAwareInterface\\ExecuteQueryParamsToBindValueRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Dbal40/Rector/StmtsAwareInterface/ExecuteQueryParamsToBindValueRector.php', + 'Rector\\Doctrine\\Dbal42\\Rector\\New_\\AddArrayResultColumnNamesRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Dbal42/Rector/New_/AddArrayResultColumnNamesRector.php', + 'Rector\\Doctrine\\DoctrineFixture\\Rector\\MethodCall\\AddGetReferenceTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/DoctrineFixture/Rector/MethodCall/AddGetReferenceTypeRector.php', + 'Rector\\Doctrine\\DoctrineFixture\\Reflection\\ParameterTypeResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/DoctrineFixture/Reflection/ParameterTypeResolver.php', + 'Rector\\Doctrine\\Enum\\DoctrineClass' => __DIR__ . '/..' . '/rector/rector-doctrine/src/Enum/DoctrineClass.php', 'Rector\\Doctrine\\Enum\\MappingClass' => __DIR__ . '/..' . '/rector/rector-doctrine/src/Enum/MappingClass.php', 'Rector\\Doctrine\\Enum\\OdmMappingClass' => __DIR__ . '/..' . '/rector/rector-doctrine/src/Enum/OdmMappingClass.php', + 'Rector\\Doctrine\\Enum\\TestClass' => __DIR__ . '/..' . '/rector/rector-doctrine/src/Enum/TestClass.php', 'Rector\\Doctrine\\NodeAnalyzer\\AttributeFinder' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeAnalyzer/AttributeFinder.php', 'Rector\\Doctrine\\NodeAnalyzer\\AttrinationFinder' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeAnalyzer/AttrinationFinder.php', 'Rector\\Doctrine\\NodeAnalyzer\\ConstructorAssignPropertyAnalyzer' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeAnalyzer/ConstructorAssignPropertyAnalyzer.php', 'Rector\\Doctrine\\NodeAnalyzer\\DoctrineEntityDetector' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeAnalyzer/DoctrineEntityDetector.php', 'Rector\\Doctrine\\NodeAnalyzer\\MethodUniqueReturnedPropertyResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeAnalyzer/MethodUniqueReturnedPropertyResolver.php', + 'Rector\\Doctrine\\NodeAnalyzer\\RepositoryClassResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeAnalyzer/RepositoryClassResolver.php', 'Rector\\Doctrine\\NodeAnalyzer\\TargetEntityResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeAnalyzer/TargetEntityResolver.php', 'Rector\\Doctrine\\NodeFactory\\ArrayCollectionAssignFactory' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeFactory/ArrayCollectionAssignFactory.php', 'Rector\\Doctrine\\NodeFactory\\ValueAssignFactory' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeFactory/ValueAssignFactory.php', @@ -1626,6 +1657,8 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Doctrine\\NodeManipulator\\ToOneRelationPropertyTypeResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/NodeManipulator/ToOneRelationPropertyTypeResolver.php', 'Rector\\Doctrine\\Orm214\\Rector\\Param\\ReplaceLifecycleEventArgsByDedicatedEventArgsRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Orm214/Rector/Param/ReplaceLifecycleEventArgsByDedicatedEventArgsRector.php', 'Rector\\Doctrine\\Orm28\\Rector\\MethodCall\\IterateToToIterableRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Orm28/Rector/MethodCall/IterateToToIterableRector.php', + 'Rector\\Doctrine\\Orm30\\Rector\\MethodCall\\CastDoctrineExprToStringRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/CastDoctrineExprToStringRector.php', + 'Rector\\Doctrine\\Orm30\\Rector\\MethodCall\\SetParametersArrayToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/SetParametersArrayToCollectionRector.php', 'Rector\\Doctrine\\PhpDocParser\\DoctrineDocBlockResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/PhpDocParser/DoctrineDocBlockResolver.php', 'Rector\\Doctrine\\PhpDoc\\ShortClassExpander' => __DIR__ . '/..' . '/rector/rector-doctrine/src/PhpDoc/ShortClassExpander.php', 'Rector\\Doctrine\\Set\\DoctrineSetList' => __DIR__ . '/..' . '/rector/rector-doctrine/src/Set/DoctrineSetList.php', @@ -1633,6 +1666,43 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeFactory' => __DIR__ . '/..' . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php', 'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php', 'Rector\\Doctrine\\TypeAnalyzer\\CollectionVarTagValueNodeResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php', + 'Rector\\Doctrine\\TypedCollections\\DocBlockAnalyzer\\CollectionTagValueNodeAnalyzer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php', + 'Rector\\Doctrine\\TypedCollections\\DocBlockProcessor\\UnionCollectionTagValueNodeNarrower' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php', + 'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\CollectionParamCallDetector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php', + 'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\EntityLikeClassDetector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Assign\\ArrayDimFetchAssignToAddCollectionCallRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Assign\\ArrayOffsetSetToSetCollectionCallRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayOffsetSetToSetCollectionCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionGetterNativeTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionParamTypeSetterToCollectionPropertyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionSetterParamNativeTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\DefaultCollectionKeyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowArrayCollectionToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowParamUnionToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowReturnUnionToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowReturnUnionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\RemoveNewArrayCollectionOutsideConstructorRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNewArrayCollectionOutsideConstructorRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\RemoveNullFromNullableCollectionTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\ReturnArrayToNewArrayCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnArrayToNewArrayCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\ReturnCollectionDocblockRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnCollectionDocblockRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\CompleteParamDocblockFromSetterToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteParamDocblockFromSetterToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\CompletePropertyDocblockFromToManyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompletePropertyDocblockFromToManyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\CompleteReturnDocblockFromToManyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteReturnDocblockFromToManyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Class_\\InitializeCollectionInConstructorRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/InitializeCollectionInConstructorRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Empty_\\EmptyOnCollectionToIsEmptyCallRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Empty_/EmptyOnCollectionToIsEmptyCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Expression\\RemoveAssertNotNullOnCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Expression\\RemoveCoalesceAssignOnCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveCoalesceAssignOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\FuncCall\\ArrayMapOnCollectionToArrayRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMapOnCollectionToArrayRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\FuncCall\\ArrayMergeOnCollectionToArrayRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMergeOnCollectionToArrayRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\FuncCall\\InArrayOnCollectionToContainsCallRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/InArrayOnCollectionToContainsCallRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\If_\\RemoveIfInstanceofCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIfInstanceofCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\If_\\RemoveIsArrayOnCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIsArrayOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\MethodCall\\AssertNullOnCollectionToAssertEmptyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertNullOnCollectionToAssertEmptyRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\MethodCall\\AssertSameCountOnCollectionToAssertCountRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\MethodCall\\SetArrayToNewCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/SetArrayToNewCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\New_\\RemoveNewArrayCollectionWrapRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/New_/RemoveNewArrayCollectionWrapRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\NullsafeMethodCall\\RemoveNullsafeOnCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/NullsafeMethodCall/RemoveNullsafeOnCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Property\\NarrowPropertyUnionToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Property/NarrowPropertyUnionToCollectionRector.php', + 'Rector\\Doctrine\\TypedCollections\\Rector\\Property\\TypedPropertyFromToManyRelationTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php', + 'Rector\\Doctrine\\TypedCollections\\TypeAnalyzer\\CollectionTypeDetector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/TypeAnalyzer/CollectionTypeDetector.php', 'Rector\\DowngradePhp72\\NodeAnalyzer\\BuiltInMethodAnalyzer' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php', 'Rector\\DowngradePhp72\\NodeAnalyzer\\OverrideFromAnonymousClassMethodAnalyzer' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/OverrideFromAnonymousClassMethodAnalyzer.php', 'Rector\\DowngradePhp72\\NodeAnalyzer\\RegexFuncAnalyzer' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/RegexFuncAnalyzer.php', @@ -1656,6 +1726,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DowngradePhp73\\Rector\\Unset_\\DowngradeTrailingCommasInUnsetRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/Unset_/DowngradeTrailingCommasInUnsetRector.php', 'Rector\\DowngradePhp73\\Tokenizer\\FollowedByCommaAnalyzer' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByCommaAnalyzer.php', 'Rector\\DowngradePhp73\\Tokenizer\\FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer.php', + 'Rector\\DowngradePhp73\\Tokenizer\\TrailingCommaRemover' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/TrailingCommaRemover.php', 'Rector\\DowngradePhp74\\Rector\\Array_\\DowngradeArraySpreadRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php', 'Rector\\DowngradePhp74\\Rector\\ArrowFunction\\ArrowFunctionToAnonymousFunctionRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ArrowFunction/ArrowFunctionToAnonymousFunctionRector.php', 'Rector\\DowngradePhp74\\Rector\\ClassMethod\\DowngradeContravariantArgumentTypeRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeContravariantArgumentTypeRector.php', @@ -1693,6 +1764,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DowngradePhp80\\Rector\\FuncCall\\DowngradeStrStartsWithRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrStartsWithRector.php', 'Rector\\DowngradePhp80\\Rector\\FunctionLike\\DowngradeMixedTypeDeclarationRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeMixedTypeDeclarationRector.php', 'Rector\\DowngradePhp80\\Rector\\FunctionLike\\DowngradeUnionTypeDeclarationRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeUnionTypeDeclarationRector.php', + 'Rector\\DowngradePhp80\\Rector\\Instanceof_\\DowngradeInstanceofStringableRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradeInstanceofStringableRector.php', 'Rector\\DowngradePhp80\\Rector\\Instanceof_\\DowngradePhp80ResourceReturnToObjectRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradePhp80ResourceReturnToObjectRector.php', 'Rector\\DowngradePhp80\\Rector\\MethodCall\\DowngradeNamedArgumentRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeNamedArgumentRector.php', 'Rector\\DowngradePhp80\\Rector\\MethodCall\\DowngradeReflectionClassGetConstantsFilterRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionClassGetConstantsFilterRector.php', @@ -1722,9 +1794,16 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\DowngradePhp81\\Rector\\MethodCall\\DowngradeIsEnumRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/MethodCall/DowngradeIsEnumRector.php', 'Rector\\DowngradePhp81\\Rector\\Property\\DowngradeReadonlyPropertyRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Property/DowngradeReadonlyPropertyRector.php', 'Rector\\DowngradePhp81\\Rector\\StmtsAwareInterface\\DowngradeSetAccessibleReflectionPropertyRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/StmtsAwareInterface/DowngradeSetAccessibleReflectionPropertyRector.php', + 'Rector\\DowngradePhp82\\NodeManipulator\\DowngradeReadonlyClassManipulator' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp82/NodeManipulator/DowngradeReadonlyClassManipulator.php', 'Rector\\DowngradePhp82\\Rector\\Class_\\DowngradeReadonlyClassRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/Class_/DowngradeReadonlyClassRector.php', + 'Rector\\DowngradePhp82\\Rector\\FuncCall\\DowngradeIteratorCountToArrayRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FuncCall/DowngradeIteratorCountToArrayRector.php', 'Rector\\DowngradePhp82\\Rector\\FunctionLike\\DowngradeStandaloneNullTrueFalseReturnTypeRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FunctionLike/DowngradeStandaloneNullTrueFalseReturnTypeRector.php', + 'Rector\\DowngradePhp83\\Rector\\ClassConstFetch\\DowngradeDynamicClassConstFetchRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php', 'Rector\\DowngradePhp83\\Rector\\ClassConst\\DowngradeTypedClassConstRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConst/DowngradeTypedClassConstRector.php', + 'Rector\\DowngradePhp83\\Rector\\Class_\\DowngradeReadonlyAnonymousClassRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/Class_/DowngradeReadonlyAnonymousClassRector.php', + 'Rector\\DowngradePhp84\\Rector\\FuncCall\\DowngradeRoundingModeEnumRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php', + 'Rector\\DowngradePhp84\\Rector\\MethodCall\\DowngradeNewMethodCallWithoutParenthesesRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php', + 'Rector\\DowngradePhp85\\Rector\\FuncCall\\DowngradeArrayFirstLastRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp85/Rector/FuncCall/DowngradeArrayFirstLastRector.php', 'Rector\\EarlyReturn\\NodeTransformer\\ConditionInverter' => __DIR__ . '/../..' . '/rules/EarlyReturn/NodeTransformer/ConditionInverter.php', 'Rector\\EarlyReturn\\Rector\\Foreach_\\ChangeNestedForeachIfsToEarlyContinueRector' => __DIR__ . '/../..' . '/rules/EarlyReturn/Rector/Foreach_/ChangeNestedForeachIfsToEarlyContinueRector.php', 'Rector\\EarlyReturn\\Rector\\If_\\ChangeIfElseValueAssignToEarlyReturnRector' => __DIR__ . '/../..' . '/rules/EarlyReturn/Rector/If_/ChangeIfElseValueAssignToEarlyReturnRector.php', @@ -1736,10 +1815,13 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\EarlyReturn\\Rector\\StmtsAwareInterface\\ReturnEarlyIfVariableRector' => __DIR__ . '/../..' . '/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php', 'Rector\\EarlyReturn\\ValueObject\\BareSingleAssignIf' => __DIR__ . '/../..' . '/rules/EarlyReturn/ValueObject/BareSingleAssignIf.php', 'Rector\\Enum\\ClassName' => __DIR__ . '/../..' . '/src/Enum/ClassName.php', + 'Rector\\Enum\\Config\\Defaults' => __DIR__ . '/../..' . '/src/Enum/Config/Defaults.php', 'Rector\\Enum\\JsonConstant' => __DIR__ . '/..' . '/rector/rector-downgrade-php/src/Enum/JsonConstant.php', 'Rector\\Enum\\ObjectReference' => __DIR__ . '/../..' . '/src/Enum/ObjectReference.php', 'Rector\\Exception\\Cache\\CachingException' => __DIR__ . '/../..' . '/src/Exception/Cache/CachingException.php', 'Rector\\Exception\\Configuration\\InvalidConfigurationException' => __DIR__ . '/../..' . '/src/Exception/Configuration/InvalidConfigurationException.php', + 'Rector\\Exception\\Configuration\\RectorRuleNameAmbiguousException' => __DIR__ . '/../..' . '/src/Exception/Configuration/RectorRuleNameAmbiguousException.php', + 'Rector\\Exception\\Configuration\\RectorRuleNotFoundException' => __DIR__ . '/../..' . '/src/Exception/Configuration/RectorRuleNotFoundException.php', 'Rector\\Exception\\NotImplementedYetException' => __DIR__ . '/../..' . '/src/Exception/NotImplementedYetException.php', 'Rector\\Exception\\Reflection\\MissingPrivatePropertyException' => __DIR__ . '/../..' . '/src/Exception/Reflection/MissingPrivatePropertyException.php', 'Rector\\Exception\\ShouldNotHappenException' => __DIR__ . '/../..' . '/src/Exception/ShouldNotHappenException.php', @@ -1754,9 +1836,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\FileSystem\\JsonFileSystem' => __DIR__ . '/../..' . '/src/FileSystem/JsonFileSystem.php', 'Rector\\Git\\RepositoryHelper' => __DIR__ . '/../..' . '/src/Git/RepositoryHelper.php', 'Rector\\Instanceof_\\Rector\\Ternary\\FlipNegatedTernaryInstanceofRector' => __DIR__ . '/../..' . '/rules/Instanceof_/Rector/Ternary/FlipNegatedTernaryInstanceofRector.php', - 'Rector\\Naming\\AssignVariableNameResolver\\NewAssignVariableNameResolver' => __DIR__ . '/../..' . '/rules/Naming/AssignVariableNameResolver/NewAssignVariableNameResolver.php', - 'Rector\\Naming\\AssignVariableNameResolver\\PropertyFetchAssignVariableNameResolver' => __DIR__ . '/../..' . '/rules/Naming/AssignVariableNameResolver/PropertyFetchAssignVariableNameResolver.php', - 'Rector\\Naming\\Contract\\AssignVariableNameResolverInterface' => __DIR__ . '/../..' . '/rules/Naming/Contract/AssignVariableNameResolverInterface.php', 'Rector\\Naming\\ExpectedNameResolver\\InflectorSingularResolver' => __DIR__ . '/../..' . '/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php', 'Rector\\Naming\\ExpectedNameResolver\\MatchParamTypeExpectedNameResolver' => __DIR__ . '/../..' . '/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php', 'Rector\\Naming\\ExpectedNameResolver\\MatchPropertyTypeExpectedNameResolver' => __DIR__ . '/../..' . '/rules/Naming/ExpectedNameResolver/MatchPropertyTypeExpectedNameResolver.php', @@ -1771,7 +1850,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Naming\\Naming\\AliasNameResolver' => __DIR__ . '/../..' . '/rules/Naming/Naming/AliasNameResolver.php', 'Rector\\Naming\\Naming\\ConflictingNameResolver' => __DIR__ . '/../..' . '/rules/Naming/Naming/ConflictingNameResolver.php', 'Rector\\Naming\\Naming\\ExpectedNameResolver' => __DIR__ . '/../..' . '/rules/Naming/Naming/ExpectedNameResolver.php', - 'Rector\\Naming\\Naming\\OverridenExistingNamesResolver' => __DIR__ . '/../..' . '/rules/Naming/Naming/OverridenExistingNamesResolver.php', + 'Rector\\Naming\\Naming\\OverriddenExistingNamesResolver' => __DIR__ . '/../..' . '/rules/Naming/Naming/OverriddenExistingNamesResolver.php', 'Rector\\Naming\\Naming\\PropertyNaming' => __DIR__ . '/../..' . '/rules/Naming/Naming/PropertyNaming.php', 'Rector\\Naming\\Naming\\UseImportsResolver' => __DIR__ . '/../..' . '/rules/Naming/Naming/UseImportsResolver.php', 'Rector\\Naming\\Naming\\VariableNaming' => __DIR__ . '/../..' . '/rules/Naming/Naming/VariableNaming.php', @@ -1797,6 +1876,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Naming\\ValueObject\\VariableAndCallAssign' => __DIR__ . '/../..' . '/rules/Naming/ValueObject/VariableAndCallAssign.php', 'Rector\\Naming\\ValueObject\\VariableAndCallForeach' => __DIR__ . '/../..' . '/rules/Naming/ValueObject/VariableAndCallForeach.php', 'Rector\\Naming\\VariableRenamer' => __DIR__ . '/../..' . '/rules/Naming/VariableRenamer.php', + 'Rector\\NetteUtils\\Rector\\StaticCall\\UtilsJsonStaticCallNamedArgRector' => __DIR__ . '/../..' . '/rules/NetteUtils/Rector/StaticCall/UtilsJsonStaticCallNamedArgRector.php', 'Rector\\NodeAnalyzer\\ArgsAnalyzer' => __DIR__ . '/../..' . '/src/NodeAnalyzer/ArgsAnalyzer.php', 'Rector\\NodeAnalyzer\\BinaryOpAnalyzer' => __DIR__ . '/../..' . '/src/NodeAnalyzer/BinaryOpAnalyzer.php', 'Rector\\NodeAnalyzer\\CallAnalyzer' => __DIR__ . '/../..' . '/src/NodeAnalyzer/CallAnalyzer.php', @@ -1825,6 +1905,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\NodeCollector\\ValueObject\\ArrayCallableDynamicMethod' => __DIR__ . '/../..' . '/src/NodeCollector/ValueObject/ArrayCallableDynamicMethod.php', 'Rector\\NodeDecorator\\CreatedByRuleDecorator' => __DIR__ . '/../..' . '/src/NodeDecorator/CreatedByRuleDecorator.php', 'Rector\\NodeDecorator\\PropertyTypeDecorator' => __DIR__ . '/../..' . '/src/NodeDecorator/PropertyTypeDecorator.php', + 'Rector\\NodeDecorator\\StatementDepthAttributeDecorator' => __DIR__ . '/../..' . '/src/NodeDecorator/StatementDepthAttributeDecorator.php', 'Rector\\NodeFactory\\ClassFromEnumFactory' => __DIR__ . '/..' . '/rector/rector-downgrade-php/src/NodeFactory/ClassFromEnumFactory.php', 'Rector\\NodeFactory\\DoctrineAnnotationFactory' => __DIR__ . '/..' . '/rector/rector-downgrade-php/src/NodeFactory/DoctrineAnnotationFactory.php', 'Rector\\NodeFactory\\NamedVariableFactory' => __DIR__ . '/..' . '/rector/rector-downgrade-php/src/NodeFactory/NamedVariableFactory.php', @@ -1892,6 +1973,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\StaticVariableNodeVisitor' => __DIR__ . '/../..' . '/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StaticVariableNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\StmtKeyNodeVisitor' => __DIR__ . '/../..' . '/src/NodeTypeResolver/PHPStan/Scope/NodeVisitor/StmtKeyNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\PHPStanNodeScopeResolver' => __DIR__ . '/../..' . '/src/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php', + 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\RectorNodeScopeResolver' => __DIR__ . '/../..' . '/src/NodeTypeResolver/PHPStan/Scope/RectorNodeScopeResolver.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\ScopeFactory' => __DIR__ . '/../..' . '/src/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php', 'Rector\\NodeTypeResolver\\PHPStan\\TypeHasher' => __DIR__ . '/../..' . '/src/NodeTypeResolver/PHPStan/TypeHasher.php', 'Rector\\NodeTypeResolver\\PHPStan\\Type\\StaticTypeAnalyzer' => __DIR__ . '/../..' . '/src/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php', @@ -1926,6 +2008,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ClosureTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/ClosureTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ConditionalTypeForParameterMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeForParameterMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ConditionalTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/ConditionalTypeMapper.php', + 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\ConstantArrayTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/ConstantArrayTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\FloatTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/FloatTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\GenericClassStringTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/GenericClassStringTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\HasMethodTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/HasMethodTypeMapper.php', @@ -1953,16 +2036,21 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\UnionTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\VoidTypeMapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/TypeMapper/VoidTypeMapper.php', 'Rector\\PHPStanStaticTypeMapper\\Utils\\TypeUnwrapper' => __DIR__ . '/../..' . '/src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php', - 'Rector\\PHPStan\\NodeVisitor\\UnreachableStatementNodeVisitor' => __DIR__ . '/../..' . '/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php', - 'Rector\\PHPStan\\NodeVisitor\\WrappedNodeRestoringNodeVisitor' => __DIR__ . '/../..' . '/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php', + 'Rector\\PHPStan\\ScopeFetcher' => __DIR__ . '/../..' . '/src/PHPStan/ScopeFetcher.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\ClassMethod\\DataProviderAnnotationToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\ClassMethod\\DependsAnnotationWithValueToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\ClassMethod\\TestWithAnnotationToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\AnnotationWithValueToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\CoversAnnotationWithValueToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php', + 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\RequiresAnnotationWithValueToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php', 'Rector\\PHPUnit\\AnnotationsToAttributes\\Rector\\Class_\\TicketAnnotationToAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Enum\\NonAssertNonStaticMethods' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Enum/NonAssertNonStaticMethods.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\AssertMethodAnalyzer' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php', 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\DoctrineEntityDocumentAnalyser' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/DoctrineEntityDocumentAnalyser.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\NullableObjectAssignCollector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/NullableObjectAssignCollector.php', + 'Rector\\PHPUnit\\CodeQuality\\NodeAnalyser\\SetUpAssignedMockTypesResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/SetUpAssignedMockTypesResolver.php', 'Rector\\PHPUnit\\CodeQuality\\NodeFactory\\NestedClosureAssertFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\AddInstanceofAssertForNullableInstanceRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/AddInstanceofAssertForNullableInstanceRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\CreateMockToAnonymousClassRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\DataProviderArrayItemsNewLinedRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\ClassMethod\\EntityDocumentCreateMockToDirectNewRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php', @@ -1976,13 +2064,15 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\NarrowUnusedSetUpDefinedPropertyRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitSelfCallRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\PreferPHPUnitThisCallRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\RemoveDataProviderParamKeysRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/RemoveDataProviderParamKeysRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SetUpBeforeClassToSetUpRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\SingleMockPropertyTypeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TestWithToDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TypeWillReturnCallableArrowFunctionRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\YieldDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\FuncCall\\AssertFuncCallToPHPUnitAssertRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareOnCountableWithMethodToAssertCountRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php', - 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareToSpecificMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertComparisonToSpecificMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEmptyNullableObjectToAssertInstanceofRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php', @@ -2003,11 +2093,16 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\SingleWithConsecutiveToWithRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/SingleWithConsecutiveToWithRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\UseSpecificWillMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\UseSpecificWithMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWithMethodRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Reflection\\MethodParametersAndReturnTypesResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php', 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\MatchAndReturnMatch' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php', + 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\ParamTypesAndReturnType' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/ParamTypesAndReturnType.php', + 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\VariableNameToType' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToType.php', + 'Rector\\PHPUnit\\CodeQuality\\ValueObject\\VariableNameToTypeCollection' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToTypeCollection.php', 'Rector\\PHPUnit\\Composer\\ProjectPackageVersionResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php', 'Rector\\PHPUnit\\Enum\\AssertMethod' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Enum/AssertMethod.php', 'Rector\\PHPUnit\\Enum\\ConsecutiveMethodName' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Enum/ConsecutiveMethodName.php', 'Rector\\PHPUnit\\Enum\\ConsecutiveVariable' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Enum/ConsecutiveVariable.php', + 'Rector\\PHPUnit\\Enum\\PHPUnitClassName' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Enum/PHPUnitClassName.php', 'Rector\\PHPUnit\\MethodCallRemover' => __DIR__ . '/..' . '/rector/rector-phpunit/src/MethodCallRemover.php', 'Rector\\PHPUnit\\Naming\\TestClassNameResolver' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Naming/TestClassNameResolver.php', 'Rector\\PHPUnit\\NodeAnalyzer\\ArgumentMover' => __DIR__ . '/..' . '/rector/rector-phpunit/src/NodeAnalyzer/ArgumentMover.php', @@ -2026,13 +2121,16 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PHPUnit\\PHPUnit100\\NodeDecorator\\WillReturnIfNodeDecorator' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/NodeDecorator/WillReturnIfNodeDecorator.php', 'Rector\\PHPUnit\\PHPUnit100\\NodeFactory\\WillReturnCallbackFactory' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\AddProphecyTraitRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\ParentTestClassConstructorRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/ParentTestClassConstructorRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\PublicDataProviderClassMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\RemoveNamedArgsInDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\Class_\\StaticDataProviderClassMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php', - 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\AssertIssetToAssertObjectHasPropertyRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php', + 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\PropertyExistsWithoutAssertRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/PropertyExistsWithoutAssertRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\MethodCall\\RemoveSetMethodsMethodCallRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\ExpectsMethodCallDecorator' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php', 'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php', 'Rector\\PHPUnit\\PHPUnit110\\Rector\\Class_\\NamedArgumentForDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php', + 'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\RemoveOverrideFinalConstructTestCaseRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php', 'Rector\\PHPUnit\\PHPUnit50\\Rector\\StaticCall\\GetMockRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php', 'Rector\\PHPUnit\\PHPUnit60\\Rector\\ClassMethod\\AddDoesNotPerformAssertionToNonAssertingTestRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/AddDoesNotPerformAssertionToNonAssertingTestRector.php', 'Rector\\PHPUnit\\PHPUnit60\\Rector\\ClassMethod\\ExceptionAnnotationRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/ExceptionAnnotationRector.php', @@ -2044,6 +2142,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PHPUnit\\PHPUnit80\\Rector\\MethodCall\\SpecificAssertInternalTypeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertInternalTypeRector.php', 'Rector\\PHPUnit\\PHPUnit90\\Rector\\Class_\\TestListenerToHooksRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit90/Rector/Class_/TestListenerToHooksRector.php', 'Rector\\PHPUnit\\PHPUnit90\\Rector\\MethodCall\\ExplicitPhpErrorApiRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ExplicitPhpErrorApiRector.php', + 'Rector\\PHPUnit\\PHPUnit90\\Rector\\MethodCall\\ReplaceAtMethodWithDesiredMatcherRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ReplaceAtMethodWithDesiredMatcherRector.php', 'Rector\\PHPUnit\\PHPUnit90\\Rector\\MethodCall\\SpecificAssertContainsWithoutIdentityRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php', 'Rector\\PHPUnit\\PhpDoc\\DataProviderMethodRenamer' => __DIR__ . '/..' . '/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php', 'Rector\\PHPUnit\\PhpDoc\\PhpDocValueToNodeMapper' => __DIR__ . '/..' . '/rector/rector-phpunit/src/PhpDoc/PhpDocValueToNodeMapper.php', @@ -2102,7 +2201,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Php71\\Rector\\Assign\\AssignArrayToStringRector' => __DIR__ . '/../..' . '/rules/Php71/Rector/Assign/AssignArrayToStringRector.php', 'Rector\\Php71\\Rector\\BinaryOp\\BinaryOpBetweenNumberAndStringRector' => __DIR__ . '/../..' . '/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php', 'Rector\\Php71\\Rector\\BooleanOr\\IsIterableRector' => __DIR__ . '/../..' . '/rules/Php71/Rector/BooleanOr/IsIterableRector.php', - 'Rector\\Php71\\Rector\\ClassConst\\PublicConstantVisibilityRector' => __DIR__ . '/../..' . '/rules/Php71/Rector/ClassConst/PublicConstantVisibilityRector.php', 'Rector\\Php71\\Rector\\FuncCall\\RemoveExtraParametersRector' => __DIR__ . '/../..' . '/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php', 'Rector\\Php71\\Rector\\List_\\ListToArrayDestructRector' => __DIR__ . '/../..' . '/rules/Php71/Rector/List_/ListToArrayDestructRector.php', 'Rector\\Php71\\Rector\\TryCatch\\MultiExceptionCatchRector' => __DIR__ . '/../..' . '/rules/Php71/Rector/TryCatch/MultiExceptionCatchRector.php', @@ -2176,6 +2274,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Php80\\Rector\\ClassMethod\\FinalPrivateToPrivateVisibilityRector' => __DIR__ . '/../..' . '/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php', 'Rector\\Php80\\Rector\\ClassMethod\\SetStateToStaticRector' => __DIR__ . '/../..' . '/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php', 'Rector\\Php80\\Rector\\Class_\\AnnotationToAttributeRector' => __DIR__ . '/../..' . '/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php', + 'Rector\\Php80\\Rector\\Class_\\AttributeValueResolver' => __DIR__ . '/../..' . '/rules/Php80/Rector/Class_/AttributeValueResolver.php', 'Rector\\Php80\\Rector\\Class_\\ClassPropertyAssignToConstructorPromotionRector' => __DIR__ . '/../..' . '/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php', 'Rector\\Php80\\Rector\\Class_\\StringableForToStringRector' => __DIR__ . '/../..' . '/rules/Php80/Rector/Class_/StringableForToStringRector.php', 'Rector\\Php80\\Rector\\FuncCall\\ClassOnObjectRector' => __DIR__ . '/../..' . '/rules/Php80/Rector/FuncCall/ClassOnObjectRector.php', @@ -2189,6 +2288,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Php80\\ValueObjectFactory\\StrStartsWithFactory' => __DIR__ . '/../..' . '/rules/Php80/ValueObjectFactory/StrStartsWithFactory.php', 'Rector\\Php80\\ValueObject\\AnnotationPropertyToAttributeClass' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/AnnotationPropertyToAttributeClass.php', 'Rector\\Php80\\ValueObject\\AnnotationToAttribute' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/AnnotationToAttribute.php', + 'Rector\\Php80\\ValueObject\\AttributeValueAndDocComment' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/AttributeValueAndDocComment.php', 'Rector\\Php80\\ValueObject\\CondAndExpr' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/CondAndExpr.php', 'Rector\\Php80\\ValueObject\\DoctrineTagAndAnnotationToAttribute' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/DoctrineTagAndAnnotationToAttribute.php', 'Rector\\Php80\\ValueObject\\MatchResult' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/MatchResult.php', @@ -2198,9 +2298,10 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 '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\\CoalescePropertyAssignMatcher' => __DIR__ . '/../..' . '/rules/Php81/NodeAnalyzer/CoalescePropertyAssignMatcher.php', 'Rector\\Php81\\NodeAnalyzer\\ComplexNewAnalyzer' => __DIR__ . '/../..' . '/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php', 'Rector\\Php81\\NodeFactory\\EnumFactory' => __DIR__ . '/../..' . '/rules/Php81/NodeFactory/EnumFactory.php', + 'Rector\\Php81\\NodeManipulator\\AttributeGroupNewLiner' => __DIR__ . '/../..' . '/rules/Php81/NodeManipulator/AttributeGroupNewLiner.php', 'Rector\\Php81\\Rector\\Array_\\FirstClassCallableRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/Array_/FirstClassCallableRector.php', 'Rector\\Php81\\Rector\\ClassMethod\\NewInInitializerRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/ClassMethod/NewInInitializerRector.php', 'Rector\\Php81\\Rector\\Class_\\MyCLabsClassToEnumRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/Class_/MyCLabsClassToEnumRector.php', @@ -2208,7 +2309,9 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Php81\\Rector\\FuncCall\\NullToStrictStringFuncCallArgRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php', 'Rector\\Php81\\Rector\\MethodCall\\MyCLabsMethodCallToEnumConstRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/MethodCall/MyCLabsMethodCallToEnumConstRector.php', 'Rector\\Php81\\Rector\\MethodCall\\SpatieEnumMethodCallToEnumConstRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/MethodCall/SpatieEnumMethodCallToEnumConstRector.php', + 'Rector\\Php81\\Rector\\New_\\MyCLabsConstructorCallToEnumFromRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/New_/MyCLabsConstructorCallToEnumFromRector.php', 'Rector\\Php81\\Rector\\Property\\ReadOnlyPropertyRector' => __DIR__ . '/../..' . '/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php', + 'Rector\\Php82\\NodeManipulator\\ReadonlyClassManipulator' => __DIR__ . '/../..' . '/rules/Php82/NodeManipulator/ReadonlyClassManipulator.php', 'Rector\\Php82\\Rector\\Class_\\ReadOnlyClassRector' => __DIR__ . '/../..' . '/rules/Php82/Rector/Class_/ReadOnlyClassRector.php', 'Rector\\Php82\\Rector\\Encapsed\\VariableInStringInterpolationFixerRector' => __DIR__ . '/../..' . '/rules/Php82/Rector/Encapsed/VariableInStringInterpolationFixerRector.php', 'Rector\\Php82\\Rector\\FuncCall\\Utf8DecodeEncodeToMbConvertEncodingRector' => __DIR__ . '/../..' . '/rules/Php82/Rector/FuncCall/Utf8DecodeEncodeToMbConvertEncodingRector.php', @@ -2216,9 +2319,16 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Php82\\Rector\\Param\\AddSensitiveParameterAttributeRector' => __DIR__ . '/../..' . '/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php', 'Rector\\Php83\\Rector\\ClassConst\\AddTypeToConstRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php', 'Rector\\Php83\\Rector\\ClassMethod\\AddOverrideAttributeToOverriddenMethodsRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php', + 'Rector\\Php83\\Rector\\Class_\\ReadOnlyAnonymousClassRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/Class_/ReadOnlyAnonymousClassRector.php', 'Rector\\Php83\\Rector\\FuncCall\\CombineHostPortLdapUriRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/FuncCall/CombineHostPortLdapUriRector.php', + 'Rector\\Php83\\Rector\\FuncCall\\DynamicClassConstFetchRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/FuncCall/DynamicClassConstFetchRector.php', 'Rector\\Php83\\Rector\\FuncCall\\RemoveGetClassGetParentClassNoArgsRector' => __DIR__ . '/../..' . '/rules/Php83/Rector/FuncCall/RemoveGetClassGetParentClassNoArgsRector.php', + 'Rector\\Php84\\Rector\\Class_\\DeprecatedAnnotationToDeprecatedAttributeRector' => __DIR__ . '/../..' . '/rules/Php84/Rector/Class_/DeprecatedAnnotationToDeprecatedAttributeRector.php', + 'Rector\\Php84\\Rector\\FuncCall\\AddEscapeArgumentRector' => __DIR__ . '/../..' . '/rules/Php84/Rector/FuncCall/AddEscapeArgumentRector.php', + 'Rector\\Php84\\Rector\\FuncCall\\RoundingModeEnumRector' => __DIR__ . '/../..' . '/rules/Php84/Rector/FuncCall/RoundingModeEnumRector.php', + 'Rector\\Php84\\Rector\\MethodCall\\NewMethodCallWithoutParenthesesRector' => __DIR__ . '/../..' . '/rules/Php84/Rector/MethodCall/NewMethodCallWithoutParenthesesRector.php', 'Rector\\Php84\\Rector\\Param\\ExplicitNullableParamTypeRector' => __DIR__ . '/../..' . '/rules/Php84/Rector/Param/ExplicitNullableParamTypeRector.php', + 'Rector\\Php85\\Rector\\ArrayDimFetch\\ArrayFirstLastRector' => __DIR__ . '/../..' . '/rules/Php85/Rector/ArrayDimFetch/ArrayFirstLastRector.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper' => __DIR__ . '/../..' . '/src/PhpAttribute/AnnotationToAttributeMapper.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper\\ArrayAnnotationToAttributeMapper' => __DIR__ . '/../..' . '/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php', 'Rector\\PhpAttribute\\AnnotationToAttributeMapper\\ArrayItemNodeAnnotationToAttributeMapper' => __DIR__ . '/../..' . '/src/PhpAttribute/AnnotationToAttributeMapper/ArrayItemNodeAnnotationToAttributeMapper.php', @@ -2249,8 +2359,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\PhpDocParser\\PhpDocParser\\PhpDocNodeVisitor\\CloningPhpDocNodeVisitor' => __DIR__ . '/../..' . '/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/CloningPhpDocNodeVisitor.php', 'Rector\\PhpDocParser\\PhpDocParser\\PhpDocNodeVisitor\\ParentConnectingPhpDocNodeVisitor' => __DIR__ . '/../..' . '/src/PhpDocParser/PhpDocParser/PhpDocNodeVisitor/ParentConnectingPhpDocNodeVisitor.php', 'Rector\\PhpDocParser\\PhpDocParser\\ValueObject\\PhpDocAttributeKey' => __DIR__ . '/../..' . '/src/PhpDocParser/PhpDocParser/ValueObject/PhpDocAttributeKey.php', - 'Rector\\PhpDocParser\\PhpParser\\SmartPhpParser' => __DIR__ . '/../..' . '/src/PhpDocParser/PhpParser/SmartPhpParser.php', - 'Rector\\PhpDocParser\\PhpParser\\SmartPhpParserFactory' => __DIR__ . '/../..' . '/src/PhpDocParser/PhpParser/SmartPhpParserFactory.php', 'Rector\\PhpDocParser\\ValueObject\\AttributeKey' => __DIR__ . '/../..' . '/src/PhpDocParser/ValueObject/AttributeKey.php', 'Rector\\PhpParser\\AstResolver' => __DIR__ . '/../..' . '/src/PhpParser/AstResolver.php', 'Rector\\PhpParser\\Comparing\\NodeComparator' => __DIR__ . '/../..' . '/src/PhpParser/Comparing/NodeComparator.php', @@ -2301,7 +2409,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\RectorInstaller\\Plugin' => __DIR__ . '/..' . '/rector/extension-installer/src/Plugin.php', 'Rector\\RectorInstaller\\PluginInstaller' => __DIR__ . '/..' . '/rector/extension-installer/src/PluginInstaller.php', 'Rector\\Rector\\AbstractRector' => __DIR__ . '/../..' . '/src/Rector/AbstractRector.php', - 'Rector\\Rector\\AbstractScopeAwareRector' => __DIR__ . '/../..' . '/src/Rector/AbstractScopeAwareRector.php', 'Rector\\Reflection\\ClassModifierChecker' => __DIR__ . '/../..' . '/src/Reflection/ClassModifierChecker.php', 'Rector\\Reflection\\ClassReflectionAnalyzer' => __DIR__ . '/../..' . '/src/Reflection/ClassReflectionAnalyzer.php', 'Rector\\Reflection\\MethodReflectionResolver' => __DIR__ . '/../..' . '/src/Reflection/MethodReflectionResolver.php', @@ -2344,7 +2451,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Reporting\\DeprecatedRulesReporter' => __DIR__ . '/../..' . '/src/Reporting/DeprecatedRulesReporter.php', 'Rector\\Reporting\\MissConfigurationReporter' => __DIR__ . '/../..' . '/src/Reporting/MissConfigurationReporter.php', 'Rector\\Set\\Contract\\SetInterface' => __DIR__ . '/../..' . '/src/Set/Contract/SetInterface.php', - 'Rector\\Set\\Contract\\SetListInterface' => __DIR__ . '/../..' . '/src/Set/Contract/SetListInterface.php', 'Rector\\Set\\Contract\\SetProviderInterface' => __DIR__ . '/../..' . '/src/Set/Contract/SetProviderInterface.php', 'Rector\\Set\\Enum\\SetGroup' => __DIR__ . '/../..' . '/src/Set/Enum/SetGroup.php', 'Rector\\Set\\SetManager' => __DIR__ . '/../..' . '/src/Set/SetManager.php', @@ -2386,6 +2492,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\StaticTypeMapper\\PhpParser\\NullableTypeNodeMapper' => __DIR__ . '/../..' . '/src/StaticTypeMapper/PhpParser/NullableTypeNodeMapper.php', 'Rector\\StaticTypeMapper\\PhpParser\\StringNodeMapper' => __DIR__ . '/../..' . '/src/StaticTypeMapper/PhpParser/StringNodeMapper.php', 'Rector\\StaticTypeMapper\\PhpParser\\UnionTypeNodeMapper' => __DIR__ . '/../..' . '/src/StaticTypeMapper/PhpParser/UnionTypeNodeMapper.php', + 'Rector\\StaticTypeMapper\\Resolver\\ClassNameFromObjectTypeResolver' => __DIR__ . '/../..' . '/src/StaticTypeMapper/Resolver/ClassNameFromObjectTypeResolver.php', 'Rector\\StaticTypeMapper\\StaticTypeMapper' => __DIR__ . '/../..' . '/src/StaticTypeMapper/StaticTypeMapper.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\AliasedObjectType' => __DIR__ . '/../..' . '/src/StaticTypeMapper/ValueObject/Type/AliasedObjectType.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\FullyQualifiedGenericObjectType' => __DIR__ . '/../..' . '/src/StaticTypeMapper/ValueObject/Type/FullyQualifiedGenericObjectType.php', @@ -2398,7 +2505,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\StaticTypeMapper\\ValueObject\\Type\\ShortenedGenericObjectType' => __DIR__ . '/../..' . '/src/StaticTypeMapper/ValueObject/Type/ShortenedGenericObjectType.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\ShortenedObjectType' => __DIR__ . '/../..' . '/src/StaticTypeMapper/ValueObject/Type/ShortenedObjectType.php', 'Rector\\StaticTypeMapper\\ValueObject\\Type\\SimpleStaticType' => __DIR__ . '/../..' . '/src/StaticTypeMapper/ValueObject/Type/SimpleStaticType.php', - 'Rector\\Strict\\NodeAnalyzer\\UnitializedPropertyAnalyzer' => __DIR__ . '/../..' . '/rules/Strict/NodeAnalyzer/UnitializedPropertyAnalyzer.php', + 'Rector\\Strict\\NodeAnalyzer\\UninitializedPropertyAnalyzer' => __DIR__ . '/../..' . '/rules/Strict/NodeAnalyzer/UninitializedPropertyAnalyzer.php', 'Rector\\Strict\\NodeFactory\\ExactCompareFactory' => __DIR__ . '/../..' . '/rules/Strict/NodeFactory/ExactCompareFactory.php', 'Rector\\Strict\\Rector\\AbstractFalsyScalarRuleFixerRector' => __DIR__ . '/../..' . '/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php', 'Rector\\Strict\\Rector\\BooleanNot\\BooleanInBooleanNotRuleFixerRector' => __DIR__ . '/../..' . '/rules/Strict/Rector/BooleanNot/BooleanInBooleanNotRuleFixerRector.php', @@ -2413,7 +2520,10 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\Bridge\\Symfony\\Routing\\SymfonyRoutesProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php', 'Rector\\Symfony\\BundleClassResolver' => __DIR__ . '/..' . '/rector/rector-symfony/src/BundleClassResolver.php', 'Rector\\Symfony\\CodeQuality\\Enum\\ResponseClass' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Enum/ResponseClass.php', + 'Rector\\Symfony\\CodeQuality\\NodeAnalyzer\\AttributePresenceDetector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/NodeAnalyzer/AttributePresenceDetector.php', 'Rector\\Symfony\\CodeQuality\\NodeFactory\\SymfonyClosureFactory' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\AttributeGroup\\SingleConditionSecurityAttributeToIsGrantedRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/AttributeGroup/SingleConditionSecurityAttributeToIsGrantedRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\BinaryOp\\RequestIsMainRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/RequestIsMainRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\BinaryOp\\ResponseStatusCodeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/ResponseStatusCodeRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\ActionSuffixRemoverRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\ParamTypeFromRouteRequiredRegexRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ParamTypeFromRouteRequiredRegexRector.php', @@ -2421,8 +2531,9 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\ResponseReturnTypeControllerActionRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ResponseReturnTypeControllerActionRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\ClassMethod\\TemplateAnnotationToThisRenderRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/TemplateAnnotationToThisRenderRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\EventListenerToEventSubscriberRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\InlineClassRoutePrefixRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\LoadValidatorMetadataToAnnotationRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php', - 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\MakeCommandLazyRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\SplitAndSecurityAttributeToIsGrantedRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/SplitAndSecurityAttributeToIsGrantedRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Closure\\StringExtensionToConfigBuilderRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\AssertSameResponseCodeWithDebugContentsRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\LiteralGetToRequestClassConstantRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php', @@ -2444,18 +2555,27 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceSetStringNameToClassNameRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSetStringNameToClassNameRector.php', 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceSettersToSettersAutodiscoveryRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSettersToSettersAutodiscoveryRector.php', 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceTagsToDefaultsAutoconfigureRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceTagsToDefaultsAutoconfigureRector.php', - 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServicesSetNameToSetTypeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php', 'Rector\\Symfony\\Configs\\ValueObject\\ServiceArguments' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/ValueObject/ServiceArguments.php', 'Rector\\Symfony\\Contract\\Bridge\\Symfony\\Routing\\SymfonyRoutesProviderInterface' => __DIR__ . '/..' . '/rector/rector-symfony/src/Contract/Bridge/Symfony/Routing/SymfonyRoutesProviderInterface.php', 'Rector\\Symfony\\Contract\\EventReferenceToMethodNameInterface' => __DIR__ . '/..' . '/rector/rector-symfony/src/Contract/EventReferenceToMethodNameInterface.php', 'Rector\\Symfony\\Contract\\Tag\\TagInterface' => __DIR__ . '/..' . '/rector/rector-symfony/src/Contract/Tag/TagInterface.php', 'Rector\\Symfony\\DataProvider\\ServiceMapProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/DataProvider/ServiceMapProvider.php', 'Rector\\Symfony\\DataProvider\\ServiceNameToTypeUniqueProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/DataProvider/ServiceNameToTypeUniqueProvider.php', + 'Rector\\Symfony\\DependencyInjection\\NodeDecorator\\CommandConstructorDecorator' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DependencyInjection/NodeDecorator/CommandConstructorDecorator.php', + 'Rector\\Symfony\\DependencyInjection\\NodeFactory\\AutowireClassMethodFactory' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DependencyInjection/NodeFactory/AutowireClassMethodFactory.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Class_\\CommandGetByTypeToConstructorInjectionRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/CommandGetByTypeToConstructorInjectionRector.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Class_\\ControllerGetByTypeToConstructorInjectionRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/ControllerGetByTypeToConstructorInjectionRector.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Class_\\GetBySymfonyStringToConstructorInjectionRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/GetBySymfonyStringToConstructorInjectionRector.php', + 'Rector\\Symfony\\DependencyInjection\\Rector\\Trait_\\TraitGetByTypeToInjectRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DependencyInjection/Rector/Trait_/TraitGetByTypeToInjectRector.php', + 'Rector\\Symfony\\DependencyInjection\\ThisGetTypeMatcher' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DependencyInjection/ThisGetTypeMatcher.php', 'Rector\\Symfony\\DowngradeSymfony70\\Rector\\Class_\\DowngradeSymfonyCommandAttributeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/DowngradeSymfony70/Rector/Class_/DowngradeSymfonyCommandAttributeRector.php', + 'Rector\\Symfony\\Enum\\CommandMethodName' => __DIR__ . '/..' . '/rector/rector-symfony/src/Enum/CommandMethodName.php', + 'Rector\\Symfony\\Enum\\FosAnnotation' => __DIR__ . '/..' . '/rector/rector-symfony/src/Enum/FosAnnotation.php', 'Rector\\Symfony\\Enum\\SensioAttribute' => __DIR__ . '/..' . '/rector/rector-symfony/src/Enum/SensioAttribute.php', 'Rector\\Symfony\\Enum\\SymfonyAnnotation' => __DIR__ . '/..' . '/rector/rector-symfony/src/Enum/SymfonyAnnotation.php', 'Rector\\Symfony\\Enum\\SymfonyAttribute' => __DIR__ . '/..' . '/rector/rector-symfony/src/Enum/SymfonyAttribute.php', 'Rector\\Symfony\\Enum\\SymfonyClass' => __DIR__ . '/..' . '/rector/rector-symfony/src/Enum/SymfonyClass.php', + 'Rector\\Symfony\\Enum\\TwigClass' => __DIR__ . '/..' . '/rector/rector-symfony/src/Enum/TwigClass.php', 'Rector\\Symfony\\Exception\\XmlContainerNotExistsException' => __DIR__ . '/..' . '/rector/rector-symfony/src/Exception/XmlContainerNotExistsException.php', 'Rector\\Symfony\\FormHelper\\FormTypeStringToTypeProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/FormHelper/FormTypeStringToTypeProvider.php', 'Rector\\Symfony\\Helper\\MessengerHelper' => __DIR__ . '/..' . '/rector/rector-symfony/src/Helper/MessengerHelper.php', @@ -2479,6 +2599,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\NodeAnalyzer\\SymfonyClosureExtensionMatcher' => __DIR__ . '/..' . '/rector/rector-symfony/src/NodeAnalyzer/SymfonyClosureExtensionMatcher.php', 'Rector\\Symfony\\NodeAnalyzer\\SymfonyPhpClosureDetector' => __DIR__ . '/..' . '/rector/rector-symfony/src/NodeAnalyzer/SymfonyPhpClosureDetector.php', 'Rector\\Symfony\\NodeAnalyzer\\SymfonyTestCaseAnalyzer' => __DIR__ . '/..' . '/rector/rector-symfony/src/NodeAnalyzer/SymfonyTestCaseAnalyzer.php', + 'Rector\\Symfony\\NodeFactory\\Annotations\\AnnotationOrAttributeValueResolver' => __DIR__ . '/..' . '/rector/rector-symfony/src/NodeFactory/Annotations/AnnotationOrAttributeValueResolver.php', 'Rector\\Symfony\\NodeFactory\\Annotations\\DoctrineAnnotationFromNewFactory' => __DIR__ . '/..' . '/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationFromNewFactory.php', 'Rector\\Symfony\\NodeFactory\\Annotations\\DoctrineAnnotationKeyToValuesResolver' => __DIR__ . '/..' . '/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationKeyToValuesResolver.php', 'Rector\\Symfony\\NodeFactory\\Annotations\\StringValueQuoteWrapper' => __DIR__ . '/..' . '/rector/rector-symfony/src/NodeFactory/Annotations/StringValueQuoteWrapper.php', @@ -2497,6 +2618,11 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\Set\\FOSRestSetList' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/FOSRestSetList.php', 'Rector\\Symfony\\Set\\JMSSetList' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/JMSSetList.php', 'Rector\\Symfony\\Set\\SensiolabsSetList' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SensiolabsSetList.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony3SetProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SetProvider/Symfony3SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony4SetProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SetProvider/Symfony4SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony5SetProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SetProvider/Symfony5SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony6SetProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SetProvider/Symfony6SetProvider.php', + 'Rector\\Symfony\\Set\\SetProvider\\Symfony7SetProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SetProvider/Symfony7SetProvider.php', 'Rector\\Symfony\\Set\\SetProvider\\SymfonySetProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SetProvider/SymfonySetProvider.php', 'Rector\\Symfony\\Set\\SetProvider\\TwigSetProvider' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SetProvider/TwigSetProvider.php', 'Rector\\Symfony\\Set\\SwiftMailerSetList' => __DIR__ . '/..' . '/rector/rector-symfony/src/Set/SwiftMailerSetList.php', @@ -2527,9 +2653,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\Symfony40\\Rector\\ConstFetch\\ConstraintUrlOptionRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony40/Rector/ConstFetch/ConstraintUrlOptionRector.php', 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\ContainerBuilderCompileEnvArgumentRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ContainerBuilderCompileEnvArgumentRector.php', 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\FormIsValidRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/FormIsValidRector.php', - 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\ProcessBuilderGetProcessRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ProcessBuilderGetProcessRector.php', 'Rector\\Symfony\\Symfony40\\Rector\\MethodCall\\VarDumperTestTraitMethodArgsRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/VarDumperTestTraitMethodArgsRector.php', - 'Rector\\Symfony\\Symfony40\\Rector\\StaticCall\\ProcessBuilderInstanceRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony40/Rector/StaticCall/ProcessBuilderInstanceRector.php', 'Rector\\Symfony\\Symfony42\\Rector\\MethodCall\\ContainerGetToConstructorInjectionRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony42/Rector/MethodCall/ContainerGetToConstructorInjectionRector.php', 'Rector\\Symfony\\Symfony42\\Rector\\New_\\RootNodeTreeBuilderRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony42/Rector/New_/RootNodeTreeBuilderRector.php', 'Rector\\Symfony\\Symfony42\\Rector\\New_\\StringToArrayArgumentProcessRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php', @@ -2539,7 +2663,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\MakeDispatchFirstArgumentEventRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/MakeDispatchFirstArgumentEventRector.php', 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\WebTestCaseAssertIsSuccessfulRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertIsSuccessfulRector.php', 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\WebTestCaseAssertResponseCodeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertResponseCodeRector.php', - 'Rector\\Symfony\\Symfony43\\Rector\\MethodCall\\WebTestCaseAssertSelectorTextContainsRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php', 'Rector\\Symfony\\Symfony43\\Rector\\StmtsAwareInterface\\TwigBundleFilesystemLoaderToTwigRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony43/Rector/StmtsAwareInterface/TwigBundleFilesystemLoaderToTwigRector.php', 'Rector\\Symfony\\Symfony44\\Rector\\ClassMethod\\ConsoleExecuteReturnIntRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony44/Rector/ClassMethod/ConsoleExecuteReturnIntRector.php', 'Rector\\Symfony\\Symfony44\\Rector\\MethodCall\\AuthorizationCheckerIsGrantedExtractorRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony44/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php', @@ -2554,7 +2677,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\Symfony52\\Rector\\New_\\PropertyAccessorCreationBooleanToFlagsRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyAccessorCreationBooleanToFlagsRector.php', 'Rector\\Symfony\\Symfony52\\Rector\\New_\\PropertyPathMapperToDataMapperRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyPathMapperToDataMapperRector.php', 'Rector\\Symfony\\Symfony52\\Rector\\StaticCall\\BinaryFileResponseCreateToNewInstanceRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony52/Rector/StaticCall/BinaryFileResponseCreateToNewInstanceRector.php', - 'Rector\\Symfony\\Symfony53\\Rector\\Class_\\CommandDescriptionToPropertyRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony53/Rector/Class_/CommandDescriptionToPropertyRector.php', 'Rector\\Symfony\\Symfony53\\Rector\\StaticPropertyFetch\\KernelTestCaseContainerPropertyDeprecationRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony53/Rector/StaticPropertyFetch/KernelTestCaseContainerPropertyDeprecationRector.php', 'Rector\\Symfony\\Symfony60\\Rector\\FuncCall\\ReplaceServiceArgumentRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony60/Rector/FuncCall/ReplaceServiceArgumentRector.php', 'Rector\\Symfony\\Symfony60\\Rector\\MethodCall\\GetHelperControllerToServiceRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony60/Rector/MethodCall/GetHelperControllerToServiceRector.php', @@ -2570,7 +2692,18 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Symfony\\Symfony62\\Rector\\MethodCall\\SimplifyFormRenderingRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony62/Rector/MethodCall/SimplifyFormRenderingRector.php', 'Rector\\Symfony\\Symfony63\\Rector\\Class_\\ParamAndEnvAttributeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php', 'Rector\\Symfony\\Symfony63\\Rector\\Class_\\SignalableCommandInterfaceReturnTypeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony63/Rector/Class_/SignalableCommandInterfaceReturnTypeRector.php', - 'Rector\\Symfony\\Symfony64\\Rector\\Class_\\ChangeRouteAttributeFromAnnotationSubnamespaceRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony64/Rector/Class_/ChangeRouteAttributeFromAnnotationSubnamespaceRector.php', + 'Rector\\Symfony\\Symfony72\\Rector\\StmtsAwareInterface\\PushRequestToRequestStackConstructorRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony72/Rector/StmtsAwareInterface/PushRequestToRequestStackConstructorRector.php', + 'Rector\\Symfony\\Symfony73\\GetMethodToAsTwigAttributeTransformer' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/GetMethodToAsTwigAttributeTransformer.php', + 'Rector\\Symfony\\Symfony73\\NodeAnalyzer\\CommandArgumentsAndOptionsResolver' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/CommandArgumentsAndOptionsResolver.php', + 'Rector\\Symfony\\Symfony73\\NodeAnalyzer\\LocalArrayMethodCallableMatcher' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/LocalArrayMethodCallableMatcher.php', + 'Rector\\Symfony\\Symfony73\\NodeFactory\\CommandInvokeParamsFactory' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php', + 'Rector\\Symfony\\Symfony73\\NodeRemover\\ReturnEmptyArrayMethodRemover' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/NodeRemover/ReturnEmptyArrayMethodRemover.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\CommandHelpToAttributeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/CommandHelpToAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\GetFiltersToAsTwigFilterAttributeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFiltersToAsTwigFilterAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\GetFunctionsToAsTwigFunctionAttributeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFunctionsToAsTwigFunctionAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\Rector\\Class_\\InvokableCommandInputAttributeRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector.php', + 'Rector\\Symfony\\Symfony73\\ValueObject\\CommandArgument' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/ValueObject/CommandArgument.php', + 'Rector\\Symfony\\Symfony73\\ValueObject\\CommandOption' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Symfony73/ValueObject/CommandOption.php', 'Rector\\Symfony\\Twig134\\Rector\\Return_\\SimpleFunctionAndFilterRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Twig134/Rector/Return_/SimpleFunctionAndFilterRector.php', 'Rector\\Symfony\\TypeAnalyzer\\ArrayUnionResponseTypeAnalyzer' => __DIR__ . '/..' . '/rector/rector-symfony/src/TypeAnalyzer/ArrayUnionResponseTypeAnalyzer.php', 'Rector\\Symfony\\TypeAnalyzer\\ContainerAwareAnalyzer' => __DIR__ . '/..' . '/rector/rector-symfony/src/TypeAnalyzer/ContainerAwareAnalyzer.php', @@ -2602,7 +2735,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\Testing\\Fixture\\FixtureTempFileDumper' => __DIR__ . '/../..' . '/src/Testing/Fixture/FixtureTempFileDumper.php', 'Rector\\Testing\\PHPUnit\\AbstractLazyTestCase' => __DIR__ . '/../..' . '/src/Testing/PHPUnit/AbstractLazyTestCase.php', 'Rector\\Testing\\PHPUnit\\AbstractRectorTestCase' => __DIR__ . '/../..' . '/src/Testing/PHPUnit/AbstractRectorTestCase.php', - 'Rector\\Testing\\PHPUnit\\AbstractTestCase' => __DIR__ . '/../..' . '/src/Testing/PHPUnit/AbstractTestCase.php', 'Rector\\Testing\\PHPUnit\\StaticPHPUnitEnvironment' => __DIR__ . '/../..' . '/src/Testing/PHPUnit/StaticPHPUnitEnvironment.php', 'Rector\\Testing\\PHPUnit\\ValueObject\\RectorTestResult' => __DIR__ . '/../..' . '/src/Testing/PHPUnit/ValueObject/RectorTestResult.php', 'Rector\\Testing\\TestingParser\\TestingParser' => __DIR__ . '/../..' . '/src/Testing/TestingParser/TestingParser.php', @@ -2736,6 +2868,9 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\TypeDeclaration\\Rector\\Closure\\ClosureReturnTypeRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/Closure/ClosureReturnTypeRector.php', 'Rector\\TypeDeclaration\\Rector\\Empty_\\EmptyOnNullableObjectToInstanceOfRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php', 'Rector\\TypeDeclaration\\Rector\\Expression\\InlineVarDocTagToAssertRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/Expression/InlineVarDocTagToAssertRector.php', + 'Rector\\TypeDeclaration\\Rector\\FuncCall\\AddArrowFunctionParamArrayWhereDimFetchRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FuncCall/AddArrowFunctionParamArrayWhereDimFetchRector.php', + 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeForArrayMapRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayMapRector.php', + 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeForArrayReduceRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeForArrayReduceRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromArgRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromArgRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromIterableMethodCallRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromIterableMethodCallRector.php', 'Rector\\TypeDeclaration\\Rector\\FunctionLike\\AddClosureParamTypeFromObjectRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/FunctionLike/AddClosureParamTypeFromObjectRector.php', @@ -2763,7 +2898,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\TypeDeclaration\\TypeInferer\\ReturnTypeInferer\\ReturnedNodesReturnTypeInfererTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInfererTypeInferer.php', 'Rector\\TypeDeclaration\\TypeInferer\\SilentVoidResolver' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php', 'Rector\\TypeDeclaration\\TypeInferer\\SplArrayFixedTypeNarrower' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/SplArrayFixedTypeNarrower.php', - 'Rector\\TypeDeclaration\\TypeNormalizer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeNormalizer.php', 'Rector\\TypeDeclaration\\ValueObject\\AddClosureParamTypeFromArg' => __DIR__ . '/../..' . '/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromArg.php', 'Rector\\TypeDeclaration\\ValueObject\\AddClosureParamTypeFromObject' => __DIR__ . '/../..' . '/rules/TypeDeclaration/ValueObject/AddClosureParamTypeFromObject.php', 'Rector\\TypeDeclaration\\ValueObject\\AddParamTypeDeclaration' => __DIR__ . '/../..' . '/rules/TypeDeclaration/ValueObject/AddParamTypeDeclaration.php', @@ -2772,7 +2906,6 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\TypeDeclaration\\ValueObject\\AddReturnTypeDeclaration' => __DIR__ . '/../..' . '/rules/TypeDeclaration/ValueObject/AddReturnTypeDeclaration.php', 'Rector\\TypeDeclaration\\ValueObject\\AssignToVariable' => __DIR__ . '/../..' . '/rules/TypeDeclaration/ValueObject/AssignToVariable.php', 'Rector\\TypeDeclaration\\ValueObject\\DataProviderNodes' => __DIR__ . '/../..' . '/rules/TypeDeclaration/ValueObject/DataProviderNodes.php', - 'Rector\\TypeDeclaration\\ValueObject\\NestedArrayType' => __DIR__ . '/../..' . '/rules/TypeDeclaration/ValueObject/NestedArrayType.php', 'Rector\\Util\\ArrayChecker' => __DIR__ . '/../..' . '/src/Util/ArrayChecker.php', 'Rector\\Util\\ArrayParametersMerger' => __DIR__ . '/../..' . '/src/Util/ArrayParametersMerger.php', 'Rector\\Util\\FileHasher' => __DIR__ . '/../..' . '/src/Util/FileHasher.php', @@ -2788,6 +2921,7 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 'Rector\\ValueObject\\Bootstrap\\BootstrapConfigs' => __DIR__ . '/../..' . '/src/ValueObject/Bootstrap/BootstrapConfigs.php', 'Rector\\ValueObject\\ClassMethodWillChangeReturnType' => __DIR__ . '/..' . '/rector/rector-downgrade-php/src/ValueObject/ClassMethodWillChangeReturnType.php', 'Rector\\ValueObject\\Configuration' => __DIR__ . '/../..' . '/src/ValueObject/Configuration.php', + 'Rector\\ValueObject\\Configuration\\LevelOverflow' => __DIR__ . '/../..' . '/src/ValueObject/Configuration/LevelOverflow.php', 'Rector\\ValueObject\\Error\\SystemError' => __DIR__ . '/../..' . '/src/ValueObject/Error/SystemError.php', 'Rector\\ValueObject\\FileProcessResult' => __DIR__ . '/../..' . '/src/ValueObject/FileProcessResult.php', 'Rector\\ValueObject\\FuncCallAndExpr' => __DIR__ . '/../..' . '/src/ValueObject/FuncCallAndExpr.php', @@ -2831,9 +2965,9 @@ class ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit4d4c37b878ce01a3ff505ba7def6aac7::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit78fb90a05527c4e1e3e0271783524c1e::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit78fb90a05527c4e1e3e0271783524c1e::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit78fb90a05527c4e1e3e0271783524c1e::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/rector/rector/vendor/composer/installed.json b/vendor/rector/rector/vendor/composer/installed.json index b11c03e7d..073f8b29c 100644 --- a/vendor/rector/rector/vendor/composer/installed.json +++ b/vendor/rector/rector/vendor/composer/installed.json @@ -28,7 +28,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Clue\\React\\NDJson\\": "src\/" + "RectorPrefix202506\\Clue\\React\\NDJson\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -69,17 +69,17 @@ }, { "name": "composer\/pcre", - "version": "3.3.1", - "version_normalized": "3.3.1.0", + "version": "3.3.2", + "version_normalized": "3.3.2.0", "source": { "type": "git", "url": "https:\/\/github.com\/composer\/pcre.git", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/composer\/pcre\/zipball\/63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "url": "https:\/\/api.github.com\/repos\/composer\/pcre\/zipball\/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { @@ -89,26 +89,26 @@ "phpstan\/phpstan": "<1.11.10" }, "require-dev": { - "phpstan\/phpstan": "^1.11.10", - "phpstan\/phpstan-strict-rules": "^1.1", + "phpstan\/phpstan": "^1.12 || ^2", + "phpstan\/phpstan-strict-rules": "^1 || ^2", "phpunit\/phpunit": "^8 || ^9" }, - "time": "2024-08-27T18:44:43+00:00", + "time": "2024-11-12T16:29:46+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - }, "phpstan": { "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-main": "3.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Composer\\Pcre\\": "src" + "RectorPrefix202506\\Composer\\Pcre\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -131,7 +131,7 @@ ], "support": { "issues": "https:\/\/github.com\/composer\/pcre\/issues", - "source": "https:\/\/github.com\/composer\/pcre\/tree\/3.3.1" + "source": "https:\/\/github.com\/composer\/pcre\/tree\/3.3.2" }, "funding": [ { @@ -181,7 +181,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Composer\\Semver\\": "src" + "RectorPrefix202506\\Composer\\Semver\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -263,7 +263,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Composer\\XdebugHandler\\": "src" + "RectorPrefix202506\\Composer\\XdebugHandler\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -333,7 +333,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" + "RectorPrefix202506\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -422,7 +422,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Evenement\\": "src\/" + "RectorPrefix202506\\Evenement\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -480,7 +480,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Fidry\\CpuCoreCounter\\": "src\/" + "RectorPrefix202506\\Fidry\\CpuCoreCounter\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -512,17 +512,17 @@ }, { "name": "illuminate\/container", - "version": "v11.30.0", - "version_normalized": "11.30.0.0", + "version": "v11.45.1", + "version_normalized": "11.45.1.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/container.git", - "reference": "06dfc614aff58384b28ba5ad191f6a02d6b192cb" + "reference": "79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/illuminate\/container\/zipball\/06dfc614aff58384b28ba5ad191f6a02d6b192cb", - "reference": "06dfc614aff58384b28ba5ad191f6a02d6b192cb", + "url": "https:\/\/api.github.com\/repos\/illuminate\/container\/zipball\/79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a", + "reference": "79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a", "shasum": "" }, "require": { @@ -533,7 +533,7 @@ "provide": { "psr\/container-implementation": "1.1|2.0" }, - "time": "2024-10-11T15:30:11+00:00", + "time": "2025-03-24T11:54:20+00:00", "type": "library", "extra": { "branch-alias": { @@ -546,7 +546,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Illuminate\\Container\\": "" + "RectorPrefix202506\\Illuminate\\Container\\": "" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -569,17 +569,17 @@ }, { "name": "illuminate\/contracts", - "version": "v11.30.0", - "version_normalized": "11.30.0.0", + "version": "v11.45.1", + "version_normalized": "11.45.1.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/contracts.git", - "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8" + "reference": "4b2a67d1663f50085bc91e6371492697a5d2d4e8" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/illuminate\/contracts\/zipball\/56312862af937bd6da8e6dc8bbd88188dfb478f8", - "reference": "56312862af937bd6da8e6dc8bbd88188dfb478f8", + "url": "https:\/\/api.github.com\/repos\/illuminate\/contracts\/zipball\/4b2a67d1663f50085bc91e6371492697a5d2d4e8", + "reference": "4b2a67d1663f50085bc91e6371492697a5d2d4e8", "shasum": "" }, "require": { @@ -587,7 +587,7 @@ "psr\/container": "^1.1.1|^2.0.1", "psr\/simple-cache": "^1.0|^2.0|^3.0" }, - "time": "2024-09-22T15:08:08+00:00", + "time": "2025-03-24T11:54:20+00:00", "type": "library", "extra": { "branch-alias": { @@ -597,7 +597,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Illuminate\\Contracts\\": "" + "RectorPrefix202506\\Illuminate\\Contracts\\": "" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -620,17 +620,17 @@ }, { "name": "nette\/utils", - "version": "v4.0.5", - "version_normalized": "4.0.5.0", + "version": "v4.0.7", + "version_normalized": "4.0.7.0", "source": { "type": "git", "url": "https:\/\/github.com\/nette\/utils.git", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/nette\/utils\/zipball\/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "url": "https:\/\/api.github.com\/repos\/nette\/utils\/zipball\/e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2", "shasum": "" }, "require": { @@ -654,7 +654,7 @@ "ext-mbstring": "to use Strings::lower() etc...", "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, - "time": "2024-08-07T15:39:19+00:00", + "time": "2025-06-03T04:55:08+00:00", "type": "library", "extra": { "branch-alias": { @@ -703,41 +703,43 @@ ], "support": { "issues": "https:\/\/github.com\/nette\/utils\/issues", - "source": "https:\/\/github.com\/nette\/utils\/tree\/v4.0.5" + "source": "https:\/\/github.com\/nette\/utils\/tree\/v4.0.7" }, "install-path": "..\/nette\/utils" }, { "name": "nikic\/php-parser", - "version": "v4.19.4", - "version_normalized": "4.19.4.0", + "version": "v5.5.0", + "version_normalized": "5.5.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/nikic\/PHP-Parser.git", - "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/nikic\/PHP-Parser\/zipball\/715f4d25e225bc47b293a8b997fe6ce99bf987d2", - "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "url": "https:\/\/api.github.com\/repos\/nikic\/PHP-Parser\/zipball\/ae59794362fe85e051a58ad36b289443f57be7a9", + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.4" }, "require-dev": { "ircmaxell\/php-yacc": "^0.0.7", - "phpunit\/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit\/phpunit": "^9.0" }, - "time": "2024-09-29T15:01:53+00:00", + "time": "2025-05-31T08:24:38+00:00", "bin": [ "bin\/php-parse" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" }, "patches_applied": [ "https:\/\/raw.githubusercontent.com\/rectorphp\/vendor-patches\/main\/patches\/nikic-php-parser-lib-phpparser-node-expr-closure-php.patch", @@ -780,7 +782,7 @@ ], "support": { "issues": "https:\/\/github.com\/nikic\/PHP-Parser\/issues", - "source": "https:\/\/github.com\/nikic\/PHP-Parser\/tree\/v4.19.4" + "source": "https:\/\/github.com\/nikic\/PHP-Parser\/tree\/v5.5.0" }, "install-path": "..\/nikic\/php-parser" }, @@ -816,7 +818,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\OndraM\\CiDetector\\": "src\/" + "RectorPrefix202506\\OndraM\\CiDetector\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -867,34 +869,34 @@ }, { "name": "phpstan\/phpdoc-parser", - "version": "1.33.0", - "version_normalized": "1.33.0.0", + "version": "2.1.0", + "version_normalized": "2.1.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/phpstan\/phpdoc-parser.git", - "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/82a311fd3690fb2bf7b64d5c98f912b3dd746140", - "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine\/annotations": "^2.0", - "nikic\/php-parser": "^4.15", + "nikic\/php-parser": "^5.3.0", "php-parallel-lint\/php-parallel-lint": "^1.2", "phpstan\/extension-installer": "^1.0", - "phpstan\/phpstan": "^1.5", - "phpstan\/phpstan-phpunit": "^1.1", - "phpstan\/phpstan-strict-rules": "^1.0", - "phpunit\/phpunit": "^9.5", + "phpstan\/phpstan": "^2.0", + "phpstan\/phpstan-phpunit": "^2.0", + "phpstan\/phpstan-strict-rules": "^2.0", + "phpunit\/phpunit": "^9.6", "symfony\/process": "^5.2" }, - "time": "2024-10-13T11:25:22+00:00", + "time": "2025-02-19T13:28:12+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -911,7 +913,7 @@ "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.33.0" + "source": "https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/2.1.0" }, "install-path": "..\/phpstan\/phpdoc-parser" }, @@ -943,7 +945,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Psr\\Container\\": "src\/" + "RectorPrefix202506\\Psr\\Container\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -999,7 +1001,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Psr\\Log\\": "src" + "RectorPrefix202506\\Psr\\Log\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1052,7 +1054,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Psr\\SimpleCache\\": "src\/" + "RectorPrefix202506\\Psr\\SimpleCache\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1105,7 +1107,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\React\\Cache\\": "src\/" + "RectorPrefix202506\\React\\Cache\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1155,36 +1157,36 @@ }, { "name": "react\/child-process", - "version": "v0.6.5", - "version_normalized": "0.6.5.0", + "version": "v0.6.6", + "version_normalized": "0.6.6.0", "source": { "type": "git", "url": "https:\/\/github.com\/reactphp\/child-process.git", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/reactphp\/child-process\/zipball\/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "url": "https:\/\/api.github.com\/repos\/reactphp\/child-process\/zipball\/1721e2b93d89b745664353b9cfc8f155ba8a6159", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", "shasum": "" }, "require": { "evenement\/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", "react\/event-loop": "^1.2", - "react\/stream": "^1.2" + "react\/stream": "^1.4" }, "require-dev": { - "phpunit\/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react\/socket": "^1.8", + "phpunit\/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react\/socket": "^1.16", "sebastian\/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" }, - "time": "2022-09-16T13:41:56+00:00", + "time": "2025-01-01T16:37:48+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\React\\ChildProcess\\": "src" + "RectorPrefix202506\\React\\ChildProcess\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1221,16 +1223,12 @@ ], "support": { "issues": "https:\/\/github.com\/reactphp\/child-process\/issues", - "source": "https:\/\/github.com\/reactphp\/child-process\/tree\/v0.6.5" + "source": "https:\/\/github.com\/reactphp\/child-process\/tree\/v0.6.6" }, "funding": [ { - "url": "https:\/\/github.com\/WyriHaximus", - "type": "github" - }, - { - "url": "https:\/\/github.com\/clue", - "type": "github" + "url": "https:\/\/opencollective.com\/reactphp", + "type": "open_collective" } ], "install-path": "..\/react\/child-process" @@ -1266,7 +1264,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\React\\Dns\\": "src\/" + "RectorPrefix202506\\React\\Dns\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1343,7 +1341,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\React\\EventLoop\\": "src\/" + "RectorPrefix202506\\React\\EventLoop\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1419,7 +1417,7 @@ "src\/functions_include.php" ], "psr-4": { - "RectorPrefix202411\\React\\Promise\\": "src\/" + "RectorPrefix202506\\React\\Promise\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1499,7 +1497,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\React\\Socket\\": "src\/" + "RectorPrefix202506\\React\\Socket\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1577,7 +1575,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\React\\Stream\\": "src\/" + "RectorPrefix202506\\React\\Stream\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -1689,37 +1687,35 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git", - "reference": "e75008c293679e0bb0637bf09cf6dd43ff34526a" + "reference": "cea5e6617d0296b59b904bf95f950700ea12c36f" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/e75008c293679e0bb0637bf09cf6dd43ff34526a", - "reference": "e75008c293679e0bb0637bf09cf6dd43ff34526a", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/cea5e6617d0296b59b904bf95f950700ea12c36f", + "reference": "cea5e6617d0296b59b904bf95f950700ea12c36f", "shasum": "" }, "require": { "php": ">=8.2", - "symfony\/yaml": "^7.1" + "symfony\/yaml": "^7.2" }, "require-dev": { - "doctrine\/doctrine-bundle": "^2.12", - "doctrine\/orm": "^2.19", + "doctrine\/doctrine-bundle": "^2.14", + "doctrine\/orm": "^2.20", + "phpecs\/phpecs": "^2.1", "phpstan\/extension-installer": "^1.4", - "phpstan\/phpstan": "^1.11", - "phpstan\/phpstan-deprecation-rules": "^1.2", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "phpunit\/phpunit": "^10.5", + "phpstan\/phpstan": "^2.1.14", + "phpstan\/phpstan-deprecation-rules": "^2.0", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.5", "rector\/rector-src": "dev-main", - "rector\/type-perfect": "^0.2", - "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/phpstan-rules": "^13.0", + "rector\/type-perfect": "^2.1", + "symplify\/phpstan-rules": "^14.6.9", "symplify\/vendor-patches": "^11.3", - "tomasvotruba\/class-leak": "^0.2.15", - "tomasvotruba\/unused-public": "^0.4", + "tomasvotruba\/class-leak": "^2.0", "tracy\/tracy": "^2.10" }, - "time": "2024-09-18T08:20:56+00:00", + "time": "2025-06-11T10:41:42+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1752,12 +1748,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-downgrade-php.git", - "reference": "d9cef571617b93e642b3ac45981b7092e1a2e89a" + "reference": "1454a52955bec8fe173d05b1d682844683cd811f" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-downgrade-php\/zipball\/d9cef571617b93e642b3ac45981b7092e1a2e89a", - "reference": "d9cef571617b93e642b3ac45981b7092e1a2e89a", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-downgrade-php\/zipball\/1454a52955bec8fe173d05b1d682844683cd811f", + "reference": "1454a52955bec8fe173d05b1d682844683cd811f", "shasum": "" }, "require": { @@ -1765,20 +1761,17 @@ }, "require-dev": { "phpstan\/extension-installer": "^1.3", - "phpstan\/phpstan": "^1.10", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "phpunit\/phpunit": "^10.5", + "phpstan\/phpstan": "^2.1.8", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.4", "rector\/rector-src": "dev-main", - "rector\/type-perfect": "^0.1.8", "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/phpstan-rules": "^13.0", "symplify\/rule-doc-generator": "^12.2", "symplify\/vendor-patches": "^11.3", - "tomasvotruba\/class-leak": "^0.2.13", + "tomasvotruba\/class-leak": "^1.0", "tracy\/tracy": "^2.10" }, - "time": "2024-09-26T16:45:00+00:00", + "time": "2025-05-31T06:44:59+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1811,43 +1804,40 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-phpunit.git", - "reference": "38bdce4187f0466d89d37383cf7376489e25ea2d" + "reference": "3bc079d2b3488716eaac7f63052d793734d5d1f3" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/38bdce4187f0466d89d37383cf7376489e25ea2d", - "reference": "38bdce4187f0466d89d37383cf7376489e25ea2d", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/3bc079d2b3488716eaac7f63052d793734d5d1f3", + "reference": "3bc079d2b3488716eaac7f63052d793734d5d1f3", "shasum": "" }, "require": { "php": ">=8.2" }, "conflict": { - "rector\/rector": "<0.11" + "rector\/rector": "<2.0" }, "require-dev": { + "phpecs\/phpecs": "^2.1.1", "phpstan\/extension-installer": "^1.4", - "phpstan\/phpstan": "^1.12", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "phpunit\/phpunit": "^10.5", + "phpstan\/phpstan": "^2.1.8", + "phpstan\/phpstan-deprecation-rules": "^2.0", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.5", "rector\/rector-src": "dev-main", "rector\/swiss-knife": "^1.0", - "rector\/type-perfect": "^1.0", - "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/phpstan-rules": "^13.0", - "symplify\/vendor-patches": "^11.3", - "tomasvotruba\/class-leak": "^1.0", + "rector\/type-perfect": "^2.0", + "symplify\/phpstan-extensions": "^12.0", + "symplify\/vendor-patches": "^11.4", + "tomasvotruba\/class-leak": "^1.2", "tracy\/tracy": "^2.10" }, - "time": "2024-11-08T08:46:53+00:00", + "time": "2025-05-29T16:41:28+00:00", "default-branch": true, "type": "rector-extension", "extra": { - "enable-patching": true, - "branch-alias": { - "dev-main": "0.11-dev" - } + "enable-patching": true }, "installation-source": "dist", "autoload": { @@ -1876,12 +1866,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-symfony.git", - "reference": "799b454b63c240edc962c8fafea2c5a2a61e5393" + "reference": "1a199fc1af9885bb647b160a5be218f69f4e6338" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/799b454b63c240edc962c8fafea2c5a2a61e5393", - "reference": "799b454b63c240edc962c8fafea2c5a2a61e5393", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/1a199fc1af9885bb647b160a5be218f69f4e6338", + "reference": "1a199fc1af9885bb647b160a5be218f69f4e6338", "shasum": "" }, "require": { @@ -1889,28 +1879,28 @@ "php": ">=8.2" }, "require-dev": { + "phpecs\/phpecs": "^2.0.1", "phpstan\/extension-installer": "^1.4", - "phpstan\/phpstan": "^1.11", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "phpunit\/phpunit": "^10.5", + "phpstan\/phpstan": "^2.1.8", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.4", "rector\/rector-src": "dev-main", - "rector\/type-perfect": "^0.1.8", + "rector\/type-perfect": "^2.0", "symfony\/config": "^6.4", "symfony\/dependency-injection": "^6.4", - "symfony\/http-kernel": "~6.3", + "symfony\/http-kernel": "^6.4", "symfony\/routing": "^6.4", "symfony\/security-core": "^6.4", "symfony\/security-http": "^6.4", "symfony\/validator": "^6.4", - "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/phpstan-rules": "^13.0", + "symplify\/phpstan-rules": "^14.6", "symplify\/vendor-patches": "^11.3", - "tomasvotruba\/class-leak": "^0.2", - "tomasvotruba\/unused-public": "^0.4", + "tomasvotruba\/class-leak": "^2.0", + "tomasvotruba\/type-coverage": "^2.0", + "tomasvotruba\/unused-public": "^2.0", "tracy\/tracy": "^2.10" }, - "time": "2024-10-28T21:03:13+00:00", + "time": "2025-06-07T19:24:53+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1938,31 +1928,31 @@ }, { "name": "sebastian\/diff", - "version": "5.1.1", - "version_normalized": "5.1.1.0", + "version": "6.0.2", + "version_normalized": "6.0.2.0", "source": { "type": "git", "url": "https:\/\/github.com\/sebastianbergmann\/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/sebastianbergmann\/diff\/zipball\/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https:\/\/api.github.com\/repos\/sebastianbergmann\/diff\/zipball\/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit\/phpunit": "^10.0", - "symfony\/process": "^6.4" + "phpunit\/phpunit": "^11.0", + "symfony\/process": "^4.2 || ^5" }, - "time": "2024-03-02T07:15:17+00:00", + "time": "2024-07-03T04:53:05+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "installation-source": "dist", @@ -1996,7 +1986,7 @@ "support": { "issues": "https:\/\/github.com\/sebastianbergmann\/diff\/issues", "security": "https:\/\/github.com\/sebastianbergmann\/diff\/security\/policy", - "source": "https:\/\/github.com\/sebastianbergmann\/diff\/tree\/5.1.1" + "source": "https:\/\/github.com\/sebastianbergmann\/diff\/tree\/6.0.2" }, "funding": [ { @@ -2008,17 +1998,17 @@ }, { "name": "symfony\/console", - "version": "v6.4.14", - "version_normalized": "6.4.14.0", + "version": "v6.4.22", + "version_normalized": "6.4.22.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/console.git", - "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b" + "reference": "7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/897c2441ed4eec8a8a2c37b943427d24dba3f26b", - "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b", + "url": "https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3", + "reference": "7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3", "shasum": "" }, "require": { @@ -2051,7 +2041,7 @@ "symfony\/stopwatch": "^5.4|^6.0|^7.0", "symfony\/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2024-11-05T15:34:40+00:00", + "time": "2025-05-07T07:05:04+00:00", "type": "library", "extra": { "patches_applied": [ @@ -2061,7 +2051,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Console\\": "" + "RectorPrefix202506\\Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2090,7 +2080,7 @@ "terminal" ], "support": { - "source": "https:\/\/github.com\/symfony\/console\/tree\/v6.4.14" + "source": "https:\/\/github.com\/symfony\/console\/tree\/v6.4.22" }, "funding": [ { @@ -2110,31 +2100,31 @@ }, { "name": "symfony\/deprecation-contracts", - "version": "v3.5.0", - "version_normalized": "3.5.0.0", + "version": "v3.6.0", + "version_normalized": "3.6.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/deprecation-contracts\/zipball\/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https:\/\/api.github.com\/repos\/symfony\/deprecation-contracts\/zipball\/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { "php": ">=8.1" }, - "time": "2024-04-18T09:32:20+00:00", + "time": "2024-09-25T14:21:43+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, "thanks": { - "name": "symfony\/contracts", - "url": "https:\/\/github.com\/symfony\/contracts" + "url": "https:\/\/github.com\/symfony\/contracts", + "name": "symfony\/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "installation-source": "dist", @@ -2160,7 +2150,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/deprecation-contracts\/tree\/v3.5.0" + "source": "https:\/\/github.com\/symfony\/deprecation-contracts\/tree\/v3.6.0" }, "funding": [ { @@ -2206,7 +2196,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Filesystem\\": "" + "RectorPrefix202506\\Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2249,17 +2239,17 @@ }, { "name": "symfony\/finder", - "version": "v6.4.13", - "version_normalized": "6.4.13.0", + "version": "v6.4.17", + "version_normalized": "6.4.17.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/finder.git", - "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/finder\/zipball\/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", - "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "url": "https:\/\/api.github.com\/repos\/symfony\/finder\/zipball\/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", "shasum": "" }, "require": { @@ -2268,12 +2258,12 @@ "require-dev": { "symfony\/filesystem": "^6.0|^7.0" }, - "time": "2024-10-01T08:30:56+00:00", + "time": "2024-12-29T13:51:37+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Finder\\": "" + "RectorPrefix202506\\Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2296,7 +2286,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/finder\/tree\/v6.4.13" + "source": "https:\/\/github.com\/symfony\/finder\/tree\/v6.4.17" }, "funding": [ { @@ -2316,20 +2306,21 @@ }, { "name": "symfony\/polyfill-mbstring", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", + "version": "v1.32.0", + "version_normalized": "1.32.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -2338,12 +2329,12 @@ "suggest": { "ext-mbstring": "For best performance" }, - "time": "2024-09-09T11:45:10+00:00", + "time": "2024-12-23T08:48:59+00:00", "type": "library", "extra": { "thanks": { - "name": "symfony\/polyfill", - "url": "https:\/\/github.com\/symfony\/polyfill" + "url": "https:\/\/github.com\/symfony\/polyfill", + "name": "symfony\/polyfill" } }, "installation-source": "dist", @@ -2379,7 +2370,7 @@ "shim" ], "support": { - "source": "https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.31.0" + "source": "https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.32.0" }, "funding": [ { @@ -2399,28 +2390,28 @@ }, { "name": "symfony\/process", - "version": "v6.4.14", - "version_normalized": "6.4.14.0", + "version": "v6.4.20", + "version_normalized": "6.4.20.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/process.git", - "reference": "25214adbb0996d18112548de20c281be9f27279f" + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/25214adbb0996d18112548de20c281be9f27279f", - "reference": "25214adbb0996d18112548de20c281be9f27279f", + "url": "https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/e2a61c16af36c9a07e5c9906498b73e091949a20", + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20", "shasum": "" }, "require": { "php": ">=8.1" }, - "time": "2024-11-06T09:25:01+00:00", + "time": "2025-03-10T17:11:00+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Process\\": "" + "RectorPrefix202506\\Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2443,7 +2434,7 @@ "description": "Executes commands in sub-processes", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/process\/tree\/v6.4.14" + "source": "https:\/\/github.com\/symfony\/process\/tree\/v6.4.20" }, "funding": [ { @@ -2463,17 +2454,17 @@ }, { "name": "symfony\/service-contracts", - "version": "v3.5.0", - "version_normalized": "3.5.0.0", + "version": "v3.6.0", + "version_normalized": "3.6.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/service-contracts\/zipball\/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https:\/\/api.github.com\/repos\/symfony\/service-contracts\/zipball\/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { @@ -2484,21 +2475,21 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "time": "2024-04-18T09:32:20+00:00", + "time": "2025-04-25T09:37:31+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, "thanks": { - "name": "symfony\/contracts", - "url": "https:\/\/github.com\/symfony\/contracts" + "url": "https:\/\/github.com\/symfony\/contracts", + "name": "symfony\/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Contracts\\Service\\": "" + "RectorPrefix202506\\Symfony\\Contracts\\Service\\": "" }, "exclude-from-classmap": [ "\/Test\/" @@ -2529,7 +2520,7 @@ "standards" ], "support": { - "source": "https:\/\/github.com\/symfony\/service-contracts\/tree\/v3.5.0" + "source": "https:\/\/github.com\/symfony\/service-contracts\/tree\/v3.6.0" }, "funding": [ { @@ -2549,21 +2540,22 @@ }, { "name": "symfony\/yaml", - "version": "v7.1.6", - "version_normalized": "7.1.6.0", + "version": "v7.3.0", + "version_normalized": "7.3.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/symfony\/yaml.git", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" + "reference": "cea40a48279d58dc3efee8112634cb90141156c2" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "url": "https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/cea40a48279d58dc3efee8112634cb90141156c2", + "reference": "cea40a48279d58dc3efee8112634cb90141156c2", "shasum": "" }, "require": { "php": ">=8.2", + "symfony\/deprecation-contracts": "^2.5|^3.0", "symfony\/polyfill-ctype": "^1.8" }, "conflict": { @@ -2572,7 +2564,7 @@ "require-dev": { "symfony\/console": "^6.4|^7.0" }, - "time": "2024-09-25T14:20:29+00:00", + "time": "2025-04-04T10:10:33+00:00", "bin": [ "Resources\/bin\/yaml-lint" ], @@ -2580,7 +2572,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Yaml\\": "" + "RectorPrefix202506\\Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "\/Tests\/" @@ -2603,7 +2595,7 @@ "description": "Loads and dumps YAML files", "homepage": "https:\/\/symfony.com", "support": { - "source": "https:\/\/github.com\/symfony\/yaml\/tree\/v7.1.6" + "source": "https:\/\/github.com\/symfony\/yaml\/tree\/v7.3.0" }, "funding": [ { @@ -2657,7 +2649,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Symplify\\EasyParallel\\": "src" + "RectorPrefix202506\\Symplify\\EasyParallel\\": "src" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", @@ -2779,7 +2771,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "RectorPrefix202411\\Webmozart\\Assert\\": "src\/" + "RectorPrefix202506\\Webmozart\\Assert\\": "src\/" } }, "notification-url": "https:\/\/packagist.org\/downloads\/", diff --git a/vendor/rector/rector/vendor/composer/installed.php b/vendor/rector/rector/vendor/composer/installed.php index 6db00cf39..5bc1f28ab 100644 --- a/vendor/rector/rector/vendor/composer/installed.php +++ b/vendor/rector/rector/vendor/composer/installed.php @@ -1,5 +1,5 @@ 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.3.1', 'version' => '3.3.1.0', 'reference' => '63aaeac21d7e775ff9bc9d45021e1745c97521c4', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.4.3', 'version' => '3.4.3.0', 'reference' => '4313d26ada5e0c4edfbd1dc481a92ff7bff91f12', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.5', 'version' => '3.0.5.0', 'reference' => '6c1925561632e83d60a44492e0b344cf48ab85ef', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/inflector' => array('pretty_version' => '2.0.10', 'version' => '2.0.10.0', 'reference' => '5817d0659c5b50c9b950feb9af7b9668e2c436bc', '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' => '1.2.0', 'version' => '1.2.0.0', 'reference' => '8520451a140d3f46ac33042715115e290cf5785f', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/container' => array('pretty_version' => 'v11.30.0', 'version' => '11.30.0.0', 'reference' => '06dfc614aff58384b28ba5ad191f6a02d6b192cb', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v11.30.0', 'version' => '11.30.0.0', 'reference' => '56312862af937bd6da8e6dc8bbd88188dfb478f8', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'dev_requirement' => \false), 'nette/utils' => array('pretty_version' => 'v4.0.5', 'version' => '4.0.5.0', 'reference' => '736c567e257dbe0fcf6ce81b4d6dbe05c6899f96', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => \false), 'nikic/php-parser' => array('pretty_version' => 'v4.19.4', 'version' => '4.19.4.0', 'reference' => '715f4d25e225bc47b293a8b997fe6ce99bf987d2', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \false), 'ondram/ci-detector' => array('pretty_version' => '4.2.0', 'version' => '4.2.0.0', 'reference' => '8b0223b5ed235fd377c75fdd1bfcad05c0f168b8', 'type' => 'library', 'install_path' => __DIR__ . '/../ondram/ci-detector', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '1.33.0', 'version' => '1.33.0.0', 'reference' => '82a311fd3690fb2bf7b64d5c98f912b3dd746140', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('dev_requirement' => \false, 'replaced' => array(0 => '1.12.8')), '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.2', 'version' => '3.0.2.0', 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', '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.13.0', 'version' => '1.13.0.0', 'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5', 'type' => 'library', 'install_path' => __DIR__ . '/../react/dns', 'aliases' => array(), 'dev_requirement' => \false), 'react/event-loop' => array('pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', 'reference' => 'bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354', 'type' => 'library', 'install_path' => __DIR__ . '/../react/event-loop', 'aliases' => array(), 'dev_requirement' => \false), 'react/promise' => array('pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => '8a164643313c71354582dc850b42b33fa12a4b63', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => \false), 'react/socket' => array('pretty_version' => 'v1.16.0', 'version' => '1.16.0.0', 'reference' => '23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1', 'type' => 'library', 'install_path' => __DIR__ . '/../react/socket', 'aliases' => array(), 'dev_requirement' => \false), 'react/stream' => array('pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d', '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' => 'e75008c293679e0bb0637bf09cf6dd43ff34526a', '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' => 'd9cef571617b93e642b3ac45981b7092e1a2e89a', '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' => '38bdce4187f0466d89d37383cf7376489e25ea2d', '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' => '799b454b63c240edc962c8fafea2c5a2a61e5393', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-symfony', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'sebastian/diff' => array('pretty_version' => '5.1.1', 'version' => '5.1.1.0', 'reference' => 'c41e007b4b62af48218231d6c2275e4c9b975b2e', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.4.14', 'version' => '6.4.14.0', 'reference' => '897c2441ed4eec8a8a2c37b943427d24dba3f26b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/filesystem' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => '4856c9cf585d5a0313d8d35afd681a526f038dd3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/finder' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => 'daea9eca0b08d0ed1dc9ab702a46128fd1be4958', '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.31.0', 'version' => '1.31.0.0', 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v6.4.14', 'version' => '6.4.14.0', 'reference' => '25214adbb0996d18112548de20c281be9f27279f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => 'bd1d9e59a81d8fa4acdcea3f617c581f7475a80f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/yaml' => array('pretty_version' => 'v7.1.6', 'version' => '7.1.6.0', 'reference' => '3ced3f29e4f0d6bce2170ff26719f1fe9aacc671', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/easy-parallel' => array('pretty_version' => '11.2.2', 'version' => '11.2.2.0', 'reference' => '8586c18bb8efb31cd192a4e5cc94ae7813f72ed9', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/easy-parallel', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator-contracts' => array('pretty_version' => '11.2.0', 'version' => '11.2.0.0', 'reference' => '479cfcfd46047f80624aba931d9789e50475b5c6', '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.3.2', 'version' => '3.3.2.0', 'reference' => 'b2bed4734f0cc156ee1fe9c0da2550420d99a21e', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.4.3', 'version' => '3.4.3.0', 'reference' => '4313d26ada5e0c4edfbd1dc481a92ff7bff91f12', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.5', 'version' => '3.0.5.0', 'reference' => '6c1925561632e83d60a44492e0b344cf48ab85ef', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/inflector' => array('pretty_version' => '2.0.10', 'version' => '2.0.10.0', 'reference' => '5817d0659c5b50c9b950feb9af7b9668e2c436bc', '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' => '1.2.0', 'version' => '1.2.0.0', 'reference' => '8520451a140d3f46ac33042715115e290cf5785f', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/container' => array('pretty_version' => 'v11.45.1', 'version' => '11.45.1.0', 'reference' => '79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v11.45.1', 'version' => '11.45.1.0', 'reference' => '4b2a67d1663f50085bc91e6371492697a5d2d4e8', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'dev_requirement' => \false), 'nette/utils' => array('pretty_version' => 'v4.0.7', 'version' => '4.0.7.0', 'reference' => 'e67c4061eb40b9c113b218214e42cb5a0dda28f2', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => \false), 'nikic/php-parser' => array('pretty_version' => 'v5.5.0', 'version' => '5.5.0.0', 'reference' => 'ae59794362fe85e051a58ad36b289443f57be7a9', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \false), 'ondram/ci-detector' => array('pretty_version' => '4.2.0', 'version' => '4.2.0.0', 'reference' => '8b0223b5ed235fd377c75fdd1bfcad05c0f168b8', 'type' => 'library', 'install_path' => __DIR__ . '/../ondram/ci-detector', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '2.1.0', 'version' => '2.1.0.0', 'reference' => '9b30d6fd026b2c132b3985ce6b23bec09ab3aa68', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('dev_requirement' => \false, 'replaced' => array(0 => '2.1.17')), '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.2', 'version' => '3.0.2.0', 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', '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.6', 'version' => '0.6.6.0', 'reference' => '1721e2b93d89b745664353b9cfc8f155ba8a6159', 'type' => 'library', 'install_path' => __DIR__ . '/../react/child-process', 'aliases' => array(), 'dev_requirement' => \false), 'react/dns' => array('pretty_version' => 'v1.13.0', 'version' => '1.13.0.0', 'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5', 'type' => 'library', 'install_path' => __DIR__ . '/../react/dns', 'aliases' => array(), 'dev_requirement' => \false), 'react/event-loop' => array('pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', 'reference' => 'bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354', 'type' => 'library', 'install_path' => __DIR__ . '/../react/event-loop', 'aliases' => array(), 'dev_requirement' => \false), 'react/promise' => array('pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => '8a164643313c71354582dc850b42b33fa12a4b63', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => \false), 'react/socket' => array('pretty_version' => 'v1.16.0', 'version' => '1.16.0.0', 'reference' => '23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1', 'type' => 'library', 'install_path' => __DIR__ . '/../react/socket', 'aliases' => array(), 'dev_requirement' => \false), 'react/stream' => array('pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d', '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' => 'cea5e6617d0296b59b904bf95f950700ea12c36f', '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' => '1454a52955bec8fe173d05b1d682844683cd811f', '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' => '3bc079d2b3488716eaac7f63052d793734d5d1f3', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-phpunit', 'aliases' => array(0 => '9999999-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' => '1a199fc1af9885bb647b160a5be218f69f4e6338', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-symfony', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'sebastian/diff' => array('pretty_version' => '6.0.2', 'version' => '6.0.2.0', 'reference' => 'b4ccd857127db5d41a5b676f24b51371d76d8544', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', 'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/filesystem' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => '4856c9cf585d5a0313d8d35afd681a526f038dd3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/finder' => array('pretty_version' => 'v6.4.17', 'version' => '6.4.17.0', 'reference' => '1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7', '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.32.0', 'version' => '1.32.0.0', 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v6.4.20', 'version' => '6.4.20.0', 'reference' => 'e2a61c16af36c9a07e5c9906498b73e091949a20', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', 'reference' => 'f021b05a130d35510bd6b25fe9053c2a8a15d5d4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/yaml' => array('pretty_version' => 'v7.3.0', 'version' => '7.3.0.0', 'reference' => 'cea40a48279d58dc3efee8112634cb90141156c2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/easy-parallel' => array('pretty_version' => '11.2.2', 'version' => '11.2.2.0', 'reference' => '8586c18bb8efb31cd192a4e5cc94ae7813f72ed9', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/easy-parallel', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator-contracts' => array('pretty_version' => '11.2.0', 'version' => '11.2.0.0', 'reference' => '479cfcfd46047f80624aba931d9789e50475b5c6', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/rule-doc-generator-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false))); diff --git a/vendor/rector/rector/vendor/composer/pcre/composer.json b/vendor/rector/rector/vendor/composer/pcre/composer.json index f770a0b6a..fdaa28c88 100644 --- a/vendor/rector/rector/vendor/composer/pcre/composer.json +++ b/vendor/rector/rector/vendor/composer/pcre/composer.json @@ -21,20 +21,20 @@ }, "require-dev": { "phpunit\/phpunit": "^8 || ^9", - "phpstan\/phpstan": "^1.11.10", - "phpstan\/phpstan-strict-rules": "^1.1" + "phpstan\/phpstan": "^1.12 || ^2", + "phpstan\/phpstan-strict-rules": "^1 || ^2" }, "conflict": { "phpstan\/phpstan": "<1.11.10" }, "autoload": { "psr-4": { - "RectorPrefix202411\\Composer\\Pcre\\": "src" + "RectorPrefix202506\\Composer\\Pcre\\": "src" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\Composer\\Pcre\\": "tests" + "RectorPrefix202506\\Composer\\Pcre\\": "tests" } }, "extra": { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php index 7fbb97270..af6d3519b 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; final class MatchAllResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php index 7edaf97b3..b801f157b 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllStrictGroupsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; final class MatchAllStrictGroupsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php index b6b8c31a8..54cd1181b 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchAllWithOffsetsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; final class MatchAllWithOffsetsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php index 9ed8b2f7b..50963141f 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; final class MatchResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php index 793415a4f..ef28a6e4b 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchStrictGroupsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; final class MatchStrictGroupsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php b/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php index c9c75d7b7..30beacdf5 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/MatchWithOffsetsResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; final class MatchWithOffsetsResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php b/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php index 99647af82..b8fda2e00 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php @@ -1,13 +1,13 @@ negate(); } - return $this->typeSpecifier->create($matchesArg->value, $matchedType, $context, $overwrite, $scope, $node); + // @phpstan-ignore function.alreadyNarrowedType + if (\method_exists('PHPStan\\Analyser\\SpecifiedTypes', 'setRootExpr')) { + $typeSpecifier = $this->typeSpecifier->create($matchesArg->value, $matchedType, $context, $scope)->setRootExpr($node); + return $overwrite ? $typeSpecifier->setAlwaysOverwriteTypes() : $typeSpecifier; + } + // @phpstan-ignore arguments.count + return $this->typeSpecifier->create( + $matchesArg->value, + $matchedType, + $context, + // @phpstan-ignore argument.type + $overwrite, + $scope, + $node + ); } } diff --git a/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php b/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php index a6eb13f13..c30325ad1 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php @@ -1,10 +1,10 @@ $val) { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/Preg.php b/vendor/rector/rector/vendor/composer/pcre/src/Preg.php index 83c707ea1..e449062be 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/Preg.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/Preg.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; class Preg { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/Regex.php b/vendor/rector/rector/vendor/composer/pcre/src/Regex.php index 1cfbf306e..29ae2c0ca 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/Regex.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/Regex.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; class Regex { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/ReplaceResult.php b/vendor/rector/rector/vendor/composer/pcre/src/ReplaceResult.php index 206798a70..915ab2758 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/ReplaceResult.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/ReplaceResult.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; final class ReplaceResult { diff --git a/vendor/rector/rector/vendor/composer/pcre/src/UnexpectedNullMatchException.php b/vendor/rector/rector/vendor/composer/pcre/src/UnexpectedNullMatchException.php index 5db46f289..ff7dbe04c 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/UnexpectedNullMatchException.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/UnexpectedNullMatchException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Pcre; +namespace RectorPrefix202506\Composer\Pcre; class UnexpectedNullMatchException extends PcreException { diff --git a/vendor/rector/rector/vendor/composer/semver/composer.json b/vendor/rector/rector/vendor/composer/semver/composer.json index 3d511dab4..0dea83d4a 100644 --- a/vendor/rector/rector/vendor/composer/semver/composer.json +++ b/vendor/rector/rector/vendor/composer/semver/composer.json @@ -39,12 +39,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Composer\\Semver\\": "src" + "RectorPrefix202506\\Composer\\Semver\\": "src" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\Composer\\Semver\\": "tests" + "RectorPrefix202506\\Composer\\Semver\\": "tests" } }, "extra": { diff --git a/vendor/rector/rector/vendor/composer/semver/src/Comparator.php b/vendor/rector/rector/vendor/composer/semver/src/Comparator.php index 83fd0c6b4..5062a28a5 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Comparator.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Comparator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver; +namespace RectorPrefix202506\Composer\Semver; -use RectorPrefix202411\Composer\Semver\Constraint\Constraint; +use RectorPrefix202506\Composer\Semver\Constraint\Constraint; class Comparator { /** diff --git a/vendor/rector/rector/vendor/composer/semver/src/CompilingMatcher.php b/vendor/rector/rector/vendor/composer/semver/src/CompilingMatcher.php index a025c7038..1a6b9f1b5 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/CompilingMatcher.php +++ b/vendor/rector/rector/vendor/composer/semver/src/CompilingMatcher.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver; +namespace RectorPrefix202506\Composer\Semver; -use RectorPrefix202411\Composer\Semver\Constraint\Constraint; -use RectorPrefix202411\Composer\Semver\Constraint\ConstraintInterface; +use RectorPrefix202506\Composer\Semver\Constraint\Constraint; +use RectorPrefix202506\Composer\Semver\Constraint\ConstraintInterface; /** * Helper class to evaluate constraint by compiling and reusing the code to evaluate */ diff --git a/vendor/rector/rector/vendor/composer/semver/src/Constraint/Bound.php b/vendor/rector/rector/vendor/composer/semver/src/Constraint/Bound.php index dfd8ef2b1..c56f12477 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Constraint/Bound.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Constraint/Bound.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver\Constraint; +namespace RectorPrefix202506\Composer\Semver\Constraint; class Bound { diff --git a/vendor/rector/rector/vendor/composer/semver/src/Constraint/Constraint.php b/vendor/rector/rector/vendor/composer/semver/src/Constraint/Constraint.php index f52c48503..5ed7401d1 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Constraint/Constraint.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Constraint/Constraint.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver\Constraint; +namespace RectorPrefix202506\Composer\Semver\Constraint; /** * Defines a constraint. diff --git a/vendor/rector/rector/vendor/composer/semver/src/Constraint/ConstraintInterface.php b/vendor/rector/rector/vendor/composer/semver/src/Constraint/ConstraintInterface.php index a54b5ad42..5e57928b4 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Constraint/ConstraintInterface.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Constraint/ConstraintInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver\Constraint; +namespace RectorPrefix202506\Composer\Semver\Constraint; /** * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint diff --git a/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchAllConstraint.php b/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchAllConstraint.php index e8a392992..93647aed5 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchAllConstraint.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchAllConstraint.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver\Constraint; +namespace RectorPrefix202506\Composer\Semver\Constraint; /** * Defines the absence of a constraint. diff --git a/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php b/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php index 94511c9b0..eb5eee534 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Constraint/MatchNoneConstraint.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver\Constraint; +namespace RectorPrefix202506\Composer\Semver\Constraint; /** * Blackhole of constraints, nothing escapes it diff --git a/vendor/rector/rector/vendor/composer/semver/src/Constraint/MultiConstraint.php b/vendor/rector/rector/vendor/composer/semver/src/Constraint/MultiConstraint.php index 3d694f8fc..63a6770c1 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Constraint/MultiConstraint.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Constraint/MultiConstraint.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver\Constraint; +namespace RectorPrefix202506\Composer\Semver\Constraint; /** * Defines a conjunctive or disjunctive set of constraints. diff --git a/vendor/rector/rector/vendor/composer/semver/src/Interval.php b/vendor/rector/rector/vendor/composer/semver/src/Interval.php index 78f3bcd55..1a1025643 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Interval.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Interval.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver; +namespace RectorPrefix202506\Composer\Semver; -use RectorPrefix202411\Composer\Semver\Constraint\Constraint; +use RectorPrefix202506\Composer\Semver\Constraint\Constraint; class Interval { /** @var Constraint */ diff --git a/vendor/rector/rector/vendor/composer/semver/src/Intervals.php b/vendor/rector/rector/vendor/composer/semver/src/Intervals.php index a1a4139dc..a53b54dfb 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Intervals.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Intervals.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver; +namespace RectorPrefix202506\Composer\Semver; -use RectorPrefix202411\Composer\Semver\Constraint\Constraint; -use RectorPrefix202411\Composer\Semver\Constraint\ConstraintInterface; -use RectorPrefix202411\Composer\Semver\Constraint\MatchAllConstraint; -use RectorPrefix202411\Composer\Semver\Constraint\MatchNoneConstraint; -use RectorPrefix202411\Composer\Semver\Constraint\MultiConstraint; +use RectorPrefix202506\Composer\Semver\Constraint\Constraint; +use RectorPrefix202506\Composer\Semver\Constraint\ConstraintInterface; +use RectorPrefix202506\Composer\Semver\Constraint\MatchAllConstraint; +use RectorPrefix202506\Composer\Semver\Constraint\MatchNoneConstraint; +use RectorPrefix202506\Composer\Semver\Constraint\MultiConstraint; /** * Helper class generating intervals from constraints * diff --git a/vendor/rector/rector/vendor/composer/semver/src/Semver.php b/vendor/rector/rector/vendor/composer/semver/src/Semver.php index fbcd19754..dd3843679 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/Semver.php +++ b/vendor/rector/rector/vendor/composer/semver/src/Semver.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver; +namespace RectorPrefix202506\Composer\Semver; -use RectorPrefix202411\Composer\Semver\Constraint\Constraint; +use RectorPrefix202506\Composer\Semver\Constraint\Constraint; class Semver { const SORT_ASC = 1; diff --git a/vendor/rector/rector/vendor/composer/semver/src/VersionParser.php b/vendor/rector/rector/vendor/composer/semver/src/VersionParser.php index 105e8a91f..a4beb6348 100644 --- a/vendor/rector/rector/vendor/composer/semver/src/VersionParser.php +++ b/vendor/rector/rector/vendor/composer/semver/src/VersionParser.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\Semver; +namespace RectorPrefix202506\Composer\Semver; -use RectorPrefix202411\Composer\Semver\Constraint\ConstraintInterface; -use RectorPrefix202411\Composer\Semver\Constraint\MatchAllConstraint; -use RectorPrefix202411\Composer\Semver\Constraint\MultiConstraint; -use RectorPrefix202411\Composer\Semver\Constraint\Constraint; +use RectorPrefix202506\Composer\Semver\Constraint\ConstraintInterface; +use RectorPrefix202506\Composer\Semver\Constraint\MatchAllConstraint; +use RectorPrefix202506\Composer\Semver\Constraint\MultiConstraint; +use RectorPrefix202506\Composer\Semver\Constraint\Constraint; /** * Version parser. * diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/composer.json b/vendor/rector/rector/vendor/composer/xdebug-handler/composer.json index 3405edde3..1999dcfe1 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/composer.json +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/composer.json @@ -29,12 +29,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Composer\\XdebugHandler\\": "src" + "RectorPrefix202506\\Composer\\XdebugHandler\\": "src" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\Composer\\XdebugHandler\\Tests\\": "tests" + "RectorPrefix202506\\Composer\\XdebugHandler\\Tests\\": "tests" } }, "scripts": { diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/PhpConfig.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/PhpConfig.php index b69072b6e..8b28b873b 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/PhpConfig.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/PhpConfig.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ -namespace RectorPrefix202411\Composer\XdebugHandler; +namespace RectorPrefix202506\Composer\XdebugHandler; /** * @author John Stevenson diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php index ceb9daf51..ffad08637 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Process.php @@ -9,9 +9,9 @@ * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); -namespace RectorPrefix202411\Composer\XdebugHandler; +namespace RectorPrefix202506\Composer\XdebugHandler; -use RectorPrefix202411\Composer\Pcre\Preg; +use RectorPrefix202506\Composer\Pcre\Preg; /** * Process utility functions * diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php index e35df9159..4f6935be0 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/Status.php @@ -9,10 +9,10 @@ * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); -namespace RectorPrefix202411\Composer\XdebugHandler; +namespace RectorPrefix202506\Composer\XdebugHandler; -use RectorPrefix202411\Psr\Log\LoggerInterface; -use RectorPrefix202411\Psr\Log\LogLevel; +use RectorPrefix202506\Psr\Log\LoggerInterface; +use RectorPrefix202506\Psr\Log\LogLevel; /** * @author John Stevenson * @internal diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php index cb200c8c0..c4ec58d38 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php @@ -9,10 +9,10 @@ * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); -namespace RectorPrefix202411\Composer\XdebugHandler; +namespace RectorPrefix202506\Composer\XdebugHandler; -use RectorPrefix202411\Composer\Pcre\Preg; -use RectorPrefix202411\Psr\Log\LoggerInterface; +use RectorPrefix202506\Composer\Pcre\Preg; +use RectorPrefix202506\Psr\Log\LoggerInterface; /** * @author John Stevenson * @@ -239,7 +239,7 @@ private function doRestart(array $command) : void } $this->tryEnableSignals(); $this->notify(Status::RESTARTING, $displayCmd); - $process = \proc_open(\is_array($cmd) ? \implode(' ', \array_map('escapeshellarg', $cmd)) : $cmd, [], $pipes); + $process = \proc_open($cmd, [], $pipes); if (\is_resource($process)) { $exitCode = \proc_close($process); } diff --git a/vendor/rector/rector/vendor/doctrine/inflector/composer.json b/vendor/rector/rector/vendor/doctrine/inflector/composer.json index 2c0f21044..425cff2fd 100644 --- a/vendor/rector/rector/vendor/doctrine/inflector/composer.json +++ b/vendor/rector/rector/vendor/doctrine/inflector/composer.json @@ -51,12 +51,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" + "RectorPrefix202506\\Doctrine\\Inflector\\": "lib\/Doctrine\/Inflector" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\Doctrine\\Tests\\Inflector\\": "tests\/Doctrine\/Tests\/Inflector" + "RectorPrefix202506\\Doctrine\\Tests\\Inflector\\": "tests\/Doctrine\/Tests\/Inflector" } }, "config": { diff --git a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php index f3d80a6fd..10ac3837b 100644 --- a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php +++ b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php @@ -1,7 +1,7 @@ ' ', '/([A-Z]+)([A-Z][a-z])/' => 'RectorPrefix202411\\1_\\2', '/([a-z\\d])([A-Z])/' => 'RectorPrefix202411\\1_\\2', '/[^A-Z^a-z^0-9^\\/]+/' => '-']; + $replacements = ['/\\W/' => ' ', '/([A-Z]+)([A-Z][a-z])/' => '\\1_\\2', '/([a-z\\d])([A-Z])/' => '\\1_\\2', '/[^A-Z^a-z^0-9^\\/]+/' => '-']; $urlized = $lowered; foreach ($replacements as $pattern => $replacement) { $replaced = preg_replace($pattern, $replacement, $urlized); diff --git a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php index c930a46a0..01d01d3aa 100644 --- a/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php +++ b/vendor/rector/rector/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php @@ -1,14 +1,14 @@ make('auth')->guard($attribute->guard)->user(); + return \call_user_func($container->make('auth')->userResolver(), $attribute->guard); } } diff --git a/vendor/rector/rector/vendor/illuminate/container/Attributes/Cache.php b/vendor/rector/rector/vendor/illuminate/container/Attributes/Cache.php index c8c224a8b..45494d8cb 100644 --- a/vendor/rector/rector/vendor/illuminate/container/Attributes/Cache.php +++ b/vendor/rector/rector/vendor/illuminate/container/Attributes/Cache.php @@ -1,17 +1,14 @@ tag = $tag; diff --git a/vendor/rector/rector/vendor/illuminate/container/BoundMethod.php b/vendor/rector/rector/vendor/illuminate/container/BoundMethod.php index 70c05894c..9ea5fe0e4 100644 --- a/vendor/rector/rector/vendor/illuminate/container/BoundMethod.php +++ b/vendor/rector/rector/vendor/illuminate/container/BoundMethod.php @@ -1,9 +1,9 @@ getClosure($abstract, $concrete); } - $this->bindings[$abstract] = \compact('concrete', 'shared'); + $this->bindings[$abstract] = ['concrete' => $concrete, 'shared' => $shared]; // If the abstract type was already resolved in this container we'll fire the // rebound listener so that any objects which have already gotten resolved // can have their copy of the object updated via the listener callbacks. @@ -424,9 +424,11 @@ public function extend($abstract, Closure $closure) /** * Register an existing instance as shared in the container. * + * @template TInstance of mixed + * * @param string $abstract - * @param mixed $instance - * @return mixed + * @param TInstance $instance + * @return TInstance */ public function instance($abstract, $instance) { @@ -550,8 +552,11 @@ public function refresh($abstract, $target, $method) */ protected function rebound($abstract) { + if (!($callbacks = $this->getReboundCallbacks($abstract))) { + return; + } $instance = $this->make($abstract); - foreach ($this->getReboundCallbacks($abstract) as $callback) { + foreach ($callbacks as $callback) { $callback($this, $instance); } } @@ -574,9 +579,7 @@ protected function getReboundCallbacks($abstract) */ public function wrap(Closure $callback, array $parameters = []) { - return function () use($callback, $parameters) { - return $this->call($callback, $parameters); - }; + return fn() => $this->call($callback, $parameters); } /** * Call the given Closure / class@method and inject its dependencies. @@ -617,21 +620,23 @@ protected function getClassForCallable($callback) /** * Get a closure to resolve the given type from the container. * - * @param string $abstract - * @return \Closure + * @template TClass of object + * + * @param string|class-string $abstract + * @return ($abstract is class-string ? \Closure(): TClass : \Closure(): mixed) */ public function factory($abstract) { - return function () use($abstract) { - return $this->make($abstract); - }; + return fn() => $this->make($abstract); } /** * An alias function name for make(). * - * @param string|callable $abstract + * @template TClass of object + * + * @param string|class-string|callable $abstract * @param array $parameters - * @return mixed + * @return ($abstract is class-string ? TClass : mixed) * * @throws \Illuminate\Contracts\Container\BindingResolutionException */ @@ -642,9 +647,11 @@ public function makeWith($abstract, array $parameters = []) /** * Resolve the given type from the container. * - * @param string $abstract + * @template TClass of object + * + * @param string|class-string $abstract * @param array $parameters - * @return mixed + * @return ($abstract is class-string ? TClass : mixed) * * @throws \Illuminate\Contracts\Container\BindingResolutionException */ @@ -655,7 +662,10 @@ public function make($abstract, array $parameters = []) /** * {@inheritdoc} * - * @return mixed + * @template TClass of object + * + * @param string|class-string $id + * @return ($id is class-string ? TClass : mixed) */ public function get(string $id) { @@ -671,10 +681,12 @@ public function get(string $id) /** * Resolve the given type from the container. * - * @param string|callable $abstract + * @template TClass of object + * + * @param string|class-string|callable $abstract * @param array $parameters * @param bool $raiseEvents - * @return mixed + * @return ($abstract is class-string ? TClass : mixed) * * @throws \Illuminate\Contracts\Container\BindingResolutionException * @throws \Illuminate\Contracts\Container\CircularDependencyException @@ -722,7 +734,9 @@ protected function resolve($abstract, $parameters = [], $raiseEvents = \true) // Before returning, we will also set the resolved flag to "true" and pop off // the parameter overrides for this build. After those two things are done // we will be ready to return back the fully constructed class instance. - $this->resolved[$abstract] = \true; + if (!$needsContextualBuild) { + $this->resolved[$abstract] = \true; + } \array_pop($this->with); return $object; } @@ -789,8 +803,10 @@ protected function isBuildable($concrete, $abstract) /** * Instantiate a concrete instance of the given type. * - * @param \Closure|string $concrete - * @return mixed + * @template TClass of object + * + * @param \Closure(static, array): TClass|class-string $concrete + * @return TClass * * @throws \Illuminate\Contracts\Container\BindingResolutionException * @throws \Illuminate\Contracts\Container\CircularDependencyException @@ -869,7 +885,7 @@ protected function resolveDependencies(array $dependencies) // If the class is null, it means the dependency is a string or some other // primitive type which we can not resolve since it is not a class and // we will just bomb out with an error since we have no-where to go. - $result = $result ?? (\is_null(Util::getParameterClassName($dependency)) ? $this->resolvePrimitive($dependency) : $this->resolveClass($dependency)); + $result ??= \is_null(Util::getParameterClassName($dependency)) ? $this->resolvePrimitive($dependency) : $this->resolveClass($dependency); $this->fireAfterResolvingAttributeCallbacks(\method_exists($dependency, 'getAttributes') ? $dependency->getAttributes() : [], $result); if ($dependency->isVariadic()) { $results = \array_merge($results, $result); @@ -969,9 +985,7 @@ protected function resolveVariadicClass(ReflectionParameter $parameter) if (!\is_array($concrete = $this->getContextualConcrete($abstract))) { return $this->make($className); } - return \array_map(function ($abstract) { - return $this->resolve($abstract); - }, $concrete); + return \array_map(fn($abstract) => $this->resolve($abstract), $concrete); } /** * Resolve a dependency based on an attribute. @@ -1295,7 +1309,7 @@ public function flush() */ public static function getInstance() { - return static::$instance = static::$instance ?? new static(); + return static::$instance ??= new static(); } /** * Set the shared instance of the container. @@ -1337,9 +1351,7 @@ public function offsetGet($key) */ public function offsetSet($key, $value) : void { - $this->bind($key, $value instanceof Closure ? $value : function () use($value) { - return $value; - }); + $this->bind($key, $value instanceof Closure ? $value : fn() => $value); } /** * Unset the value at a given offset. diff --git a/vendor/rector/rector/vendor/illuminate/container/ContextualBindingBuilder.php b/vendor/rector/rector/vendor/illuminate/container/ContextualBindingBuilder.php index 08ff86ae6..2f423cc45 100644 --- a/vendor/rector/rector/vendor/illuminate/container/ContextualBindingBuilder.php +++ b/vendor/rector/rector/vendor/illuminate/container/ContextualBindingBuilder.php @@ -1,9 +1,9 @@ give(function ($container) use($key, $default) { - return $container->get('config')->get($key, $default); - }); + $this->give(fn($container) => $container->get('config')->get($key, $default)); } } diff --git a/vendor/rector/rector/vendor/illuminate/container/EntryNotFoundException.php b/vendor/rector/rector/vendor/illuminate/container/EntryNotFoundException.php index 2a06f9676..f987e3a72 100644 --- a/vendor/rector/rector/vendor/illuminate/container/EntryNotFoundException.php +++ b/vendor/rector/rector/vendor/illuminate/container/EntryNotFoundException.php @@ -1,9 +1,9 @@ $id + * @return ($id is class-string ? TClass : mixed) + */ + public function get(string $id); /** * Determine if the given abstract type has been bound. * @@ -109,9 +118,11 @@ public function extend($abstract, Closure $closure); /** * Register an existing instance as shared in the container. * + * @template TInstance of mixed + * * @param string $abstract - * @param mixed $instance - * @return mixed + * @param TInstance $instance + * @return TInstance */ public function instance($abstract, $instance); /** @@ -133,8 +144,10 @@ public function when($concrete); /** * Get a closure to resolve the given type from the container. * - * @param string $abstract - * @return \Closure + * @template TClass of object + * + * @param string|class-string $abstract + * @return ($abstract is class-string ? \Closure(): TClass : \Closure(): mixed) */ public function factory($abstract); /** @@ -146,9 +159,11 @@ public function flush(); /** * Resolve the given type from the container. * - * @param string $abstract + * @template TClass of object + * + * @param string|class-string $abstract * @param array $parameters - * @return mixed + * @return ($abstract is class-string ? TClass : mixed) * * @throws \Illuminate\Contracts\Container\BindingResolutionException */ diff --git a/vendor/rector/rector/vendor/illuminate/contracts/Container/ContextualAttribute.php b/vendor/rector/rector/vendor/illuminate/contracts/Container/ContextualAttribute.php index abc7abf2d..ddb258ed1 100644 --- a/vendor/rector/rector/vendor/illuminate/contracts/Container/ContextualAttribute.php +++ b/vendor/rector/rector/vendor/illuminate/contracts/Container/ContextualAttribute.php @@ -1,6 +1,6 @@ */ public $class; /** @@ -33,13 +33,13 @@ class ModelIdentifier /** * The class name of the model collection. * - * @var string|null + * @var class-string<\Illuminate\Database\Eloquent\Collection>|null */ public $collectionClass; /** * Create a new model identifier. * - * @param string $class + * @param class-string<\Illuminate\Database\Eloquent\Model> $class * @param mixed $id * @param array $relations * @param mixed $connection @@ -55,7 +55,7 @@ public function __construct($class, $id, array $relations, $connection) /** * Specify the collection class that should be used when serializing / restoring collections. * - * @param string|null $collectionClass + * @param class-string<\Illuminate\Database\Eloquent\Collection> $collectionClass * @return $this */ public function useCollectionClass(?string $collectionClass) diff --git a/vendor/rector/rector/vendor/illuminate/contracts/Database/Query/Builder.php b/vendor/rector/rector/vendor/illuminate/contracts/Database/Query/Builder.php index 5e771991e..9f86ee786 100644 --- a/vendor/rector/rector/vendor/illuminate/contracts/Database/Query/Builder.php +++ b/vendor/rector/rector/vendor/illuminate/contracts/Database/Query/Builder.php @@ -1,6 +1,6 @@ */ public function items(); /** diff --git a/vendor/rector/rector/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php b/vendor/rector/rector/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php index 581792207..6f9f96b71 100644 --- a/vendor/rector/rector/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php +++ b/vendor/rector/rector/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php @@ -1,7 +1,14 @@ + */ interface LengthAwarePaginator extends Paginator { /** diff --git a/vendor/rector/rector/vendor/illuminate/contracts/Pagination/Paginator.php b/vendor/rector/rector/vendor/illuminate/contracts/Pagination/Paginator.php index 91a87d3c6..bf72cebaa 100644 --- a/vendor/rector/rector/vendor/illuminate/contracts/Pagination/Paginator.php +++ b/vendor/rector/rector/vendor/illuminate/contracts/Pagination/Paginator.php @@ -1,7 +1,12 @@ */ public function items(); /** diff --git a/vendor/rector/rector/vendor/illuminate/contracts/Pipeline/Hub.php b/vendor/rector/rector/vendor/illuminate/contracts/Pipeline/Hub.php index 4e35369da..fc9b09dff 100644 --- a/vendor/rector/rector/vendor/illuminate/contracts/Pipeline/Hub.php +++ b/vendor/rector/rector/vendor/illuminate/contracts/Pipeline/Hub.php @@ -1,6 +1,6 @@ $array diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Arrays.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Arrays.php index c6f489ae7..311e1c742 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Arrays.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Arrays.php @@ -5,10 +5,10 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\JetBrains\PhpStorm\Language; -use RectorPrefix202411\Nette; +use RectorPrefix202506\JetBrains\PhpStorm\Language; +use RectorPrefix202506\Nette; use function is_array, is_int, is_object, count; /** * Array tools library. @@ -138,8 +138,7 @@ public static function last(array $array, ?callable $predicate = null, ?callable public static function firstKey(array $array, ?callable $predicate = null) { if (!$predicate) { - \reset($array); - return \key($array); + return \array_key_first($array); } foreach ($array as $k => $v) { if ($predicate($v, $k, $array)) { @@ -158,8 +157,7 @@ public static function firstKey(array $array, ?callable $predicate = null) */ public static function lastKey(array $array, ?callable $predicate = null) { - \end($array); - return $predicate ? self::firstKey(\array_reverse($array, \true), $predicate) : \key($array); + return $predicate ? self::firstKey(\array_reverse($array, \true), $predicate) : \array_key_last($array); } /** * Inserts the contents of the $inserted array into the $array immediately after the $key. diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Callback.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Callback.php index 681a811be..d2d9e32cd 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Callback.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Callback.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; use function is_array, is_object, is_string; /** * PHP callable tools. diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/DateTime.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/DateTime.php index 66f866263..6ca158882 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/DateTime.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/DateTime.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * DateTime. */ @@ -60,20 +60,79 @@ public static function fromParts(int $year, int $month, int $day, int $hour = 0, return new static($s); } /** - * Returns new DateTime object formatted according to the specified format. + * Returns a new DateTime object formatted according to the specified format. * @param string|\DateTimeZone|null $timezone * @return static|false */ - public static function createFromFormat(string $format, string $time, $timezone = null) + public static function createFromFormat(string $format, string $datetime, $timezone = null) { if ($timezone === null) { $timezone = new \DateTimeZone(\date_default_timezone_get()); } elseif (\is_string($timezone)) { $timezone = new \DateTimeZone($timezone); } - $date = parent::createFromFormat($format, $time, $timezone); + $date = parent::createFromFormat($format, $datetime, $timezone); return $date ? static::from($date) : \false; } + public function __construct(string $datetime = 'now', ?\DateTimeZone $timezone = null) + { + $this->apply($datetime, $timezone, \true); + } + /** + * @return static + */ + public function modify(string $modifier) + { + $this->apply($modifier); + return $this; + } + /** + * @return static + */ + public function setDate(int $year, int $month, int $day) + { + if (!\checkdate($month, $day, $year)) { + \trigger_error(\sprintf(self::class . ': The date %04d-%02d-%02d is not valid.', $year, $month, $day), \E_USER_WARNING); + } + return parent::setDate($year, $month, $day); + } + /** + * @return static + */ + public function setTime(int $hour, int $minute, int $second = 0, int $microsecond = 0) + { + if ($hour < 0 || $hour > 23 || $minute < 0 || $minute > 59 || $second < 0 || $second >= 60 || $microsecond < 0 || $microsecond >= 1000000) { + \trigger_error(\sprintf(self::class . ': The time %02d:%02d:%08.5F is not valid.', $hour, $minute, $second + $microsecond / 1000000), \E_USER_WARNING); + } + return parent::setTime($hour, $minute, $second, $microsecond); + } + /** + * Converts a relative time string (e.g. '10 minut') to seconds. + */ + public static function relativeToSeconds(string $relativeTime) : int + { + return (new \DateTimeImmutable('1970-01-01 ' . $relativeTime, new \DateTimeZone('UTC')))->getTimestamp(); + } + private function apply(string $datetime, $timezone = null, bool $ctr = \false) : void + { + $relPart = ''; + $absPart = \preg_replace_callback('/[+-]?\\s*\\d+\\s+((microsecond|millisecond|[mµu]sec)s?|[mµ]s|sec(ond)?s?|min(ute)?s?|hours?)\\b/iu', function ($m) use(&$relPart) { + $relPart .= $m[0] . ' '; + return ''; + }, $datetime); + if ($ctr) { + parent::__construct($absPart, $timezone); + $this->handleErrors($datetime); + } elseif (\trim($absPart)) { + parent::modify($absPart) && $this->handleErrors($datetime); + } + if ($relPart) { + $timezone ??= $this->getTimezone(); + $this->setTimezone(new \DateTimeZone('UTC')); + parent::modify($relPart) && $this->handleErrors($datetime); + $this->setTimezone($timezone); + } + } /** * Returns JSON representation in ISO 8601 (used by JavaScript). */ @@ -97,4 +156,12 @@ public function modifyClone(string $modify = '') $dolly = clone $this; return $modify ? $dolly->modify($modify) : $dolly; } + private function handleErrors(string $value) : void + { + $errors = self::getLastErrors(); + $errors = \array_merge($errors['errors'] ?? [], $errors['warnings'] ?? []); + if ($errors) { + \trigger_error(self::class . ': ' . \implode(', ', $errors) . " '{$value}'", \E_USER_WARNING); + } + } } diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/FileInfo.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/FileInfo.php index 4194f745e..d3a587abc 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/FileInfo.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/FileInfo.php @@ -5,19 +5,16 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Represents the file or directory returned by the Finder. * @internal do not create instances directly */ final class FileInfo extends \SplFileInfo { - /** - * @var string - */ - private $relativePath; + private string $relativePath; public function __construct(string $file, string $relativePath = '') { parent::__construct($file); diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/FileSystem.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/FileSystem.php index 2ed0bcd03..86d3d9764 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/FileSystem.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/FileSystem.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * File system tool. */ @@ -221,6 +221,20 @@ public static function joinPaths(string ...$paths) : string { return self::normalizePath(\implode('/', $paths)); } + /** + * Resolves a path against a base path. If the path is absolute, returns it directly, if it's relative, joins it with the base path. + */ + public static function resolvePath(string $basePath, string $path) : string + { + switch (\true) { + case self::isAbsolute($path): + return self::platformSlashes($path); + case $path === '': + return self::platformSlashes($basePath); + default: + return self::joinPaths($basePath, $path); + } + } /** * Converts backslashes to slashes. */ diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Finder.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Finder.php index 0294aef1c..84de2da2f 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Finder.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Finder.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Finder allows searching through directory trees using iterator. * @@ -22,29 +22,20 @@ class Finder implements \IteratorAggregate { use Nette\SmartObject; /** @var array */ - private $find = []; + private array $find = []; /** @var string[] */ - private $in = []; + private array $in = []; /** @var \Closure[] */ - private $filters = []; + private array $filters = []; /** @var \Closure[] */ - private $descentFilters = []; + private array $descentFilters = []; /** @var array */ - private $appends = []; - /** - * @var bool - */ - private $childFirst = \false; + private array $appends = []; + private bool $childFirst = \false; /** @var ?callable */ private $sort; - /** - * @var int - */ - private $maxDepth = -1; - /** - * @var bool - */ - private $ignoreUnreadableDirs = \true; + private int $maxDepth = -1; + private bool $ignoreUnreadableDirs = \true; /** * Begins search for files and directories matching mask. * @param string|mixed[] $masks @@ -184,9 +175,7 @@ public function sortBy(callable $callback) */ public function sortByName() { - $this->sort = function (FileInfo $a, FileInfo $b) : int { - return \strnatcmp($a->getBasename(), $b->getBasename()); - }; + $this->sort = fn(FileInfo $a, FileInfo $b): int => \strnatcmp($a->getBasename(), $b->getBasename()); return $this; } /** @@ -219,9 +208,7 @@ public function exclude($masks) } $end = $m[3]; $re = $this->buildPattern($m[2]); - $filter = function (FileInfo $file) use($end, $re) : bool { - return $end && !$file->isDir() || !\preg_match($re, FileSystem::unixSlashes($file->getRelativePathname())); - }; + $filter = fn(FileInfo $file): bool => $end && !$file->isDir() || !\preg_match($re, FileSystem::unixSlashes($file->getRelativePathname())); $this->descentFilter($filter); if ($end !== '/*') { $this->filter($filter); @@ -274,9 +261,7 @@ public function size(string $operator, ?int $size = null) $size *= $units[\strtolower($unit)]; $operator = $operator ?: '='; } - return $this->filter(function (FileInfo $file) use($operator, $size) : bool { - return !$file->isFile() || Helpers::compare($file->getSize(), $operator, $size); - }); + return $this->filter(fn(FileInfo $file): bool => !$file->isFile() || Helpers::compare($file->getSize(), $operator, $size)); } /** * Restricts the search by modified time. $operator accepts "[operator] [date]" example: >1978-01-23 @@ -293,10 +278,8 @@ public function date(string $operator, $date = null) [, $operator, $date] = $matches; $operator = $operator ?: '='; } - $date = DateTime::from($date)->format('U'); - return $this->filter(function (FileInfo $file) use($operator, $date) : bool { - return !$file->isFile() || Helpers::compare($file->getMTime(), $operator, $date); - }); + $date = DateTime::from($date)->getTimestamp(); + return $this->filter(fn(FileInfo $file): bool => !$file->isFile() || Helpers::compare($file->getMTime(), $operator, $date)); } /********************* iterator generator ****************d*g**/ /** @@ -388,7 +371,7 @@ private function proveFilters(array $filters, FileInfo $file, array &$cache) : b { foreach ($filters as $filter) { $res =& $cache[\spl_object_id($filter)]; - $res = $res ?? $filter($file); + $res ??= $filter($file); if (!$res) { return \false; } @@ -415,7 +398,7 @@ private function buildPlan() : array } foreach ($splits as [$base, $rest, $recursive]) { $base = $base === '' ? '.' : $base; - $dirs = $dirCache[$base] = $dirCache[$base] ?? (\strpbrk($base, '*?[') ? \glob($base, \GLOB_NOSORT | \GLOB_ONLYDIR | \GLOB_NOESCAPE) : [\strtr($base, ['[[]' => '[', '[]]' => ']'])]); + $dirs = $dirCache[$base] ??= \strpbrk($base, '*?[') ? \glob($base, \GLOB_NOSORT | \GLOB_ONLYDIR | \GLOB_NOESCAPE) : [\strtr($base, ['[[]' => '[', '[]]' => ']'])]; // unescape [ and ] if (!$dirs) { throw new Nette\InvalidStateException(\sprintf("Directory '%s' does not exist.", \rtrim($base, '/\\'))); @@ -451,6 +434,6 @@ private function buildPattern(string $mask) : string $anchor = '(?:^|/)'; } $pattern = \strtr(\preg_quote($mask, '#'), ['\\*\\*/' => '(.+/)?', '\\*' => '[^/]*', '\\?' => '[^/]', '\\[\\!' => '[^', '\\[' => '[', '\\]' => ']', '\\-' => '-']); - return '#' . $anchor . $pattern . '$#D' . (\defined('PHP_WINDOWS_VERSION_BUILD') ? 'i' : ''); + return '#' . $anchor . $pattern . '$#D' . (Helpers::IsWindows ? 'i' : ''); } } diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Floats.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Floats.php index 730e5f98b..4dfdca17d 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Floats.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Floats.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Floating-point numbers comparison. */ diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Helpers.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Helpers.php index fbf55995f..50f8a8401 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Helpers.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Helpers.php @@ -5,11 +5,12 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; class Helpers { + public const IsWindows = \PHP_OS_FAMILY === 'Windows'; /** * Executes a callback and returns the captured output as a string. */ diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Html.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Html.php index 165c90efb..61a8ce9e7 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Html.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Html.php @@ -5,10 +5,10 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; -use RectorPrefix202411\Nette\HtmlStringable; +use RectorPrefix202506\Nette; +use RectorPrefix202506\Nette\HtmlStringable; use function is_array, is_float, is_object, is_string; /** * HTML helper. @@ -236,13 +236,9 @@ class Html implements \ArrayAccess, \Countable, \IteratorAggregate, HtmlStringab public static $emptyElements = ['img' => 1, 'hr' => 1, 'br' => 1, 'input' => 1, 'meta' => 1, 'area' => 1, 'embed' => 1, 'keygen' => 1, 'source' => 1, 'base' => 1, 'col' => 1, 'link' => 1, 'param' => 1, 'basefont' => 1, 'frame' => 1, 'isindex' => 1, 'wbr' => 1, 'command' => 1, 'track' => 1]; /** @var array nodes */ protected $children = []; - /** element's name - * @var string */ - private $name = ''; - /** - * @var bool - */ - private $isEmpty = \false; + /** element's name */ + private string $name = ''; + private bool $isEmpty = \false; /** * Constructs new HTML element. * @param array|string $attrs element's attributes or plain text content diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Image.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Image.php index 8f04fa38a..a2bb8361c 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Image.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Image.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Basic manipulation with images. Supported types are JPEG, PNG, GIF, WEBP, AVIF and BMP. * @@ -113,10 +113,7 @@ class Image public const JPEG = ImageType::JPEG, PNG = ImageType::PNG, GIF = ImageType::GIF, WEBP = ImageType::WEBP, AVIF = ImageType::AVIF, BMP = ImageType::BMP; public const EmptyGIF = "GIF89a\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;"; private const Formats = [ImageType::JPEG => 'jpeg', ImageType::PNG => 'png', ImageType::GIF => 'gif', ImageType::WEBP => 'webp', ImageType::AVIF => 'avif', ImageType::BMP => 'bmp']; - /** - * @var \GdImage - */ - private $image; + private \GdImage $image; /** * Returns RGB color (0..255) and transparency (0..127). * @deprecated use ImageColor::rgb() @@ -551,7 +548,7 @@ public function filledRectangleWH(int $x, int $y, int $width, int $height, Image */ public function save(string $file, ?int $quality = null, ?int $type = null) : void { - $type = $type ?? self::extensionToType(\pathinfo($file, \PATHINFO_EXTENSION)); + $type ??= self::extensionToType(\pathinfo($file, \PATHINFO_EXTENSION)); $this->output($type, $quality, $file); } /** @@ -590,39 +587,36 @@ private function output(int $type, ?int $quality, ?string $file = null) : void { switch ($type) { case ImageType::JPEG: - $quality = $quality === null ? 85 : \max(0, \min(100, $quality)); - $success = @\imagejpeg($this->image, $file, $quality); - // @ is escalated to exception + [$defQuality, $min, $max] = [85, 0, 100]; break; case ImageType::PNG: - $quality = $quality === null ? 9 : \max(0, \min(9, $quality)); - $success = @\imagepng($this->image, $file, $quality); - // @ is escalated to exception + [$defQuality, $min, $max] = [9, 0, 9]; break; case ImageType::GIF: - $success = @\imagegif($this->image, $file); - // @ is escalated to exception + [$defQuality, $min, $max] = [null, null, null]; break; case ImageType::WEBP: - $quality = $quality === null ? 80 : \max(0, \min(100, $quality)); - $success = @\imagewebp($this->image, $file, $quality); - // @ is escalated to exception + [$defQuality, $min, $max] = [80, 0, 100]; break; case ImageType::AVIF: - $quality = $quality === null ? 30 : \max(0, \min(100, $quality)); - $success = @\imageavif($this->image, $file, $quality); - // @ is escalated to exception + [$defQuality, $min, $max] = [30, 0, 100]; break; case ImageType::BMP: - $success = @\imagebmp($this->image, $file); - // @ is escalated to exception + [$defQuality, $min, $max] = [null, null, null]; break; default: throw new Nette\InvalidArgumentException("Unsupported image type '{$type}'."); } - if (!$success) { - throw new ImageException(Helpers::getLastError() ?: 'Unknown error'); + $args = [$this->image, $file]; + if ($defQuality !== null) { + $args[] = $quality === null ? $defQuality : \max($min, \min($max, $quality)); } + Callback::invokeSafe('image' . self::Formats[$type], $args, function (string $message) use($file) : void { + if ($file !== null) { + @\unlink($file); + } + throw new ImageException($message); + }); } /** * Call to undefined method. diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageColor.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageColor.php index 85d582a35..cda6c1b13 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageColor.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageColor.php @@ -5,30 +5,18 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Represent RGB color (0..255) with opacity (0..1). */ class ImageColor { - /** - * @var int - */ - public $red; - /** - * @var int - */ - public $green; - /** - * @var int - */ - public $blue; - /** - * @var float - */ - public $opacity = 1; + public int $red; + public int $green; + public int $blue; + public float $opacity = 1; public static function rgb(int $red, int $green, int $blue, float $opacity = 1) : self { return new self($red, $green, $blue, $opacity); diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageType.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageType.php index 7c97c09b5..1578a07ad 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageType.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/ImageType.php @@ -5,7 +5,7 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; /** * Type of image file. diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Iterables.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Iterables.php index 1873d3e28..13beb06cd 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Iterables.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Iterables.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Utilities for iterables. */ @@ -168,14 +168,8 @@ public static function memoize(iterable $iterable) : iterable { return new class(self::toIterator($iterable)) implements \IteratorAggregate { - /** - * @var \Iterator - */ - private $iterator; - /** - * @var mixed[] - */ - private $cache = []; + private \Iterator $iterator; + private array $cache = []; public function __construct(\Iterator $iterator, array $cache = []) { $this->iterator = $iterator; @@ -220,6 +214,8 @@ public static function toIterator(iterable $iterable) : \Iterator return self::toIterator($iterable->getIterator()); case \is_array($iterable): return new \ArrayIterator($iterable); + default: + throw new Nette\ShouldNotHappenException(); } } } diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Json.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Json.php index acd9eedb4..e556a12bf 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Json.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Json.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * JSON encoder and decoder. */ diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/ObjectHelpers.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/ObjectHelpers.php index 510609716..71b879eb0 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/ObjectHelpers.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/ObjectHelpers.php @@ -5,10 +5,10 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; -use RectorPrefix202411\Nette\MemberAccessException; +use RectorPrefix202506\Nette; +use RectorPrefix202506\Nette\MemberAccessException; /** * Nette\SmartObject helpers. * @internal @@ -23,9 +23,7 @@ final class ObjectHelpers public static function strictGet(string $class, string $name) : void { $rc = new \ReflectionClass($class); - $hint = self::getSuggestion(\array_merge(\array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) { - return !$p->isStatic(); - }), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-read)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name); + $hint = self::getSuggestion(\array_merge(\array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), fn($p) => !$p->isStatic()), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-read)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name); throw new MemberAccessException("Cannot read an undeclared property {$class}::\${$name}" . ($hint ? ", did you mean \${$hint}?" : '.')); } /** @@ -35,9 +33,7 @@ public static function strictGet(string $class, string $name) : void public static function strictSet(string $class, string $name) : void { $rc = new \ReflectionClass($class); - $hint = self::getSuggestion(\array_merge(\array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) { - return !$p->isStatic(); - }), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-write)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name); + $hint = self::getSuggestion(\array_merge(\array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), fn($p) => !$p->isStatic()), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-write)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name); throw new MemberAccessException("Cannot write to an undeclared property {$class}::\${$name}" . ($hint ? ", did you mean \${$hint}?" : '.')); } /** @@ -82,9 +78,7 @@ public static function strictStaticCall(string $class, string $method) : void $visibility = $rm->isPrivate() ? 'private ' : ($rm->isProtected() ? 'protected ' : ''); throw new MemberAccessException("Call to {$visibility}method {$class}::{$method}() from " . ($context ? "scope {$context}." : 'global scope.')); } else { - $hint = self::getSuggestion(\array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), function ($m) { - return $m->isStatic(); - }), $method); + $hint = self::getSuggestion(\array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), fn($m) => $m->isStatic()), $method); throw new MemberAccessException("Call to undefined static method {$class}::{$method}()" . ($hint ? ", did you mean {$hint}()?" : '.')); } } diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Paginator.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Paginator.php index 009d9ba3f..6a9dad1e2 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Paginator.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Paginator.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Paginating math. * @@ -29,18 +29,12 @@ class Paginator { use Nette\SmartObject; - /** - * @var int - */ - private $base = 1; + private int $base = 1; /** @var positive-int */ - private $itemsPerPage = 1; - /** - * @var int - */ - private $page = 1; + private int $itemsPerPage = 1; + private int $page = 1; /** @var int<0, max>|null */ - private $itemCount; + private ?int $itemCount = null; /** * Sets current page number. * @return static diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Random.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Random.php index cc5fb5473..afdff6c76 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Random.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Random.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; use Random\Randomizer; /** * Secure random string generator. @@ -21,9 +21,7 @@ final class Random */ public static function generate(int $length = 10, string $charlist = '0-9a-z') : string { - $charlist = \preg_replace_callback('#.-.#', function (array $m) : string { - return \implode('', \range($m[0][0], $m[0][2])); - }, $charlist); + $charlist = \preg_replace_callback('#.-.#', fn(array $m): string => \implode('', \range($m[0][0], $m[0][2])), $charlist); $charlist = \count_chars($charlist, 3); $chLen = \strlen($charlist); if ($length < 1) { diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Reflection.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Reflection.php index 384edb855..8e0aa8b84 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Reflection.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Reflection.php @@ -5,21 +5,21 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * PHP reflection helpers. */ final class Reflection { use Nette\StaticClass; - /** @deprecated use Nette\Utils\Validator::isBuiltinType() */ + /** @deprecated use Nette\Utils\Validators::isBuiltinType() */ public static function isBuiltinType(string $type) : bool { return Validators::isBuiltinType($type); } - /** @deprecated use Nette\Utils\Validator::isClassKeyword() */ + /** @deprecated use Nette\Utils\Validators::isClassKeyword() */ public static function isClassKeyword(string $name) : bool { return Validators::isClassKeyword($name); diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/ReflectionMethod.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/ReflectionMethod.php index 8bac37f2c..f0cc6da4d 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/ReflectionMethod.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/ReflectionMethod.php @@ -5,7 +5,7 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; /** * ReflectionMethod preserving the original class name. @@ -13,10 +13,7 @@ */ final class ReflectionMethod extends \ReflectionMethod { - /** - * @var \ReflectionClass - */ - private $originalClass; + private \ReflectionClass $originalClass; /** * @param object|string $objectOrMethod */ diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Strings.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Strings.php index c9be76b36..20db82f51 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Strings.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Strings.php @@ -5,10 +5,10 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\JetBrains\PhpStorm\Language; -use RectorPrefix202411\Nette; +use RectorPrefix202506\JetBrains\PhpStorm\Language; +use RectorPrefix202506\Nette; use function is_array, is_object, strlen; /** * String tools library. @@ -20,7 +20,7 @@ class Strings /** @deprecated use Strings::TrimCharacters */ public const TRIM_CHARACTERS = self::TrimCharacters; /** - * @deprecated use Nette\Utils\Validator::isUnicode() + * @deprecated use Nette\Utils\Validators::isUnicode() */ public static function checkEncoding(string $s) : bool { @@ -514,9 +514,7 @@ public static function matchAll( while ($offset <= strlen($subject) - ($counter ? 1 : 0) && self::pcre('preg_match', [$pattern, $subject, &$m, $flags, $offset])) { $offset = $m[0][1] + \max(1, strlen($m[0][0])); if (!$captureOffset) { - $m = \array_map(function ($item) { - return $item[0]; - }, $m); + $m = \array_map(fn($item) => $item[0], $m); } elseif ($utf8) { $m = self::bytesToChars($subject, [$m])[0]; } @@ -557,9 +555,7 @@ public static function replace( if ($utf8) { $pattern .= 'u'; if ($captureOffset) { - $replacement = function ($m) use($replacement, $subject) { - return $replacement(self::bytesToChars($subject, [$m])[0]); - }; + $replacement = fn($m) => $replacement(self::bytesToChars($subject, [$m])[0]); } } if (PHP_VERSION_ID < 70400) { @@ -572,9 +568,7 @@ public static function replace( $pattern = \array_keys($pattern); } if ($utf8) { - $pattern = \array_map(function ($item) { - return $item . 'u'; - }, (array) $pattern); + $pattern = \array_map(fn($item) => $item . 'u', (array) $pattern); } return self::pcre('preg_replace', [$pattern, $replacement, $subject, $limit]); } diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Type.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Type.php index 690b22663..34d297db7 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Type.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Type.php @@ -5,24 +5,18 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * PHP type reflection. */ final class Type { /** @var array */ - private $types; - /** - * @var bool - */ - private $simple; - /** - * @var string - */ - private $kind; + private array $types; + private bool $simple; + private string $kind; // | & /** * Creates a Type object based on reflection. Resolves self, static and parent to the actual class name. @@ -43,9 +37,7 @@ private static function fromReflectionType(\ReflectionType $type, $of, bool $asO $name = self::resolve($type->getName(), $of); return $asObject ? new self($type->allowsNull() && $name !== 'mixed' ? [$name, 'null'] : [$name]) : $name; } elseif ($type instanceof \ReflectionUnionType || $type instanceof \ReflectionIntersectionType) { - return new self(\array_map(function ($t) use($of) { - return self::fromReflectionType($t, $of, \false); - }, $type->getTypes()), $type instanceof \ReflectionUnionType ? '|' : '&'); + return new self(\array_map(fn($t) => self::fromReflectionType($t, $of, \false), $type->getTypes()), $type instanceof \ReflectionUnionType ? '|' : '&'); } else { throw new Nette\InvalidStateException('Unexpected type of ' . Reflection::toString($of)); } @@ -117,9 +109,7 @@ public function __toString() : string */ public function getNames() : array { - return \array_map(function ($t) { - return $t instanceof self ? $t->getNames() : $t; - }, $this->types); + return \array_map(fn($t) => $t instanceof self ? $t->getNames() : $t, $this->types); } /** * Returns the array of subtypes that make up the compound type as Type objects: @@ -127,9 +117,7 @@ public function getNames() : array */ public function getTypes() : array { - return \array_map(function ($t) { - return $t instanceof self ? $t : new self([$t]); - }, $this->types); + return \array_map(fn($t) => $t instanceof self ? $t : new self([$t]), $this->types); } /** * Returns the type name for simple types, otherwise null. @@ -194,22 +182,14 @@ public function allows(string $subtype) : bool return \true; } $subtype = self::fromString($subtype); - return $subtype->isUnion() ? Arrays::every($subtype->types, function ($t) { - return $this->allows2($t instanceof self ? $t->types : [$t]); - }) : $this->allows2($subtype->types); + return $subtype->isUnion() ? Arrays::every($subtype->types, fn($t) => $this->allows2($t instanceof self ? $t->types : [$t])) : $this->allows2($subtype->types); } private function allows2(array $subtypes) : bool { - return $this->isUnion() ? Arrays::some($this->types, function ($t) use($subtypes) { - return $this->allows3($t instanceof self ? $t->types : [$t], $subtypes); - }) : $this->allows3($this->types, $subtypes); + return $this->isUnion() ? Arrays::some($this->types, fn($t) => $this->allows3($t instanceof self ? $t->types : [$t], $subtypes)) : $this->allows3($this->types, $subtypes); } private function allows3(array $types, array $subtypes) : bool { - return Arrays::every($types, function ($type) use($subtypes) { - return Arrays::some($subtypes, function ($subtype) use($type) { - return Validators::isBuiltinType($type) ? \strcasecmp($type, $subtype) === 0 : \is_a($subtype, $type, \true); - }); - }); + return Arrays::every($types, fn($type) => Arrays::some($subtypes, fn($subtype) => Validators::isBuiltinType($type) ? \strcasecmp($type, $subtype) === 0 : \is_a($subtype, $type, \true))); } } diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/Validators.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/Validators.php index 539c0a482..9f1427d62 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/Validators.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/Validators.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; /** * Validation utilities. */ diff --git a/vendor/rector/rector/vendor/nette/utils/src/Utils/exceptions.php b/vendor/rector/rector/vendor/nette/utils/src/Utils/exceptions.php index 9e1fa5fb3..26a792a8c 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/Utils/exceptions.php +++ b/vendor/rector/rector/vendor/nette/utils/src/Utils/exceptions.php @@ -5,34 +5,34 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; /** - * The exception that is thrown when an image error occurs. + * An error occurred while working with the image. */ class ImageException extends \Exception { } /** - * The exception that indicates invalid image file. + * The image file is invalid or in an unsupported format. */ class UnknownImageFileException extends ImageException { } /** - * The exception that indicates error of JSON encoding/decoding. + * JSON encoding or decoding failed. */ class JsonException extends \JsonException { } /** - * The exception that indicates error of the last Regexp execution. + * Regular expression pattern or execution failed. */ class RegexpException extends \Exception { } /** - * The exception that indicates assertion error. + * Type validation failed. The value doesn't match the expected type constraints. */ class AssertionException extends \Exception { diff --git a/vendor/rector/rector/vendor/nette/utils/src/compatibility.php b/vendor/rector/rector/vendor/nette/utils/src/compatibility.php index 00b076dbf..db4e43e7a 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/compatibility.php +++ b/vendor/rector/rector/vendor/nette/utils/src/compatibility.php @@ -5,9 +5,9 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette\Utils; +namespace RectorPrefix202506\Nette\Utils; -use RectorPrefix202411\Nette; +use RectorPrefix202506\Nette; if (\false) { /** @deprecated use Nette\HtmlStringable */ interface IHtmlString extends Nette\HtmlStringable @@ -16,7 +16,7 @@ interface IHtmlString extends Nette\HtmlStringable } elseif (!\interface_exists(IHtmlString::class)) { \class_alias(Nette\HtmlStringable::class, IHtmlString::class); } -namespace RectorPrefix202411\Nette\Localization; +namespace RectorPrefix202506\Nette\Localization; if (\false) { /** @deprecated use Nette\Localization\Translator */ diff --git a/vendor/rector/rector/vendor/nette/utils/src/exceptions.php b/vendor/rector/rector/vendor/nette/utils/src/exceptions.php index 09dff60ab..76d5fa95c 100644 --- a/vendor/rector/rector/vendor/nette/utils/src/exceptions.php +++ b/vendor/rector/rector/vendor/nette/utils/src/exceptions.php @@ -5,80 +5,83 @@ * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare (strict_types=1); -namespace RectorPrefix202411\Nette; +namespace RectorPrefix202506\Nette; /** - * The exception that is thrown when the value of an argument is - * outside the allowable range of values as defined by the invoked method. + * The value is outside the allowed range. */ class ArgumentOutOfRangeException extends \InvalidArgumentException { } /** - * The exception that is thrown when a method call is invalid for the object's - * current state, method has been invoked at an illegal or inappropriate time. + * The object is in a state that does not allow the requested operation. */ class InvalidStateException extends \RuntimeException { } /** - * The exception that is thrown when a requested method or operation is not implemented. + * The requested feature is not implemented. */ class NotImplementedException extends \LogicException { } /** - * The exception that is thrown when an invoked method is not supported. For scenarios where - * it is sometimes possible to perform the requested operation, see InvalidStateException. + * The requested operation is not supported. */ class NotSupportedException extends \LogicException { } /** - * The exception that is thrown when a requested method or operation is deprecated. + * The requested feature is deprecated and no longer available. */ class DeprecatedException extends NotSupportedException { } /** - * The exception that is thrown when accessing a class member (property or method) fails. + * Cannot access the requested class property or method. */ class MemberAccessException extends \Error { } /** - * The exception that is thrown when an I/O error occurs. + * Failed to read from or write to a file or stream. */ class IOException extends \RuntimeException { } /** - * The exception that is thrown when accessing a file that does not exist on disk. + * The requested file does not exist. */ class FileNotFoundException extends IOException { } /** - * The exception that is thrown when part of a file or directory cannot be found. + * The requested directory does not exist. */ class DirectoryNotFoundException extends IOException { } /** - * The exception that is thrown when an argument does not match with the expected value. + * The provided argument has invalid type or format. */ class InvalidArgumentException extends \InvalidArgumentException { } /** - * The exception that is thrown when an illegal index was requested. + * The requested array or collection index does not exist. */ class OutOfRangeException extends \OutOfRangeException { } /** - * The exception that is thrown when a value (typically returned by function) does not match with the expected value. + * The returned value has unexpected type or format. */ class UnexpectedValueException extends \UnexpectedValueException { } +/** + * Houston, we have a problem. + */ +class ShouldNotHappenException extends \LogicException +{ +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/README.md b/vendor/rector/rector/vendor/nikic/php-parser/README.md index 3bca288b9..edb3ed32f 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/README.md +++ b/vendor/rector/rector/vendor/nikic/php-parser/README.md @@ -3,24 +3,24 @@ PHP Parser [![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) -This is a PHP 5.2 to PHP 8.2 parser written in PHP. Its purpose is to simplify static code analysis and +This is a PHP parser written in PHP. Its purpose is to simplify static code analysis and manipulation. -[**Documentation for version 4.x**][doc_4_x] (stable; for running on PHP >= 7.1; for parsing PHP 5.2 to PHP 8.2). +[**Documentation for version 5.x**][doc_master] (current; for running on PHP >= 7.4; for parsing PHP 7.0 to PHP 8.4, with limited support for parsing PHP 5.x). -[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). +[Documentation for version 4.x][doc_4_x] (supported; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.3). Features -------- The main features provided by this library are: - * Parsing PHP 5, PHP 7, and PHP 8 code into an abstract syntax tree (AST). + * Parsing PHP 7, and PHP 8 code into an abstract syntax tree (AST). * Invalid code can be parsed into a partial AST. * The AST contains accurate location information. * Dumping the AST in human-readable form. * Converting an AST back to PHP code. - * Experimental: Formatting can be preserved for partially changed ASTs. + * Formatting can be preserved for partially changed ASTs. * Infrastructure to traverse and modify ASTs. * Resolution of namespaced names. * Evaluation of constant expressions. @@ -51,7 +51,7 @@ function test($foo) } CODE; -$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7); +$parser = (new ParserFactory())->createForNewestSupportedVersion(); try { $ast = $parser->parse($code); } catch (Error $error) { @@ -68,12 +68,17 @@ This dumps an AST looking something like this: ``` array( 0: Stmt_Function( + attrGroups: array( + ) byRef: false name: Identifier( name: test ) params: array( 0: Param( + attrGroups: array( + ) + flags: 0 type: null byRef: false variadic: false @@ -88,12 +93,11 @@ array( 0: Stmt_Expression( expr: Expr_FuncCall( name: Name( - parts: array( - 0: var_dump - ) + name: var_dump ) args: array( 0: Arg( + name: null value: Expr_Variable( name: foo ) @@ -135,12 +139,16 @@ This gives us an AST where the `Function_::$stmts` are empty: ``` array( 0: Stmt_Function( + attrGroups: array( + ) byRef: false name: Identifier( name: test ) params: array( 0: Param( + attrGroups: array( + ) type: null byRef: false variadic: false @@ -203,9 +211,8 @@ Component documentation: * [AST builders](doc/component/AST_builders.markdown) * Fluent builders for AST nodes * [Lexer](doc/component/Lexer.markdown) - * Lexer options - * Token and file positions for nodes - * Custom attributes + * Emulation + * Tokens, positions and attributes * [Error handling](doc/component/Error_handling.markdown) * Column information for errors * Error recovery (parsing of syntactically incorrect code) @@ -223,3 +230,4 @@ Component documentation: [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc [doc_4_x]: https://github.com/nikic/PHP-Parser/tree/4.x/doc + [doc_master]: https://github.com/nikic/PHP-Parser/tree/master/doc diff --git a/vendor/rector/rector/vendor/nikic/php-parser/bin/php-parse b/vendor/rector/rector/vendor/nikic/php-parser/bin/php-parse index 88b566cb8..77f5720aa 100755 --- a/vendor/rector/rector/vendor/nikic/php-parser/bin/php-parse +++ b/vendor/rector/rector/vendor/nikic/php-parser/bin/php-parse @@ -1,6 +1,6 @@ #!/usr/bin/env php ['startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments']]); -$parser = (new \PhpParser\ParserFactory())->create(\PhpParser\ParserFactory::PREFER_PHP7, $lexer); +$parser = (new \PhpParser\ParserFactory())->createForVersion($attributes['version']); $dumper = new \PhpParser\NodeDumper(['dumpComments' => \true, 'dumpPositions' => $attributes['with-positions']]); $prettyPrinter = new \PhpParser\PrettyPrinter\Standard(); $traverser = new \PhpParser\NodeTraverser(); $traverser->addVisitor(new \PhpParser\NodeVisitor\NameResolver()); foreach ($files as $file) { - if (\strpos($file, ' Code {$code}\n"); + if ($file === '-') { + $code = \file_get_contents('php://stdin'); + \fwrite(\STDERR, "====> Stdin:\n"); } else { - if (!\file_exists($file)) { - \fwrite(\STDERR, "File {$file} does not exist.\n"); - exit(1); + if (\strpos($file, ' Code {$code}\n"); + } else { + if (!\file_exists($file)) { + \fwrite(\STDERR, "File {$file} does not exist.\n"); + exit(1); + } + $code = \file_get_contents($file); + \fwrite(\STDERR, "====> File {$file}:\n"); } - $code = \file_get_contents($file); - \fwrite(\STDERR, "====> File {$file}:\n"); } if ($attributes['with-recovery']) { $errorHandler = new \PhpParser\ErrorHandler\Collecting(); @@ -90,7 +94,7 @@ function showHelp($error = '') if ($error) { \fwrite(\STDERR, $error . "\n\n"); } - \fwrite($error ? \STDERR : \STDOUT, << \false, 'with-positions' => \false, 'with-recovery' => \false]; + $attributes = ['with-column-info' => \false, 'with-positions' => \false, 'with-recovery' => \false, 'version' => \PhpParser\PhpVersion::getNewestSupported()]; \array_shift($args); $parseOptions = \true; foreach ($args as $arg) { @@ -169,7 +174,9 @@ function parseArgs($args) $parseOptions = \false; break; default: - if ($arg[0] === '-') { + if (\preg_match('/^--version=(.*)$/', $arg, $matches)) { + $attributes['version'] = \PhpParser\PhpVersion::fromString($matches[1]); + } elseif ($arg[0] === '-' && \strlen($arg[0]) > 1) { showHelp("Invalid operation {$arg}."); } else { $files[] = $arg; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/composer.json b/vendor/rector/rector/vendor/nikic/php-parser/composer.json index 04688e2d7..5e839e336 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/composer.json +++ b/vendor/rector/rector/vendor/nikic/php-parser/composer.json @@ -13,16 +13,18 @@ } ], "require": { - "php": ">=7.1", - "ext-tokenizer": "*" + "php": ">=7.4", + "ext-tokenizer": "*", + "ext-json": "*", + "ext-ctype": "*" }, "require-dev": { - "phpunit\/phpunit": "^7.0 || ^8.0 || ^9.0", + "phpunit\/phpunit": "^9.0", "ircmaxell\/php-yacc": "^0.0.7" }, "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php index 07b353d1c..2bd3152c1 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php @@ -5,23 +5,26 @@ use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Const_; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; class ClassConst implements PhpParser\Builder { - protected $flags = 0; - protected $attributes = []; - protected $constants = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; - /** @var Identifier|Node\Name|Node\ComplexType */ - protected $type; + protected int $flags = 0; + /** @var array */ + protected array $attributes = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $attributeGroups = []; + /** @var Identifier|Node\Name|Node\ComplexType|null */ + protected ?Node $type = null; /** * Creates a class constant builder * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value */ public function __construct($name, $value) @@ -31,7 +34,7 @@ public function __construct($name, $value) /** * Add another constant to const group * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value * * @return $this The builder instance (for fluid interface) @@ -48,7 +51,7 @@ public function addConst($name, $value) */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** @@ -58,7 +61,7 @@ public function makePublic() */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** @@ -68,7 +71,7 @@ public function makeProtected() */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** @@ -78,7 +81,7 @@ public function makePrivate() */ public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); return $this; } /** diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php index 444b266e5..61b8a8886 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php @@ -5,21 +5,27 @@ use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Stmt; class Class_ extends \PhpParser\Builder\Declaration { - protected $name; - protected $extends = null; - protected $implements = []; - protected $flags = 0; - protected $uses = []; - protected $constants = []; - protected $properties = []; - protected $methods = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + protected ?Name $extends = null; + /** @var list */ + protected array $implements = []; + protected int $flags = 0; + /** @var list */ + protected array $uses = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $properties = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a class builder. * @@ -62,7 +68,7 @@ public function implement(...$interfaces) */ public function makeAbstract() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::ABSTRACT); return $this; } /** @@ -72,12 +78,17 @@ public function makeAbstract() */ public function makeFinal() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::FINAL); return $this; } + /** + * Makes the class readonly. + * + * @return $this The builder instance (for fluid interface) + */ public function makeReadonly() { - $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Modifiers::READONLY); return $this; } /** @@ -90,12 +101,17 @@ public function makeReadonly() public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); - $targets = [Stmt\TraitUse::class => &$this->uses, Stmt\ClassConst::class => &$this->constants, Stmt\Property::class => &$this->properties, Stmt\ClassMethod::class => &$this->methods]; - $class = \get_class($stmt); - if (!isset($targets[$class])) { + if ($stmt instanceof Stmt\Property) { + $this->properties[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + $this->methods[] = $stmt; + } elseif ($stmt instanceof Stmt\TraitUse) { + $this->uses[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; + } else { throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } - $targets[$class][] = $stmt; return $this; } /** diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php index d44671423..b9c5d8278 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php @@ -7,12 +7,20 @@ use PhpParser\BuilderHelpers; abstract class Declaration implements PhpParser\Builder { - protected $attributes = []; + /** @var array */ + protected array $attributes = []; + /** + * Adds a statement. + * + * @param PhpParser\Node\Stmt|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) + */ public abstract function addStmt($stmt); /** * Adds multiple statements. * - * @param array $stmts The statements to add + * @param (PhpParser\Node\Stmt|PhpParser\Builder)[] $stmts The statements to add * * @return $this The builder instance (for fluid interface) */ diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php index 83f3a46cd..ca4a67983 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php @@ -10,15 +10,17 @@ use PhpParser\Node\Stmt; class EnumCase implements PhpParser\Builder { + /** @var Identifier|string */ protected $name; - protected $value = null; - protected $attributes = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected ?Node\Expr $value = null; + /** @var array */ + protected array $attributes = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an enum case builder. * - * @param string|Identifier $name Name + * @param string|Identifier $name Name */ public function __construct($name) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php index c89ff7ee6..a0c31a5c1 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php @@ -11,15 +11,20 @@ use PhpParser\Node\Stmt; class Enum_ extends \PhpParser\Builder\Declaration { - protected $name; - protected $scalarType = null; - protected $implements = []; - protected $uses = []; - protected $enumCases = []; - protected $constants = []; - protected $methods = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + protected ?Identifier $scalarType = null; + /** @var list */ + protected array $implements = []; + /** @var list */ + protected array $uses = []; + /** @var list */ + protected array $enumCases = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an enum builder. * @@ -32,7 +37,7 @@ public function __construct(string $name) /** * Sets the scalar type. * - * @param string|Identifier $type + * @param string|Identifier $scalarType * * @return $this */ @@ -65,12 +70,17 @@ public function implement(...$interfaces) public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); - $targets = [Stmt\TraitUse::class => &$this->uses, Stmt\EnumCase::class => &$this->enumCases, Stmt\ClassConst::class => &$this->constants, Stmt\ClassMethod::class => &$this->methods]; - $class = \get_class($stmt); - if (!isset($targets[$class])) { + if ($stmt instanceof Stmt\EnumCase) { + $this->enumCases[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + $this->methods[] = $stmt; + } elseif ($stmt instanceof Stmt\TraitUse) { + $this->uses[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; + } else { throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } - $targets[$class][] = $stmt; return $this; } /** diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php index 6dfd36a77..1a7733a06 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php @@ -7,10 +7,11 @@ use PhpParser\Node; abstract class FunctionLike extends \PhpParser\Builder\Declaration { - protected $returnByRef = \false; - protected $params = []; - /** @var string|Node\Name|Node\NullableType|null */ - protected $returnType = null; + protected bool $returnByRef = \false; + /** @var Node\Param[] */ + protected array $params = []; + /** @var Node\Identifier|Node\Name|Node\ComplexType|null */ + protected ?Node $returnType = null; /** * Make the function return by reference. * @@ -40,7 +41,7 @@ public function addParam($param) /** * Adds multiple parameters. * - * @param array $params The parameters to add + * @param (Node\Param|Param)[] $params The parameters to add * * @return $this The builder instance (for fluid interface) */ diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php index f3c3ca3d5..bf10852e1 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php @@ -9,10 +9,11 @@ use PhpParser\Node\Stmt; class Function_ extends \PhpParser\Builder\FunctionLike { - protected $name; - protected $stmts = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + /** @var list */ + protected array $stmts = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a function builder. * diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php index fcaa3e809..5d5edff83 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php @@ -10,12 +10,15 @@ use PhpParser\Node\Stmt; class Interface_ extends \PhpParser\Builder\Declaration { - protected $name; - protected $extends = []; - protected $constants = []; - protected $methods = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + /** @var list */ + protected array $extends = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an interface builder. * diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php index 97050de1a..a47cd9c88 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php @@ -5,16 +5,17 @@ use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Stmt; class Method extends \PhpParser\Builder\FunctionLike { - protected $name; - protected $flags = 0; - /** @var array|null */ - protected $stmts = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + protected int $flags = 0; + /** @var list|null */ + protected ?array $stmts = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a method builder. * @@ -31,7 +32,7 @@ public function __construct(string $name) */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** @@ -41,7 +42,7 @@ public function makePublic() */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** @@ -51,7 +52,7 @@ public function makeProtected() */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** @@ -61,7 +62,7 @@ public function makePrivate() */ public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC); return $this; } /** @@ -74,7 +75,7 @@ public function makeAbstract() if (!empty($this->stmts)) { throw new \LogicException('Cannot make method with statements abstract'); } - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::ABSTRACT); $this->stmts = null; // abstract methods don't have statements return $this; @@ -86,7 +87,7 @@ public function makeAbstract() */ public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); return $this; } /** diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php index 5c76282a0..f58fea856 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php @@ -9,8 +9,9 @@ use PhpParser\Node\Stmt; class Namespace_ extends \PhpParser\Builder\Declaration { - private $name; - private $stmts = []; + private ?Node\Name $name; + /** @var Stmt[] */ + private array $stmts = []; /** * Creates a namespace builder. * diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php index 10dd9f4fa..3aa4a2280 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php @@ -5,18 +5,19 @@ use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; class Param implements PhpParser\Builder { - protected $name; - protected $default = null; - /** @var Node\Identifier|Node\Name|Node\NullableType|null */ - protected $type = null; - protected $byRef = \false; - protected $variadic = \false; - protected $flags = 0; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + protected ?Node\Expr $default = null; + /** @var Node\Identifier|Node\Name|Node\ComplexType|null */ + protected ?Node $type = null; + protected bool $byRef = \false; + protected int $flags = 0; + protected bool $variadic = \false; + /** @var list */ + protected array $attributeGroups = []; /** * Creates a parameter builder. * @@ -53,19 +54,6 @@ public function setType($type) } return $this; } - /** - * Sets type for the parameter. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type - * - * @return $this The builder instance (for fluid interface) - * - * @deprecated Use setType() instead - */ - public function setTypeHint($type) - { - return $this->setType($type); - } /** * Make the parameter accept the value by reference. * @@ -93,7 +81,7 @@ public function makeVariadic() */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** @@ -103,7 +91,7 @@ public function makePublic() */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** @@ -113,7 +101,7 @@ public function makeProtected() */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** @@ -123,7 +111,27 @@ public function makePrivate() */ public function makeReadonly() { - $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_READONLY); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY); + return $this; + } + /** + * Gives the promoted property private(set) visibility. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivateSet() + { + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE_SET); + return $this; + } + /** + * Gives the promoted property protected(set) visibility. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtectedSet() + { + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED_SET); return $this; } /** diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php index 7a985e7c4..496a748b8 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php @@ -5,6 +5,7 @@ use PhpParser; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Name; @@ -12,14 +13,17 @@ use PhpParser\Node\ComplexType; class Property implements PhpParser\Builder { - protected $name; - protected $flags = 0; - protected $default = null; - protected $attributes = []; - /** @var null|Identifier|Name|NullableType */ - protected $type; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + protected int $flags = 0; + protected ?Node\Expr $default = null; + /** @var array */ + protected array $attributes = []; + /** @var null|Identifier|Name|ComplexType */ + protected ?Node $type = null; + /** @var list */ + protected array $attributeGroups = []; + /** @var list */ + protected array $hooks = []; /** * Creates a property builder. * @@ -36,7 +40,7 @@ public function __construct(string $name) */ public function makePublic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); return $this; } /** @@ -46,7 +50,7 @@ public function makePublic() */ public function makeProtected() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); return $this; } /** @@ -56,7 +60,7 @@ public function makeProtected() */ public function makePrivate() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); return $this; } /** @@ -66,7 +70,7 @@ public function makePrivate() */ public function makeStatic() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::STATIC); return $this; } /** @@ -76,7 +80,47 @@ public function makeStatic() */ public function makeReadonly() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY); + return $this; + } + /** + * Makes the property abstract. Requires at least one property hook to be specified as well. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeAbstract() + { + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::ABSTRACT); + return $this; + } + /** + * Makes the property final. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeFinal() + { + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); + return $this; + } + /** + * Gives the property private(set) visibility. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivateSet() + { + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE_SET); + return $this; + } + /** + * Gives the property protected(set) visibility. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtectedSet() + { + $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED_SET); return $this; } /** @@ -127,6 +171,16 @@ public function addAttribute($attribute) $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } + /** + * Adds a property hook. + * + * @return $this The builder instance (for fluid interface) + */ + public function addHook(Node\PropertyHook $hook) + { + $this->hooks[] = $hook; + return $this; + } /** * Returns the built class node. * @@ -134,6 +188,9 @@ public function addAttribute($attribute) */ public function getNode() : PhpParser\Node { - return new Stmt\Property($this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, [new Stmt\PropertyProperty($this->name, $this->default)], $this->attributes, $this->type, $this->attributeGroups); + if ($this->flags & Modifiers::ABSTRACT && !$this->hooks) { + throw new PhpParser\Error('Only hooked properties may be declared abstract'); + } + return new Stmt\Property($this->flags !== 0 ? $this->flags : Modifiers::PUBLIC, [new Node\PropertyItem($this->name, $this->default)], $this->attributes, $this->type, $this->attributeGroups, $this->hooks); } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php index 0c68467ca..dd8ad4265 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php @@ -9,8 +9,10 @@ use PhpParser\Node\Stmt; class TraitUse implements Builder { - protected $traits = []; - protected $adaptations = []; + /** @var Node\Name[] */ + protected array $traits = []; + /** @var Stmt\TraitUseAdaptation[] */ + protected array $adaptations = []; /** * Creates a trait use builder. * diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php index 094a0c975..354fd468b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php @@ -5,25 +5,26 @@ use PhpParser\Builder; use PhpParser\BuilderHelpers; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Stmt; class TraitUseAdaptation implements Builder { - const TYPE_UNDEFINED = 0; - const TYPE_ALIAS = 1; - const TYPE_PRECEDENCE = 2; - /** @var int Type of building adaptation */ - protected $type; - protected $trait; - protected $method; - protected $modifier = null; - protected $alias = null; - protected $insteadof = []; + private const TYPE_UNDEFINED = 0; + private const TYPE_ALIAS = 1; + private const TYPE_PRECEDENCE = 2; + protected int $type; + protected ?Node\Name $trait; + protected Node\Identifier $method; + protected ?int $modifier = null; + protected ?Node\Identifier $alias = null; + /** @var Node\Name[] */ + protected array $insteadof = []; /** * Creates a trait use adaptation builder. * - * @param Node\Name|string|null $trait Name of adaptated trait - * @param Node\Identifier|string $method Name of adaptated method + * @param Node\Name|string|null $trait Name of adapted trait + * @param Node\Identifier|string $method Name of adapted method */ public function __construct($trait, $method) { @@ -34,7 +35,7 @@ public function __construct($trait, $method) /** * Sets alias of method. * - * @param Node\Identifier|string $alias Alias for adaptated method + * @param Node\Identifier|string $alias Alias for adapted method * * @return $this The builder instance (for fluid interface) */ @@ -46,37 +47,37 @@ public function as($alias) if ($this->type !== self::TYPE_ALIAS) { throw new \LogicException('Cannot set alias for not alias adaptation buider'); } - $this->alias = $alias; + $this->alias = BuilderHelpers::normalizeIdentifier($alias); return $this; } /** - * Sets adaptated method public. + * Sets adapted method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { - $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); + $this->setModifier(Modifiers::PUBLIC); return $this; } /** - * Sets adaptated method protected. + * Sets adapted method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { - $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); + $this->setModifier(Modifiers::PROTECTED); return $this; } /** - * Sets adaptated method private. + * Sets adapted method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { - $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); + $this->setModifier(Modifiers::PRIVATE); return $this; } /** @@ -102,7 +103,7 @@ public function insteadof(...$traits) } return $this; } - protected function setModifier(int $modifier) + protected function setModifier(int $modifier) : void { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php index fe26aec5d..6b3442889 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php @@ -9,12 +9,17 @@ use PhpParser\Node\Stmt; class Trait_ extends \PhpParser\Builder\Declaration { - protected $name; - protected $uses = []; - protected $properties = []; - protected $methods = []; - /** @var Node\AttributeGroup[] */ - protected $attributeGroups = []; + protected string $name; + /** @var list */ + protected array $uses = []; + /** @var list */ + protected array $constants = []; + /** @var list */ + protected array $properties = []; + /** @var list */ + protected array $methods = []; + /** @var list */ + protected array $attributeGroups = []; /** * Creates an interface builder. * @@ -40,6 +45,8 @@ public function addStmt($stmt) $this->methods[] = $stmt; } elseif ($stmt instanceof Stmt\TraitUse) { $this->uses[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; } else { throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } @@ -64,6 +71,6 @@ public function addAttribute($attribute) */ public function getNode() : PhpParser\Node { - return new Stmt\Trait_($this->name, ['stmts' => \array_merge($this->uses, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); + return new Stmt\Trait_($this->name, ['stmts' => \array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php index 58da52345..ad40a553b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php @@ -9,14 +9,15 @@ use PhpParser\Node\Stmt; class Use_ implements Builder { - protected $name; - protected $type; - protected $alias = null; + protected Node\Name $name; + /** @var Stmt\Use_::TYPE_* */ + protected int $type; + protected ?string $alias = null; /** * Creates a name use (alias) builder. * * @param Node\Name|string $name Name of the entity (namespace, class, function, constant) to alias - * @param int $type One of the Stmt\Use_::TYPE_* constants + * @param Stmt\Use_::TYPE_* $type One of the Stmt\Use_::TYPE_* constants */ public function __construct($name, int $type) { @@ -42,6 +43,6 @@ public function as(string $alias) */ public function getNode() : Node { - return new Stmt\Use_([new Stmt\UseUse($this->name, $this->alias)], $this->type); + return new Stmt\Use_([new Node\UseItem($this->name, $this->alias)], $this->type); } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php index 936e7e0fa..f056e2e3e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php @@ -16,9 +16,7 @@ class BuilderFactory * Creates an attribute node. * * @param string|Name $name Name of the attribute - * @param array $args Attribute named arguments - * - * @return Node\Attribute + * @param array $args Attribute named arguments */ public function attribute($name, array $args = []) : \PhpParser\Node\Attribute { @@ -84,7 +82,7 @@ public function enum(string $name) : \PhpParser\Builder\Enum_ * * @param Node\Name|string ...$traits Trait names * - * @return Builder\TraitUse The create trait use builder + * @return Builder\TraitUse The created trait use builder */ public function useTrait(...$traits) : \PhpParser\Builder\TraitUse { @@ -93,10 +91,10 @@ public function useTrait(...$traits) : \PhpParser\Builder\TraitUse /** * Creates a trait use adaptation builder. * - * @param Node\Name|string|null $trait Trait name + * @param Node\Name|string|null $trait Trait name * @param Node\Identifier|string $method Method name * - * @return Builder\TraitUseAdaptation The create trait use adaptation builder + * @return Builder\TraitUseAdaptation The created trait use adaptation builder */ public function traitUseAdaptation($trait, $method = null) : \PhpParser\Builder\TraitUseAdaptation { @@ -186,7 +184,7 @@ public function useConst($name) : \PhpParser\Builder\Use_ /** * Creates a class constant builder. * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return Builder\ClassConst The created use const builder @@ -198,7 +196,7 @@ public function classConst($name, $value) : \PhpParser\Builder\ClassConst /** * Creates an enum case builder. * - * @param string|Identifier $name Name + * @param string|Identifier $name Name * * @return Builder\EnumCase The created use const builder */ @@ -210,8 +208,6 @@ public function enumCase($name) : \PhpParser\Builder\EnumCase * Creates node a for a literal value. * * @param Expr|bool|null|int|float|string|array|\UnitEnum $value $value - * - * @return Expr */ public function val($value) : Expr { @@ -221,8 +217,6 @@ public function val($value) : Expr * Creates variable node. * * @param string|Expr $name Name - * - * @return Expr\Variable */ public function var($name) : Expr\Variable { @@ -238,7 +232,7 @@ public function var($name) : Expr\Variable * * @param array $args List of arguments to normalize * - * @return Arg[] + * @return list */ public function args(array $args) : array { @@ -258,9 +252,7 @@ public function args(array $args) : array * Creates a function call node. * * @param string|Name|Expr $name Function name - * @param array $args Function arguments - * - * @return Expr\FuncCall + * @param array $args Function arguments */ public function funcCall($name, array $args = []) : Expr\FuncCall { @@ -269,11 +261,9 @@ public function funcCall($name, array $args = []) : Expr\FuncCall /** * Creates a method call node. * - * @param Expr $var Variable the method is called on + * @param Expr $var Variable the method is called on * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\MethodCall + * @param array $args Method arguments */ public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { @@ -282,11 +272,9 @@ public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall /** * Creates a static method call node. * - * @param string|Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Method arguments - * - * @return Expr\StaticCall + * @param string|Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Method arguments */ public function staticCall($class, $name, array $args = []) : Expr\StaticCall { @@ -296,9 +284,7 @@ public function staticCall($class, $name, array $args = []) : Expr\StaticCall * Creates an object creation node. * * @param string|Name|Expr $class Class name - * @param array $args Constructor arguments - * - * @return Expr\New_ + * @param array $args Constructor arguments */ public function new($class, array $args = []) : Expr\New_ { @@ -308,8 +294,6 @@ public function new($class, array $args = []) : Expr\New_ * Creates a constant fetch node. * * @param string|Name $name Constant name - * - * @return Expr\ConstFetch */ public function constFetch($name) : Expr\ConstFetch { @@ -318,10 +302,8 @@ public function constFetch($name) : Expr\ConstFetch /** * Creates a property fetch node. * - * @param Expr $var Variable holding object + * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Property name - * - * @return Expr\PropertyFetch */ public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { @@ -331,9 +313,7 @@ public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch * Creates a class constant fetch node. * * @param string|Name|Expr $class Class name - * @param string|Identifier|Expr $name Constant name - * - * @return Expr\ClassConstFetch + * @param string|Identifier|Expr $name Constant name */ public function classConstFetch($class, $name) : Expr\ClassConstFetch { @@ -343,8 +323,6 @@ public function classConstFetch($class, $name) : Expr\ClassConstFetch * Creates nested Concat nodes from a list of expressions. * * @param Expr|string ...$exprs Expressions or literal strings - * - * @return Concat */ public function concat(...$exprs) : Concat { @@ -360,7 +338,6 @@ public function concat(...$exprs) : Concat } /** * @param string|Expr $expr - * @return Expr */ private function normalizeStringExpr($expr) : Expr { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php index 4671e84b6..6ffb989ab 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php @@ -188,10 +188,10 @@ public static function normalizeValue($value) : Expr return new Expr\ConstFetch(new Name($value ? 'true' : 'false')); } if (\is_int($value)) { - return new Scalar\LNumber($value); + return new Scalar\Int_($value); } if (\is_float($value)) { - return new Scalar\DNumber($value); + return new Scalar\Float_($value); } if (\is_string($value)) { return new Scalar\String_($value); @@ -202,10 +202,10 @@ public static function normalizeValue($value) : Expr foreach ($value as $itemKey => $itemValue) { // for consecutive, numeric keys don't generate keys if (null !== $lastKey && ++$lastKey === $itemKey) { - $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue)); + $items[] = new \PhpParser\Node\ArrayItem(self::normalizeValue($itemValue)); } else { $lastKey = null; - $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue), self::normalizeValue($itemKey)); + $items[] = new \PhpParser\Node\ArrayItem(self::normalizeValue($itemValue), self::normalizeValue($itemKey)); } } return new Expr\Array_($items); @@ -253,13 +253,13 @@ public static function normalizeAttribute($attribute) : \PhpParser\Node\Attribut * Adds a modifier and returns new modifier bitmask. * * @param int $modifiers Existing modifiers - * @param int $modifier Modifier to set + * @param int $modifier Modifier to set * * @return int New modifiers */ public static function addModifier(int $modifiers, int $modifier) : int { - Stmt\Class_::verifyModifier($modifiers, $modifier); + \PhpParser\Modifiers::verifyModifier($modifiers, $modifier); return $modifiers | $modifier; } /** @@ -268,7 +268,7 @@ public static function addModifier(int $modifiers, int $modifier) : int */ public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { - Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); + \PhpParser\Modifiers::verifyClassModifier($existingModifiers, $modifierToSet); return $existingModifiers | $modifierToSet; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Comment.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Comment.php index 8e3aa00ab..2f5728179 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Comment.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Comment.php @@ -5,20 +5,20 @@ class Comment implements \JsonSerializable { - protected $text; - protected $startLine; - protected $startFilePos; - protected $startTokenPos; - protected $endLine; - protected $endFilePos; - protected $endTokenPos; + protected string $text; + protected int $startLine; + protected int $startFilePos; + protected int $startTokenPos; + protected int $endLine; + protected int $endFilePos; + protected int $endTokenPos; /** * Constructs a comment node. * - * @param string $text Comment text (including comment delimiters like /*) - * @param int $startLine Line number the comment started on - * @param int $startFilePos File offset the comment started on - * @param int $startTokenPos Token offset the comment started on + * @param string $text Comment text (including comment delimiters like /*) + * @param int $startLine Line number the comment started on + * @param int $startFilePos File offset the comment started on + * @param int $startTokenPos Token offset the comment started on */ public function __construct(string $text, int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1, int $endLine = -1, int $endFilePos = -1, int $endTokenPos = -1) { @@ -43,6 +43,7 @@ public function getText() : string * Gets the line number the comment started on. * * @return int Line number (or -1 if not available) + * @phpstan-return -1|positive-int */ public function getStartLine() : int { @@ -70,6 +71,7 @@ public function getStartTokenPos() : int * Gets the line number the comment ends on. * * @return int Line number (or -1 if not available) + * @phpstan-return -1|positive-int */ public function getEndLine() : int { @@ -93,39 +95,6 @@ public function getEndTokenPos() : int { return $this->endTokenPos; } - /** - * Gets the line number the comment started on. - * - * @deprecated Use getStartLine() instead - * - * @return int Line number - */ - public function getLine() : int - { - return $this->startLine; - } - /** - * Gets the file offset the comment started on. - * - * @deprecated Use getStartFilePos() instead - * - * @return int File offset - */ - public function getFilePos() : int - { - return $this->startFilePos; - } - /** - * Gets the token offset the comment started on. - * - * @deprecated Use getStartTokenPos() instead - * - * @return int Token offset - */ - public function getTokenPos() : int - { - return $this->startTokenPos; - } /** * Gets the comment text. * @@ -140,19 +109,20 @@ public function __toString() : string * * "Reformatted" here means that we try to clean up the whitespace at the * starts of the lines. This is necessary because we receive the comments - * without trailing whitespace on the first line, but with trailing whitespace + * without leading whitespace on the first line, but with leading whitespace * on all subsequent lines. * - * @return mixed|string + * Additionally, this normalizes CRLF newlines to LF newlines. */ - public function getReformattedText() + public function getReformattedText() : string { - $text = \trim($this->text); + $text = \str_replace("\r\n", "\n", $this->text); $newlinePos = \strpos($text, "\n"); if (\false === $newlinePos) { // Single line comments don't need further processing return $text; - } elseif (\preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\\R\\s+\\*.*)+$)', $text)) { + } + if (\preg_match('(^.*(?:\\n\\s+\\*.*)+$)', $text)) { // Multi line comment of the type // // /* @@ -161,8 +131,9 @@ public function getReformattedText() // */ // // is handled by replacing the whitespace sequences before the * by a single space - return \preg_replace('(^\\s+\\*)m', ' *', $this->text); - } elseif (\preg_match('(^/\\*\\*?\\s*[\\r\\n])', $text) && \preg_match('(\\n(\\s*)\\*/$)', $text, $matches)) { + return \preg_replace('(^\\s+\\*)m', ' *', $text); + } + if (\preg_match('(^/\\*\\*?\\s*\\n)', $text) && \preg_match('(\\n(\\s*)\\*/$)', $text, $matches)) { // Multi line comment of the type // // /* @@ -174,7 +145,8 @@ public function getReformattedText() // */ on all lines. So if the last line is " */", then " " is removed at the // start of all lines. return \preg_replace('(^' . \preg_quote($matches[1]) . ')m', '', $text); - } elseif (\preg_match('(^/\\*\\*?\\s*(?!\\s))', $text, $matches)) { + } + if (\preg_match('(^/\\*\\*?\\s*(?!\\s))', $text, $matches)) { // Multi line comment of the type // // /* Some text. @@ -202,7 +174,7 @@ public function getReformattedText() private function getShortestWhitespacePrefixLen(string $str) : int { $lines = \explode("\n", $str); - $shortestPrefixLen = \INF; + $shortestPrefixLen = \PHP_INT_MAX; foreach ($lines as $line) { \preg_match('(^\\s*)', $line, $matches); $prefixLen = \strlen($matches[0]); @@ -213,8 +185,7 @@ private function getShortestWhitespacePrefixLen(string $str) : int return $shortestPrefixLen; } /** - * @return array - * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} + * @return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} */ public function jsonSerialize() : array { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php index e5af08c36..4194c740a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php @@ -1,5 +1,6 @@ evaluate($expr); } + /** @return mixed */ private function evaluate(Expr $expr) { - if ($expr instanceof Scalar\LNumber || $expr instanceof Scalar\DNumber || $expr instanceof Scalar\String_) { + if ($expr instanceof Scalar\Int_ || $expr instanceof Scalar\Float_ || $expr instanceof Scalar\String_) { return $expr->value; } if ($expr instanceof Expr\Array_) { @@ -130,7 +133,7 @@ private function evaluate(Expr $expr) } return ($this->fallbackEvaluator)($expr); } - private function evaluateArray(Expr\Array_ $expr) + private function evaluateArray(Expr\Array_ $expr) : array { $array = []; foreach ($expr->items as $item) { @@ -144,6 +147,7 @@ private function evaluateArray(Expr\Array_ $expr) } return $array; } + /** @return mixed */ private function evaluateTernary(Expr\Ternary $expr) { if (null === $expr->if) { @@ -151,6 +155,7 @@ private function evaluateTernary(Expr\Ternary $expr) } return $this->evaluate($expr->cond) ? $this->evaluate($expr->if) : $this->evaluate($expr->else); } + /** @return mixed */ private function evaluateBinaryOp(Expr\BinaryOp $expr) { if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch) { @@ -219,6 +224,7 @@ private function evaluateBinaryOp(Expr\BinaryOp $expr) } throw new \Exception('Should not happen'); } + /** @return mixed */ private function evaluateConstFetch(Expr\ConstFetch $expr) { $name = $expr->name->toLowerString(); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Error.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Error.php index 421892b80..70bc5da3a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Error.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Error.php @@ -5,23 +5,19 @@ class Error extends \RuntimeException { - protected $rawMessage; - protected $attributes; + protected string $rawMessage; + /** @var array */ + protected array $attributes; /** * Creates an Exception signifying a parse error. * - * @param string $message Error message - * @param array|int $attributes Attributes of node/token where error occurred - * (or start line of error -- deprecated) + * @param string $message Error message + * @param array $attributes Attributes of node/token where error occurred */ - public function __construct(string $message, $attributes = []) + public function __construct(string $message, array $attributes = []) { $this->rawMessage = $message; - if (\is_array($attributes)) { - $this->attributes = $attributes; - } else { - $this->attributes = ['startLine' => $attributes]; - } + $this->attributes = $attributes; $this->updateMessage(); } /** @@ -37,6 +33,7 @@ public function getRawMessage() : string * Gets the line the error starts in. * * @return int Error start line + * @phpstan-return -1|positive-int */ public function getStartLine() : int { @@ -46,6 +43,7 @@ public function getStartLine() : int * Gets the line the error ends in. * * @return int Error end line + * @phpstan-return -1|positive-int */ public function getEndLine() : int { @@ -54,7 +52,7 @@ public function getEndLine() : int /** * Gets the attributes of the node/token the error occurred at. * - * @return array + * @return array */ public function getAttributes() : array { @@ -63,9 +61,9 @@ public function getAttributes() : array /** * Sets the attributes of the node/token the error occurred at. * - * @param array $attributes + * @param array $attributes */ - public function setAttributes(array $attributes) + public function setAttributes(array $attributes) : void { $this->attributes = $attributes; $this->updateMessage(); @@ -75,7 +73,7 @@ public function setAttributes(array $attributes) * * @param string $message Error message */ - public function setRawMessage(string $message) + public function setRawMessage(string $message) : void { $this->rawMessage = $message; $this->updateMessage(); @@ -85,7 +83,7 @@ public function setRawMessage(string $message) * * @param int $line Error start line */ - public function setStartLine(int $line) + public function setStartLine(int $line) : void { $this->attributes['startLine'] = $line; $this->updateMessage(); @@ -94,8 +92,6 @@ public function setStartLine(int $line) * Returns whether the error has start and end column information. * * For column information enable the startFilePos and endFilePos in the lexer options. - * - * @return bool */ public function hasColumnInfo() : bool { @@ -105,7 +101,6 @@ public function hasColumnInfo() : bool * Gets the start column (1-based) into the line where the error started. * * @param string $code Source code of the file - * @return int */ public function getStartColumn(string $code) : int { @@ -118,7 +113,6 @@ public function getStartColumn(string $code) : int * Gets the end column (1-based) into the line where the error ended. * * @param string $code Source code of the file - * @return int */ public function getEndColumn(string $code) : int { @@ -142,7 +136,7 @@ public function getMessageWithColumnInfo(string $code) : string * Converts a file offset into a column. * * @param string $code Source code that $pos indexes into - * @param int $pos 0-based position in $code + * @param int $pos 0-based position in $code * * @return int 1-based column (relative to start of line) */ @@ -160,7 +154,7 @@ private function toColumn(string $code, int $pos) : int /** * Updates the exception message after a change to rawMessage or rawLine. */ - protected function updateMessage() + protected function updateMessage() : void { $this->message = $this->rawMessage; if (-1 === $this->getStartLine()) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php index b561f3527..ad5951ce4 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php @@ -10,5 +10,5 @@ interface ErrorHandler * * @param Error $error The error that needs to be handled */ - public function handleError(\PhpParser\Error $error); + public function handleError(\PhpParser\Error $error) : void; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php index 536fc0bf5..6e832da32 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php @@ -13,8 +13,8 @@ class Collecting implements ErrorHandler { /** @var Error[] Collected errors */ - private $errors = []; - public function handleError(Error $error) + private array $errors = []; + public function handleError(Error $error) : void { $this->errors[] = $error; } @@ -29,8 +29,6 @@ public function getErrors() : array } /** * Check whether there are any errors. - * - * @return bool */ public function hasErrors() : bool { @@ -39,7 +37,7 @@ public function hasErrors() : bool /** * Reset/clear collected errors. */ - public function clearErrors() + public function clearErrors() : void { $this->errors = []; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php index 7308184f7..c2dd3b7c7 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php @@ -12,7 +12,7 @@ */ class Throwing implements ErrorHandler { - public function handleError(Error $error) + public function handleError(Error $error) : void { throw $error; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php index d020940dd..1ca00a069 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php @@ -8,16 +8,21 @@ */ class DiffElem { - const TYPE_KEEP = 0; - const TYPE_REMOVE = 1; - const TYPE_ADD = 2; - const TYPE_REPLACE = 3; + public const TYPE_KEEP = 0; + public const TYPE_REMOVE = 1; + public const TYPE_ADD = 2; + public const TYPE_REPLACE = 3; /** @var int One of the TYPE_* constants */ - public $type; + public int $type; /** @var mixed Is null for add operations */ public $old; /** @var mixed Is null for remove operations */ public $new; + /** + * @param int $type One of the TYPE_* constants + * @param mixed $old Is null for add operations + * @param mixed $new Is null for remove operations + */ public function __construct(int $type, $old, $new) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php index 893ec6f04..37ee89fb8 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php @@ -9,15 +9,17 @@ * Myers, Eugene W. "An O (ND) difference algorithm and its variations." * Algorithmica 1.1 (1986): 251-266. * + * @template T * @internal */ class Differ { + /** @var callable(T, T): bool */ private $isEqual; /** * Create differ over the given equality relation. * - * @param callable $isEqual Equality relation with signature function($a, $b) : bool + * @param callable(T, T): bool $isEqual Equality relation */ public function __construct(callable $isEqual) { @@ -26,13 +28,15 @@ public function __construct(callable $isEqual) /** * Calculate diff (edit script) from $old to $new. * - * @param array $old Original array - * @param array $new New array + * @param T[] $old Original array + * @param T[] $new New array * * @return DiffElem[] Diff (edit script) */ - public function diff(array $old, array $new) + public function diff(array $old, array $new) : array { + $old = \array_values($old); + $new = \array_values($new); list($trace, $x, $y) = $this->calculateTrace($old, $new); return $this->extractDiff($trace, $x, $y, $old, $new); } @@ -42,19 +46,24 @@ public function diff(array $old, array $new) * If a sequence of remove operations is followed by the same number of add operations, these * will be coalesced into replace operations. * - * @param array $old Original array - * @param array $new New array + * @param T[] $old Original array + * @param T[] $new New array * * @return DiffElem[] Diff (edit script), including replace operations */ - public function diffWithReplacements(array $old, array $new) + public function diffWithReplacements(array $old, array $new) : array { return $this->coalesceReplacements($this->diff($old, $new)); } - private function calculateTrace(array $a, array $b) + /** + * @param T[] $old + * @param T[] $new + * @return array{array>, int, int} + */ + private function calculateTrace(array $old, array $new) : array { - $n = \count($a); - $m = \count($b); + $n = \count($old); + $m = \count($new); $max = $n + $m; $v = [1 => 0]; $trace = []; @@ -67,7 +76,7 @@ private function calculateTrace(array $a, array $b) $x = $v[$k - 1] + 1; } $y = $x - $k; - while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { + while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { $x++; $y++; } @@ -79,7 +88,13 @@ private function calculateTrace(array $a, array $b) } throw new \Exception('Should not happen'); } - private function extractDiff(array $trace, int $x, int $y, array $a, array $b) + /** + * @param array> $trace + * @param T[] $old + * @param T[] $new + * @return DiffElem[] + */ + private function extractDiff(array $trace, int $x, int $y, array $old, array $new) : array { $result = []; for ($d = \count($trace) - 1; $d >= 0; $d--) { @@ -93,7 +108,7 @@ private function extractDiff(array $trace, int $x, int $y, array $a, array $b) $prevX = $v[$prevK]; $prevY = $prevX - $prevK; while ($x > $prevX && $y > $prevY) { - $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_KEEP, $a[$x - 1], $b[$y - 1]); + $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); $x--; $y--; } @@ -101,11 +116,11 @@ private function extractDiff(array $trace, int $x, int $y, array $a, array $b) break; } while ($x > $prevX) { - $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_REMOVE, $a[$x - 1], null); + $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_REMOVE, $old[$x - 1], null); $x--; } while ($y > $prevY) { - $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_ADD, null, $b[$y - 1]); + $result[] = new \PhpParser\Internal\DiffElem(\PhpParser\Internal\DiffElem::TYPE_ADD, null, $new[$y - 1]); $y--; } } @@ -117,7 +132,7 @@ private function extractDiff(array $trace, int $x, int $y, array $a, array $b) * @param DiffElem[] $diff * @return DiffElem[] */ - private function coalesceReplacements(array $diff) + private function coalesceReplacements(array $diff) : array { $newDiff = []; $c = \count($diff); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php index f01ca2e2e..1a4bd7fa2 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php @@ -18,17 +18,25 @@ class PrintableNewAnonClassNode extends Expr { /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var int Modifiers */ - public $flags; - /** @var Node\Arg[] Arguments */ - public $args; + public int $flags; + /** @var (Node\Arg|Node\VariadicPlaceholder)[] Arguments */ + public array $args; /** @var null|Node\Name Name of extended class */ - public $extends; + public ?Node\Name $extends; /** @var Node\Name[] Names of implemented interfaces */ - public $implements; + public array $implements; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; + /** + * @param Node\AttributeGroup[] $attrGroups PHP attribute groups + * @param (Node\Arg|Node\VariadicPlaceholder)[] $args Arguments + * @param Node\Name|null $extends Name of extended class + * @param Node\Name[] $implements Names of implemented interfaces + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Attributes + */ public function __construct(array $attrGroups, int $flags, array $args, ?Node\Name $extends, array $implements, array $stmts, array $attributes) { parent::__construct($attributes); @@ -39,7 +47,7 @@ public function __construct(array $attrGroups, int $flags, array $args, ?Node\Na $this->implements = $implements; $this->stmts = $stmts; } - public static function fromNewNode(Expr\New_ $newNode) + public static function fromNewNode(Expr\New_ $newNode) : self { $class = $newNode->class; \assert($class instanceof Node\Stmt\Class_); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php new file mode 100644 index 000000000..f694a0006 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php @@ -0,0 +1,208 @@ += 80000) { + class TokenPolyfill extends \PhpToken + { + } + return; +} +/** + * This is a polyfill for the PhpToken class introduced in PHP 8.0. We do not actually polyfill + * PhpToken, because composer might end up picking a different polyfill implementation, which does + * not meet our requirements. + * + * @internal + */ +class TokenPolyfill +{ + /** @var int The ID of the token. Either a T_* constant of a character code < 256. */ + public int $id; + /** @var string The textual content of the token. */ + public string $text; + /** @var int The 1-based starting line of the token (or -1 if unknown). */ + public int $line; + /** @var int The 0-based starting position of the token (or -1 if unknown). */ + public int $pos; + /** @var array Tokens ignored by the PHP parser. */ + private const IGNORABLE_TOKENS = [\T_WHITESPACE => \true, \T_COMMENT => \true, \T_DOC_COMMENT => \true, \T_OPEN_TAG => \true]; + /** @var array Tokens that may be part of a T_NAME_* identifier. */ + private static array $identifierTokens; + /** + * Create a Token with the given ID and text, as well optional line and position information. + */ + public final function __construct(int $id, string $text, int $line = -1, int $pos = -1) + { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $pos; + } + /** + * Get the name of the token. For single-char tokens this will be the token character. + * Otherwise it will be a T_* style name, or null if the token ID is unknown. + */ + public function getTokenName() : ?string + { + if ($this->id < 256) { + return \chr($this->id); + } + $name = \token_name($this->id); + return $name === 'UNKNOWN' ? null : $name; + } + /** + * Check whether the token is of the given kind. The kind may be either an integer that matches + * the token ID, a string that matches the token text, or an array of integers/strings. In the + * latter case, the function returns true if any of the kinds in the array match. + * + * @param int|string|(int|string)[] $kind + */ + public function is($kind) : bool + { + if (\is_int($kind)) { + return $this->id === $kind; + } + if (\is_string($kind)) { + return $this->text === $kind; + } + if (\is_array($kind)) { + foreach ($kind as $entry) { + if (\is_int($entry)) { + if ($this->id === $entry) { + return \true; + } + } elseif (\is_string($entry)) { + if ($this->text === $entry) { + return \true; + } + } else { + throw new \TypeError('Argument #1 ($kind) must only have elements of type string|int, ' . \gettype($entry) . ' given'); + } + } + return \false; + } + throw new \TypeError('Argument #1 ($kind) must be of type string|int|array, ' . \gettype($kind) . ' given'); + } + /** + * Check whether this token would be ignored by the PHP parser. Returns true for T_WHITESPACE, + * T_COMMENT, T_DOC_COMMENT and T_OPEN_TAG, and false for everything else. + */ + public function isIgnorable() : bool + { + return isset(self::IGNORABLE_TOKENS[$this->id]); + } + /** + * Return the textual content of the token. + */ + public function __toString() : string + { + return $this->text; + } + /** + * Tokenize the given source code and return an array of tokens. + * + * This performs certain canonicalizations to match the PHP 8.0 token format: + * * Bad characters are represented using T_BAD_CHARACTER rather than omitted. + * * T_COMMENT does not include trailing newlines, instead the newline is part of a following + * T_WHITESPACE token. + * * Namespaced names are represented using T_NAME_* tokens. + * + * @return static[] + */ + public static function tokenize(string $code, int $flags = 0) : array + { + self::init(); + $tokens = []; + $line = 1; + $pos = 0; + $origTokens = \token_get_all($code, $flags); + $numTokens = \count($origTokens); + for ($i = 0; $i < $numTokens; $i++) { + $token = $origTokens[$i]; + if (\is_string($token)) { + if (\strlen($token) === 2) { + // b" and B" are tokenized as single-char tokens, even though they aren't. + $tokens[] = new static(\ord('"'), $token, $line, $pos); + $pos += 2; + } else { + $tokens[] = new static(\ord($token), $token, $line, $pos); + $pos++; + } + } else { + $id = $token[0]; + $text = $token[1]; + // Emulate PHP 8.0 comment format, which does not include trailing whitespace anymore. + if ($id === \T_COMMENT && \substr($text, 0, 2) !== '/*' && \preg_match('/(\\r\\n|\\n|\\r)$/D', $text, $matches)) { + $trailingNewline = $matches[0]; + $text = \substr($text, 0, -\strlen($trailingNewline)); + $tokens[] = new static($id, $text, $line, $pos); + $pos += \strlen($text); + if ($i + 1 < $numTokens && $origTokens[$i + 1][0] === \T_WHITESPACE) { + // Move trailing newline into following T_WHITESPACE token, if it already exists. + $origTokens[$i + 1][1] = $trailingNewline . $origTokens[$i + 1][1]; + $origTokens[$i + 1][2]--; + } else { + // Otherwise, we need to create a new T_WHITESPACE token. + $tokens[] = new static(\T_WHITESPACE, $trailingNewline, $line, $pos); + $line++; + $pos += \strlen($trailingNewline); + } + continue; + } + // Emulate PHP 8.0 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and + // T_STRING into a single token. + if ($id === \T_NS_SEPARATOR || isset(self::$identifierTokens[$id])) { + $newText = $text; + $lastWasSeparator = $id === \T_NS_SEPARATOR; + for ($j = $i + 1; $j < $numTokens; $j++) { + if ($lastWasSeparator) { + if (!isset(self::$identifierTokens[$origTokens[$j][0]])) { + break; + } + $lastWasSeparator = \false; + } else { + if ($origTokens[$j][0] !== \T_NS_SEPARATOR) { + break; + } + $lastWasSeparator = \true; + } + $newText .= $origTokens[$j][1]; + } + if ($lastWasSeparator) { + // Trailing separator is not part of the name. + $j--; + $newText = \substr($newText, 0, -1); + } + if ($j > $i + 1) { + if ($id === \T_NS_SEPARATOR) { + $id = \T_NAME_FULLY_QUALIFIED; + } elseif ($id === \T_NAMESPACE) { + $id = \T_NAME_RELATIVE; + } else { + $id = \T_NAME_QUALIFIED; + } + $tokens[] = new static($id, $newText, $line, $pos); + $pos += \strlen($newText); + $i = $j - 1; + continue; + } + } + $tokens[] = new static($id, $text, $line, $pos); + $line += \substr_count($text, "\n"); + $pos += \strlen($text); + } + } + return $tokens; + } + /** Initialize private static state needed by tokenize(). */ + private static function init() : void + { + if (isset(self::$identifierTokens)) { + return; + } + // Based on semi_reserved production. + self::$identifierTokens = \array_fill_keys([\T_STRING, \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, \T_MATCH], \true); + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php index b95496d51..1a65a9e8f 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace PhpParser\Internal; +use PhpParser\Token; /** * Provides operations on token streams, for use by pretty printer. * @@ -10,27 +11,25 @@ */ class TokenStream { - /** @var array Tokens (in token_get_all format) */ - private $tokens; + /** @var Token[] Tokens (in PhpToken::tokenize() format) */ + private array $tokens; /** @var int[] Map from position to indentation */ - private $indentMap; + private array $indentMap; /** * Create token stream instance. * - * @param array $tokens Tokens in token_get_all() format + * @param Token[] $tokens Tokens in PhpToken::tokenize() format */ - public function __construct(array $tokens) + public function __construct(array $tokens, int $tabWidth) { $this->tokens = $tokens; - $this->indentMap = $this->calcIndentMap(); + $this->indentMap = $this->calcIndentMap($tabWidth); } /** * Whether the given position is immediately surrounded by parenthesis. * * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool + * @param int $endPos End position */ public function haveParens(int $startPos, int $endPos) : bool { @@ -40,9 +39,7 @@ public function haveParens(int $startPos, int $endPos) : bool * Whether the given position is immediately surrounded by braces. * * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool + * @param int $endPos End position */ public function haveBraces(int $startPos, int $endPos) : bool { @@ -53,7 +50,7 @@ public function haveBraces(int $startPos, int $endPos) : bool * * During this check whitespace and comments are skipped. * - * @param int $pos Position before which the token should occur + * @param int $pos Position before which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found @@ -63,11 +60,11 @@ public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool $tokens = $this->tokens; $pos--; for (; $pos >= 0; $pos--) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { + $token = $tokens[$pos]; + if ($token->is($expectedTokenType)) { return \true; } - if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + if (!$token->isIgnorable()) { break; } } @@ -78,7 +75,7 @@ public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool * * During this check whitespace and comments are skipped. * - * @param int $pos Position after which the token should occur + * @param int $pos Position after which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found @@ -87,39 +84,41 @@ public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { $tokens = $this->tokens; $pos++; - for (; $pos < \count($tokens); $pos++) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { + for ($c = \count($tokens); $pos < $c; $pos++) { + $token = $tokens[$pos]; + if ($token->is($expectedTokenType)) { return \true; } - if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + if (!$token->isIgnorable()) { break; } } return \false; } - public function skipLeft(int $pos, $skipTokenType) + /** @param int|string|(int|string)[] $skipTokenType */ + public function skipLeft(int $pos, $skipTokenType) : int { $tokens = $this->tokens; $pos = $this->skipLeftWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } - if ($tokens[$pos][0] !== $skipTokenType) { + if (!$tokens[$pos]->is($skipTokenType)) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } $pos--; return $this->skipLeftWhitespace($pos); } - public function skipRight(int $pos, $skipTokenType) + /** @param int|string|(int|string)[] $skipTokenType */ + public function skipRight(int $pos, $skipTokenType) : int { $tokens = $this->tokens; $pos = $this->skipRightWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } - if ($tokens[$pos][0] !== $skipTokenType) { + if (!$tokens[$pos]->is($skipTokenType)) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } @@ -132,12 +131,11 @@ public function skipRight(int $pos, $skipTokenType) * @param int $pos Token position * @return int Non-whitespace token position */ - public function skipLeftWhitespace(int $pos) + public function skipLeftWhitespace(int $pos) : int { $tokens = $this->tokens; for (; $pos >= 0; $pos--) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + if (!$tokens[$pos]->isIgnorable()) { break; } } @@ -149,23 +147,22 @@ public function skipLeftWhitespace(int $pos) * @param int $pos Token position * @return int Non-whitespace token position */ - public function skipRightWhitespace(int $pos) + public function skipRightWhitespace(int $pos) : int { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + if (!$tokens[$pos]->isIgnorable()) { break; } } return $pos; } - public function findRight(int $pos, $findTokenType) + /** @param int|string|(int|string)[] $findTokenType */ + public function findRight(int $pos, $findTokenType) : int { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type === $findTokenType) { + if ($tokens[$pos]->is($findTokenType)) { return $pos; } } @@ -179,20 +176,16 @@ public function findRight(int $pos, $findTokenType) * @param int|string $tokenType Token type to look for * @return bool Whether the token occurs in the given range */ - public function haveTokenInRange(int $startPos, int $endPos, $tokenType) + public function haveTokenInRange(int $startPos, int $endPos, $tokenType) : bool { $tokens = $this->tokens; for ($pos = $startPos; $pos < $endPos; $pos++) { - if ($tokens[$pos][0] === $tokenType) { + if ($tokens[$pos]->is($tokenType)) { return \true; } } return \false; } - public function haveBracesInRange(int $startPos, int $endPos) - { - return $this->haveTokenInRange($startPos, $endPos, '{') || $this->haveTokenInRange($startPos, $endPos, \T_CURLY_OPEN) || $this->haveTokenInRange($startPos, $endPos, '}'); - } public function haveTagInRange(int $startPos, int $endPos) : bool { return $this->haveTokenInRange($startPos, $endPos, \T_OPEN_TAG) || $this->haveTokenInRange($startPos, $endPos, \T_CLOSE_TAG); @@ -211,8 +204,8 @@ public function getIndentationBefore(int $pos) : int /** * Get the code corresponding to a token offset range, optionally adjusted for indentation. * - * @param int $from Token start position (inclusive) - * @param int $to Token end position (exclusive) + * @param int $from Token start position (inclusive) + * @param int $to Token end position (exclusive) * @param int $indent By how much the code should be indented (can be negative as well) * * @return string Code corresponding to token range, adjusted for indentation @@ -223,23 +216,19 @@ public function getTokenCode(int $from, int $to, int $indent) : string $result = ''; for ($pos = $from; $pos < $to; $pos++) { $token = $tokens[$pos]; - if (\is_array($token)) { - $type = $token[0]; - $content = $token[1]; - if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { - $result .= $content; + $id = $token->id; + $text = $token->text; + if ($id === \T_CONSTANT_ENCAPSED_STRING || $id === \T_ENCAPSED_AND_WHITESPACE) { + $result .= $text; + } else { + // TODO Handle non-space indentation + if ($indent < 0) { + $result .= \str_replace("\n" . \str_repeat(" ", -$indent), "\n", $text); + } elseif ($indent > 0) { + $result .= \str_replace("\n", "\n" . \str_repeat(" ", $indent), $text); } else { - // TODO Handle non-space indentation - if ($indent < 0) { - $result .= \str_replace("\n" . \str_repeat(" ", -$indent), "\n", $content); - } elseif ($indent > 0) { - $result .= \str_replace("\n", "\n" . \str_repeat(" ", $indent), $content); - } else { - $result .= $content; - } + $result .= $text; } - } else { - $result .= $token; } } return $result; @@ -249,17 +238,20 @@ public function getTokenCode(int $from, int $to, int $indent) : string * * @return int[] Token position to indentation map */ - private function calcIndentMap() + private function calcIndentMap(int $tabWidth) : array { $indentMap = []; $indent = 0; - foreach ($this->tokens as $token) { + foreach ($this->tokens as $i => $token) { $indentMap[] = $indent; - if ($token[0] === \T_WHITESPACE) { - $content = $token[1]; + if ($token->id === \T_WHITESPACE) { + $content = $token->text; $newlinePos = \strrpos($content, "\n"); if (\false !== $newlinePos) { - $indent = \strlen($content) - $newlinePos - 1; + $indent = $this->getIndent(\substr($content, $newlinePos + 1), $tabWidth); + } elseif ($i === 1 && $this->tokens[0]->id === \T_OPEN_TAG && $this->tokens[0]->text[\strlen($this->tokens[0]->text) - 1] === "\n") { + // Special case: Newline at the end of opening tag followed by whitespace. + $indent = $this->getIndent($content, $tabWidth); } } } @@ -267,4 +259,11 @@ private function calcIndentMap() $indentMap[] = $indent; return $indentMap; } + private function getIndent(string $ws, int $tabWidth) : int + { + $spaces = \substr_count($ws, " "); + $tabs = \substr_count($ws, "\t"); + \assert(\strlen($ws) === $spaces + $tabs); + return $spaces + $tabs * $tabWidth; + } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php index e509418b9..7bd83120a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php @@ -5,8 +5,9 @@ class JsonDecoder { - /** @var \ReflectionClass[] Node type to reflection class map */ - private $reflectionClassCache; + /** @var \ReflectionClass[] Node type to reflection class map */ + private array $reflectionClassCache; + /** @return mixed */ public function decode(string $json) { $value = \json_decode($json, \true); @@ -15,6 +16,10 @@ public function decode(string $json) } return $this->decodeRecursive($value); } + /** + * @param mixed $value + * @return mixed + */ private function decodeRecursive($value) { if (\is_array($value)) { @@ -43,7 +48,6 @@ private function decodeNode(array $value) : \PhpParser\Node throw new \RuntimeException('Node type must be a string'); } $reflectionClass = $this->reflectionClassFromNodeType($nodeType); - /** @var Node $node */ $node = $reflectionClass->newInstanceWithoutConstructor(); if (isset($value['attributes'])) { if (!\is_array($value['attributes'])) { @@ -67,6 +71,7 @@ private function decodeComment(array $value) : \PhpParser\Comment } return new $className($value['text'], $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1); } + /** @return \ReflectionClass */ private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { if (!isset($this->reflectionClassCache[$nodeType])) { @@ -75,6 +80,7 @@ private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClas } return $this->reflectionClassCache[$nodeType]; } + /** @return class-string */ private function classNameFromNodeType(string $nodeType) : string { $className = 'PhpParser\\Node\\' . \strtr($nodeType, '_', '\\'); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer.php index da74bed24..7a5dda5e6 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer.php @@ -3,463 +3,89 @@ declare (strict_types=1); namespace PhpParser; -use PhpParser\Parser\Tokens; +require __DIR__ . '/compatibility_tokens.php'; class Lexer { - protected $code; - protected $tokens; - protected $pos; - protected $line; - protected $filePos; - protected $prevCloseTagHasNewline; - protected $tokenMap; - protected $dropTokens; - protected $identifierTokens; - private $attributeStartLineUsed; - private $attributeEndLineUsed; - private $attributeStartTokenPosUsed; - private $attributeEndTokenPosUsed; - private $attributeStartFilePosUsed; - private $attributeEndFilePosUsed; - private $attributeCommentsUsed; /** - * Creates a Lexer. + * Tokenize the provided source code. * - * @param array $options Options array. Currently only the 'usedAttributes' option is supported, - * which is an array of attributes to add to the AST nodes. Possible - * attributes are: 'comments', 'startLine', 'endLine', 'startTokenPos', - * 'endTokenPos', 'startFilePos', 'endFilePos'. The option defaults to the - * first three. For more info see getNextToken() docs. - */ - public function __construct(array $options = []) - { - // Create Map from internal tokens to PhpParser tokens. - $this->defineCompatibilityTokens(); - $this->tokenMap = $this->createTokenMap(); - $this->identifierTokens = $this->createIdentifierTokenMap(); - // map of tokens to drop while lexing (the map is only used for isset lookup, - // that's why the value is simply set to 1; the value is never actually used.) - $this->dropTokens = \array_fill_keys([\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1); - $defaultAttributes = ['comments', 'startLine', 'endLine']; - $usedAttributes = \array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, \true); - // Create individual boolean properties to make these checks faster. - $this->attributeStartLineUsed = isset($usedAttributes['startLine']); - $this->attributeEndLineUsed = isset($usedAttributes['endLine']); - $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); - $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); - $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); - $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); - $this->attributeCommentsUsed = isset($usedAttributes['comments']); - } - /** - * Initializes the lexer for lexing the provided source code. + * The token array is in the same format as provided by the PhpToken::tokenize() method in + * PHP 8.0. The tokens are instances of PhpParser\Token, to abstract over a polyfill + * implementation in earlier PHP version. * - * This function does not throw if lexing errors occur. Instead, errors may be retrieved using - * the getErrors() method. + * The token array is terminated by a sentinel token with token ID 0. + * The token array does not discard any tokens (i.e. whitespace and comments are included). + * The token position attributes are against this token array. * - * @param string $code The source code to lex + * @param string $code The source code to tokenize. * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to - * ErrorHandler\Throwing + * ErrorHandler\Throwing. + * @return Token[] Tokens */ - public function startLexing(string $code, ?\PhpParser\ErrorHandler $errorHandler = null) + public function tokenize(string $code, ?\PhpParser\ErrorHandler $errorHandler = null) : array { if (null === $errorHandler) { $errorHandler = new \PhpParser\ErrorHandler\Throwing(); } - $this->code = $code; - // keep the code around for __halt_compiler() handling - $this->pos = -1; - $this->line = 1; - $this->filePos = 0; - // If inline HTML occurs without preceding code, treat it as if it had a leading newline. - // This ensures proper composability, because having a newline is the "safe" assumption. - $this->prevCloseTagHasNewline = \true; $scream = \ini_set('xdebug.scream', '0'); - $this->tokens = @\token_get_all($code); - $this->postprocessTokens($errorHandler); + $tokens = @\PhpParser\Token::tokenize($code); + $this->postprocessTokens($tokens, $errorHandler); if (\false !== $scream) { \ini_set('xdebug.scream', $scream); } - } - private function handleInvalidCharacterRange($start, $end, $line, \PhpParser\ErrorHandler $errorHandler) - { - $tokens = []; - for ($i = $start; $i < $end; $i++) { - $chr = $this->code[$i]; - if ($chr === "\x00") { - // PHP cuts error message after null byte, so need special case - $errorMsg = 'Unexpected null byte'; - } else { - $errorMsg = \sprintf('Unexpected character "%s" (ASCII %d)', $chr, \ord($chr)); - } - $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; - $errorHandler->handleError(new \PhpParser\Error($errorMsg, ['startLine' => $line, 'endLine' => $line, 'startFilePos' => $i, 'endFilePos' => $i])); - } return $tokens; } - /** - * Check whether comment token is unterminated. - * - * @return bool - */ - private function isUnterminatedComment($token) : bool - { - return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) && \substr($token[1], 0, 2) === '/*' && \substr($token[1], -2) !== '*/'; - } - protected function postprocessTokens(\PhpParser\ErrorHandler $errorHandler) - { - // PHP's error handling for token_get_all() is rather bad, so if we want detailed - // error information we need to compute it ourselves. Invalid character errors are - // detected by finding "gaps" in the token array. Unterminated comments are detected - // by checking if a trailing comment has a "*/" at the end. - // - // Additionally, we perform a number of canonicalizations here: - // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. - // * Use PHP 8.0 T_NAME_* tokens. - // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and - // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. - $filePos = 0; - $line = 1; - $numTokens = \count($this->tokens); - for ($i = 0; $i < $numTokens; $i++) { - $token = $this->tokens[$i]; - // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. - // In this case we only need to emit an error. - if ($token[0] === \T_BAD_CHARACTER) { - $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); - } - if ($token[0] === \T_COMMENT && \substr($token[1], 0, 2) !== '/*' && \preg_match('/(\\r\\n|\\n|\\r)$/D', $token[1], $matches)) { - $trailingNewline = $matches[0]; - $token[1] = \substr($token[1], 0, -\strlen($trailingNewline)); - $this->tokens[$i] = $token; - if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { - // Move trailing newline into following T_WHITESPACE token, if it already exists. - $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; - $this->tokens[$i + 1][2]--; - } else { - // Otherwise, we need to create a new T_WHITESPACE token. - \array_splice($this->tokens, $i + 1, 0, [[\T_WHITESPACE, $trailingNewline, $line]]); - $numTokens++; - } - } - // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING - // into a single token. - if (\is_array($token) && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { - $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; - $text = $token[1]; - for ($j = $i + 1; isset($this->tokens[$j]); $j++) { - if ($lastWasSeparator) { - if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { - break; - } - $lastWasSeparator = \false; - } else { - if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { - break; - } - $lastWasSeparator = \true; - } - $text .= $this->tokens[$j][1]; - } - if ($lastWasSeparator) { - // Trailing separator is not part of the name. - $j--; - $text = \substr($text, 0, -1); - } - if ($j > $i + 1) { - if ($token[0] === \T_NS_SEPARATOR) { - $type = \T_NAME_FULLY_QUALIFIED; - } else { - if ($token[0] === \T_NAMESPACE) { - $type = \T_NAME_RELATIVE; - } else { - $type = \T_NAME_QUALIFIED; - } - } - $token = [$type, $text, $line]; - \array_splice($this->tokens, $i, $j - $i, [$token]); - $numTokens -= $j - $i - 1; - } - } - if ($token === '&') { - $next = $i + 1; - while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { - $next++; - } - $followedByVarOrVarArg = isset($this->tokens[$next]) && ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); - $this->tokens[$i] = $token = [$followedByVarOrVarArg ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, '&', $line]; - } - $tokenValue = \is_string($token) ? $token : $token[1]; - $tokenLen = \strlen($tokenValue); - if (\substr($this->code, $filePos, $tokenLen) !== $tokenValue) { - // Something is missing, must be an invalid character - $nextFilePos = \strpos($this->code, $tokenValue, $filePos); - $badCharTokens = $this->handleInvalidCharacterRange($filePos, $nextFilePos, $line, $errorHandler); - $filePos = (int) $nextFilePos; - \array_splice($this->tokens, $i, 0, $badCharTokens); - $numTokens += \count($badCharTokens); - $i += \count($badCharTokens); - } - $filePos += $tokenLen; - $line += \substr_count($tokenValue, "\n"); - } - if ($filePos !== \strlen($this->code)) { - if (\substr($this->code, $filePos, 2) === '/*') { - // Unlike PHP, HHVM will drop unterminated comments entirely - $comment = \substr($this->code, $filePos); - $errorHandler->handleError(new \PhpParser\Error('Unterminated comment', ['startLine' => $line, 'endLine' => $line + \substr_count($comment, "\n"), 'startFilePos' => $filePos, 'endFilePos' => $filePos + \strlen($comment)])); - // Emulate the PHP behavior - $isDocComment = isset($comment[3]) && $comment[3] === '*'; - $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; - } else { - // Invalid characters at the end of the input - $badCharTokens = $this->handleInvalidCharacterRange($filePos, \strlen($this->code), $line, $errorHandler); - $this->tokens = \array_merge($this->tokens, $badCharTokens); - } - return; - } - if (\count($this->tokens) > 0) { - // Check for unterminated comment - $lastToken = $this->tokens[\count($this->tokens) - 1]; - if ($this->isUnterminatedComment($lastToken)) { - $errorHandler->handleError(new \PhpParser\Error('Unterminated comment', ['startLine' => $line - \substr_count($lastToken[1], "\n"), 'endLine' => $line, 'startFilePos' => $filePos - \strlen($lastToken[1]), 'endFilePos' => $filePos])); - } - } - } - /** - * Fetches the next token. - * - * The available attributes are determined by the 'usedAttributes' option, which can - * be specified in the constructor. The following attributes are supported: - * - * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, - * representing all comments that occurred between the previous - * non-discarded token and the current one. - * * 'startLine' => Line in which the node starts. - * * 'endLine' => Line in which the node ends. - * * 'startTokenPos' => Offset into the token array of the first token in the node. - * * 'endTokenPos' => Offset into the token array of the last token in the node. - * * 'startFilePos' => Offset into the code string of the first character that is part of the node. - * * 'endFilePos' => Offset into the code string of the last character that is part of the node. - * - * @param mixed $value Variable to store token content in - * @param mixed $startAttributes Variable to store start attributes in - * @param mixed $endAttributes Variable to store end attributes in - * - * @return int Token id - */ - public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int + private function handleInvalidCharacter(\PhpParser\Token $token, \PhpParser\ErrorHandler $errorHandler) : void { - $startAttributes = []; - $endAttributes = []; - while (1) { - if (isset($this->tokens[++$this->pos])) { - $token = $this->tokens[$this->pos]; - } else { - // EOF token with ID 0 - $token = "\x00"; - } - if ($this->attributeStartLineUsed) { - $startAttributes['startLine'] = $this->line; - } - if ($this->attributeStartTokenPosUsed) { - $startAttributes['startTokenPos'] = $this->pos; - } - if ($this->attributeStartFilePosUsed) { - $startAttributes['startFilePos'] = $this->filePos; - } - if (\is_string($token)) { - $value = $token; - if (isset($token[1])) { - // bug in token_get_all - $this->filePos += 2; - $id = \ord('"'); - } else { - $this->filePos += 1; - $id = \ord($token); - } - } elseif (!isset($this->dropTokens[$token[0]])) { - $value = $token[1]; - $id = $this->tokenMap[$token[0]]; - if (\T_CLOSE_TAG === $token[0]) { - $this->prevCloseTagHasNewline = \false !== \strpos($token[1], "\n") || \false !== \strpos($token[1], "\r"); - } elseif (\T_INLINE_HTML === $token[0]) { - $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; - } - $this->line += \substr_count($value, "\n"); - $this->filePos += \strlen($value); - } else { - $origLine = $this->line; - $origFilePos = $this->filePos; - $this->line += \substr_count($token[1], "\n"); - $this->filePos += \strlen($token[1]); - if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { - if ($this->attributeCommentsUsed) { - $comment = \T_DOC_COMMENT === $token[0] ? new \PhpParser\Comment\Doc($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos) : new \PhpParser\Comment($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos); - $startAttributes['comments'][] = $comment; - } - } - continue; - } - if ($this->attributeEndLineUsed) { - $endAttributes['endLine'] = $this->line; - } - if ($this->attributeEndTokenPosUsed) { - $endAttributes['endTokenPos'] = $this->pos; - } - if ($this->attributeEndFilePosUsed) { - $endAttributes['endFilePos'] = $this->filePos - 1; - } - return $id; + $chr = $token->text; + if ($chr === "\x00") { + // PHP cuts error message after null byte, so need special case + $errorMsg = 'Unexpected null byte'; + } else { + $errorMsg = \sprintf('Unexpected character "%s" (ASCII %d)', $chr, \ord($chr)); } - throw new \RuntimeException('Reached end of lexer loop'); + $errorHandler->handleError(new \PhpParser\Error($errorMsg, ['startLine' => $token->line, 'endLine' => $token->line, 'startFilePos' => $token->pos, 'endFilePos' => $token->pos])); } - /** - * Returns the token array for current code. - * - * The token array is in the same format as provided by the - * token_get_all() function and does not discard tokens (i.e. - * whitespace and comments are included). The token position - * attributes are against this token array. - * - * @return array Array of tokens in token_get_all() format - */ - public function getTokens() : array + private function isUnterminatedComment(\PhpParser\Token $token) : bool { - return $this->tokens; + return $token->is([\T_COMMENT, \T_DOC_COMMENT]) && \substr($token->text, 0, 2) === '/*' && \substr($token->text, -2) !== '*/'; } /** - * Handles __halt_compiler() by returning the text after it. - * - * @return string Remaining text + * @param list $tokens */ - public function handleHaltCompiler() : string - { - // text after T_HALT_COMPILER, still including (); - $textAfter = \substr($this->code, $this->filePos); - // ensure that it is followed by (); - // this simplifies the situation, by not allowing any comments - // in between of the tokens. - if (!\preg_match('~^\\s*\\(\\s*\\)\\s*(?:;|\\?>\\r?\\n?)~', $textAfter, $matches)) { - throw new \PhpParser\Error('__HALT_COMPILER must be followed by "();"'); - } - // prevent the lexer from returning any further tokens - $this->pos = \count($this->tokens); - // return with (); removed - return \substr($textAfter, \strlen($matches[0])); - } - private function defineCompatibilityTokens() + protected function postprocessTokens(array &$tokens, \PhpParser\ErrorHandler $errorHandler) : void { - static $compatTokensDefined = \false; - if ($compatTokensDefined) { + // This function reports errors (bad characters and unterminated comments) in the token + // array, and performs certain canonicalizations: + // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and + // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. + // * Add a sentinel token with ID 0. + $numTokens = \count($tokens); + if ($numTokens === 0) { + // Empty input edge case: Just add the sentinel token. + $tokens[] = new \PhpParser\Token(0, "\x00", 1, 0); return; } - $compatTokens = [ - // PHP 7.4 - 'T_BAD_CHARACTER', - 'T_FN', - 'T_COALESCE_EQUAL', - // PHP 8.0 - 'T_NAME_QUALIFIED', - 'T_NAME_FULLY_QUALIFIED', - 'T_NAME_RELATIVE', - 'T_MATCH', - 'T_NULLSAFE_OBJECT_OPERATOR', - 'T_ATTRIBUTE', - // PHP 8.1 - 'T_ENUM', - 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', - 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', - 'T_READONLY', - ]; - // PHP-Parser might be used together with another library that also emulates some or all - // of these tokens. Perform a sanity-check that all already defined tokens have been - // assigned a unique ID. - $usedTokenIds = []; - foreach ($compatTokens as $token) { - if (\defined($token)) { - $tokenId = \constant($token); - $clashingToken = $usedTokenIds[$tokenId] ?? null; - if ($clashingToken !== null) { - throw new \Error(\sprintf('Token %s has same ID as token %s, ' . 'you may be using a library with broken token emulation', $token, $clashingToken)); - } - $usedTokenIds[$tokenId] = $token; - } - } - // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 - // downwards, but skip any IDs that may already be in use. - $newTokenId = -1; - foreach ($compatTokens as $token) { - if (!\defined($token)) { - while (isset($usedTokenIds[$newTokenId])) { - $newTokenId--; - } - \define($token, $newTokenId); - $newTokenId--; + for ($i = 0; $i < $numTokens; $i++) { + $token = $tokens[$i]; + if ($token->id === \T_BAD_CHARACTER) { + $this->handleInvalidCharacter($token, $errorHandler); } - } - $compatTokensDefined = \true; - } - /** - * Creates the token map. - * - * The token map maps the PHP internal token identifiers - * to the identifiers used by the Parser. Additionally it - * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. - * - * @return array The token map - */ - protected function createTokenMap() : array - { - $tokenMap = []; - // 256 is the minimum possible token number, as everything below - // it is an ASCII value - for ($i = 256; $i < 1000; ++$i) { - if (\T_DOUBLE_COLON === $i) { - // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM - $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; - } elseif (\T_OPEN_TAG_WITH_ECHO === $i) { - // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO - $tokenMap[$i] = Tokens::T_ECHO; - } elseif (\T_CLOSE_TAG === $i) { - // T_CLOSE_TAG is equivalent to ';' - $tokenMap[$i] = \ord(';'); - } elseif ('UNKNOWN' !== ($name = \token_name($i))) { - if ('T_HASHBANG' === $name) { - // HHVM uses a special token for #! hashbang lines - $tokenMap[$i] = Tokens::T_INLINE_HTML; - } elseif (\defined($name = Tokens::class . '::' . $name)) { - // Other tokens can be mapped directly - $tokenMap[$i] = \constant($name); + if ($token->id === \ord('&')) { + $next = $i + 1; + while (isset($tokens[$next]) && $tokens[$next]->id === \T_WHITESPACE) { + $next++; } + $followedByVarOrVarArg = isset($tokens[$next]) && $tokens[$next]->is([\T_VARIABLE, \T_ELLIPSIS]); + $token->id = $followedByVarOrVarArg ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; } } - // HHVM uses a special token for numbers that overflow to double - if (\defined('T_ONUMBER')) { - $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; - } - // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant - if (\defined('T_COMPILER_HALT_OFFSET')) { - $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; + // Check for unterminated comment + $lastToken = $tokens[$numTokens - 1]; + if ($this->isUnterminatedComment($lastToken)) { + $errorHandler->handleError(new \PhpParser\Error('Unterminated comment', ['startLine' => $lastToken->line, 'endLine' => $lastToken->getEndLine(), 'startFilePos' => $lastToken->pos, 'endFilePos' => $lastToken->getEndPos()])); } - // Assign tokens for which we define compatibility constants, as token_name() does not know them. - $tokenMap[\T_FN] = Tokens::T_FN; - $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; - $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; - $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; - $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; - $tokenMap[\T_MATCH] = Tokens::T_MATCH; - $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; - $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; - $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_ENUM] = Tokens::T_ENUM; - $tokenMap[\T_READONLY] = Tokens::T_READONLY; - return $tokenMap; - } - private function createIdentifierTokenMap() : array - { - // Based on semi_reserved production. - return \array_fill_keys([\T_STRING, \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, \T_MATCH], \true); + // Add sentinel token. + $tokens[] = new \PhpParser\Token(0, "\x00", $lastToken->getEndLine(), $lastToken->getEndPos()); } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php index 013674a89..731397e93 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php @@ -6,74 +6,66 @@ use PhpParser\Error; use PhpParser\ErrorHandler; use PhpParser\Lexer; +use PhpParser\Lexer\TokenEmulator\AsymmetricVisibilityTokenEmulator; use PhpParser\Lexer\TokenEmulator\AttributeEmulator; use PhpParser\Lexer\TokenEmulator\EnumTokenEmulator; -use PhpParser\Lexer\TokenEmulator\CoaleseEqualTokenEmulator; use PhpParser\Lexer\TokenEmulator\ExplicitOctalEmulator; -use PhpParser\Lexer\TokenEmulator\FlexibleDocStringEmulator; -use PhpParser\Lexer\TokenEmulator\FnTokenEmulator; use PhpParser\Lexer\TokenEmulator\MatchTokenEmulator; use PhpParser\Lexer\TokenEmulator\NullsafeTokenEmulator; -use PhpParser\Lexer\TokenEmulator\NumericLiteralSeparatorEmulator; +use PhpParser\Lexer\TokenEmulator\PropertyTokenEmulator; use PhpParser\Lexer\TokenEmulator\ReadonlyFunctionTokenEmulator; use PhpParser\Lexer\TokenEmulator\ReadonlyTokenEmulator; use PhpParser\Lexer\TokenEmulator\ReverseEmulator; use PhpParser\Lexer\TokenEmulator\TokenEmulator; +use PhpParser\PhpVersion; +use PhpParser\Token; class Emulative extends Lexer { - const PHP_7_3 = '7.3dev'; - const PHP_7_4 = '7.4dev'; - const PHP_8_0 = '8.0dev'; - const PHP_8_1 = '8.1dev'; - const PHP_8_2 = '8.2dev'; - /** @var mixed[] Patches used to reverse changes introduced in the code */ - private $patches = []; - /** @var TokenEmulator[] */ - private $emulators = []; - /** @var string */ - private $targetPhpVersion; + /** @var array{int, string, string}[] Patches used to reverse changes introduced in the code */ + private array $patches = []; + /** @var list */ + private array $emulators = []; + private PhpVersion $targetPhpVersion; + private PhpVersion $hostPhpVersion; /** - * @param mixed[] $options Lexer options. In addition to the usual options, - * accepts a 'phpVersion' string that specifies the - * version to emulate. Defaults to newest supported. + * @param PhpVersion|null $phpVersion PHP version to emulate. Defaults to newest supported. */ - public function __construct(array $options = []) + public function __construct(?PhpVersion $phpVersion = null) { - $this->targetPhpVersion = $options['phpVersion'] ?? \PhpParser\Lexer\Emulative::PHP_8_2; - unset($options['phpVersion']); - parent::__construct($options); - $emulators = [new FlexibleDocStringEmulator(), new FnTokenEmulator(), new MatchTokenEmulator(), new CoaleseEqualTokenEmulator(), new NumericLiteralSeparatorEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), new ReadonlyTokenEmulator(), new ExplicitOctalEmulator(), new ReadonlyFunctionTokenEmulator()]; + $this->targetPhpVersion = $phpVersion ?? PhpVersion::getNewestSupported(); + $this->hostPhpVersion = PhpVersion::getHostVersion(); + $emulators = [new MatchTokenEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), new ReadonlyTokenEmulator(), new ExplicitOctalEmulator(), new ReadonlyFunctionTokenEmulator(), new PropertyTokenEmulator(), new AsymmetricVisibilityTokenEmulator()]; // Collect emulators that are relevant for the PHP version we're running // and the PHP version we're targeting for emulation. foreach ($emulators as $emulator) { $emulatorPhpVersion = $emulator->getPhpVersion(); if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = $emulator; - } else { - if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { - $this->emulators[] = new ReverseEmulator($emulator); - } + } elseif ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { + $this->emulators[] = new ReverseEmulator($emulator); } } } - public function startLexing(string $code, ?ErrorHandler $errorHandler = null) + public function tokenize(string $code, ?ErrorHandler $errorHandler = null) : array { $emulators = \array_filter($this->emulators, function ($emulator) use($code) { return $emulator->isEmulationNeeded($code); }); if (empty($emulators)) { // Nothing to emulate, yay - parent::startLexing($code, $errorHandler); - return; + return parent::tokenize($code, $errorHandler); + } + if ($errorHandler === null) { + $errorHandler = new ErrorHandler\Throwing(); } $this->patches = []; foreach ($emulators as $emulator) { $code = $emulator->preprocessCode($code, $this->patches); } $collector = new ErrorHandler\Collecting(); - parent::startLexing($code, $collector); + $tokens = parent::tokenize($code, $collector); $this->sortPatches(); - $this->fixupTokens(); + $tokens = $this->fixupTokens($tokens); $errors = $collector->getErrors(); if (!empty($errors)) { $this->fixupErrors($errors); @@ -82,18 +74,19 @@ public function startLexing(string $code, ?ErrorHandler $errorHandler = null) } } foreach ($emulators as $emulator) { - $this->tokens = $emulator->emulate($code, $this->tokens); + $tokens = $emulator->emulate($code, $tokens); } + return $tokens; } - private function isForwardEmulationNeeded(string $emulatorPhpVersion) : bool + private function isForwardEmulationNeeded(PhpVersion $emulatorPhpVersion) : bool { - return \version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); + return $this->hostPhpVersion->older($emulatorPhpVersion) && $this->targetPhpVersion->newerOrEqual($emulatorPhpVersion); } - private function isReverseEmulationNeeded(string $emulatorPhpVersion) : bool + private function isReverseEmulationNeeded(PhpVersion $emulatorPhpVersion) : bool { - return \version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); + return $this->hostPhpVersion->newerOrEqual($emulatorPhpVersion) && $this->targetPhpVersion->older($emulatorPhpVersion); } - private function sortPatches() + private function sortPatches() : void { // Patches may be contributed by different emulators. // Make sure they are sorted by increasing patch position. @@ -101,83 +94,72 @@ private function sortPatches() return $p1[0] <=> $p2[0]; }); } - private function fixupTokens() + /** + * @param list $tokens + * @return list + */ + private function fixupTokens(array $tokens) : array { if (\count($this->patches) === 0) { - return; + return $tokens; } // Load first patch $patchIdx = 0; list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; // We use a manual loop over the tokens, because we modify the array on the fly - $pos = 0; - for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { - $token = $this->tokens[$i]; - if (\is_string($token)) { - if ($patchPos === $pos) { - // Only support replacement for string tokens. - \assert($patchType === 'replace'); - $this->tokens[$i] = $patchText; - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; - } - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - } - $pos += \strlen($token); - continue; - } - $len = \strlen($token[1]); - $posDelta = 0; + $posDelta = 0; + $lineDelta = 0; + for ($i = 0, $c = \count($tokens); $i < $c; $i++) { + $token = $tokens[$i]; + $pos = $token->pos; + $token->pos += $posDelta; + $token->line += $lineDelta; + $localPosDelta = 0; + $len = \strlen($token->text); while ($patchPos >= $pos && $patchPos < $pos + $len) { $patchTextLen = \strlen($patchText); if ($patchType === 'remove') { if ($patchPos === $pos && $patchTextLen === $len) { // Remove token entirely - \array_splice($this->tokens, $i, 1, []); + \array_splice($tokens, $i, 1, []); $i--; $c--; } else { // Remove from token string - $this->tokens[$i][1] = \substr_replace($token[1], '', $patchPos - $pos + $posDelta, $patchTextLen); - $posDelta -= $patchTextLen; + $token->text = \substr_replace($token->text, '', $patchPos - $pos + $localPosDelta, $patchTextLen); + $localPosDelta -= $patchTextLen; } + $lineDelta -= \substr_count($patchText, "\n"); } elseif ($patchType === 'add') { // Insert into the token string - $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, 0); - $posDelta += $patchTextLen; + $token->text = \substr_replace($token->text, $patchText, $patchPos - $pos + $localPosDelta, 0); + $localPosDelta += $patchTextLen; + $lineDelta += \substr_count($patchText, "\n"); + } elseif ($patchType === 'replace') { + // Replace inside the token string + $token->text = \substr_replace($token->text, $patchText, $patchPos - $pos + $localPosDelta, $patchTextLen); } else { - if ($patchType === 'replace') { - // Replace inside the token string - $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen); - } else { - \assert(\false); - } + \assert(\false); } // Fetch the next patch $patchIdx++; if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; + // No more patches. However, we still need to adjust position. + $patchPos = \PHP_INT_MAX; + break; } list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - // Multiple patches may apply to the same token. Reload the current one to check - // If the new patch applies - $token = $this->tokens[$i]; } - $pos += $len; + $posDelta += $localPosDelta; } - // A patch did not apply - \assert(\false); + return $tokens; } /** * Fixup line and position information in errors. * * @param Error[] $errors */ - private function fixupErrors(array $errors) + private function fixupErrors(array $errors) : void { foreach ($errors as $error) { $attrs = $error->getAttributes(); @@ -192,11 +174,9 @@ private function fixupErrors(array $errors) if ($patchType === 'add') { $posDelta += \strlen($patchText); $lineDelta += \substr_count($patchText, "\n"); - } else { - if ($patchType === 'remove') { - $posDelta -= \strlen($patchText); - $lineDelta -= \substr_count($patchText, "\n"); - } + } elseif ($patchType === 'remove') { + $posDelta -= \strlen($patchText); + $lineDelta -= \substr_count($patchText, "\n"); } } $attrs['startFilePos'] += $posDelta; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php new file mode 100644 index 000000000..327e55b81 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php @@ -0,0 +1,66 @@ + \T_PUBLIC_SET, \T_PROTECTED => \T_PROTECTED_SET, \T_PRIVATE => \T_PRIVATE_SET]; + for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { + $token = $tokens[$i]; + if (isset($map[$token->id]) && $i + 3 < $c && $tokens[$i + 1]->text === '(' && $tokens[$i + 2]->id === \T_STRING && \strtolower($tokens[$i + 2]->text) === 'set' && $tokens[$i + 3]->text === ')' && $this->isKeywordContext($tokens, $i)) { + \array_splice($tokens, $i, 4, [new Token($map[$token->id], $token->text . '(' . $tokens[$i + 2]->text . ')', $token->line, $token->pos)]); + $c -= 3; + } + } + return $tokens; + } + public function reverseEmulate(string $code, array $tokens) : array + { + $reverseMap = [\T_PUBLIC_SET => \T_PUBLIC, \T_PROTECTED_SET => \T_PROTECTED, \T_PRIVATE_SET => \T_PRIVATE]; + for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { + $token = $tokens[$i]; + if (isset($reverseMap[$token->id]) && \preg_match('/(public|protected|private)\\((set)\\)/i', $token->text, $matches)) { + [, $modifier, $set] = $matches; + $modifierLen = \strlen($modifier); + \array_splice($tokens, $i, 1, [new Token($reverseMap[$token->id], $modifier, $token->line, $token->pos), new Token(\ord('('), '(', $token->line, $token->pos + $modifierLen), new Token(\T_STRING, $set, $token->line, $token->pos + $modifierLen + 1), new Token(\ord(')'), ')', $token->line, $token->pos + $modifierLen + 4)]); + $i += 3; + $c += 3; + } + } + return $tokens; + } + /** @param Token[] $tokens */ + protected function isKeywordContext(array $tokens, int $pos) : bool + { + $prevToken = $this->getPreviousNonSpaceToken($tokens, $pos); + if ($prevToken === null) { + return \false; + } + return $prevToken->id !== \T_OBJECT_OPERATOR && $prevToken->id !== \T_NULLSAFE_OBJECT_OPERATOR; + } + /** @param Token[] $tokens */ + private function getPreviousNonSpaceToken(array $tokens, int $start) : ?Token + { + for ($i = $start - 1; $i >= 0; --$i) { + if ($tokens[$i]->id === \T_WHITESPACE) { + continue; + } + return $tokens[$i]; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php index 7481f2598..7ddcef996 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php @@ -3,12 +3,13 @@ declare (strict_types=1); namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; +use PhpParser\Token; final class AttributeEmulator extends \PhpParser\Lexer\TokenEmulator\TokenEmulator { - public function getPhpVersion() : string + public function getPhpVersion() : PhpVersion { - return Emulative::PHP_8_0; + return PhpVersion::fromComponents(8, 0); } public function isEmulationNeeded(string $code) : bool { @@ -18,16 +19,13 @@ public function emulate(string $code, array $tokens) : array { // We need to manually iterate and manage a count because we'll change // the tokens array on the way. - $line = 1; for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1] === '[') { - \array_splice($tokens, $i, 2, [[\T_ATTRIBUTE, '#[', $line]]); + $token = $tokens[$i]; + if ($token->text === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '[') { + \array_splice($tokens, $i, 2, [new Token(\T_ATTRIBUTE, '#[', $token->line, $token->pos)]); $c--; continue; } - if (\is_array($tokens[$i])) { - $line += \substr_count($tokens[$i][1], "\n"); - } } return $tokens; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php deleted file mode 100644 index 2b9f54df0..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php +++ /dev/null @@ -1,41 +0,0 @@ -id === \T_WHITESPACE && $tokens[$pos + 2]->id === \T_STRING; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php index fc6a179bc..f97d5b253 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php @@ -3,12 +3,13 @@ declare (strict_types=1); namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; +use PhpParser\Token; class ExplicitOctalEmulator extends \PhpParser\Lexer\TokenEmulator\TokenEmulator { - public function getPhpVersion() : string + public function getPhpVersion() : PhpVersion { - return Emulative::PHP_8_1; + return PhpVersion::fromComponents(8, 1); } public function isEmulationNeeded(string $code) : bool { @@ -17,9 +18,10 @@ public function isEmulationNeeded(string $code) : bool public function emulate(string $code, array $tokens) : array { for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { - if ($tokens[$i][0] == \T_LNUMBER && $tokens[$i][1] === '0' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] == \T_STRING && \preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1][1])) { - $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1][1]); - \array_splice($tokens, $i, 2, [[$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]]]); + $token = $tokens[$i]; + if ($token->id == \T_LNUMBER && $token->text === '0' && isset($tokens[$i + 1]) && $tokens[$i + 1]->id == \T_STRING && \preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1]->text)) { + $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1]->text); + \array_splice($tokens, $i, 2, [new Token($tokenKind, '0' . $tokens[$i + 1]->text, $token->line, $token->pos)]); $c--; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php deleted file mode 100644 index eb4ff0484..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php +++ /dev/null @@ -1,66 +0,0 @@ -\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x -REGEX; - public function getPhpVersion() : string - { - return Emulative::PHP_7_3; - } - public function isEmulationNeeded(string $code) : bool - { - return \strpos($code, '<<<') !== \false; - } - public function emulate(string $code, array $tokens) : array - { - // Handled by preprocessing + fixup. - return $tokens; - } - public function reverseEmulate(string $code, array $tokens) : array - { - // Not supported. - return $tokens; - } - public function preprocessCode(string $code, array &$patches) : string - { - if (!\preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE)) { - // No heredoc/nowdoc found - return $code; - } - // Keep track of how much we need to adjust string offsets due to the modifications we - // already made - $posDelta = 0; - foreach ($matches as $match) { - $indentation = $match['indentation'][0]; - $indentationStart = $match['indentation'][1]; - $separator = $match['separator'][0]; - $separatorStart = $match['separator'][1]; - if ($indentation === '' && $separator !== '') { - // Ordinary heredoc/nowdoc - continue; - } - if ($indentation !== '') { - // Remove indentation - $indentationLen = \strlen($indentation); - $code = \substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); - $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; - $posDelta -= $indentationLen; - } - if ($separator === '') { - // Insert newline as separator - $code = \substr_replace($code, "\n", $separatorStart + $posDelta, 0); - $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; - $posDelta += 1; - } - } - return $code; - } -} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php deleted file mode 100644 index c24034140..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php +++ /dev/null @@ -1,21 +0,0 @@ -getKeywordString()) !== \false; } + /** @param Token[] $tokens */ protected function isKeywordContext(array $tokens, int $pos) : bool { - $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); - return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; + $prevToken = $this->getPreviousNonSpaceToken($tokens, $pos); + if ($prevToken === null) { + return \false; + } + return $prevToken->id !== \T_OBJECT_OPERATOR && $prevToken->id !== \T_NULLSAFE_OBJECT_OPERATOR; } public function emulate(string $code, array $tokens) : array { $keywordString = $this->getKeywordString(); foreach ($tokens as $i => $token) { - if ($token[0] === \T_STRING && \strtolower($token[1]) === $keywordString && $this->isKeywordContext($tokens, $i)) { - $tokens[$i][0] = $this->getKeywordToken(); + if ($token->id === \T_STRING && \strtolower($token->text) === $keywordString && $this->isKeywordContext($tokens, $i)) { + $token->id = $this->getKeywordToken(); } } return $tokens; } - /** - * @param mixed[] $tokens - * @return array|string|null - */ - private function getPreviousNonSpaceToken(array $tokens, int $start) + /** @param Token[] $tokens */ + private function getPreviousNonSpaceToken(array $tokens, int $start) : ?Token { for ($i = $start - 1; $i >= 0; --$i) { - if ($tokens[$i][0] === \T_WHITESPACE) { + if ($tokens[$i]->id === \T_WHITESPACE) { continue; } return $tokens[$i]; @@ -43,9 +45,9 @@ private function getPreviousNonSpaceToken(array $tokens, int $start) public function reverseEmulate(string $code, array $tokens) : array { $keywordToken = $this->getKeywordToken(); - foreach ($tokens as $i => $token) { - if ($token[0] === $keywordToken) { - $tokens[$i][0] = \T_STRING; + foreach ($tokens as $token) { + if ($token->id === $keywordToken) { + $token->id = \T_STRING; } } return $tokens; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php index 93892930d..732f859fa 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; final class MatchTokenEmulator extends \PhpParser\Lexer\TokenEmulator\KeywordEmulator { - public function getPhpVersion() : string + public function getPhpVersion() : PhpVersion { - return Emulative::PHP_8_0; + return PhpVersion::fromComponents(8, 0); } public function getKeywordString() : string { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php index 83c5c4d0b..639f47dca 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php @@ -3,12 +3,13 @@ declare (strict_types=1); namespace PhpParser\Lexer\TokenEmulator; -use PhpParser\Lexer\Emulative; +use PhpParser\PhpVersion; +use PhpParser\Token; final class NullsafeTokenEmulator extends \PhpParser\Lexer\TokenEmulator\TokenEmulator { - public function getPhpVersion() : string + public function getPhpVersion() : PhpVersion { - return Emulative::PHP_8_0; + return PhpVersion::fromComponents(8, 0); } public function isEmulationNeeded(string $code) : bool { @@ -18,26 +19,24 @@ public function emulate(string $code, array $tokens) : array { // We need to manually iterate and manage a count because we'll change // the tokens array on the way - $line = 1; for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { - \array_splice($tokens, $i, 2, [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line]]); + $token = $tokens[$i]; + if ($token->text === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1]->id === \T_OBJECT_OPERATOR) { + \array_splice($tokens, $i, 2, [new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos)]); $c--; continue; } // Handle ?-> inside encapsed string. - if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) && $tokens[$i - 1][0] === \T_VARIABLE && \preg_match('/^\\?->([a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*)/', $tokens[$i][1], $matches)) { - $replacement = [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], [\T_STRING, $matches[1], $line]]; - if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { - $replacement[] = [\T_ENCAPSED_AND_WHITESPACE, \substr($tokens[$i][1], \strlen($matches[0])), $line]; + if ($token->id === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) && $tokens[$i - 1]->id === \T_VARIABLE && \preg_match('/^\\?->([a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*)/', $token->text, $matches)) { + $replacement = [new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos), new Token(\T_STRING, $matches[1], $token->line, $token->pos + 3)]; + $matchLen = \strlen($matches[0]); + if ($matchLen !== \strlen($token->text)) { + $replacement[] = new Token(\T_ENCAPSED_AND_WHITESPACE, \substr($token->text, $matchLen), $token->line, $token->pos + $matchLen); } \array_splice($tokens, $i, 1, $replacement); $c += \count($replacement) - 1; continue; } - if (\is_array($tokens[$i])) { - $line += \substr_count($tokens[$i][1], "\n"); - } } return $tokens; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php deleted file mode 100644 index 3de1690d3..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php +++ /dev/null @@ -1,88 +0,0 @@ -resolveIntegerOrFloatToken($match); - $newTokens = [[$tokenKind, $match, $token[2]]]; - $numTokens = 1; - $len = $tokenLen; - while ($matchLen > $len) { - $nextToken = $tokens[$i + $numTokens]; - $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; - $nextTokenLen = \strlen($nextTokenText); - $numTokens++; - if ($matchLen < $len + $nextTokenLen) { - // Split trailing characters into a partial token. - \assert(\is_array($nextToken), "Partial token should be an array token"); - $partialText = \substr($nextTokenText, $matchLen - $len); - $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; - break; - } - $len += $nextTokenLen; - } - \array_splice($tokens, $i, $numTokens, $newTokens); - $c -= $numTokens - \count($newTokens); - $codeOffset += $matchLen; - } - return $tokens; - } - private function resolveIntegerOrFloatToken(string $str) : int - { - $str = \str_replace('_', '', $str); - if (\stripos($str, '0b') === 0) { - $num = \bindec($str); - } elseif (\stripos($str, '0x') === 0) { - $num = \hexdec($str); - } elseif (\stripos($str, '0') === 0 && \ctype_digit($str)) { - $num = \octdec($str); - } else { - $num = +$str; - } - return \is_float($num) ? \T_DNUMBER : \T_LNUMBER; - } - public function reverseEmulate(string $code, array $tokens) : array - { - // Numeric separators were not legal code previously, don't bother. - return $tokens; - } -} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php new file mode 100644 index 000000000..3c24e2318 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php @@ -0,0 +1,21 @@ +text === '(' || $tokens[$pos + 1]->id === \T_WHITESPACE && isset($tokens[$pos + 2]) && $tokens[$pos + 2]->text === '(')); } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php index 2a91fba3c..5e1ca9380 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php @@ -3,18 +3,19 @@ declare (strict_types=1); namespace PhpParser\Lexer\TokenEmulator; +use PhpParser\PhpVersion; /** * Reverses emulation direction of the inner emulator. */ final class ReverseEmulator extends \PhpParser\Lexer\TokenEmulator\TokenEmulator { /** @var TokenEmulator Inner emulator */ - private $emulator; + private \PhpParser\Lexer\TokenEmulator\TokenEmulator $emulator; public function __construct(\PhpParser\Lexer\TokenEmulator\TokenEmulator $emulator) { $this->emulator = $emulator; } - public function getPhpVersion() : string + public function getPhpVersion() : PhpVersion { return $this->emulator->getPhpVersion(); } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php index 0de52716f..3159c3fde 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php @@ -3,19 +3,24 @@ declare (strict_types=1); namespace PhpParser\Lexer\TokenEmulator; +use PhpParser\PhpVersion; +use PhpParser\Token; /** @internal */ abstract class TokenEmulator { - public abstract function getPhpVersion() : string; + public abstract function getPhpVersion() : PhpVersion; public abstract function isEmulationNeeded(string $code) : bool; /** - * @return array Modified Tokens + * @param Token[] $tokens Original tokens + * @return Token[] Modified Tokens */ public abstract function emulate(string $code, array $tokens) : array; /** - * @return array Modified Tokens + * @param Token[] $tokens Original tokens + * @return Token[] Modified Tokens */ public abstract function reverseEmulate(string $code, array $tokens) : array; + /** @param array{int, string, string}[] $patches */ public function preprocessCode(string $code, array &$patches) : string { return $code; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php new file mode 100644 index 000000000..3824b74d7 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php @@ -0,0 +1,66 @@ + 'public', self::PROTECTED => 'protected', self::PRIVATE => 'private', self::STATIC => 'static', self::ABSTRACT => 'abstract', self::FINAL => 'final', self::READONLY => 'readonly', self::PUBLIC_SET => 'public(set)', self::PROTECTED_SET => 'protected(set)', self::PRIVATE_SET => 'private(set)']; + public static function toString(int $modifier) : string + { + if (!isset(self::TO_STRING_MAP[$modifier])) { + throw new \InvalidArgumentException("Unknown modifier {$modifier}"); + } + return self::TO_STRING_MAP[$modifier]; + } + private static function isValidModifier(int $modifier) : bool + { + $isPow2 = ($modifier & $modifier - 1) == 0 && $modifier != 0; + return $isPow2 && $modifier <= self::PRIVATE_SET; + } + /** + * @internal + */ + public static function verifyClassModifier(int $a, int $b) : void + { + \assert(self::isValidModifier($b)); + if (($a & $b) != 0) { + throw new \PhpParser\Error('Multiple ' . self::toString($b) . ' modifiers are not allowed'); + } + if ($a & 48 && $b & 48) { + throw new \PhpParser\Error('Cannot use the final modifier on an abstract class'); + } + } + /** + * @internal + */ + public static function verifyModifier(int $a, int $b) : void + { + \assert(self::isValidModifier($b)); + if ($a & \PhpParser\Modifiers::VISIBILITY_MASK && $b & \PhpParser\Modifiers::VISIBILITY_MASK || $a & \PhpParser\Modifiers::VISIBILITY_SET_MASK && $b & \PhpParser\Modifiers::VISIBILITY_SET_MASK) { + throw new \PhpParser\Error('Multiple access type modifiers are not allowed'); + } + if (($a & $b) != 0) { + throw new \PhpParser\Error('Multiple ' . self::toString($b) . ' modifiers are not allowed'); + } + if ($a & 48 && $b & 48) { + throw new \PhpParser\Error('Cannot use the final modifier on an abstract class member'); + } + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NameContext.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NameContext.php index 534b41600..c377653bc 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NameContext.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NameContext.php @@ -9,13 +9,13 @@ class NameContext { /** @var null|Name Current namespace */ - protected $namespace; + protected ?Name $namespace; /** @var Name[][] Map of format [aliasType => [aliasName => originalName]] */ - protected $aliases = []; + protected array $aliases = []; /** @var Name[][] Same as $aliases but preserving original case */ - protected $origAliases = []; + protected array $origAliases = []; /** @var ErrorHandler Error handler */ - protected $errorHandler; + protected \PhpParser\ErrorHandler $errorHandler; /** * Create a name context. * @@ -32,7 +32,7 @@ public function __construct(\PhpParser\ErrorHandler $errorHandler) * * @param Name|null $namespace Null is the global namespace */ - public function startNamespace(?Name $namespace = null) + public function startNamespace(?Name $namespace = null) : void { $this->namespace = $namespace; $this->origAliases = $this->aliases = [Stmt\Use_::TYPE_NORMAL => [], Stmt\Use_::TYPE_FUNCTION => [], Stmt\Use_::TYPE_CONSTANT => []]; @@ -40,12 +40,12 @@ public function startNamespace(?Name $namespace = null) /** * Add an alias / import. * - * @param Name $name Original name - * @param string $aliasName Aliased name - * @param int $type One of Stmt\Use_::TYPE_* - * @param array $errorAttrs Attributes to use to report an error + * @param Name $name Original name + * @param string $aliasName Aliased name + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* + * @param array $errorAttrs Attributes to use to report an error */ - public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) + public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) : void { // Constant names are case sensitive, everything else case insensitive if ($type === Stmt\Use_::TYPE_CONSTANT) { @@ -66,7 +66,7 @@ public function addAlias(Name $name, string $aliasName, int $type, array $errorA * * @return null|Name Namespace (or null if global namespace) */ - public function getNamespace() + public function getNamespace() : ?Name { return $this->namespace; } @@ -74,11 +74,11 @@ public function getNamespace() * Get resolved name. * * @param Name $name Name to resolve - * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} * * @return null|Name Resolved name, or null if static resolution is not possible */ - public function getResolvedName(Name $name, int $type) + public function getResolvedName(Name $name, int $type) : ?Name { // don't resolve special class names if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { @@ -121,7 +121,7 @@ public function getResolvedClassName(Name $name) : Name * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). * * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name[] Possible representations of the name */ @@ -153,7 +153,7 @@ public function getPossibleNames(string $name, int $type) : array // Check for relevant type-specific use statements foreach ($this->origAliases[$type] as $alias => $orig) { if ($type === Stmt\Use_::TYPE_CONSTANT) { - // Constants are are complicated-sensitive + // Constants are complicated-sensitive $normalizedOrig = $this->normalizeConstName($orig->toString()); if ($normalizedOrig === $this->normalizeConstName($name)) { $possibleNames[] = new Name($alias); @@ -171,7 +171,7 @@ public function getPossibleNames(string $name, int $type) : array * Get shortest representation of this fully-qualified name. * * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name Shortest representation */ @@ -190,7 +190,7 @@ public function getShortName(string $name, int $type) : Name } return $shortestName; } - private function resolveAlias(Name $name, $type) + private function resolveAlias(Name $name, int $type) : ?FullyQualified { $firstPart = $name->getFirst(); if ($name->isQualified()) { @@ -211,7 +211,7 @@ private function resolveAlias(Name $name, $type) // No applicable aliases return null; } - private function getNamespaceRelativeName(string $name, string $lcName, int $type) + private function getNamespaceRelativeName(string $name, string $lcName, int $type) : ?Name { if (null === $this->namespace) { return new Name($name); @@ -229,7 +229,7 @@ private function getNamespaceRelativeName(string $name, string $lcName, int $typ } return null; } - private function normalizeConstName(string $name) + private function normalizeConstName(string $name) : string { $nsSep = \strrpos($name, '\\'); if (\false === $nsSep) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node.php index 9aabdedfb..18e68e7fb 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node.php @@ -8,19 +8,23 @@ interface Node /** * Gets the type of the node. * + * @psalm-return non-empty-string * @return string Type of the node */ public function getType() : string; /** * Gets the names of the sub nodes. * - * @return array Names of sub nodes + * @return string[] Names of sub nodes */ public function getSubNodeNames() : array; /** * Gets line the node started in (alias of getStartLine). * * @return int Start line (or -1 if not available) + * @phpstan-return -1|positive-int + * + * @deprecated Use getStartLine() instead */ public function getLine() : int; /** @@ -29,6 +33,7 @@ public function getLine() : int; * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). * * @return int Start line (or -1 if not available) + * @phpstan-return -1|positive-int */ public function getStartLine() : int; /** @@ -37,6 +42,7 @@ public function getStartLine() : int; * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). * * @return int End line (or -1 if not available) + * @phpstan-return -1|positive-int */ public function getEndLine() : int; /** @@ -88,7 +94,7 @@ public function getComments() : array; * * @return null|Comment\Doc Doc comment object or null */ - public function getDocComment(); + public function getDocComment() : ?\PhpParser\Comment\Doc; /** * Sets the doc comment of the node. * @@ -96,27 +102,21 @@ public function getDocComment(); * * @param Comment\Doc $docComment Doc comment to set */ - public function setDocComment(\PhpParser\Comment\Doc $docComment); + public function setDocComment(\PhpParser\Comment\Doc $docComment) : void; /** * Sets an attribute on a node. * - * @param string $key - * @param mixed $value + * @param mixed $value */ - public function setAttribute(string $key, $value); + public function setAttribute(string $key, $value) : void; /** * Returns whether an attribute exists. - * - * @param string $key - * - * @return bool */ public function hasAttribute(string $key) : bool; /** * Returns the value of an attribute. * - * @param string $key - * @param mixed $default + * @param mixed $default * * @return mixed */ @@ -124,13 +124,13 @@ public function getAttribute(string $key, $default = null); /** * Returns all the attributes of this node. * - * @return array + * @return array */ public function getAttributes() : array; /** * Replaces all the attributes of this node. * - * @param array $attributes + * @param array $attributes */ - public function setAttributes(array $attributes); + public function setAttributes(array $attributes) : void; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php index 389923700..d2b00348a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php @@ -3,25 +3,24 @@ declare (strict_types=1); namespace PhpParser\Node; -use PhpParser\Node\VariadicPlaceholder; use PhpParser\NodeAbstract; class Arg extends NodeAbstract { /** @var Identifier|null Parameter name (for named parameters) */ - public $name; + public ?\PhpParser\Node\Identifier $name; /** @var Expr Value to pass */ - public $value; + public \PhpParser\Node\Expr $value; /** @var bool Whether to pass by ref */ - public $byRef; + public bool $byRef; /** @var bool Whether to unpack the argument */ - public $unpack; + public bool $unpack; /** * Constructs a function call argument node. * - * @param Expr $value Value to pass - * @param bool $byRef Whether to pass by ref - * @param bool $unpack Whether to unpack the argument - * @param array $attributes Additional attributes + * @param Expr $value Value to pass + * @param bool $byRef Whether to pass by ref + * @param bool $unpack Whether to unpack the argument + * @param array $attributes Additional attributes * @param Identifier|null $name Parameter name (for named parameters) */ public function __construct(\PhpParser\Node\Expr $value, bool $byRef = \false, bool $unpack = \false, array $attributes = [], ?\PhpParser\Node\Identifier $name = null) diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php new file mode 100644 index 000000000..e02afda95 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php @@ -0,0 +1,43 @@ + $attributes Additional attributes + */ + public function __construct(\PhpParser\Node\Expr $value, ?\PhpParser\Node\Expr $key = null, bool $byRef = \false, array $attributes = [], bool $unpack = \false) + { + $this->attributes = $attributes; + $this->key = $key; + $this->value = $value; + $this->byRef = $byRef; + $this->unpack = $unpack; + } + public function getSubNodeNames() : array + { + return ['key', 'value', 'byRef', 'unpack']; + } + public function getType() : string + { + return 'ArrayItem'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\ArrayItem::class, \PhpParser\Node\Expr\ArrayItem::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php index eaef6eba4..c0317f6df 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php @@ -8,13 +8,13 @@ class Attribute extends NodeAbstract { /** @var Name Attribute name */ - public $name; - /** @var Arg[] Attribute arguments */ - public $args; + public \PhpParser\Node\Name $name; + /** @var list Attribute arguments */ + public array $args; /** - * @param Node\Name $name Attribute name - * @param Arg[] $args Attribute arguments - * @param array $attributes Additional node attributes + * @param Node\Name $name Attribute name + * @param list $args Attribute arguments + * @param array $attributes Additional node attributes */ public function __construct(\PhpParser\Node\Name $name, array $args = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php index 2033a9fc4..6418285e0 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php @@ -3,15 +3,14 @@ declare (strict_types=1); namespace PhpParser\Node; -use PhpParser\Node; use PhpParser\NodeAbstract; class AttributeGroup extends NodeAbstract { /** @var Attribute[] Attributes */ - public $attrs; + public array $attrs; /** * @param Attribute[] $attrs PHP attributes - * @param array $attributes Additional node attributes + * @param array $attributes Additional node attributes */ public function __construct(array $attrs, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php new file mode 100644 index 000000000..9763c7faa --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php @@ -0,0 +1,36 @@ + $attributes Additional attributes + */ + public function __construct(\PhpParser\Node\Expr\Variable $var, bool $byRef = \false, array $attributes = []) + { + $this->attributes = $attributes; + $this->var = $var; + $this->byRef = $byRef; + } + public function getSubNodeNames() : array + { + return ['var', 'byRef']; + } + public function getType() : string + { + return 'ClosureUse'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\ClosureUse::class, \PhpParser\Node\Expr\ClosureUse::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php index a6602239b..ed8916fb1 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php @@ -7,17 +7,17 @@ class Const_ extends NodeAbstract { /** @var Identifier Name */ - public $name; + public \PhpParser\Node\Identifier $name; /** @var Expr Value */ - public $value; + public \PhpParser\Node\Expr $value; /** @var Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; + public ?\PhpParser\Node\Name $namespacedName; /** * Constructs a const node for use in class const and const statements. * - * @param string|Identifier $name Name - * @param Expr $value Value - * @param array $attributes Additional attributes + * @param string|Identifier $name Name + * @param Expr $value Value + * @param array $attributes Additional attributes */ public function __construct($name, \PhpParser\Node\Expr $value, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php new file mode 100644 index 000000000..9e85e86a4 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php @@ -0,0 +1,37 @@ +value pair node. + * + * @param string|Node\Identifier $key Key + * @param Node\Expr $value Value + * @param array $attributes Additional attributes + */ + public function __construct($key, Node\Expr $value, array $attributes = []) + { + $this->attributes = $attributes; + $this->key = \is_string($key) ? new Node\Identifier($key) : $key; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['key', 'value']; + } + public function getType() : string + { + return 'DeclareItem'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\DeclareItem::class, \PhpParser\Node\Stmt\DeclareDeclare::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php index 0447434a5..796b6e6a3 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php @@ -7,15 +7,15 @@ class ArrayDimFetch extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** @var null|Expr Array index / dim */ - public $dim; + public ?Expr $dim; /** * Constructs an array index fetch node. * - * @param Expr $var Variable - * @param null|Expr $dim Array index / dim - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param null|Expr $dim Array index / dim + * @param array $attributes Additional attributes */ public function __construct(Expr $var, ?Expr $dim = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php index 37d54057b..60b1aafee 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php @@ -3,39 +3,10 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; -use PhpParser\Node\Expr; -class ArrayItem extends Expr -{ - /** @var null|Expr Key */ - public $key; - /** @var Expr Value */ - public $value; - /** @var bool Whether to assign by reference */ - public $byRef; - /** @var bool Whether to unpack the argument */ - public $unpack; - /** - * Constructs an array item node. - * - * @param Expr $value Value - * @param null|Expr $key Key - * @param bool $byRef Whether to assign by reference - * @param array $attributes Additional attributes - */ - public function __construct(Expr $value, ?Expr $key = null, bool $byRef = \false, array $attributes = [], bool $unpack = \false) +require __DIR__ . '/../ArrayItem.php'; +if (\false) { + // For classmap-authoritative support. + class ArrayItem extends \PhpParser\Node\ArrayItem { - $this->attributes = $attributes; - $this->key = $key; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - public function getSubNodeNames() : array - { - return ['key', 'value', 'byRef', 'unpack']; - } - public function getType() : string - { - return 'Expr_ArrayItem'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php index a728e7914..ca1e83f13 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php @@ -3,21 +3,22 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; class Array_ extends Expr { // For use in "kind" attribute - const KIND_LONG = 1; + public const KIND_LONG = 1; // array() syntax - const KIND_SHORT = 2; + public const KIND_SHORT = 2; // [] syntax - /** @var (ArrayItem|null)[] Items */ - public $items; + /** @var ArrayItem[] Items */ + public array $items; /** * Constructs an array node. * - * @param (ArrayItem|null)[] $items Items of the array - * @param array $attributes Additional attributes + * @param ArrayItem[] $items Items of the array + * @param array $attributes Additional attributes */ public function __construct(array $items = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php index 31fd306ac..10c02093b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php @@ -8,36 +8,42 @@ use PhpParser\Node\FunctionLike; class ArrowFunction extends Expr implements FunctionLike { - /** @var bool */ - public $static; - /** @var bool */ - public $byRef; + /** @var bool Whether the closure is static */ + public bool $static; + /** @var bool Whether to return by reference */ + public bool $byRef; /** @var Node\Param[] */ - public $params = []; + public array $params = []; /** @var null|Node\Identifier|Node\Name|Node\ComplexType */ - public $returnType; - /** @var Expr */ - public $expr; + public ?Node $returnType; + /** @var Expr Expression body */ + public Expr $expr; /** @var Node\AttributeGroup[] */ - public $attrGroups; + public array $attrGroups; /** - * @param array $subNodes Array of the following optional subnodes: - * 'static' => false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'expr' => Expr : Expression body - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * expr: Expr, + * static?: bool, + * byRef?: bool, + * params?: Node\Param[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * attrGroups?: Node\AttributeGroup[] + * } $subNodes Array of the following subnodes: + * 'expr' : Expression body + * 'static' => false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ - public function __construct(array $subNodes = [], array $attributes = []) + public function __construct(array $subNodes, array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? \false; $this->byRef = $subNodes['byRef'] ?? \false; $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->expr = $subNodes['expr']; $this->attrGroups = $subNodes['attrGroups'] ?? []; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php index 1fa7a37c0..38ceb4cdc 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php @@ -7,15 +7,15 @@ class Assign extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an assignment node. * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php index 762e6c42f..69d61bf9d 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php @@ -7,15 +7,15 @@ abstract class AssignOp extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a compound assignment operation node. * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php index 258fef8d0..029e51a4e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php @@ -7,15 +7,15 @@ class AssignRef extends Expr { /** @var Expr Variable reference is assigned to */ - public $var; + public Expr $var; /** @var Expr Variable which is referenced */ - public $expr; + public Expr $expr; /** * Constructs an assignment node. * - * @param Expr $var Variable - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $var, Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php index 2139c5108..058bbe86b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php @@ -7,15 +7,15 @@ abstract class BinaryOp extends Expr { /** @var Expr The left hand side expression */ - public $left; + public Expr $left; /** @var Expr The right hand side expression */ - public $right; + public Expr $right; /** * Constructs a binary operator node. * - * @param Expr $left The left hand side expression - * @param Expr $right The right hand side expression - * @param array $attributes Additional attributes + * @param Expr $left The left hand side expression + * @param Expr $right The right hand side expression + * @param array $attributes Additional attributes */ public function __construct(Expr $left, Expr $right, array $attributes = []) { @@ -32,8 +32,6 @@ public function getSubNodeNames() : array * * In the case there are multiple possible sigils for an operator, this method does not * necessarily return the one used in the parsed code. - * - * @return string */ public abstract function getOperatorSigil() : string; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php index fa39ab5ee..fb6f7ceeb 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php @@ -7,12 +7,12 @@ class BitwiseNot extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a bitwise not node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php index 5277b5a32..ae3143052 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php @@ -7,12 +7,12 @@ class BooleanNot extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a boolean not node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php index bf9ad36bc..7928b5ec0 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php @@ -20,12 +20,8 @@ public abstract function getRawArgs() : array; */ public function isFirstClassCallable() : bool { - foreach ($this->getRawArgs() as $arg) { - if ($arg instanceof VariadicPlaceholder) { - return \true; - } - } - return \false; + $rawArgs = $this->getRawArgs(); + return \count($rawArgs) === 1 && \current($rawArgs) instanceof VariadicPlaceholder; } /** * Assert that this is not a first-class callable and return only ordinary Args. diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php index a27bd7dce..d81df2326 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php @@ -7,12 +7,12 @@ abstract class Cast extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a cast node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php index 1b0cc9ef8..fe82044c4 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php @@ -7,11 +7,11 @@ class Double extends Cast { // For use in "kind" attribute - const KIND_DOUBLE = 1; + public const KIND_DOUBLE = 1; // "double" syntax - const KIND_FLOAT = 2; + public const KIND_FLOAT = 2; // "float" syntax - const KIND_REAL = 3; + public const KIND_REAL = 3; // "real" syntax public function getType() : string { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php index b69262d16..ef2f118c5 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php @@ -3,23 +3,24 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; use PhpParser\Node\Name; class ClassConstFetch extends Expr { /** @var Name|Expr Class name */ - public $class; + public Node $class; /** @var Identifier|Expr|Error Constant name */ - public $name; + public Node $name; /** * Constructs a class const fetch node. * - * @param Name|Expr $class Class name - * @param string|Identifier|Expr|Error $name Constant name - * @param array $attributes Additional attributes + * @param Name|Expr $class Class name + * @param string|Identifier|Expr|Error $name Constant name + * @param array $attributes Additional attributes */ - public function __construct($class, $name, array $attributes = []) + public function __construct(Node $class, $name, array $attributes = []) { $this->attributes = $attributes; $this->class = $class; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php index 801bd0081..43cfa94fe 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php @@ -7,12 +7,12 @@ class Clone_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a clone node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php index 40ebccfbd..8ce838565 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php @@ -4,37 +4,46 @@ namespace PhpParser\Node\Expr; use PhpParser\Node; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr; use PhpParser\Node\FunctionLike; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; class Closure extends Expr implements FunctionLike, StmtsAwareInterface { /** @var bool Whether the closure is static */ - public $static; + public bool $static; /** @var bool Whether to return by reference */ - public $byRef; + public bool $byRef; /** @var Node\Param[] Parameters */ - public $params; + public array $params; /** @var ClosureUse[] use()s */ - public $uses; + public array $uses; /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; + public ?Node $returnType; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** * Constructs a lambda function node. * - * @param array $subNodes Array of the following optional subnodes: - * 'static' => false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'uses' => array(): use()s - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attributes groups - * @param array $attributes Additional attributes + * @param array{ + * static?: bool, + * byRef?: bool, + * params?: Node\Param[], + * uses?: ClosureUse[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'static' => false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array(): Parameters + * 'uses' => array(): use()s + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attributes groups + * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { @@ -43,8 +52,7 @@ public function __construct(array $subNodes = [], array $attributes = []) $this->byRef = $subNodes['byRef'] ?? \false; $this->params = $subNodes['params'] ?? []; $this->uses = $subNodes['uses'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php index 4d5795628..974e519de 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php @@ -3,32 +3,10 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; -use PhpParser\Node\Expr; -class ClosureUse extends Expr -{ - /** @var Expr\Variable Variable to use */ - public $var; - /** @var bool Whether to use by reference */ - public $byRef; - /** - * Constructs a closure use node. - * - * @param Expr\Variable $var Variable to use - * @param bool $byRef Whether to use by reference - * @param array $attributes Additional attributes - */ - public function __construct(Expr\Variable $var, bool $byRef = \false, array $attributes = []) +require __DIR__ . '/../ClosureUse.php'; +if (\false) { + // For classmap-authoritative support. + class ClosureUse extends \PhpParser\Node\ClosureUse { - $this->attributes = $attributes; - $this->var = $var; - $this->byRef = $byRef; - } - public function getSubNodeNames() : array - { - return ['var', 'byRef']; - } - public function getType() : string - { - return 'Expr_ClosureUse'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php index 50c1a8a02..6f902d933 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php @@ -8,12 +8,12 @@ class ConstFetch extends Expr { /** @var Name Constant name */ - public $name; + public Name $name; /** * Constructs a const fetch node. * - * @param Name $name Constant name - * @param array $attributes Additional attributes + * @param Name $name Constant name + * @param array $attributes Additional attributes */ public function __construct(Name $name, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php index 220efdbbd..25f948479 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php @@ -7,12 +7,12 @@ class Empty_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an empty() node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php index f9e673fb1..a3e2bccc1 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php @@ -15,7 +15,7 @@ class Error extends Expr /** * Constructs an error node. * - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php index e13c96da8..9b8de6e07 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php @@ -7,12 +7,12 @@ class ErrorSuppress extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an error suppress node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php index 27989b472..38caa0b18 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php @@ -7,12 +7,12 @@ class Eval_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an eval() node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php index 302c431e4..31093955c 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php @@ -7,15 +7,15 @@ class Exit_ extends Expr { /* For use in "kind" attribute */ - const KIND_EXIT = 1; - const KIND_DIE = 2; + public const KIND_EXIT = 1; + public const KIND_DIE = 2; /** @var null|Expr Expression */ - public $expr; + public ?Expr $expr; /** * Constructs an exit() node. * - * @param null|Expr $expr Expression - * @param array $attributes Additional attributes + * @param null|Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(?Expr $expr = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php index 871bd84f1..c3249cb4f 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php @@ -8,17 +8,17 @@ class FuncCall extends \PhpParser\Node\Expr\CallLike { /** @var Node\Name|Expr Function name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a function call node. * - * @param Node\Name|Expr $name Function name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Node\Name|Expr $name Function name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct($name, array $args = [], array $attributes = []) + public function __construct(Node $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php index 000f87a1a..0fbc0659e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php @@ -6,20 +6,20 @@ use PhpParser\Node\Expr; class Include_ extends Expr { - const TYPE_INCLUDE = 1; - const TYPE_INCLUDE_ONCE = 2; - const TYPE_REQUIRE = 3; - const TYPE_REQUIRE_ONCE = 4; + public const TYPE_INCLUDE = 1; + public const TYPE_INCLUDE_ONCE = 2; + public const TYPE_REQUIRE = 3; + public const TYPE_REQUIRE_ONCE = 4; /** @var Expr Expression */ - public $expr; + public Expr $expr; /** @var int Type of include */ - public $type; + public int $type; /** * Constructs an include node. * - * @param Expr $expr Expression - * @param int $type Type of include - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param int $type Type of include + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, int $type, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php index 651e48165..81a3f1ec9 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php @@ -3,22 +3,23 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; class Instanceof_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** @var Name|Expr Class name */ - public $class; + public Node $class; /** * Constructs an instanceof check node. * - * @param Expr $expr Expression - * @param Name|Expr $class Class name - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param Name|Expr $class Class name + * @param array $attributes Additional attributes */ - public function __construct(Expr $expr, $class, array $attributes = []) + public function __construct(Expr $expr, Node $class, array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php index f6205e7c4..ed345ea65 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php @@ -7,12 +7,12 @@ class Isset_ extends Expr { /** @var Expr[] Variables */ - public $vars; + public array $vars; /** * Constructs an array node. * - * @param Expr[] $vars Variables - * @param array $attributes Additional attributes + * @param Expr[] $vars Variables + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php index dfa5a3ade..51e723c57 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php @@ -3,16 +3,22 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; class List_ extends Expr { + // For use in "kind" attribute + public const KIND_LIST = 1; + // list() syntax + public const KIND_ARRAY = 2; + // [] syntax /** @var (ArrayItem|null)[] List of items to assign to */ - public $items; + public array $items; /** * Constructs a list() destructuring node. * - * @param (ArrayItem|null)[] $items List of items to assign to - * @param array $attributes Additional attributes + * @param (ArrayItem|null)[] $items List of items to assign to + * @param array $attributes Additional attributes */ public function __construct(array $items, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php index c302f171f..7ad84ee7f 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php @@ -7,12 +7,14 @@ use PhpParser\Node\MatchArm; class Match_ extends Node\Expr { - /** @var Node\Expr */ - public $cond; + /** @var Node\Expr Condition */ + public Node\Expr $cond; /** @var MatchArm[] */ - public $arms; + public array $arms; /** + * @param Node\Expr $cond Condition * @param MatchArm[] $arms + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $arms = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php index 235181855..2e154208e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; @@ -10,18 +11,18 @@ class MethodCall extends \PhpParser\Node\Expr\CallLike { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Method name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a function call node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php index ca1f00462..994270de4 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php @@ -10,17 +10,17 @@ class New_ extends \PhpParser\Node\Expr\CallLike { /** @var Node\Name|Expr|Node\Stmt\Class_ Class name */ - public $class; + public Node $class; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a function call node. * - * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct($class, array $args = [], array $attributes = []) + public function __construct(Node $class, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php index fb33349cd..60946e5b6 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; @@ -10,18 +11,18 @@ class NullsafeMethodCall extends \PhpParser\Node\Expr\CallLike { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Method name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a nullsafe method call node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php index 060834c00..c2000e8a3 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php @@ -3,20 +3,21 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; class NullsafePropertyFetch extends Expr { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Property name */ - public $name; + public Node $name; /** * Constructs a nullsafe property fetch node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Property name + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php index e0ab3cbc4..07701ba67 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php @@ -7,12 +7,12 @@ class PostDec extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a post decrement node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php index 02576c883..7bc250434 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php @@ -7,12 +7,12 @@ class PostInc extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a post increment node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php index a945d1ffe..efcb1c77e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php @@ -7,12 +7,12 @@ class PreDec extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a pre decrement node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php index b02faaa40..df6212f0b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php @@ -7,12 +7,12 @@ class PreInc extends Expr { /** @var Expr Variable */ - public $var; + public Expr $var; /** * Constructs a pre increment node. * - * @param Expr $var Variable - * @param array $attributes Additional attributes + * @param Expr $var Variable + * @param array $attributes Additional attributes */ public function __construct(Expr $var, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php index d03c390ed..40e0b902b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php @@ -7,12 +7,12 @@ class Print_ extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs an print() node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php index 6deb62032..41a7dd144 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php @@ -3,20 +3,21 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Identifier; class PropertyFetch extends Expr { /** @var Expr Variable holding object */ - public $var; + public Expr $var; /** @var Identifier|Expr Property name */ - public $name; + public Node $name; /** * Constructs a function call node. * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name - * @param array $attributes Additional attributes + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Property name + * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php index b7f711edb..82ae963d5 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php @@ -4,15 +4,16 @@ namespace PhpParser\Node\Expr; use PhpParser\Node\Expr; +use PhpParser\Node\InterpolatedStringPart; class ShellExec extends Expr { - /** @var array Encapsed string array */ - public $parts; + /** @var (Expr|InterpolatedStringPart)[] Interpolated string array */ + public array $parts; /** * Constructs a shell exec (backtick) node. * - * @param array $parts Encapsed string array - * @param array $attributes Additional attributes + * @param (Expr|InterpolatedStringPart)[] $parts Interpolated string array + * @param array $attributes Additional attributes */ public function __construct(array $parts, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php index a3675b60f..104d51168 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php @@ -11,20 +11,20 @@ class StaticCall extends \PhpParser\Node\Expr\CallLike { /** @var Node\Name|Expr Class name */ - public $class; + public Node $class; /** @var Identifier|Expr Method name */ - public $name; + public Node $name; /** @var array Arguments */ - public $args; + public array $args; /** * Constructs a static method call node. * - * @param Node\Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes + * @param Node\Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct($class, $name, array $args = [], array $attributes = []) + public function __construct(Node $class, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php index 86f343044..aea095561 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php @@ -3,23 +3,24 @@ declare (strict_types=1); namespace PhpParser\Node\Expr; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; use PhpParser\Node\VarLikeIdentifier; class StaticPropertyFetch extends Expr { /** @var Name|Expr Class name */ - public $class; + public Node $class; /** @var VarLikeIdentifier|Expr Property name */ - public $name; + public Node $name; /** * Constructs a static property fetch node. * - * @param Name|Expr $class Class name - * @param string|VarLikeIdentifier|Expr $name Property name - * @param array $attributes Additional attributes + * @param Name|Expr $class Class name + * @param string|VarLikeIdentifier|Expr $name Property name + * @param array $attributes Additional attributes */ - public function __construct($class, $name, array $attributes = []) + public function __construct(Node $class, $name, array $attributes = []) { $this->attributes = $attributes; $this->class = $class; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php index 426ba105c..372650d4b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php @@ -7,20 +7,20 @@ class Ternary extends Expr { /** @var Expr Condition */ - public $cond; + public Expr $cond; /** @var null|Expr Expression for true */ - public $if; + public ?Expr $if; /** @var Expr Expression for false */ - public $else; + public Expr $else; /** * Constructs a ternary operator node. * - * @param Expr $cond Condition - * @param null|Expr $if Expression for true - * @param Expr $else Expression for false - * @param array $attributes Additional attributes + * @param Expr $cond Condition + * @param null|Expr $if Expression for true + * @param Expr $else Expression for false + * @param array $attributes Additional attributes */ - public function __construct(Expr $cond, $if, Expr $else, array $attributes = []) + public function __construct(Expr $cond, ?Expr $if, Expr $else, array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php index 6f7c91eda..c43ce56f6 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php @@ -7,12 +7,12 @@ class Throw_ extends Node\Expr { /** @var Node\Expr Expression */ - public $expr; + public Node\Expr $expr; /** * Constructs a throw expression node. * - * @param Node\Expr $expr Expression - * @param array $attributes Additional attributes + * @param Node\Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php index b933fdd82..bcf32ae3a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php @@ -7,12 +7,12 @@ class UnaryMinus extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a unary minus node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php index 916f50a8c..92e555db5 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php @@ -7,12 +7,12 @@ class UnaryPlus extends Expr { /** @var Expr Expression */ - public $expr; + public Expr $expr; /** * Constructs a unary plus node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php index 97d884e06..6903b812e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php @@ -11,8 +11,8 @@ class Variable extends Expr /** * Constructs a variable node. * - * @param string|Expr $name Name - * @param array $attributes Additional attributes + * @param string|Expr $name Name + * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php index 8149a09db..a92fcbe9d 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php @@ -7,12 +7,12 @@ class YieldFrom extends Expr { /** @var Expr Expression to yield from */ - public $expr; + public Expr $expr; /** * Constructs an "yield from" node. * - * @param Expr $expr Expression - * @param array $attributes Additional attributes + * @param Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php index ced4c68b4..86a964200 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php @@ -7,15 +7,15 @@ class Yield_ extends Expr { /** @var null|Expr Key expression */ - public $key; + public ?Expr $key; /** @var null|Expr Value expression */ - public $value; + public ?Expr $value; /** * Constructs a yield expression node. * - * @param null|Expr $value Value expression - * @param null|Expr $key Key expression - * @param array $attributes Additional attributes + * @param null|Expr $value Value expression + * @param null|Expr $key Key expression + * @param array $attributes Additional attributes */ public function __construct(?Expr $value = null, ?Expr $key = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php index 74554375d..81c7431b9 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php @@ -8,8 +8,6 @@ interface FunctionLike extends Node { /** * Whether to return by reference - * - * @return bool */ public function returnsByRef() : bool; /** @@ -29,7 +27,7 @@ public function getReturnType(); * * @return Stmt[]|null */ - public function getStmts(); + public function getStmts() : ?array; /** * Get PHP attribute groups. * diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php index 54245ba5d..4c0d69bdc 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php @@ -9,17 +9,24 @@ */ class Identifier extends NodeAbstract { - /** @var string Identifier as string */ - public $name; - private static $specialClassNames = ['self' => \true, 'parent' => \true, 'static' => \true]; + /** + * @psalm-var non-empty-string + * @var string Identifier as string + */ + public string $name; + /** @var array */ + private static array $specialClassNames = ['self' => \true, 'parent' => \true, 'static' => \true]; /** * Constructs an identifier node. * - * @param string $name Identifier as string - * @param array $attributes Additional attributes + * @param string $name Identifier as string + * @param array $attributes Additional attributes */ public function __construct(string $name, array $attributes = []) { + if ($name === '') { + throw new \InvalidArgumentException('Identifier name cannot be empty'); + } $this->attributes = $attributes; $this->name = $name; } @@ -30,6 +37,7 @@ public function getSubNodeNames() : array /** * Get identifier as string. * + * @psalm-return non-empty-string * @return string Identifier as string. */ public function toString() : string @@ -39,6 +47,7 @@ public function toString() : string /** * Get lowercased identifier as string. * + * @psalm-return non-empty-string&lowercase-string * @return string Lowercased identifier as string */ public function toLowerString() : string @@ -57,6 +66,7 @@ public function isSpecialClassName() : bool /** * Get identifier as string. * + * @psalm-return non-empty-string * @return string Identifier as string */ public function __toString() : string diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php new file mode 100644 index 000000000..7596b15f6 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php @@ -0,0 +1,32 @@ + $attributes Additional attributes + */ + public function __construct(string $value, array $attributes = []) + { + $this->attributes = $attributes; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['value']; + } + public function getType() : string + { + return 'InterpolatedStringPart'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\InterpolatedStringPart::class, \PhpParser\Node\Scalar\EncapsedStringPart::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php index 3912fb798..d0625df03 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php @@ -3,16 +3,15 @@ declare (strict_types=1); namespace PhpParser\Node; -use PhpParser\NodeAbstract; class IntersectionType extends \PhpParser\Node\ComplexType { /** @var (Identifier|Name)[] Types */ - public $types; + public array $types; /** * Constructs an intersection type. * - * @param (Identifier|Name)[] $types Types - * @param array $attributes Additional attributes + * @param (Identifier|Name)[] $types Types + * @param array $attributes Additional attributes */ public function __construct(array $types, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php index 7ad2f398e..451309b84 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php @@ -7,14 +7,13 @@ use PhpParser\NodeAbstract; class MatchArm extends NodeAbstract { - /** @var null|Node\Expr[] */ - public $conds; - /** @var Node\Expr */ - public $body; + /** @var null|list */ + public ?array $conds; + public \PhpParser\Node\Expr $body; /** - * @param null|Node\Expr[] $conds + * @param null|list $conds */ - public function __construct($conds, Node\Expr $body, array $attributes = []) + public function __construct(?array $conds, Node\Expr $body, array $attributes = []) { $this->conds = $conds; $this->body = $body; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php index 30f95099e..01b4ff0b8 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php @@ -7,34 +7,36 @@ class Name extends NodeAbstract { /** - * @var string[] Parts of the name - * @deprecated Use getParts() instead + * @psalm-var non-empty-string + * @var string Name as string */ - public $parts; - private static $specialClassNames = ['self' => \true, 'parent' => \true, 'static' => \true]; + public string $name; + /** @var array */ + private static array $specialClassNames = ['self' => \true, 'parent' => \true, 'static' => \true]; /** * Constructs a name node. * - * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) - * @param array $attributes Additional attributes + * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) + * @param array $attributes Additional attributes */ - public function __construct($name, array $attributes = []) + public final function __construct($name, array $attributes = []) { $this->attributes = $attributes; - $this->parts = self::prepareName($name); + $this->name = self::prepareName($name); } public function getSubNodeNames() : array { - return ['parts']; + return ['name']; } /** * Get parts of name (split by the namespace separator). * + * @psalm-return non-empty-list * @return string[] Parts of name */ public function getParts() : array { - return $this->parts; + return \explode('\\', $this->name); } /** * Gets the first part of the name, i.e. everything before the first namespace separator. @@ -43,7 +45,10 @@ public function getParts() : array */ public function getFirst() : string { - return $this->parts[0]; + if (\false !== ($pos = \strpos($this->name, '\\'))) { + return \substr($this->name, 0, $pos); + } + return $this->name; } /** * Gets the last part of the name, i.e. everything after the last namespace separator. @@ -52,7 +57,10 @@ public function getFirst() : string */ public function getLast() : string { - return $this->parts[\count($this->parts) - 1]; + if (\false !== ($pos = \strrpos($this->name, '\\'))) { + return \substr($this->name, $pos + 1); + } + return $this->name; } /** * Checks whether the name is unqualified. (E.g. Name) @@ -61,7 +69,7 @@ public function getLast() : string */ public function isUnqualified() : bool { - return 1 === \count($this->parts); + return \false === \strpos($this->name, '\\'); } /** * Checks whether the name is qualified. (E.g. Name\Name) @@ -70,7 +78,7 @@ public function isUnqualified() : bool */ public function isQualified() : bool { - return 1 < \count($this->parts); + return \false !== \strpos($this->name, '\\'); } /** * Checks whether the name is fully qualified. (E.g. \Name) @@ -94,16 +102,18 @@ public function isRelative() : bool * Returns a string representation of the name itself, without taking the name type into * account (e.g., not including a leading backslash for fully qualified names). * + * @psalm-return non-empty-string * @return string String representation */ public function toString() : string { - return \implode('\\', $this->parts); + return $this->name; } /** * Returns a string representation of the name as it would occur in code (e.g., including * leading backslash for fully qualified names. * + * @psalm-return non-empty-string * @return string String representation */ public function toCodeString() : string @@ -114,11 +124,12 @@ public function toCodeString() : string * Returns lowercased string representation of the name, without taking the name type into * account (e.g., no leading backslash for fully qualified names). * + * @psalm-return non-empty-string&lowercase-string * @return string Lowercased string representation */ public function toLowerString() : string { - return \strtolower(\implode('\\', $this->parts)); + return \strtolower($this->name); } /** * Checks whether the identifier is a special class name (self, parent or static). @@ -127,17 +138,18 @@ public function toLowerString() : string */ public function isSpecialClassName() : bool { - return \count($this->parts) === 1 && isset(self::$specialClassNames[\strtolower($this->parts[0])]); + return isset(self::$specialClassNames[\strtolower($this->name)]); } /** * Returns a string representation of the name by imploding the namespace parts with the * namespace separator. * + * @psalm-return non-empty-string * @return string String representation */ public function __toString() : string { - return \implode('\\', $this->parts); + return $this->name; } /** * Gets a slice of a name (similar to array_slice). @@ -150,14 +162,22 @@ public function __toString() : string * * Offset and length have the same meaning as in array_slice(). * - * @param int $offset Offset to start the slice at (may be negative) + * @param int $offset Offset to start the slice at (may be negative) * @param int|null $length Length of the slice (may be negative) * * @return static|null Sliced name */ public function slice(int $offset, ?int $length = null) { - $numParts = \count($this->parts); + if ($offset === 1 && $length === null) { + // Short-circuit the common case. + if (\false !== ($pos = \strpos($this->name, '\\'))) { + return new static(\substr($this->name, $pos + 1)); + } + return null; + } + $parts = \explode('\\', $this->name); + $numParts = \count($parts); $realOffset = $offset < 0 ? $offset + $numParts : $offset; if ($realOffset < 0 || $realOffset > $numParts) { throw new \OutOfBoundsException(\sprintf('Offset %d is out of bounds', $offset)); @@ -174,7 +194,7 @@ public function slice(int $offset, ?int $length = null) // Empty slice is represented as null return null; } - return new static(\array_slice($this->parts, $realOffset, $realLength), $this->attributes); + return new static(\array_slice($parts, $realOffset, $realLength), $this->attributes); } /** * Concatenate two names, yielding a new Name instance. @@ -187,9 +207,9 @@ public function slice(int $offset, ?int $length = null) * Name::concat($namespace, $shortName) * where $namespace is a Name node or null will work as expected. * - * @param string|string[]|self|null $name1 The first name - * @param string|string[]|self|null $name2 The second name - * @param array $attributes Attributes to assign to concatenated name + * @param string|string[]|self|null $name1 The first name + * @param string|string[]|self|null $name2 The second name + * @param array $attributes Attributes to assign to concatenated name * * @return static|null Concatenated name */ @@ -197,36 +217,41 @@ public static function concat($name1, $name2, array $attributes = []) { if (null === $name1 && null === $name2) { return null; - } elseif (null === $name1) { - return new static(self::prepareName($name2), $attributes); - } elseif (null === $name2) { - return new static(self::prepareName($name1), $attributes); + } + if (null === $name1) { + return new static($name2, $attributes); + } + if (null === $name2) { + return new static($name1, $attributes); } else { - return new static(\array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes); + return new static(self::prepareName($name1) . '\\' . self::prepareName($name2), $attributes); } } /** * Prepares a (string, array or Name node) name for use in name changing methods by converting - * it to an array. + * it to a string. * * @param string|string[]|self $name Name to prepare * - * @return string[] Prepared name + * @psalm-return non-empty-string + * @return string Prepared name */ - private static function prepareName($name) : array + private static function prepareName($name) : string { if (\is_string($name)) { if ('' === $name) { throw new \InvalidArgumentException('Name cannot be empty'); } - return \explode('\\', $name); - } elseif (\is_array($name)) { + return $name; + } + if (\is_array($name)) { if (empty($name)) { throw new \InvalidArgumentException('Name cannot be empty'); } - return $name; - } elseif ($name instanceof self) { - return $name->parts; + return \implode('\\', $name); + } + if ($name instanceof self) { + return $name->name; } throw new \InvalidArgumentException('Expected string, array of parts or Name instance'); } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php index 0fa0d59fb..dda5f6bfe 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php @@ -3,20 +3,21 @@ declare (strict_types=1); namespace PhpParser\Node; +use PhpParser\Node; class NullableType extends \PhpParser\Node\ComplexType { /** @var Identifier|Name Type */ - public $type; + public Node $type; /** * Constructs a nullable type (wrapping another type). * - * @param string|Identifier|Name $type Type - * @param array $attributes Additional attributes + * @param Identifier|Name $type Type + * @param array $attributes Additional attributes */ - public function __construct($type, array $attributes = []) + public function __construct(Node $type, array $attributes = []) { $this->attributes = $attributes; - $this->type = \is_string($type) ? new \PhpParser\Node\Identifier($type) : $type; + $this->type = $type; } public function getSubNodeNames() : array { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php index 4718e9b3d..b179c9588 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php @@ -3,52 +3,109 @@ declare (strict_types=1); namespace PhpParser\Node; +use PhpParser\Modifiers; +use PhpParser\Node; use PhpParser\NodeAbstract; class Param extends NodeAbstract { /** @var null|Identifier|Name|ComplexType Type declaration */ - public $type; + public ?Node $type; /** @var bool Whether parameter is passed by reference */ - public $byRef; + public bool $byRef; /** @var bool Whether this is a variadic argument */ - public $variadic; + public bool $variadic; /** @var Expr\Variable|Expr\Error Parameter variable */ - public $var; + public \PhpParser\Node\Expr $var; /** @var null|Expr Default value */ - public $default; - /** @var int */ - public $flags; + public ?\PhpParser\Node\Expr $default; + /** @var int Optional visibility flags */ + public int $flags; /** @var AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; + /** @var PropertyHook[] Property hooks for promoted properties */ + public array $hooks; /** * Constructs a parameter node. * - * @param Expr\Variable|Expr\Error $var Parameter variable - * @param null|Expr $default Default value - * @param null|string|Identifier|Name|ComplexType $type Type declaration - * @param bool $byRef Whether is passed by reference - * @param bool $variadic Whether this is a variadic argument - * @param array $attributes Additional attributes - * @param int $flags Optional visibility flags - * @param AttributeGroup[] $attrGroups PHP attribute groups + * @param Expr\Variable|Expr\Error $var Parameter variable + * @param null|Expr $default Default value + * @param null|Identifier|Name|ComplexType $type Type declaration + * @param bool $byRef Whether is passed by reference + * @param bool $variadic Whether this is a variadic argument + * @param array $attributes Additional attributes + * @param int $flags Optional visibility flags + * @param list $attrGroups PHP attribute groups + * @param PropertyHook[] $hooks Property hooks for promoted properties */ - public function __construct($var, ?\PhpParser\Node\Expr $default = null, $type = null, bool $byRef = \false, bool $variadic = \false, array $attributes = [], int $flags = 0, array $attrGroups = []) + public function __construct(\PhpParser\Node\Expr $var, ?\PhpParser\Node\Expr $default = null, ?Node $type = null, bool $byRef = \false, bool $variadic = \false, array $attributes = [], int $flags = 0, array $attrGroups = [], array $hooks = []) { $this->attributes = $attributes; - $this->type = \is_string($type) ? new \PhpParser\Node\Identifier($type) : $type; + $this->type = $type; $this->byRef = $byRef; $this->variadic = $variadic; $this->var = $var; $this->default = $default; $this->flags = $flags; $this->attrGroups = $attrGroups; + $this->hooks = $hooks; } public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; + return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default', 'hooks']; } public function getType() : string { return 'Param'; } + /** + * Whether this parameter uses constructor property promotion. + */ + public function isPromoted() : bool + { + return $this->flags !== 0 || $this->hooks !== []; + } + public function isPublic() : bool + { + $public = (bool) ($this->flags & Modifiers::PUBLIC); + if ($public) { + return \true; + } + if ($this->hooks === []) { + return \false; + } + return ($this->flags & Modifiers::VISIBILITY_MASK) === 0; + } + public function isProtected() : bool + { + return (bool) ($this->flags & Modifiers::PROTECTED); + } + public function isPrivate() : bool + { + return (bool) ($this->flags & Modifiers::PRIVATE); + } + public function isReadonly() : bool + { + return (bool) ($this->flags & Modifiers::READONLY); + } + /** + * Whether the promoted property has explicit public(set) visibility. + */ + public function isPublicSet() : bool + { + return (bool) ($this->flags & Modifiers::PUBLIC_SET); + } + /** + * Whether the promoted property has explicit protected(set) visibility. + */ + public function isProtectedSet() : bool + { + return (bool) ($this->flags & Modifiers::PROTECTED_SET); + } + /** + * Whether the promoted property has explicit private(set) visibility. + */ + public function isPrivateSet() : bool + { + return (bool) ($this->flags & Modifiers::PRIVATE_SET); + } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php new file mode 100644 index 000000000..527cf4ca1 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php @@ -0,0 +1,104 @@ + 0 : Flags + * 'byRef' => false : Whether hook returns by reference + * 'params' => array(): Parameters + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, $body, array $subNodes = [], array $attributes = []) + { + $this->attributes = $attributes; + $this->name = \is_string($name) ? new \PhpParser\Node\Identifier($name) : $name; + $this->body = $body; + $this->flags = $subNodes['flags'] ?? 0; + $this->byRef = $subNodes['byRef'] ?? \false; + $this->params = $subNodes['params'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + public function returnsByRef() : bool + { + return $this->byRef; + } + public function getParams() : array + { + return $this->params; + } + public function getReturnType() + { + return null; + } + /** + * Whether the property hook is final. + */ + public function isFinal() : bool + { + return (bool) ($this->flags & Modifiers::FINAL); + } + public function getStmts() : ?array + { + if ($this->body instanceof \PhpParser\Node\Expr) { + $name = $this->name->toLowerString(); + if ($name === 'get') { + return [new Return_($this->body)]; + } + if ($name === 'set') { + if (!$this->hasAttribute('propertyName')) { + throw new \LogicException('Can only use getStmts() on a "set" hook if the "propertyName" attribute is set'); + } + $propName = $this->getAttribute('propertyName'); + $prop = new PropertyFetch(new Variable('this'), (string) $propName); + return [new Expression(new Assign($prop, $this->body))]; + } + throw new \LogicException('Unknown property hook "' . $name . '"'); + } + return $this->body; + } + public function getAttrGroups() : array + { + return $this->attrGroups; + } + public function getType() : string + { + return 'PropertyHook'; + } + public function getSubNodeNames() : array + { + return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'body']; + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php new file mode 100644 index 000000000..c26e26422 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php @@ -0,0 +1,37 @@ + $attributes Additional attributes + */ + public function __construct($name, ?Node\Expr $default = null, array $attributes = []) + { + $this->attributes = $attributes; + $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; + $this->default = $default; + } + public function getSubNodeNames() : array + { + return ['name', 'default']; + } + public function getType() : string + { + return 'PropertyItem'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\PropertyItem::class, \PhpParser\Node\Stmt\PropertyProperty::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php index 1fb87574a..4f1f967de 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php @@ -3,69 +3,10 @@ declare (strict_types=1); namespace PhpParser\Node\Scalar; -use PhpParser\Node\Scalar; -class DNumber extends Scalar -{ - /** @var float Number value */ - public $value; - /** - * Constructs a float number scalar node. - * - * @param float $value Value of the number - * @param array $attributes Additional attributes - */ - public function __construct(float $value, array $attributes = []) +require __DIR__ . '/Float_.php'; +if (\false) { + // For classmap-authoritative support. + class DNumber extends \PhpParser\Node\Scalar\Float_ { - $this->attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - /** - * @param mixed[] $attributes - */ - public static function fromString(string $str, array $attributes = []) : \PhpParser\Node\Scalar\DNumber - { - $attributes['rawValue'] = $str; - $float = self::parse($str); - return new \PhpParser\Node\Scalar\DNumber($float, $attributes); - } - /** - * @internal - * - * Parses a DNUMBER token like PHP would. - * - * @param string $str A string number - * - * @return float The parsed number - */ - public static function parse(string $str) : float - { - $str = \str_replace('_', '', $str); - // Check whether this is one of the special integer notations. - if ('0' === $str[0]) { - // hex - if ('x' === $str[1] || 'X' === $str[1]) { - return \hexdec($str); - } - // bin - if ('b' === $str[1] || 'B' === $str[1]) { - return \bindec($str); - } - // oct, but only if the string does not contain any of '.eE'. - if (\false === \strpbrk($str, '.eE')) { - // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit - // (8 or 9) so that only the digits before that are used. - return \octdec(\substr($str, 0, \strcspn($str, '89'))); - } - } - // dec - return (float) $str; - } - public function getType() : string - { - return 'Scalar_DNumber'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php index 6e28cd7d7..e3332ad96 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php @@ -3,29 +3,10 @@ declare (strict_types=1); namespace PhpParser\Node\Scalar; -use PhpParser\Node\Expr; -use PhpParser\Node\Scalar; -class Encapsed extends Scalar -{ - /** @var Expr[] list of string parts */ - public $parts; - /** - * Constructs an encapsed string node. - * - * @param Expr[] $parts Encaps list - * @param array $attributes Additional attributes - */ - public function __construct(array $parts, array $attributes = []) +require __DIR__ . '/InterpolatedString.php'; +if (\false) { + // For classmap-authoritative support. + class Encapsed extends \PhpParser\Node\Scalar\InterpolatedString { - $this->attributes = $attributes; - $this->parts = $parts; - } - public function getSubNodeNames() : array - { - return ['parts']; - } - public function getType() : string - { - return 'Scalar_Encapsed'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php index 3f066aad9..5fbf9db91 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php @@ -3,28 +3,11 @@ declare (strict_types=1); namespace PhpParser\Node\Scalar; -use PhpParser\Node\Scalar; -class EncapsedStringPart extends Scalar -{ - /** @var string String value */ - public $value; - /** - * Constructs a node representing a string part of an encapsed string. - * - * @param string $value String value - * @param array $attributes Additional attributes - */ - public function __construct(string $value, array $attributes = []) +use PhpParser\Node\InterpolatedStringPart; +require __DIR__ . '/../InterpolatedStringPart.php'; +if (\false) { + // For classmap-authoritative support. + class EncapsedStringPart extends InterpolatedStringPart { - $this->attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - public function getType() : string - { - return 'Scalar_EncapsedStringPart'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php new file mode 100644 index 000000000..ea9641872 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php @@ -0,0 +1,73 @@ + $attributes Additional attributes + */ + public function __construct(float $value, array $attributes = []) + { + $this->attributes = $attributes; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['value']; + } + /** + * @param mixed[] $attributes + */ + public static function fromString(string $str, array $attributes = []) : \PhpParser\Node\Scalar\Float_ + { + $attributes['rawValue'] = $str; + $float = self::parse($str); + return new \PhpParser\Node\Scalar\Float_($float, $attributes); + } + /** + * @internal + * + * Parses a DNUMBER token like PHP would. + * + * @param string $str A string number + * + * @return float The parsed number + */ + public static function parse(string $str) : float + { + $str = \str_replace('_', '', $str); + // Check whether this is one of the special integer notations. + if ('0' === $str[0]) { + // hex + if ('x' === $str[1] || 'X' === $str[1]) { + return \hexdec($str); + } + // bin + if ('b' === $str[1] || 'B' === $str[1]) { + return \bindec($str); + } + // oct, but only if the string does not contain any of '.eE'. + if (\false === \strpbrk($str, '.eE')) { + // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit + // (8 or 9) so that only the digits before that are used. + return \octdec(\substr($str, 0, \strcspn($str, '89'))); + } + } + // dec + return (float) $str; + } + public function getType() : string + { + return 'Scalar_Float'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\Scalar\Float_::class, \PhpParser\Node\Scalar\DNumber::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php new file mode 100644 index 000000000..4010d5a08 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php @@ -0,0 +1,74 @@ + $attributes Additional attributes + */ + public function __construct(int $value, array $attributes = []) + { + $this->attributes = $attributes; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['value']; + } + /** + * Constructs an Int node from a string number literal. + * + * @param string $str String number literal (decimal, octal, hex or binary) + * @param array $attributes Additional attributes + * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) + * + * @return Int_ The constructed LNumber, including kind attribute + */ + public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = \false) : \PhpParser\Node\Scalar\Int_ + { + $attributes['rawValue'] = $str; + $str = \str_replace('_', '', $str); + if ('0' !== $str[0] || '0' === $str) { + $attributes['kind'] = \PhpParser\Node\Scalar\Int_::KIND_DEC; + return new \PhpParser\Node\Scalar\Int_((int) $str, $attributes); + } + if ('x' === $str[1] || 'X' === $str[1]) { + $attributes['kind'] = \PhpParser\Node\Scalar\Int_::KIND_HEX; + return new \PhpParser\Node\Scalar\Int_(\hexdec($str), $attributes); + } + if ('b' === $str[1] || 'B' === $str[1]) { + $attributes['kind'] = \PhpParser\Node\Scalar\Int_::KIND_BIN; + return new \PhpParser\Node\Scalar\Int_(\bindec($str), $attributes); + } + if (!$allowInvalidOctal && \strpbrk($str, '89')) { + throw new Error('Invalid numeric literal', $attributes); + } + // Strip optional explicit octal prefix. + if ('o' === $str[1] || 'O' === $str[1]) { + $str = \substr($str, 2); + } + // use intval instead of octdec to get proper cutting behavior with malformed numbers + $attributes['kind'] = \PhpParser\Node\Scalar\Int_::KIND_OCT; + return new \PhpParser\Node\Scalar\Int_(\intval($str, 8), $attributes); + } + public function getType() : string + { + return 'Scalar_Int'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\Scalar\Int_::class, \PhpParser\Node\Scalar\LNumber::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php new file mode 100644 index 000000000..beb65bc39 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php @@ -0,0 +1,34 @@ + $attributes Additional attributes + */ + public function __construct(array $parts, array $attributes = []) + { + $this->attributes = $attributes; + $this->parts = $parts; + } + public function getSubNodeNames() : array + { + return ['parts']; + } + public function getType() : string + { + return 'Scalar_InterpolatedString'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\Scalar\InterpolatedString::class, \PhpParser\Node\Scalar\Encapsed::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php index 5c2575950..d2c3766fb 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php @@ -3,70 +3,10 @@ declare (strict_types=1); namespace PhpParser\Node\Scalar; -use PhpParser\Error; -use PhpParser\Node\Scalar; -class LNumber extends Scalar -{ - /* For use in "kind" attribute */ - const KIND_BIN = 2; - const KIND_OCT = 8; - const KIND_DEC = 10; - const KIND_HEX = 16; - /** @var int Number value */ - public $value; - /** - * Constructs an integer number scalar node. - * - * @param int $value Value of the number - * @param array $attributes Additional attributes - */ - public function __construct(int $value, array $attributes = []) +require __DIR__ . '/Int_.php'; +if (\false) { + // For classmap-authoritative support. + class LNumber extends \PhpParser\Node\Scalar\Int_ { - $this->attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - /** - * Constructs an LNumber node from a string number literal. - * - * @param string $str String number literal (decimal, octal, hex or binary) - * @param array $attributes Additional attributes - * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) - * - * @return LNumber The constructed LNumber, including kind attribute - */ - public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = \false) : \PhpParser\Node\Scalar\LNumber - { - $attributes['rawValue'] = $str; - $str = \str_replace('_', '', $str); - if ('0' !== $str[0] || '0' === $str) { - $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_DEC; - return new \PhpParser\Node\Scalar\LNumber((int) $str, $attributes); - } - if ('x' === $str[1] || 'X' === $str[1]) { - $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_HEX; - return new \PhpParser\Node\Scalar\LNumber(\hexdec($str), $attributes); - } - if ('b' === $str[1] || 'B' === $str[1]) { - $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_BIN; - return new \PhpParser\Node\Scalar\LNumber(\bindec($str), $attributes); - } - if (!$allowInvalidOctal && \strpbrk($str, '89')) { - throw new Error('Invalid numeric literal', $attributes); - } - // Strip optional explicit octal prefix. - if ('o' === $str[1] || 'O' === $str[1]) { - $str = \substr($str, 2); - } - // use intval instead of octdec to get proper cutting behavior with malformed numbers - $attributes['kind'] = \PhpParser\Node\Scalar\LNumber::KIND_OCT; - return new \PhpParser\Node\Scalar\LNumber(\intval($str, 8), $attributes); - } - public function getType() : string - { - return 'Scalar_LNumber'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php index c254461a1..e9e131e1e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php @@ -9,7 +9,7 @@ abstract class MagicConst extends Scalar /** * Constructs a magic constant node. * - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php new file mode 100644 index 000000000..69f78f1bb --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php @@ -0,0 +1,17 @@ + '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1b"]; + public string $value; + /** @var array Escaped character to its decoded value */ + protected static array $replacements = ['\\' => '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1b"]; /** * Constructs a string scalar node. * - * @param string $value Value of the string - * @param array $attributes Additional attributes + * @param string $value Value of the string + * @param array $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { @@ -31,6 +32,7 @@ public function getSubNodeNames() : array return ['value']; } /** + * @param array $attributes * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes */ public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = \true) : self @@ -67,13 +69,13 @@ public static function parse(string $str, bool $parseUnicodeEscape = \true) : st * * Parses escape sequences in strings (all string types apart from single quoted). * - * @param string $str String without quotes + * @param string $str String without quotes * @param null|string $quote Quote type * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string String with escape sequences parsed */ - public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = \true) : string + public static function parseEscapeSequences(string $str, ?string $quote, bool $parseUnicodeEscape = \true) : string { if (null !== $quote) { $str = \str_replace('\\' . $quote, $quote, $str); @@ -86,10 +88,14 @@ public static function parseEscapeSequences(string $str, $quote, bool $parseUnic $str = $matches[1]; if (isset(self::$replacements[$str])) { return self::$replacements[$str]; - } elseif ('x' === $str[0] || 'X' === $str[0]) { + } + if ('x' === $str[0] || 'X' === $str[0]) { return \chr(\hexdec(\substr($str, 1))); - } elseif ('u' === $str[0]) { - return self::codePointToUtf8(\hexdec($matches[2])); + } + if ('u' === $str[0]) { + $dec = \hexdec($matches[2]); + // If it overflowed to float, treat as INT_MAX, it will throw an error anyway. + return self::codePointToUtf8(\is_int($dec) ? $dec : \PHP_INT_MAX); } else { return \chr(\octdec($str)); } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php new file mode 100644 index 000000000..f90b36a17 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php @@ -0,0 +1,37 @@ + $attributes Additional attributes + */ + public function __construct(\PhpParser\Node\Expr\Variable $var, ?Node\Expr $default = null, array $attributes = []) + { + $this->attributes = $attributes; + $this->var = $var; + $this->default = $default; + } + public function getSubNodeNames() : array + { + return ['var', 'default']; + } + public function getType() : string + { + return 'StaticVar'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\StaticVar::class, \PhpParser\Node\Stmt\StaticVar::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php new file mode 100644 index 000000000..dfa99d289 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php @@ -0,0 +1,30 @@ + $attributes Additional attributes + */ + public function __construct(array $stmts, array $attributes = []) + { + $this->attributes = $attributes; + $this->stmts = $stmts; + } + public function getType() : string + { + return 'Stmt_Block'; + } + public function getSubNodeNames() : array + { + return ['stmts']; + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php index 4a8ad5b0b..5fda910ed 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php @@ -7,12 +7,12 @@ class Break_ extends Node\Stmt { /** @var null|Node\Expr Number of loops to break */ - public $num; + public ?Node\Expr $num; /** * Constructs a break node. * - * @param null|Node\Expr $num Number of loops to break - * @param array $attributes Additional attributes + * @param null|Node\Expr $num Number of loops to break + * @param array $attributes Additional attributes */ public function __construct(?Node\Expr $num = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php index b0dc4dc7c..84da7bb39 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php @@ -4,20 +4,21 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Case_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class Case_ extends Node\Stmt implements StmtsAwareInterface { /** @var null|Node\Expr Condition (null for default) */ - public $cond; + public ?Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a case node. * - * @param null|Node\Expr $cond Condition (null for default) - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param null|Node\Expr $cond Condition (null for default) + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ - public function __construct($cond, array $stmts = [], array $attributes = []) + public function __construct(?Node\Expr $cond, array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php index 7b7087713..162eb740e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php @@ -9,18 +9,18 @@ class Catch_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Name[] Types of exceptions to catch */ - public $types; + public array $types; /** @var Expr\Variable|null Variable for exception */ - public $var; + public ?Expr\Variable $var; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a catch node. * - * @param Node\Name[] $types Types of exceptions to catch - * @param Expr\Variable|null $var Variable for exception - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Name[] $types Types of exceptions to catch + * @param Expr\Variable|null $var Variable for exception + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(array $types, ?Expr\Variable $var = null, array $stmts = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php index b29972827..d05919834 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php @@ -3,33 +3,34 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; +use PhpParser\Modifiers; use PhpParser\Node; class ClassConst extends Node\Stmt { /** @var int Modifiers */ - public $flags; + public int $flags; /** @var Node\Const_[] Constant declarations */ - public $consts; + public array $consts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var Node\Identifier|Node\Name|Node\ComplexType|null Type declaration */ - public $type; + public ?Node $type; /** * Constructs a class const list node. * - * @param Node\Const_[] $consts Constant declarations - * @param int $flags Modifiers - * @param array $attributes Additional attributes - * @param Node\AttributeGroup[] $attrGroups PHP attribute groups - * @param null|string|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration + * @param Node\Const_[] $consts Constant declarations + * @param int $flags Modifiers + * @param array $attributes Additional attributes + * @param list $attrGroups PHP attribute groups + * @param null|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration */ - public function __construct(array $consts, int $flags = 0, array $attributes = [], array $attrGroups = [], $type = null) + public function __construct(array $consts, int $flags = 0, array $attributes = [], array $attrGroups = [], ?Node $type = null) { $this->attributes = $attributes; $this->flags = $flags; $this->consts = $consts; $this->attrGroups = $attrGroups; - $this->type = \is_string($type) ? new Node\Identifier($type) : $type; + $this->type = $type; } public function getSubNodeNames() : array { @@ -37,39 +38,31 @@ public function getSubNodeNames() : array } /** * Whether constant is explicitly or implicitly public. - * - * @return bool */ public function isPublic() : bool { - return ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & \PhpParser\Node\Stmt\Class_::VISIBILITY_MODIFIER_MASK) === 0; + return ($this->flags & Modifiers::PUBLIC) !== 0 || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether constant is protected. - * - * @return bool */ public function isProtected() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED); + return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether constant is private. - * - * @return bool */ public function isPrivate() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE); + return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether constant is final. - * - * @return bool */ public function isFinal() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL); + return (bool) ($this->flags & Modifiers::FINAL); } public function getType() : string { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php index d64a6a66b..9c0f5618e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php @@ -4,18 +4,19 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; +use PhpParser\Node\PropertyItem; abstract class ClassLike extends Node\Stmt { /** @var Node\Identifier|null Name */ - public $name; + public ?Node\Identifier $name; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var Node\Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; + public ?Node\Name $namespacedName; /** - * @return TraitUse[] + * @return list */ public function getTraitUses() : array { @@ -28,7 +29,7 @@ public function getTraitUses() : array return $traitUses; } /** - * @return ClassConst[] + * @return list */ public function getConstants() : array { @@ -41,7 +42,7 @@ public function getConstants() : array return $constants; } /** - * @return Property[] + * @return list */ public function getProperties() : array { @@ -60,12 +61,12 @@ public function getProperties() : array * * @return Property|null Property node or null if the property does not exist */ - public function getProperty(string $name) + public function getProperty(string $name) : ?\PhpParser\Node\Stmt\Property { foreach ($this->stmts as $stmt) { if ($stmt instanceof \PhpParser\Node\Stmt\Property) { foreach ($stmt->props as $prop) { - if ($prop instanceof \PhpParser\Node\Stmt\PropertyProperty && $name === $prop->name->toString()) { + if ($prop instanceof PropertyItem && $name === $prop->name->toString()) { return $stmt; } } @@ -76,7 +77,7 @@ public function getProperty(string $name) /** * Gets all methods defined directly in this class/interface/trait * - * @return ClassMethod[] + * @return list */ public function getMethods() : array { @@ -95,7 +96,7 @@ public function getMethods() : array * * @return ClassMethod|null Method node or null if the method does not exist */ - public function getMethod(string $name) + public function getMethod(string $name) : ?\PhpParser\Node\Stmt\ClassMethod { $lowerName = \strtolower($name); foreach ($this->stmts as $stmt) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php index ef64021eb..e15473ff7 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php @@ -3,38 +3,47 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\FunctionLike; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; class ClassMethod extends Node\Stmt implements FunctionLike, StmtsAwareInterface { /** @var int Flags */ - public $flags; + public int $flags; /** @var bool Whether to return by reference */ - public $byRef; + public bool $byRef; /** @var Node\Identifier Name */ - public $name; + public Node\Identifier $name; /** @var Node\Param[] Parameters */ - public $params; + public array $params; /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; + public ?Node $returnType; /** @var Node\Stmt[]|null Statements */ - public $stmts; + public ?array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; - private static $magicNames = ['__construct' => \true, '__destruct' => \true, '__call' => \true, '__callstatic' => \true, '__get' => \true, '__set' => \true, '__isset' => \true, '__unset' => \true, '__sleep' => \true, '__wakeup' => \true, '__tostring' => \true, '__set_state' => \true, '__clone' => \true, '__invoke' => \true, '__debuginfo' => \true, '__serialize' => \true, '__unserialize' => \true]; + public array $attrGroups; + /** @var array */ + private static array $magicNames = ['__construct' => \true, '__destruct' => \true, '__call' => \true, '__callstatic' => \true, '__get' => \true, '__set' => \true, '__isset' => \true, '__unset' => \true, '__sleep' => \true, '__wakeup' => \true, '__tostring' => \true, '__set_state' => \true, '__clone' => \true, '__invoke' => \true, '__debuginfo' => \true, '__serialize' => \true, '__unserialize' => \true]; /** * Constructs a class method node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags => MODIFIER_PUBLIC: Flags - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * flags?: int, + * byRef?: bool, + * params?: Node\Param[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * stmts?: Node\Stmt[]|null, + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'flags => 0 : Flags + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { @@ -43,8 +52,7 @@ public function __construct($name, array $subNodes = [], array $attributes = []) $this->byRef = $subNodes['byRef'] ?? \false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = \array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } @@ -64,7 +72,7 @@ public function getReturnType() { return $this->returnType; } - public function getStmts() + public function getStmts() : ?array { return $this->stmts; } @@ -74,62 +82,48 @@ public function getAttrGroups() : array } /** * Whether the method is explicitly or implicitly public. - * - * @return bool */ public function isPublic() : bool { - return ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & \PhpParser\Node\Stmt\Class_::VISIBILITY_MODIFIER_MASK) === 0; + return ($this->flags & Modifiers::PUBLIC) !== 0 || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether the method is protected. - * - * @return bool */ public function isProtected() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED); + return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether the method is private. - * - * @return bool */ public function isPrivate() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE); + return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether the method is abstract. - * - * @return bool */ public function isAbstract() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT); + return (bool) ($this->flags & Modifiers::ABSTRACT); } /** * Whether the method is final. - * - * @return bool */ public function isFinal() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL); + return (bool) ($this->flags & Modifiers::FINAL); } /** * Whether the method is static. - * - * @return bool */ public function isStatic() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC); + return (bool) ($this->flags & Modifiers::STATIC); } /** * Whether the method is magic. - * - * @return bool */ public function isMagic() : bool { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php index db2dee3e2..4f317ea6f 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php @@ -3,36 +3,50 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; -use PhpParser\Error; +use PhpParser\Modifiers; use PhpParser\Node; class Class_ extends \PhpParser\Node\Stmt\ClassLike { - const MODIFIER_PUBLIC = 1; - const MODIFIER_PROTECTED = 2; - const MODIFIER_PRIVATE = 4; - const MODIFIER_STATIC = 8; - const MODIFIER_ABSTRACT = 16; - const MODIFIER_FINAL = 32; - const MODIFIER_READONLY = 64; - const VISIBILITY_MODIFIER_MASK = 7; + /** @deprecated Use Modifiers::PUBLIC instead */ + public const MODIFIER_PUBLIC = 1; + /** @deprecated Use Modifiers::PROTECTED instead */ + public const MODIFIER_PROTECTED = 2; + /** @deprecated Use Modifiers::PRIVATE instead */ + public const MODIFIER_PRIVATE = 4; + /** @deprecated Use Modifiers::STATIC instead */ + public const MODIFIER_STATIC = 8; + /** @deprecated Use Modifiers::ABSTRACT instead */ + public const MODIFIER_ABSTRACT = 16; + /** @deprecated Use Modifiers::FINAL instead */ + public const MODIFIER_FINAL = 32; + /** @deprecated Use Modifiers::READONLY instead */ + public const MODIFIER_READONLY = 64; + /** @deprecated Use Modifiers::VISIBILITY_MASK instead */ + public const VISIBILITY_MODIFIER_MASK = 7; // 1 | 2 | 4 - /** @var int Type */ - public $flags; + /** @var int Modifiers */ + public int $flags; /** @var null|Node\Name Name of extended class */ - public $extends; + public ?Node\Name $extends; /** @var Node\Name[] Names of implemented interfaces */ - public $implements; + public array $implements; /** * Constructs a class node. * * @param string|Node\Identifier|null $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags' => 0 : Flags - * 'extends' => null : Name of extended class - * 'implements' => array(): Names of implemented interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * flags?: int, + * extends?: Node\Name|null, + * implements?: Node\Name[], + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'flags' => 0 : Flags + * 'extends' => null : Name of extended class + * 'implements' => array(): Names of implemented interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { @@ -50,77 +64,29 @@ public function getSubNodeNames() : array } /** * Whether the class is explicitly abstract. - * - * @return bool */ public function isAbstract() : bool { - return (bool) ($this->flags & self::MODIFIER_ABSTRACT); + return (bool) ($this->flags & Modifiers::ABSTRACT); } /** * Whether the class is final. - * - * @return bool */ public function isFinal() : bool { - return (bool) ($this->flags & self::MODIFIER_FINAL); + return (bool) ($this->flags & Modifiers::FINAL); } public function isReadonly() : bool { - return (bool) ($this->flags & self::MODIFIER_READONLY); + return (bool) ($this->flags & Modifiers::READONLY); } /** * Whether the class is anonymous. - * - * @return bool */ public function isAnonymous() : bool { return null === $this->name; } - /** - * @internal - */ - public static function verifyClassModifier($a, $b) - { - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class'); - } - } - /** - * @internal - */ - public static function verifyModifier($a, $b) - { - if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { - throw new Error('Multiple access type modifiers are not allowed'); - } - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { - throw new Error('Multiple static modifiers are not allowed'); - } - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class member'); - } - } public function getType() : string { return 'Stmt_Class'; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php index aff84aa08..966b71fc1 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php @@ -7,21 +7,25 @@ class Const_ extends Node\Stmt { /** @var Node\Const_[] Constant declarations */ - public $consts; + public array $consts; + /** @var Node\AttributeGroup[] PHP attribute groups */ + public array $attrGroups; /** * Constructs a const list node. * - * @param Node\Const_[] $consts Constant declarations - * @param array $attributes Additional attributes + * @param Node\Const_[] $consts Constant declarations + * @param array $attributes Additional attributes + * @param list $attrGroups PHP attribute groups */ - public function __construct(array $consts, array $attributes = []) + public function __construct(array $consts, array $attributes = [], array $attrGroups = []) { $this->attributes = $attributes; + $this->attrGroups = $attrGroups; $this->consts = $consts; } public function getSubNodeNames() : array { - return ['consts']; + return ['attrGroups', 'consts']; } public function getType() : string { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php index 331a3ae55..942cf67df 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php @@ -7,12 +7,12 @@ class Continue_ extends Node\Stmt { /** @var null|Node\Expr Number of loops to continue */ - public $num; + public ?Node\Expr $num; /** * Constructs a continue node. * - * @param null|Node\Expr $num Number of loops to continue - * @param array $attributes Additional attributes + * @param null|Node\Expr $num Number of loops to continue + * @param array $attributes Additional attributes */ public function __construct(?Node\Expr $num = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php index 4fde5c280..d0a18188d 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php @@ -3,32 +3,11 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; -use PhpParser\Node; -class DeclareDeclare extends Node\Stmt -{ - /** @var Node\Identifier Key */ - public $key; - /** @var Node\Expr Value */ - public $value; - /** - * Constructs a declare key=>value pair node. - * - * @param string|Node\Identifier $key Key - * @param Node\Expr $value Value - * @param array $attributes Additional attributes - */ - public function __construct($key, Node\Expr $value, array $attributes = []) +use PhpParser\Node\DeclareItem; +require __DIR__ . '/../DeclareItem.php'; +if (\false) { + // For classmap-authoritative support. + class DeclareDeclare extends DeclareItem { - $this->attributes = $attributes; - $this->key = \is_string($key) ? new Node\Identifier($key) : $key; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['key', 'value']; - } - public function getType() : string - { - return 'Stmt_DeclareDeclare'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php index b57ad947c..7d66ad74e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php @@ -4,18 +4,19 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; +use PhpParser\Node\DeclareItem; class Declare_ extends Node\Stmt { - /** @var DeclareDeclare[] List of declares */ - public $declares; + /** @var DeclareItem[] List of declares */ + public array $declares; /** @var Node\Stmt[]|null Statements */ - public $stmts; + public ?array $stmts; /** * Constructs a declare node. * - * @param DeclareDeclare[] $declares List of declares - * @param Node\Stmt[]|null $stmts Statements - * @param array $attributes Additional attributes + * @param DeclareItem[] $declares List of declares + * @param Node\Stmt[]|null $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(array $declares, ?array $stmts = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php index a343b6bb7..0d1d0542c 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php @@ -4,18 +4,19 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Do_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class Do_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** * Constructs a do while node. * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php index c50905354..70a18eb35 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php @@ -7,12 +7,12 @@ class Echo_ extends Node\Stmt { /** @var Node\Expr[] Expressions */ - public $exprs; + public array $exprs; /** * Constructs an echo node. * - * @param Node\Expr[] $exprs Expressions - * @param array $attributes Additional attributes + * @param Node\Expr[] $exprs Expressions + * @param array $attributes Additional attributes */ public function __construct(array $exprs, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php index 4b0e31a48..6938033e9 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php @@ -4,18 +4,19 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class ElseIf_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class ElseIf_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs an elseif node. * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php index 20c998b32..757e762cb 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php @@ -4,15 +4,16 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Else_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class Else_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs an else node. * - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(array $stmts = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php index df41143df..73d1785f2 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php @@ -8,16 +8,16 @@ class EnumCase extends Node\Stmt { /** @var Node\Identifier Enum case name */ - public $name; + public Node\Identifier $name; /** @var Node\Expr|null Enum case expression */ - public $expr; + public ?Node\Expr $expr; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** - * @param string|Node\Identifier $name Enum case name - * @param Node\Expr|null $expr Enum case expression - * @param AttributeGroup[] $attrGroups PHP attribute groups - * @param array $attributes Additional attributes + * @param string|Node\Identifier $name Enum case name + * @param Node\Expr|null $expr Enum case expression + * @param list $attrGroups PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, ?Node\Expr $expr = null, array $attrGroups = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php index 48cf8d69a..e636e57d8 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php @@ -7,17 +7,22 @@ class Enum_ extends \PhpParser\Node\Stmt\ClassLike { /** @var null|Node\Identifier Scalar Type */ - public $scalarType; + public ?Node $scalarType; /** @var Node\Name[] Names of implemented interfaces */ - public $implements; + public array $implements; /** - * @param string|Node\Identifier|null $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'scalarType' => null : Scalar type - * 'implements' => array() : Names of implemented interfaces - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes + * @param string|Node\Identifier|null $name Name + * @param array{ + * scalarType?: Node\Identifier|null, + * implements?: Node\Name[], + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'scalarType' => null : Scalar type + * 'implements' => array() : Names of implemented interfaces + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php index 4971d2f62..77408f284 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php @@ -10,12 +10,12 @@ class Expression extends Node\Stmt { /** @var Node\Expr Expression */ - public $expr; + public Node\Expr $expr; /** * Constructs an expression statement. * - * @param Node\Expr $expr Expression - * @param array $attributes Additional attributes + * @param Node\Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php index 01200cc3d..5e3809de1 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php @@ -4,15 +4,16 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Finally_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class Finally_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a finally node. * - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(array $stmts = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php index c7119a240..30f81b255 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php @@ -4,25 +4,31 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class For_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class For_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Expr[] Init expressions */ - public $init; + public array $init; /** @var Node\Expr[] Loop conditions */ - public $cond; + public array $cond; /** @var Node\Expr[] Loop expressions */ - public $loop; + public array $loop; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a for loop node. * - * @param array $subNodes Array of the following optional subnodes: - * 'init' => array(): Init expressions - * 'cond' => array(): Loop conditions - * 'loop' => array(): Loop expressions - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes + * @param array{ + * init?: Node\Expr[], + * cond?: Node\Expr[], + * loop?: Node\Expr[], + * stmts?: Node\Stmt[], + * } $subNodes Array of the following optional subnodes: + * 'init' => array(): Init expressions + * 'cond' => array(): Loop conditions + * 'loop' => array(): Loop expressions + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php index 23060580a..9d232e9db 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php @@ -4,28 +4,33 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class Foreach_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class Foreach_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Expr Expression to iterate */ - public $expr; + public Node\Expr $expr; /** @var null|Node\Expr Variable to assign key to */ - public $keyVar; + public ?Node\Expr $keyVar; /** @var bool Whether to assign value by reference */ - public $byRef; + public bool $byRef; /** @var Node\Expr Variable to assign value to */ - public $valueVar; + public Node\Expr $valueVar; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a foreach node. * - * @param Node\Expr $expr Expression to iterate - * @param Node\Expr $valueVar Variable to assign value to - * @param array $subNodes Array of the following optional subnodes: - * 'keyVar' => null : Variable to assign key to - * 'byRef' => false : Whether to assign value by reference - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes + * @param Node\Expr $expr Expression to iterate + * @param Node\Expr $valueVar Variable to assign value to + * @param array{ + * keyVar?: Node\Expr|null, + * byRef?: bool, + * stmts?: Node\Stmt[], + * } $subNodes Array of the following optional subnodes: + * 'keyVar' => null : Variable to assign key to + * 'byRef' => false : Whether to assign value by reference + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php index 698b1be7c..85298e85a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php @@ -9,30 +9,36 @@ class Function_ extends Node\Stmt implements FunctionLike, StmtsAwareInterface { /** @var bool Whether function returns by reference */ - public $byRef; + public bool $byRef; /** @var Node\Identifier Name */ - public $name; + public Node\Identifier $name; /** @var Node\Param[] Parameters */ - public $params; + public array $params; /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ - public $returnType; + public ?Node $returnType; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; /** @var Node\Name|null Namespaced name (if using NameResolver) */ - public $namespacedName; + public ?Node\Name $namespacedName; /** * Constructs a function node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * byRef?: bool, + * params?: Node\Param[], + * returnType?: null|Node\Identifier|Node\Name|Node\ComplexType, + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'byRef' => false : Whether to return by reference + * 'params' => array(): Parameters + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { @@ -40,8 +46,7 @@ public function __construct($name, array $subNodes = [], array $attributes = []) $this->byRef = $subNodes['byRef'] ?? \false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->returnType = $subNodes['returnType'] ?? null; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php index 600c67888..e6df97e65 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php @@ -7,12 +7,12 @@ class Global_ extends Node\Stmt { /** @var Node\Expr[] Variables */ - public $vars; + public array $vars; /** * Constructs a global variables list node. * - * @param Node\Expr[] $vars Variables to unset - * @param array $attributes Additional attributes + * @param Node\Expr[] $vars Variables to unset + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php index 0edfd25aa..f8d5f7bf3 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php @@ -8,12 +8,12 @@ class Goto_ extends Stmt { /** @var Identifier Name of label to jump to */ - public $name; + public Identifier $name; /** * Constructs a goto node. * - * @param string|Identifier $name Name of label to jump to - * @param array $attributes Additional attributes + * @param string|Identifier $name Name of label to jump to + * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php index f43407dcd..484347817 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php @@ -5,21 +5,24 @@ use PhpParser\Node\Name; use PhpParser\Node\Stmt; +use PhpParser\Node\UseItem; class GroupUse extends Stmt { - /** @var int Type of group use */ - public $type; + /** + * @var Use_::TYPE_* Type of group use + */ + public int $type; /** @var Name Prefix for uses */ - public $prefix; - /** @var UseUse[] Uses */ - public $uses; + public Name $prefix; + /** @var UseItem[] Uses */ + public array $uses; /** * Constructs a group use node. * - * @param Name $prefix Prefix for uses - * @param UseUse[] $uses Uses - * @param int $type Type of group use - * @param array $attributes Additional attributes + * @param Name $prefix Prefix for uses + * @param UseItem[] $uses Uses + * @param Use_::TYPE_* $type Type of group use + * @param array $attributes Additional attributes */ public function __construct(Name $prefix, array $uses, int $type = \PhpParser\Node\Stmt\Use_::TYPE_NORMAL, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php index ebc9654e5..c1c829fc8 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php @@ -7,12 +7,12 @@ class HaltCompiler extends Stmt { /** @var string Remaining text after halt compiler statement. */ - public $remaining; + public string $remaining; /** * Constructs a __halt_compiler node. * - * @param string $remaining Remaining text after halt compiler statement. - * @param array $attributes Additional attributes + * @param string $remaining Remaining text after halt compiler statement. + * @param array $attributes Additional attributes */ public function __construct(string $remaining, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php index 1be355cb8..4cafe23d7 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php @@ -4,25 +4,30 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class If_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class If_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Expr Condition expression */ - public $cond; + public Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var ElseIf_[] Elseif clauses */ - public $elseifs; + public array $elseifs; /** @var null|Else_ Else clause */ - public $else; + public ?\PhpParser\Node\Stmt\Else_ $else; /** * Constructs an if node. * - * @param Node\Expr $cond Condition - * @param array $subNodes Array of the following optional subnodes: - * 'stmts' => array(): Statements - * 'elseifs' => array(): Elseif clauses - * 'else' => null : Else clause - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param array{ + * stmts?: Node\Stmt[], + * elseifs?: ElseIf_[], + * else?: Else_|null, + * } $subNodes Array of the following optional subnodes: + * 'stmts' => array(): Statements + * 'elseifs' => array(): Elseif clauses + * 'else' => null : Else clause + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php index 8643d5c7b..33ead2efd 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php @@ -7,12 +7,12 @@ class InlineHTML extends Stmt { /** @var string String */ - public $value; + public string $value; /** * Constructs an inline HTML node. * - * @param string $value String - * @param array $attributes Additional attributes + * @param string $value String + * @param array $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php index ceae98b3c..9a1da332e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php @@ -7,16 +7,20 @@ class Interface_ extends \PhpParser\Node\Stmt\ClassLike { /** @var Node\Name[] Extended interfaces */ - public $extends; + public array $extends; /** * Constructs a class node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'extends' => array(): Name of extended interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * extends?: Node\Name[], + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'extends' => array(): Name of extended interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php index fa8563152..f3374e4be 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php @@ -8,12 +8,12 @@ class Label extends Stmt { /** @var Identifier Name */ - public $name; + public Identifier $name; /** * Constructs a label node. * - * @param string|Identifier $name Name - * @param array $attributes Additional attributes + * @param string|Identifier $name Name + * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php index cd96768d7..719b01ed0 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php @@ -8,20 +8,20 @@ class Namespace_ extends Node\Stmt implements StmtsAwareInterface { /* For use in the "kind" attribute */ - const KIND_SEMICOLON = 1; - const KIND_BRACED = 2; + public const KIND_SEMICOLON = 1; + public const KIND_BRACED = 2; /** @var null|Node\Name Name */ - public $name; + public ?Node\Name $name; /** @var Node\Stmt[] Statements */ public $stmts; /** * Constructs a namespace node. * - * @param null|Node\Name $name Name - * @param null|Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param null|Node\Name $name Name + * @param null|Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ - public function __construct(?Node\Name $name = null, $stmts = [], array $attributes = []) + public function __construct(?Node\Name $name = null, ?array $stmts = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php index c57ef5688..1163fc015 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php @@ -3,85 +3,116 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\ComplexType; use PhpParser\Node\Identifier; use PhpParser\Node\Name; +use PhpParser\Node\PropertyItem; class Property extends Node\Stmt { /** @var int Modifiers */ - public $flags; - /** @var PropertyProperty[] Properties */ - public $props; + public int $flags; + /** @var PropertyItem[] Properties */ + public array $props; /** @var null|Identifier|Name|ComplexType Type declaration */ - public $type; + public ?Node $type; /** @var Node\AttributeGroup[] PHP attribute groups */ - public $attrGroups; + public array $attrGroups; + /** @var Node\PropertyHook[] Property hooks */ + public array $hooks; /** * Constructs a class property list node. * - * @param int $flags Modifiers - * @param PropertyProperty[] $props Properties - * @param array $attributes Additional attributes - * @param null|string|Identifier|Name|ComplexType $type Type declaration - * @param Node\AttributeGroup[] $attrGroups PHP attribute groups + * @param int $flags Modifiers + * @param PropertyItem[] $props Properties + * @param array $attributes Additional attributes + * @param null|Identifier|Name|ComplexType $type Type declaration + * @param Node\AttributeGroup[] $attrGroups PHP attribute groups + * @param Node\PropertyHook[] $hooks Property hooks */ - public function __construct(int $flags, array $props, array $attributes = [], $type = null, array $attrGroups = []) + public function __construct(int $flags, array $props, array $attributes = [], ?Node $type = null, array $attrGroups = [], array $hooks = []) { $this->attributes = $attributes; $this->flags = $flags; $this->props = $props; - $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->type = $type; $this->attrGroups = $attrGroups; + $this->hooks = $hooks; } public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'type', 'props']; + return ['attrGroups', 'flags', 'type', 'props', 'hooks']; } /** * Whether the property is explicitly or implicitly public. - * - * @return bool */ public function isPublic() : bool { - return ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & \PhpParser\Node\Stmt\Class_::VISIBILITY_MODIFIER_MASK) === 0; + return ($this->flags & Modifiers::PUBLIC) !== 0 || ($this->flags & Modifiers::VISIBILITY_MASK) === 0; } /** * Whether the property is protected. - * - * @return bool */ public function isProtected() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED); + return (bool) ($this->flags & Modifiers::PROTECTED); } /** * Whether the property is private. - * - * @return bool */ public function isPrivate() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE); + return (bool) ($this->flags & Modifiers::PRIVATE); } /** * Whether the property is static. - * - * @return bool */ public function isStatic() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC); + return (bool) ($this->flags & Modifiers::STATIC); } /** * Whether the property is readonly. - * - * @return bool */ public function isReadonly() : bool { - return (bool) ($this->flags & \PhpParser\Node\Stmt\Class_::MODIFIER_READONLY); + return (bool) ($this->flags & Modifiers::READONLY); + } + /** + * Whether the property is abstract. + */ + public function isAbstract() : bool + { + return (bool) ($this->flags & Modifiers::ABSTRACT); + } + /** + * Whether the property is final. + */ + public function isFinal() : bool + { + return (bool) ($this->flags & Modifiers::FINAL); + } + /** + * Whether the property has explicit public(set) visibility. + */ + public function isPublicSet() : bool + { + return (bool) ($this->flags & Modifiers::PUBLIC_SET); + } + /** + * Whether the property has explicit protected(set) visibility. + */ + public function isProtectedSet() : bool + { + return (bool) ($this->flags & Modifiers::PROTECTED_SET); + } + /** + * Whether the property has explicit private(set) visibility. + */ + public function isPrivateSet() : bool + { + return (bool) ($this->flags & Modifiers::PRIVATE_SET); } public function getType() : string { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php index d3292a5c0..de962684b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php @@ -3,32 +3,11 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; -use PhpParser\Node; -class PropertyProperty extends Node\Stmt -{ - /** @var Node\VarLikeIdentifier Name */ - public $name; - /** @var null|Node\Expr Default */ - public $default; - /** - * Constructs a class property node. - * - * @param string|Node\VarLikeIdentifier $name Name - * @param null|Node\Expr $default Default value - * @param array $attributes Additional attributes - */ - public function __construct($name, ?Node\Expr $default = null, array $attributes = []) +use PhpParser\Node\PropertyItem; +require __DIR__ . '/../PropertyItem.php'; +if (\false) { + // For classmap-authoritative support. + class PropertyProperty extends PropertyItem { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; - $this->default = $default; - } - public function getSubNodeNames() : array - { - return ['name', 'default']; - } - public function getType() : string - { - return 'Stmt_PropertyProperty'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php index 157597cc3..86810a1d5 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php @@ -7,12 +7,12 @@ class Return_ extends Node\Stmt { /** @var null|Node\Expr Expression */ - public $expr; + public ?Node\Expr $expr; /** * Constructs a return node. * - * @param null|Node\Expr $expr Expression - * @param array $attributes Additional attributes + * @param null|Node\Expr $expr Expression + * @param array $attributes Additional attributes */ public function __construct(?Node\Expr $expr = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php index a014cb69b..efae40479 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php @@ -3,33 +3,10 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; -use PhpParser\Node; -use PhpParser\Node\Expr; -class StaticVar extends Node\Stmt -{ - /** @var Expr\Variable Variable */ - public $var; - /** @var null|Node\Expr Default value */ - public $default; - /** - * Constructs a static variable node. - * - * @param Expr\Variable $var Name - * @param null|Node\Expr $default Default value - * @param array $attributes Additional attributes - */ - public function __construct(Expr\Variable $var, ?Node\Expr $default = null, array $attributes = []) +require __DIR__ . '/../StaticVar.php'; +if (\false) { + // For classmap-authoritative support. + class StaticVar extends \PhpParser\Node\StaticVar { - $this->attributes = $attributes; - $this->var = $var; - $this->default = $default; - } - public function getSubNodeNames() : array - { - return ['var', 'default']; - } - public function getType() : string - { - return 'Stmt_StaticVar'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php index 7a0a347a7..eed2eebc8 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php @@ -3,16 +3,17 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; +use PhpParser\Node\StaticVar; use PhpParser\Node\Stmt; class Static_ extends Stmt { /** @var StaticVar[] Variable definitions */ - public $vars; + public array $vars; /** * Constructs a static variables list node. * - * @param StaticVar[] $vars Variable definitions - * @param array $attributes Additional attributes + * @param StaticVar[] $vars Variable definitions + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php index 0edbd2dfd..13493f15f 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php @@ -7,15 +7,15 @@ class Switch_ extends Node\Stmt { /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** @var Case_[] Case list */ - public $cases; + public array $cases; /** * Constructs a case node. * - * @param Node\Expr $cond Condition - * @param Case_[] $cases Case list - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Case_[] $cases Case list + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $cases, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php deleted file mode 100644 index fd38ef1ff..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php +++ /dev/null @@ -1,30 +0,0 @@ -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Stmt_Throw'; - } -} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php index 98d9e70e3..780b1b380 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php @@ -7,15 +7,15 @@ class TraitUse extends Node\Stmt { /** @var Node\Name[] Traits */ - public $traits; + public array $traits; /** @var TraitUseAdaptation[] Adaptations */ - public $adaptations; + public array $adaptations; /** * Constructs a trait use node. * - * @param Node\Name[] $traits Traits + * @param Node\Name[] $traits Traits * @param TraitUseAdaptation[] $adaptations Adaptations - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $traits, array $adaptations = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php index 02f9f0669..d1a50f6f6 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php @@ -7,7 +7,7 @@ abstract class TraitUseAdaptation extends Node\Stmt { /** @var Node\Name|null Trait name */ - public $trait; + public ?Node\Name $trait; /** @var Node\Identifier Method name */ - public $method; + public Node\Identifier $method; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php index 32c226642..304704d7b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php @@ -7,19 +7,19 @@ class Alias extends Node\Stmt\TraitUseAdaptation { /** @var null|int New modifier */ - public $newModifier; + public ?int $newModifier; /** @var null|Node\Identifier New name */ - public $newName; + public ?Node\Identifier $newName; /** * Constructs a trait use precedence adaptation node. * - * @param null|Node\Name $trait Trait name - * @param string|Node\Identifier $method Method name - * @param null|int $newModifier New modifier - * @param null|string|Node\Identifier $newName New name - * @param array $attributes Additional attributes + * @param null|Node\Name $trait Trait name + * @param string|Node\Identifier $method Method name + * @param null|int $newModifier New modifier + * @param null|string|Node\Identifier $newName New name + * @param array $attributes Additional attributes */ - public function __construct($trait, $method, $newModifier, $newName, array $attributes = []) + public function __construct(?Node\Name $trait, $method, ?int $newModifier, $newName, array $attributes = []) { $this->attributes = $attributes; $this->trait = $trait; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php index 486a17289..f01b0c4dc 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php @@ -7,14 +7,14 @@ class Precedence extends Node\Stmt\TraitUseAdaptation { /** @var Node\Name[] Overwritten traits */ - public $insteadof; + public array $insteadof; /** * Constructs a trait use precedence adaptation node. * - * @param Node\Name $trait Trait name - * @param string|Node\Identifier $method Method name - * @param Node\Name[] $insteadof Overwritten traits - * @param array $attributes Additional attributes + * @param Node\Name $trait Trait name + * @param string|Node\Identifier $method Method name + * @param Node\Name[] $insteadof Overwritten traits + * @param array $attributes Additional attributes */ public function __construct(Node\Name $trait, $method, array $insteadof, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php index 017bca351..d1981400d 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php @@ -10,10 +10,13 @@ class Trait_ extends \PhpParser\Node\Stmt\ClassLike * Constructs a trait node. * * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes + * @param array{ + * stmts?: Node\Stmt[], + * attrGroups?: Node\AttributeGroup[], + * } $subNodes Array of the following optional subnodes: + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php index 337224a10..aa596924a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php @@ -8,18 +8,18 @@ class TryCatch extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** @var Catch_[] Catches */ - public $catches; + public array $catches; /** @var null|Finally_ Optional finally node */ - public $finally; + public ?\PhpParser\Node\Stmt\Finally_ $finally; /** * Constructs a try catch node. * - * @param Node\Stmt[] $stmts Statements - * @param Catch_[] $catches Catches - * @param null|Finally_ $finally Optional finally node - * @param array $attributes Additional attributes + * @param Node\Stmt[] $stmts Statements + * @param Catch_[] $catches Catches + * @param null|Finally_ $finally Optional finally node + * @param array $attributes Additional attributes */ public function __construct(array $stmts, array $catches, ?\PhpParser\Node\Stmt\Finally_ $finally = null, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php index c5a24f718..5c2c608d2 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php @@ -7,12 +7,12 @@ class Unset_ extends Node\Stmt { /** @var Node\Expr[] Variables to unset */ - public $vars; + public array $vars; /** * Constructs an unset node. * - * @param Node\Expr[] $vars Variables to unset - * @param array $attributes Additional attributes + * @param Node\Expr[] $vars Variables to unset + * @param array $attributes Additional attributes */ public function __construct(array $vars, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php index a56f4faf6..2d9d2b326 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php @@ -3,49 +3,11 @@ declare (strict_types=1); namespace PhpParser\Node\Stmt; -use PhpParser\Node; -use PhpParser\Node\Identifier; -class UseUse extends Node\Stmt -{ - /** @var int One of the Stmt\Use_::TYPE_* constants. Will only differ from TYPE_UNKNOWN for mixed group uses */ - public $type; - /** @var Node\Name Namespace, class, function or constant to alias */ - public $name; - /** @var Identifier|null Alias */ - public $alias; - /** - * Constructs an alias (use) node. - * - * @param Node\Name $name Namespace/Class to alias - * @param null|string|Identifier $alias Alias - * @param int $type Type of the use element (for mixed group use only) - * @param array $attributes Additional attributes - */ - public function __construct(Node\Name $name, $alias = null, int $type = \PhpParser\Node\Stmt\Use_::TYPE_UNKNOWN, array $attributes = []) +use PhpParser\Node\UseItem; +require __DIR__ . '/../UseItem.php'; +if (\false) { + // For classmap-authoritative support. + class UseUse extends UseItem { - $this->attributes = $attributes; - $this->type = $type; - $this->name = $name; - $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; - } - public function getSubNodeNames() : array - { - return ['type', 'name', 'alias']; - } - /** - * Get alias. If not explicitly given this is the last component of the used name. - * - * @return Identifier - */ - public function getAlias() : Identifier - { - if (null !== $this->alias) { - return $this->alias; - } - return new Identifier($this->name->getLast()); - } - public function getType() : string - { - return 'Stmt_UseUse'; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php index 6702649cd..e69165c7f 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php @@ -4,6 +4,7 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node\Stmt; +use PhpParser\Node\UseItem; class Use_ extends Stmt { /** @@ -11,23 +12,23 @@ class Use_ extends Stmt * TYPE_UNKNOWN while the other has one of the three other possible types. For normal use statements the type on the * Stmt\UseUse is unknown. It's only the other way around for mixed group use declarations. */ - const TYPE_UNKNOWN = 0; + public const TYPE_UNKNOWN = 0; /** Class or namespace import */ - const TYPE_NORMAL = 1; + public const TYPE_NORMAL = 1; /** Function import */ - const TYPE_FUNCTION = 2; + public const TYPE_FUNCTION = 2; /** Constant import */ - const TYPE_CONSTANT = 3; - /** @var int Type of alias */ - public $type; - /** @var UseUse[] Aliases */ - public $uses; + public const TYPE_CONSTANT = 3; + /** @var self::TYPE_* Type of alias */ + public int $type; + /** @var UseItem[] Aliases */ + public array $uses; /** * Constructs an alias (use) list node. * - * @param UseUse[] $uses Aliases - * @param int $type Type of alias - * @param array $attributes Additional attributes + * @param UseItem[] $uses Aliases + * @param Stmt\Use_::TYPE_* $type Type of alias + * @param array $attributes Additional attributes */ public function __construct(array $uses, int $type = self::TYPE_NORMAL, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php index 36ed0fe22..1167c22be 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php @@ -4,18 +4,19 @@ namespace PhpParser\Node\Stmt; use PhpParser\Node; -class While_ extends Node\Stmt implements \Rector\Contract\PhpParser\Node\StmtsAwareInterface +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; +class While_ extends Node\Stmt implements StmtsAwareInterface { /** @var Node\Expr Condition */ - public $cond; + public Node\Expr $cond; /** @var Node\Stmt[] Statements */ - public $stmts; + public array $stmts; /** * Constructs a while node. * - * @param Node\Expr $cond Condition - * @param Node\Stmt[] $stmts Statements - * @param array $attributes Additional attributes + * @param Node\Expr $cond Condition + * @param Node\Stmt[] $stmts Statements + * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $stmts = [], array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php index 18f8e521e..d6a7ecbbb 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php @@ -6,12 +6,12 @@ class UnionType extends \PhpParser\Node\ComplexType { /** @var (Identifier|Name|IntersectionType)[] Types */ - public $types; + public array $types; /** * Constructs a union type. * - * @param (Identifier|Name|IntersectionType)[] $types Types - * @param array $attributes Additional attributes + * @param (Identifier|Name|IntersectionType)[] $types Types + * @param array $attributes Additional attributes */ public function __construct(array $types, array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php new file mode 100644 index 000000000..13dfbb3fc --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php @@ -0,0 +1,54 @@ + $attributes Additional attributes + */ + public function __construct(Node\Name $name, $alias = null, int $type = Use_::TYPE_UNKNOWN, array $attributes = []) + { + $this->attributes = $attributes; + $this->type = $type; + $this->name = $name; + $this->alias = \is_string($alias) ? new \PhpParser\Node\Identifier($alias) : $alias; + } + public function getSubNodeNames() : array + { + return ['type', 'name', 'alias']; + } + /** + * Get alias. If not explicitly given this is the last component of the used name. + */ + public function getAlias() : \PhpParser\Node\Identifier + { + if (null !== $this->alias) { + return $this->alias; + } + return new \PhpParser\Node\Identifier($this->name->getLast()); + } + public function getType() : string + { + return 'UseItem'; + } +} +// @deprecated compatibility alias +\class_alias(\PhpParser\Node\UseItem::class, \PhpParser\Node\Stmt\UseUse::class); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php index 63a0951da..ac098cd93 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php @@ -12,7 +12,7 @@ class VariadicPlaceholder extends NodeAbstract /** * Create a variadic argument placeholder (first-class callable syntax). * - * @param array $attributes Additional attributes + * @param array $attributes Additional attributes */ public function __construct(array $attributes = []) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php index 389cb0c35..6901a6424 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php @@ -5,11 +5,12 @@ abstract class NodeAbstract implements \PhpParser\Node, \JsonSerializable { - protected $attributes; + /** @var array Attributes */ + protected array $attributes; /** * Creates a Node. * - * @param array $attributes Array of attributes + * @param array $attributes Array of attributes */ public function __construct(array $attributes = []) { @@ -19,6 +20,7 @@ public function __construct(array $attributes = []) * Gets line the node started in (alias of getStartLine). * * @return int Start line (or -1 if not available) + * @phpstan-return -1|positive-int */ public function getLine() : int { @@ -30,6 +32,7 @@ public function getLine() : int * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). * * @return int Start line (or -1 if not available) + * @phpstan-return -1|positive-int */ public function getStartLine() : int { @@ -41,6 +44,7 @@ public function getStartLine() : int * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). * * @return int End line (or -1 if not available) + * @phpstan-return -1|positive-int */ public function getEndLine() : int { @@ -110,7 +114,7 @@ public function getComments() : array * * @return null|Comment\Doc Doc comment object or null */ - public function getDocComment() + public function getDocComment() : ?\PhpParser\Comment\Doc { $comments = $this->getComments(); for ($i = \count($comments) - 1; $i >= 0; $i--) { @@ -128,7 +132,7 @@ public function getDocComment() * * @param Comment\Doc $docComment Doc comment to set */ - public function setDocComment(\PhpParser\Comment\Doc $docComment) + public function setDocComment(\PhpParser\Comment\Doc $docComment) : void { $comments = $this->getComments(); for ($i = \count($comments) - 1; $i >= 0; $i--) { @@ -143,7 +147,7 @@ public function setDocComment(\PhpParser\Comment\Doc $docComment) $comments[] = $docComment; $this->setAttribute('comments', $comments); } - public function setAttribute(string $key, $value) + public function setAttribute(string $key, $value) : void { $this->attributes[$key] = $value; } @@ -162,12 +166,12 @@ public function getAttributes() : array { return $this->attributes; } - public function setAttributes(array $attributes) + public function setAttributes(array $attributes) : void { $this->attributes = $attributes; } /** - * @return array + * @return array */ public function jsonSerialize() : array { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php index 6629d42b0..f5478f1fd 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php @@ -3,16 +3,24 @@ declare (strict_types=1); namespace PhpParser; +use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\Include_; -use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Expr\List_; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Scalar\InterpolatedString; +use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; -use PhpParser\Node\Stmt\UseUse; +use PhpParser\Node\UseItem; class NodeDumper { - private $dumpComments; - private $dumpPositions; - private $code; + private bool $dumpComments; + private bool $dumpPositions; + private bool $dumpOtherAttributes; + private ?string $code; + private string $res; + private string $nl; + private const IGNORE_ATTRIBUTES = ['comments' => \true, 'startLine' => \true, 'endLine' => \true, 'startFilePos' => \true, 'endFilePos' => \true, 'startTokenPos' => \true, 'endTokenPos' => \true]; /** * Constructs a NodeDumper. * @@ -20,6 +28,7 @@ class NodeDumper * * bool dumpComments: Whether comments should be dumped. * * bool dumpPositions: Whether line/offset information should be dumped. To dump offset * information, the code needs to be passed to dump(). + * * bool dumpOtherAttributes: Whether non-comment, non-position attributes should be dumped. * * @param array $options Options (see description) */ @@ -27,11 +36,12 @@ public function __construct(array $options = []) { $this->dumpComments = !empty($options['dumpComments']); $this->dumpPositions = !empty($options['dumpPositions']); + $this->dumpOtherAttributes = !empty($options['dumpOtherAttributes']); } /** * Dumps a node or array. * - * @param array|Node $node Node or array to dump + * @param array|Node $node Node or array to dump * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if * the dumpPositions option is enabled and the dumping of node offsets * is desired. @@ -41,110 +51,172 @@ public function __construct(array $options = []) public function dump($node, ?string $code = null) : string { $this->code = $code; - return $this->dumpRecursive($node); + $this->res = ''; + $this->nl = "\n"; + $this->dumpRecursive($node, \false); + return $this->res; } - protected function dumpRecursive($node) + /** @param mixed $node */ + protected function dumpRecursive($node, bool $indent = \true) : void { + if ($indent) { + $this->nl .= " "; + } if ($node instanceof \PhpParser\Node) { - $r = $node->getType(); + $this->res .= $node->getType(); if ($this->dumpPositions && null !== ($p = $this->dumpPosition($node))) { - $r .= $p; + $this->res .= $p; } - $r .= '('; + $this->res .= '('; foreach ($node->getSubNodeNames() as $key) { - $r .= "\n " . $key . ': '; + $this->res .= "{$this->nl} " . $key . ': '; $value = $node->{$key}; - if (null === $value) { - $r .= 'null'; - } elseif (\false === $value) { - $r .= 'false'; - } elseif (\true === $value) { - $r .= 'true'; - } elseif (\is_scalar($value)) { + if (\is_int($value)) { if ('flags' === $key || 'newModifier' === $key) { - $r .= $this->dumpFlags($value); - } elseif ('type' === $key && $node instanceof Include_) { - $r .= $this->dumpIncludeType($value); - } elseif ('type' === $key && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { - $r .= $this->dumpUseType($value); - } else { - $r .= $value; + $this->res .= $this->dumpFlags($value); + continue; + } + if ('type' === $key && $node instanceof Include_) { + $this->res .= $this->dumpIncludeType($value); + continue; + } + if ('type' === $key && ($node instanceof Use_ || $node instanceof UseItem || $node instanceof GroupUse)) { + $this->res .= $this->dumpUseType($value); + continue; } - } else { - $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); } + $this->dumpRecursive($value); } if ($this->dumpComments && ($comments = $node->getComments())) { - $r .= "\n comments: " . \str_replace("\n", "\n ", $this->dumpRecursive($comments)); + $this->res .= "{$this->nl} comments: "; + $this->dumpRecursive($comments); + } + if ($this->dumpOtherAttributes) { + foreach ($node->getAttributes() as $key => $value) { + if (isset(self::IGNORE_ATTRIBUTES[$key])) { + continue; + } + $this->res .= "{$this->nl} {$key}: "; + if (\is_int($value)) { + if ('kind' === $key) { + if ($node instanceof Int_) { + $this->res .= $this->dumpIntKind($value); + continue; + } + if ($node instanceof String_ || $node instanceof InterpolatedString) { + $this->res .= $this->dumpStringKind($value); + continue; + } + if ($node instanceof Array_) { + $this->res .= $this->dumpArrayKind($value); + continue; + } + if ($node instanceof List_) { + $this->res .= $this->dumpListKind($value); + continue; + } + } + } + $this->dumpRecursive($value); + } } + $this->res .= "{$this->nl})"; } elseif (\is_array($node)) { - $r = 'array('; + $this->res .= 'array('; foreach ($node as $key => $value) { - $r .= "\n " . $key . ': '; - if (null === $value) { - $r .= 'null'; - } elseif (\false === $value) { - $r .= 'false'; - } elseif (\true === $value) { - $r .= 'true'; - } elseif (\is_scalar($value)) { - $r .= $value; - } else { - $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); - } + $this->res .= "{$this->nl} " . $key . ': '; + $this->dumpRecursive($value); } + $this->res .= "{$this->nl})"; } elseif ($node instanceof \PhpParser\Comment) { - return $node->getReformattedText(); + $this->res .= \str_replace("\n", $this->nl, $node->getReformattedText()); + } elseif (\is_string($node)) { + $this->res .= \str_replace("\n", $this->nl, $node); + } elseif (\is_int($node) || \is_float($node)) { + $this->res .= $node; + } elseif (null === $node) { + $this->res .= 'null'; + } elseif (\false === $node) { + $this->res .= 'false'; + } elseif (\true === $node) { + $this->res .= 'true'; } else { throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } - return $r . "\n)"; + if ($indent) { + $this->nl = \substr($this->nl, 0, -4); + } } - protected function dumpFlags($flags) + protected function dumpFlags(int $flags) : string { $strs = []; - if ($flags & Class_::MODIFIER_PUBLIC) { - $strs[] = 'MODIFIER_PUBLIC'; + if ($flags & \PhpParser\Modifiers::PUBLIC) { + $strs[] = 'PUBLIC'; + } + if ($flags & \PhpParser\Modifiers::PROTECTED) { + $strs[] = 'PROTECTED'; + } + if ($flags & \PhpParser\Modifiers::PRIVATE) { + $strs[] = 'PRIVATE'; + } + if ($flags & \PhpParser\Modifiers::ABSTRACT) { + $strs[] = 'ABSTRACT'; } - if ($flags & Class_::MODIFIER_PROTECTED) { - $strs[] = 'MODIFIER_PROTECTED'; + if ($flags & \PhpParser\Modifiers::STATIC) { + $strs[] = 'STATIC'; } - if ($flags & Class_::MODIFIER_PRIVATE) { - $strs[] = 'MODIFIER_PRIVATE'; + if ($flags & \PhpParser\Modifiers::FINAL) { + $strs[] = 'FINAL'; } - if ($flags & Class_::MODIFIER_ABSTRACT) { - $strs[] = 'MODIFIER_ABSTRACT'; + if ($flags & \PhpParser\Modifiers::READONLY) { + $strs[] = 'READONLY'; } - if ($flags & Class_::MODIFIER_STATIC) { - $strs[] = 'MODIFIER_STATIC'; + if ($flags & \PhpParser\Modifiers::PUBLIC_SET) { + $strs[] = 'PUBLIC_SET'; } - if ($flags & Class_::MODIFIER_FINAL) { - $strs[] = 'MODIFIER_FINAL'; + if ($flags & \PhpParser\Modifiers::PROTECTED_SET) { + $strs[] = 'PROTECTED_SET'; } - if ($flags & Class_::MODIFIER_READONLY) { - $strs[] = 'MODIFIER_READONLY'; + if ($flags & \PhpParser\Modifiers::PRIVATE_SET) { + $strs[] = 'PRIVATE_SET'; } if ($strs) { return \implode(' | ', $strs) . ' (' . $flags . ')'; } else { - return $flags; + return (string) $flags; } } - protected function dumpIncludeType($type) + /** @param array $map */ + private function dumpEnum(int $value, array $map) : string { - $map = [Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE']; - if (!isset($map[$type])) { - return $type; + if (!isset($map[$value])) { + return (string) $value; } - return $map[$type] . ' (' . $type . ')'; + return $map[$value] . ' (' . $value . ')'; } - protected function dumpUseType($type) + private function dumpIncludeType(int $type) : string { - $map = [Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT']; - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; + return $this->dumpEnum($type, [Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE']); + } + private function dumpUseType(int $type) : string + { + return $this->dumpEnum($type, [Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT']); + } + private function dumpIntKind(int $kind) : string + { + return $this->dumpEnum($kind, [Int_::KIND_BIN => 'KIND_BIN', Int_::KIND_OCT => 'KIND_OCT', Int_::KIND_DEC => 'KIND_DEC', Int_::KIND_HEX => 'KIND_HEX']); + } + private function dumpStringKind(int $kind) : string + { + return $this->dumpEnum($kind, [String_::KIND_SINGLE_QUOTED => 'KIND_SINGLE_QUOTED', String_::KIND_DOUBLE_QUOTED => 'KIND_DOUBLE_QUOTED', String_::KIND_HEREDOC => 'KIND_HEREDOC', String_::KIND_NOWDOC => 'KIND_NOWDOC']); + } + private function dumpArrayKind(int $kind) : string + { + return $this->dumpEnum($kind, [Array_::KIND_LONG => 'KIND_LONG', Array_::KIND_SHORT => 'KIND_SHORT']); + } + private function dumpListKind(int $kind) : string + { + return $this->dumpEnum($kind, [List_::KIND_LIST => 'KIND_LIST', List_::KIND_ARRAY => 'KIND_ARRAY']); } /** * Dump node position, if possible. @@ -153,7 +225,7 @@ protected function dumpUseType($type) * * @return string|null Dump of position, or null if position information not available */ - protected function dumpPosition(\PhpParser\Node $node) + protected function dumpPosition(\PhpParser\Node $node) : ?string { if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { return null; @@ -167,7 +239,7 @@ protected function dumpPosition(\PhpParser\Node $node) return "[{$start} - {$end}]"; } // Copied from Error class - private function toColumn($code, $pos) + private function toColumn(string $code, int $pos) : int { if ($pos > \strlen($code)) { throw new \RuntimeException('Invalid position information'); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php index 335f6ecb0..acc03077e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php @@ -10,29 +10,32 @@ class NodeFinder /** * Find all nodes satisfying a filter callback. * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param callable $filter Filter callback: function(Node $node) : bool * * @return Node[] Found nodes satisfying the filter callback */ public function find($nodes, callable $filter) : array { + if ($nodes === []) { + return []; + } if (!\is_array($nodes)) { $nodes = [$nodes]; } $visitor = new FindingVisitor($filter); - $traverser = new \PhpParser\NodeTraverser(); - $traverser->addVisitor($visitor); + $traverser = new \PhpParser\NodeTraverser($visitor); $traverser->traverse($nodes); return $visitor->getFoundNodes(); } /** * Find all nodes that are instances of a certain class. + * @template TNode as Node * * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name + * @param class-string $class Class name * - * @return Node[] Found nodes (all instances of $class) + * @return TNode[] Found nodes (all instances of $class) */ public function findInstanceOf($nodes, string $class) : array { @@ -43,31 +46,35 @@ public function findInstanceOf($nodes, string $class) : array /** * Find first node satisfying a filter callback. * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param callable $filter Filter callback: function(Node $node) : bool * * @return null|Node Found node (or null if none found) */ - public function findFirst($nodes, callable $filter) + public function findFirst($nodes, callable $filter) : ?\PhpParser\Node { + if ($nodes === []) { + return null; + } if (!\is_array($nodes)) { $nodes = [$nodes]; } $visitor = new FirstFindingVisitor($filter); - $traverser = new \PhpParser\NodeTraverser(); - $traverser->addVisitor($visitor); + $traverser = new \PhpParser\NodeTraverser($visitor); $traverser->traverse($nodes); return $visitor->getFoundNode(); } /** * Find first node that is an instance of a certain class. * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name + * @template TNode as Node + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param class-string $class Class name * - * @return null|Node Found node, which is an instance of $class (or null if none found) + * @return null|TNode Found node, which is an instance of $class (or null if none found) */ - public function findFirstInstanceOf($nodes, string $class) + public function findFirstInstanceOf($nodes, string $class) : ?\PhpParser\Node { return $this->findFirst($nodes, function ($node) use($class) { return $node instanceof $class; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php index 56d22cccb..276c2b50a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php @@ -6,65 +6,51 @@ class NodeTraverser implements \PhpParser\NodeTraverserInterface { /** - * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes - * of the current node will not be traversed for any visitors. - * - * For subsequent visitors enterNode() will still be called on the current - * node and leaveNode() will also be invoked for the current node. + * @deprecated Use NodeVisitor::DONT_TRAVERSE_CHILDREN instead. */ - const DONT_TRAVERSE_CHILDREN = 1; + public const DONT_TRAVERSE_CHILDREN = \PhpParser\NodeVisitor::DONT_TRAVERSE_CHILDREN; /** - * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns - * STOP_TRAVERSAL, traversal is aborted. - * - * The afterTraverse() method will still be invoked. + * @deprecated Use NodeVisitor::STOP_TRAVERSAL instead. */ - const STOP_TRAVERSAL = 2; + public const STOP_TRAVERSAL = \PhpParser\NodeVisitor::STOP_TRAVERSAL; /** - * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs - * in an array, it will be removed from the array. - * - * For subsequent visitors leaveNode() will still be invoked for the - * removed node. + * @deprecated Use NodeVisitor::REMOVE_NODE instead. */ - const REMOVE_NODE = 3; + public const REMOVE_NODE = \PhpParser\NodeVisitor::REMOVE_NODE; /** - * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes - * of the current node will not be traversed for any visitors. - * - * For subsequent visitors enterNode() will not be called as well. - * leaveNode() will be invoked for visitors that has enterNode() method invoked. + * @deprecated Use NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN instead. */ - const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4; - /** @var NodeVisitor[] Visitors */ - protected $visitors = []; + public const DONT_TRAVERSE_CURRENT_AND_CHILDREN = \PhpParser\NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + /** @var list Visitors */ + protected array $visitors = []; /** @var bool Whether traversal should be stopped */ - protected $stopTraversal; - public function __construct() + protected bool $stopTraversal; + /** + * Create a traverser with the given visitors. + * + * @param NodeVisitor ...$visitors Node visitors + */ + public function __construct(\PhpParser\NodeVisitor ...$visitors) { - // for BC + $this->visitors = $visitors; } /** * Adds a visitor. * * @param NodeVisitor $visitor Visitor to add */ - public function addVisitor(\PhpParser\NodeVisitor $visitor) + public function addVisitor(\PhpParser\NodeVisitor $visitor) : void { $this->visitors[] = $visitor; } /** * Removes an added visitor. - * - * @param NodeVisitor $visitor */ - public function removeVisitor(\PhpParser\NodeVisitor $visitor) + public function removeVisitor(\PhpParser\NodeVisitor $visitor) : void { - foreach ($this->visitors as $index => $storedVisitor) { - if ($storedVisitor === $visitor) { - unset($this->visitors[$index]); - break; - } + $index = \array_search($visitor, $this->visitors); + if ($index !== \false) { + \array_splice($this->visitors, $index, 1, []); } } /** @@ -83,7 +69,8 @@ public function traverse(array $nodes) : array } } $nodes = $this->traverseArray($nodes); - foreach ($this->visitors as $visitor) { + for ($i = \count($this->visitors) - 1; $i >= 0; --$i) { + $visitor = $this->visitors[$i]; if (null !== ($return = $visitor->afterTraverse($nodes))) { $nodes = $return; } @@ -94,70 +81,73 @@ public function traverse(array $nodes) : array * Recursively traverse a node. * * @param Node $node Node to traverse. - * - * @return Node Result of traversal (may be original node or new one) */ - protected function traverseNode(\PhpParser\Node $node) : \PhpParser\Node + protected function traverseNode(\PhpParser\Node $node) : void { foreach ($node->getSubNodeNames() as $name) { - $subNode =& $node->{$name}; + $subNode = $node->{$name}; if (\is_array($subNode)) { - $subNode = $this->traverseArray($subNode); + $node->{$name} = $this->traverseArray($subNode); if ($this->stopTraversal) { break; } - } elseif ($subNode instanceof \PhpParser\Node) { - $traverseChildren = \true; - $breakVisitorIndex = null; - $visitors = $this->getVisitorsForNode($subNode); - foreach ($visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($subNode); - if (null !== $return) { - if ($return instanceof \PhpParser\Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = \false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = \false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } else { - throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); - } - } - } - if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); - if ($this->stopTraversal) { + continue; + } + if (!$subNode instanceof \PhpParser\Node) { + continue; + } + $traverseChildren = \true; + $visitorIndex = -1; + $visitors = $this->getVisitorsForNode($subNode); + foreach ($visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($subNode); + if (null !== $return) { + if ($return instanceof \PhpParser\Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $node->{$name} = $return; + } elseif (\PhpParser\NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = \false; + } elseif (\PhpParser\NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = \false; break; + } elseif (\PhpParser\NodeVisitor::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } elseif (\PhpParser\NodeVisitor::REPLACE_WITH_NULL === $return) { + $node->{$name} = null; + continue 2; + } else { + throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); } } - foreach ($visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($subNode); - if (null !== $return) { - if ($return instanceof \PhpParser\Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } elseif (\is_array($return)) { - throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); - } else { - throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); - } - } - if ($breakVisitorIndex === $visitorIndex) { + } + if ($traverseChildren) { + $this->traverseNode($subNode); + if ($this->stopTraversal) { + break; + } + } + for (; $visitorIndex >= 0; --$visitorIndex) { + $visitor = $visitors[$visitorIndex]; + $return = $visitor->leaveNode($subNode); + if (null !== $return) { + if ($return instanceof \PhpParser\Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $node->{$name} = $return; + } elseif (\PhpParser\NodeVisitor::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } elseif (\PhpParser\NodeVisitor::REPLACE_WITH_NULL === $return) { + $node->{$name} = null; break; + } elseif (\is_array($return)) { + throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); + } else { + throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); } } } } - return $node; } /** * Recursively traverse array (usually of nodes). @@ -169,64 +159,71 @@ protected function traverseNode(\PhpParser\Node $node) : \PhpParser\Node protected function traverseArray(array $nodes) : array { $doNodes = []; - foreach ($nodes as $i => &$node) { - if ($node instanceof \PhpParser\Node) { - $traverseChildren = \true; - $breakVisitorIndex = null; - $visitors = $this->getVisitorsForNode($node); - foreach ($visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($node); - if (null !== $return) { - if ($return instanceof \PhpParser\Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = \false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = \false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } else { - throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); - } - } + foreach ($nodes as $i => $node) { + if (!$node instanceof \PhpParser\Node) { + if (\is_array($node)) { + throw new \LogicException('Invalid node structure: Contains nested arrays'); } - if ($traverseChildren) { - $node = $this->traverseNode($node); - if ($this->stopTraversal) { + continue; + } + $traverseChildren = \true; + $visitorIndex = -1; + $visitors = $this->getVisitorsForNode($node); + foreach ($visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($node); + if (null !== $return) { + if ($return instanceof \PhpParser\Node) { + $this->ensureReplacementReasonable($node, $return); + $nodes[$i] = $node = $return; + } elseif (\is_array($return)) { + $doNodes[] = [$i, $return]; + continue 2; + } elseif (\PhpParser\NodeVisitor::REMOVE_NODE === $return) { + $doNodes[] = [$i, []]; + continue 2; + } elseif (\PhpParser\NodeVisitor::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = \false; + } elseif (\PhpParser\NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = \false; break; + } elseif (\PhpParser\NodeVisitor::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } elseif (\PhpParser\NodeVisitor::REPLACE_WITH_NULL === $return) { + throw new \LogicException('REPLACE_WITH_NULL can not be used if the parent structure is an array'); + } else { + throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); } } - foreach ($visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($node); - if (null !== $return) { - if ($return instanceof \PhpParser\Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (\is_array($return)) { - $doNodes[] = [$i, $return]; - break; - } elseif (self::REMOVE_NODE === $return) { - $doNodes[] = [$i, []]; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } elseif (\false === $return) { - throw new \LogicException('bool(false) return from leaveNode() no longer supported. ' . 'Return NodeTraverser::REMOVE_NODE instead'); - } else { - throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); - } - } - if ($breakVisitorIndex === $visitorIndex) { + } + if ($traverseChildren) { + $this->traverseNode($node); + if ($this->stopTraversal) { + break; + } + } + for (; $visitorIndex >= 0; --$visitorIndex) { + $visitor = $visitors[$visitorIndex]; + $return = $visitor->leaveNode($node); + if (null !== $return) { + if ($return instanceof \PhpParser\Node) { + $this->ensureReplacementReasonable($node, $return); + $nodes[$i] = $node = $return; + } elseif (\is_array($return)) { + $doNodes[] = [$i, $return]; + break; + } elseif (\PhpParser\NodeVisitor::REMOVE_NODE === $return) { + $doNodes[] = [$i, []]; break; + } elseif (\PhpParser\NodeVisitor::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } elseif (\PhpParser\NodeVisitor::REPLACE_WITH_NULL === $return) { + throw new \LogicException('REPLACE_WITH_NULL can not be used if the parent structure is an array'); + } else { + throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); } } - } elseif (\is_array($node)) { - throw new \LogicException('Invalid node structure: Contains nested arrays'); } } if (!empty($doNodes)) { @@ -243,7 +240,7 @@ public function getVisitorsForNode(\PhpParser\Node $node) { return $this->visitors; } - private function ensureReplacementReasonable($old, $new) + private function ensureReplacementReasonable(\PhpParser\Node $old, \PhpParser\Node $new) : void { if ($old instanceof \PhpParser\Node\Stmt && $new instanceof \PhpParser\Node\Expr) { throw new \LogicException("Trying to replace statement ({$old->getType()}) " . "with expression ({$new->getType()}). Are you missing a " . "Stmt_Expression wrapper?"); diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php index 959330c89..b0127d74e 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php @@ -10,13 +10,11 @@ interface NodeTraverserInterface * * @param NodeVisitor $visitor Visitor to add */ - public function addVisitor(\PhpParser\NodeVisitor $visitor); + public function addVisitor(\PhpParser\NodeVisitor $visitor) : void; /** * Removes an added visitor. - * - * @param NodeVisitor $visitor */ - public function removeVisitor(\PhpParser\NodeVisitor $visitor); + public function removeVisitor(\PhpParser\NodeVisitor $visitor) : void; /** * Traverses an array of nodes using the registered visitors. * diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php index 0da77047d..605ece98c 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php @@ -5,6 +5,43 @@ interface NodeVisitor { + /** + * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes + * of the current node will not be traversed for any visitors. + * + * For subsequent visitors enterNode() will still be called on the current + * node and leaveNode() will also be invoked for the current node. + */ + public const DONT_TRAVERSE_CHILDREN = 1; + /** + * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns + * STOP_TRAVERSAL, traversal is aborted. + * + * The afterTraverse() method will still be invoked. + */ + public const STOP_TRAVERSAL = 2; + /** + * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs + * in an array, it will be removed from the array. + * + * For subsequent visitors leaveNode() will still be invoked for the + * removed node. + */ + public const REMOVE_NODE = 3; + /** + * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes + * of the current node will not be traversed for any visitors. + * + * For subsequent visitors enterNode() will not be called as well. + * leaveNode() will be invoked for visitors that has enterNode() method invoked. + */ + public const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4; + /** + * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns REPLACE_WITH_NULL, + * the node will be replaced with null. This is not a legal return value if the node is part + * of an array, rather than another node. + */ + public const REPLACE_WITH_NULL = 5; /** * Called once before traversal. * @@ -23,16 +60,25 @@ public function beforeTraverse(array $nodes); * Return value semantics: * * null * => $node stays as-is - * * NodeTraverser::DONT_TRAVERSE_CHILDREN + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * NodeVisitor::REMOVE_NODE + * => $node is removed from the parent array + * * NodeVisitor::REPLACE_WITH_NULL + * => $node is replaced with null + * * NodeVisitor::DONT_TRAVERSE_CHILDREN * => Children of $node are not traversed. $node stays as-is - * * NodeTraverser::STOP_TRAVERSAL + * * NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN + * => Further visitors for the current node are skipped, and its children are not + * traversed. $node stays as-is. + * * NodeVisitor::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * otherwise * => $node is set to the return value * * @param Node $node Node * - * @return null|int|Node Replacement node (or special return value) + * @return null|int|Node|Node[] Replacement node (or special return value) */ public function enterNode(\PhpParser\Node $node); /** @@ -41,9 +87,11 @@ public function enterNode(\PhpParser\Node $node); * Return value semantics: * * null * => $node stays as-is - * * NodeTraverser::REMOVE_NODE + * * NodeVisitor::REMOVE_NODE * => $node is removed from the parent array - * * NodeTraverser::STOP_TRAVERSAL + * * NodeVisitor::REPLACE_WITH_NULL + * => $node is replaced with null + * * NodeVisitor::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php new file mode 100644 index 000000000..45897ac54 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php @@ -0,0 +1,74 @@ + Token positions of comments */ + private array $commentPositions = []; + /** + * Create a comment annotation visitor. + * + * @param Token[] $tokens Token array + */ + public function __construct(array $tokens) + { + $this->tokens = $tokens; + // Collect positions of comments. We use this to avoid traversing parts of the AST where + // there are no comments. + foreach ($tokens as $i => $token) { + if ($token->id === \T_COMMENT || $token->id === \T_DOC_COMMENT) { + $this->commentPositions[] = $i; + } + } + } + public function enterNode(Node $node) + { + $nextCommentPos = \current($this->commentPositions); + if ($nextCommentPos === \false) { + // No more comments. + return self::STOP_TRAVERSAL; + } + $oldPos = $this->pos; + $this->pos = $pos = $node->getStartTokenPos(); + if ($nextCommentPos > $oldPos && $nextCommentPos < $pos) { + $comments = []; + while (--$pos >= $oldPos) { + $token = $this->tokens[$pos]; + if ($token->id === \T_DOC_COMMENT) { + $comments[] = new Comment\Doc($token->text, $token->line, $token->pos, $pos, $token->getEndLine(), $token->getEndPos() - 1, $pos); + continue; + } + if ($token->id === \T_COMMENT) { + $comments[] = new Comment($token->text, $token->line, $token->pos, $pos, $token->getEndLine(), $token->getEndPos() - 1, $pos); + continue; + } + if ($token->id !== \T_WHITESPACE) { + break; + } + } + if (!empty($comments)) { + $node->setAttribute('comments', \array_reverse($comments)); + } + do { + $nextCommentPos = \next($this->commentPositions); + } while ($nextCommentPos !== \false && $nextCommentPos < $this->pos); + } + $endPos = $node->getEndTokenPos(); + if ($nextCommentPos > $endPos) { + // Skip children if there are no comments located inside this node. + $this->pos = $endPos; + return self::DONT_TRAVERSE_CHILDREN; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php index 6da6af2cc..11b26643b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php @@ -13,8 +13,8 @@ class FindingVisitor extends NodeVisitorAbstract { /** @var callable Filter callback */ protected $filterCallback; - /** @var Node[] Found nodes */ - protected $foundNodes; + /** @var list Found nodes */ + protected array $foundNodes; public function __construct(callable $filterCallback) { $this->filterCallback = $filterCallback; @@ -24,13 +24,13 @@ public function __construct(callable $filterCallback) * * Nodes are returned in pre-order. * - * @return Node[] Found nodes + * @return list Found nodes */ public function getFoundNodes() : array { return $this->foundNodes; } - public function beforeTraverse(array $nodes) + public function beforeTraverse(array $nodes) : ?array { $this->foundNodes = []; return null; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php index b19f20f2f..f05eeff50 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php @@ -4,7 +4,7 @@ namespace PhpParser\NodeVisitor; use PhpParser\Node; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PhpParser\NodeVisitorAbstract; /** * This visitor can be used to find the first node satisfying some criterion determined by @@ -15,7 +15,7 @@ class FirstFindingVisitor extends NodeVisitorAbstract /** @var callable Filter callback */ protected $filterCallback; /** @var null|Node Found node */ - protected $foundNode; + protected ?Node $foundNode; public function __construct(callable $filterCallback) { $this->filterCallback = $filterCallback; @@ -27,11 +27,11 @@ public function __construct(callable $filterCallback) * * @return null|Node Found node (or null if not found) */ - public function getFoundNode() + public function getFoundNode() : ?Node { return $this->foundNode; } - public function beforeTraverse(array $nodes) + public function beforeTraverse(array $nodes) : ?array { $this->foundNode = null; return null; @@ -41,7 +41,7 @@ public function enterNode(Node $node) $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNode = $node; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php index e0f8f5bd2..bbd79f6cc 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php @@ -14,11 +14,11 @@ class NameResolver extends NodeVisitorAbstract { /** @var NameContext Naming context */ - protected $nameContext; + protected NameContext $nameContext; /** @var bool Whether to preserve original names */ - protected $preserveOriginalNames; + protected bool $preserveOriginalNames; /** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes */ - protected $replaceNodes; + protected bool $replaceNodes; /** * Constructs a name resolution visitor. * @@ -30,7 +30,7 @@ class NameResolver extends NodeVisitorAbstract * namespacedName attribute, as usual.) * * @param ErrorHandler|null $errorHandler Error handler - * @param array $options Options + * @param array{preserveOriginalNames?: bool, replaceNodes?: bool} $options Options */ public function __construct(?ErrorHandler $errorHandler = null, array $options = []) { @@ -40,14 +40,12 @@ public function __construct(?ErrorHandler $errorHandler = null, array $options = } /** * Get name resolution context. - * - * @return NameContext */ public function getNameContext() : NameContext { return $this->nameContext; } - public function beforeTraverse(array $nodes) + public function beforeTraverse(array $nodes) : ?array { $this->nameContext->startNamespace(); return null; @@ -74,6 +72,8 @@ public function enterNode(Node $node) $this->resolveAttrGroups($node); if (null !== $node->name) { $this->addNamespacedName($node); + } else { + $node->namespacedName = null; } } elseif ($node instanceof Stmt\Interface_) { foreach ($node->extends as &$interface) { @@ -86,9 +86,7 @@ public function enterNode(Node $node) $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } + $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Trait_) { $this->resolveAttrGroups($node); $this->addNamespacedName($node); @@ -104,53 +102,57 @@ public function enterNode(Node $node) $node->type = $this->resolveType($node->type); } $this->resolveAttrGroups($node); + } elseif ($node instanceof Node\PropertyHook) { + foreach ($node->params as $param) { + $param->type = $this->resolveType($param->type); + $this->resolveAttrGroups($param); + } + $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\Const_) { foreach ($node->consts as $const) { $this->addNamespacedName($const); } - } else { - if ($node instanceof Stmt\ClassConst) { - if (null !== $node->type) { - $node->type = $this->resolveType($node->type); + $this->resolveAttrGroups($node); + } elseif ($node instanceof Stmt\ClassConst) { + if (null !== $node->type) { + $node->type = $this->resolveType($node->type); + } + $this->resolveAttrGroups($node); + } elseif ($node instanceof Stmt\EnumCase) { + $this->resolveAttrGroups($node); + } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\ClassConstFetch || $node instanceof Expr\New_ || $node instanceof Expr\Instanceof_) { + if ($node->class instanceof Name) { + $node->class = $this->resolveClassName($node->class); + } + } elseif ($node instanceof Stmt\Catch_) { + foreach ($node->types as &$type) { + $type = $this->resolveClassName($type); + } + } elseif ($node instanceof Expr\FuncCall) { + if ($node->name instanceof Name) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); + } + } elseif ($node instanceof Expr\ConstFetch) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); + } elseif ($node instanceof Stmt\TraitUse) { + foreach ($node->traits as &$trait) { + $trait = $this->resolveClassName($trait); + } + foreach ($node->adaptations as $adaptation) { + if (null !== $adaptation->trait) { + $adaptation->trait = $this->resolveClassName($adaptation->trait); } - $this->resolveAttrGroups($node); - } else { - if ($node instanceof Stmt\EnumCase) { - $this->resolveAttrGroups($node); - } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\ClassConstFetch || $node instanceof Expr\New_ || $node instanceof Expr\Instanceof_) { - if ($node->class instanceof Name) { - $node->class = $this->resolveClassName($node->class); - } - } elseif ($node instanceof Stmt\Catch_) { - foreach ($node->types as &$type) { - $type = $this->resolveClassName($type); - } - } elseif ($node instanceof Expr\FuncCall) { - if ($node->name instanceof Name) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); - } - } elseif ($node instanceof Expr\ConstFetch) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); - } elseif ($node instanceof Stmt\TraitUse) { - foreach ($node->traits as &$trait) { - $trait = $this->resolveClassName($trait); - } - foreach ($node->adaptations as $adaptation) { - if (null !== $adaptation->trait) { - $adaptation->trait = $this->resolveClassName($adaptation->trait); - } - if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { - foreach ($adaptation->insteadof as &$insteadof) { - $insteadof = $this->resolveClassName($insteadof); - } - } + if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { + foreach ($adaptation->insteadof as &$insteadof) { + $insteadof = $this->resolveClassName($insteadof); } } } } return null; } - private function addAlias(Stmt\UseUse $use, int $type, ?Name $prefix = null) + /** @param Stmt\Use_::TYPE_* $type */ + private function addAlias(Node\UseItem $use, int $type, ?Name $prefix = null) : void { // Add prefix for group uses $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; @@ -158,8 +160,8 @@ private function addAlias(Stmt\UseUse $use, int $type, ?Name $prefix = null) $type |= $use->type; $this->nameContext->addAlias($name, (string) $use->getAlias(), $type, $use->getAttributes()); } - /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ - private function resolveSignature($node) + /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure|Expr\ArrowFunction $node */ + private function resolveSignature($node) : void { foreach ($node->params as $param) { $param->type = $this->resolveType($param->type); @@ -167,7 +169,12 @@ private function resolveSignature($node) } $node->returnType = $this->resolveType($node->returnType); } - private function resolveType($node) + /** + * @template T of Node\Identifier|Name|Node\ComplexType|null + * @param T $node + * @return T + */ + private function resolveType(?Node $node) : ?Node { if ($node instanceof Name) { return $this->resolveClassName($node); @@ -188,7 +195,7 @@ private function resolveType($node) * Resolve name, according to name resolver options. * * @param Name $name Function or constant name to resolve - * @param int $type One of Stmt\Use_::TYPE_* + * @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_* * * @return Name Resolved name, or original name with attribute */ @@ -218,15 +225,15 @@ protected function resolveName(Name $name, int $type) : Name $name->setAttribute('namespacedName', FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes())); return $name; } - protected function resolveClassName(Name $name) + protected function resolveClassName(Name $name) : Name { return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); } - protected function addNamespacedName(Node $node) + protected function addNamespacedName(Node $node) : void { $node->namespacedName = Name::concat($this->nameContext->getNamespace(), (string) $node->name); } - protected function resolveAttrGroups(Node $node) + protected function resolveAttrGroups(Node $node) : void { foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attr) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php index 9a96210ce..01748e614 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php @@ -9,21 +9,28 @@ * Visitor that connects a child node to its parent node * as well as its sibling nodes. * - * On the child node, the parent node can be accessed through + * With $weakReferences=false on the child node, the parent node can be accessed through * $node->getAttribute('parent'), the previous * node can be accessed through $node->getAttribute('previous'), * and the next node can be accessed through $node->getAttribute('next'). + * + * With $weakReferences=true attribute names are prefixed by "weak_", e.g. "weak_parent". */ final class NodeConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ - private $stack = []; + private array $stack = []; /** * @var ?Node */ private $previous; + private bool $weakReferences; + public function __construct(bool $weakReferences = \false) + { + $this->weakReferences = $weakReferences; + } public function beforeTraverse(array $nodes) { $this->stack = []; @@ -32,11 +39,23 @@ public function beforeTraverse(array $nodes) public function enterNode(Node $node) { if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[\count($this->stack) - 1]); + $parent = $this->stack[\count($this->stack) - 1]; + if ($this->weakReferences) { + $node->setAttribute('weak_parent', \WeakReference::create($parent)); + } else { + $node->setAttribute('parent', $parent); + } } - if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { - $node->setAttribute('previous', $this->previous); - $this->previous->setAttribute('next', $node); + if ($this->previous !== null) { + if ($this->weakReferences) { + if ($this->previous->getAttribute('weak_parent') === $node->getAttribute('weak_parent')) { + $node->setAttribute('weak_previous', \WeakReference::create($this->previous)); + $this->previous->setAttribute('weak_next', \WeakReference::create($node)); + } + } elseif ($this->previous->getAttribute('parent') === $node->getAttribute('parent')) { + $node->setAttribute('previous', $this->previous); + $this->previous->setAttribute('next', $node); + } } $this->stack[] = $node; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php index b27ca88a3..d3405f52b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php @@ -3,22 +3,29 @@ declare (strict_types=1); namespace PhpParser\NodeVisitor; -use function array_pop; -use function count; use PhpParser\Node; use PhpParser\NodeVisitorAbstract; +use function array_pop; +use function count; /** * Visitor that connects a child node to its parent node. * - * On the child node, the parent node can be accessed through + * With $weakReferences=false on the child node, the parent node can be accessed through * $node->getAttribute('parent'). + * + * With $weakReferences=true the attribute name is "weak_parent" instead. */ final class ParentConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ - private $stack = []; + private array $stack = []; + private bool $weakReferences; + public function __construct(bool $weakReferences = \false) + { + $this->weakReferences = $weakReferences; + } public function beforeTraverse(array $nodes) { $this->stack = []; @@ -26,7 +33,12 @@ public function beforeTraverse(array $nodes) public function enterNode(Node $node) { if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); + $parent = $this->stack[count($this->stack) - 1]; + if ($this->weakReferences) { + $node->setAttribute('weak_parent', \WeakReference::create($parent)); + } else { + $node->setAttribute('parent', $parent); + } } $this->stack[] = $node; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php index 7c2e66c64..41889087b 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php @@ -6,7 +6,7 @@ /** * @codeCoverageIgnore */ -class NodeVisitorAbstract implements \PhpParser\NodeVisitor +abstract class NodeVisitorAbstract implements \PhpParser\NodeVisitor { public function beforeTraverse(array $nodes) { diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser.php index 321e01d2d..3f3d7ed8a 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser.php @@ -15,5 +15,11 @@ interface Parser * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and * the parser was unable to recover from an error). */ - public function parse(string $code, ?\PhpParser\ErrorHandler $errorHandler = null); + public function parse(string $code, ?\PhpParser\ErrorHandler $errorHandler = null) : ?array; + /** + * Return tokens for the last parse. + * + * @return Token[] + */ + public function getTokens() : array; } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php deleted file mode 100644 index 526599270..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php +++ /dev/null @@ -1,53 +0,0 @@ -parsers = $parsers; - } - public function parse(string $code, ?ErrorHandler $errorHandler = null) - { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing(); - } - list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); - if ($firstError === null) { - return $firstStmts; - } - for ($i = 1, $c = \count($this->parsers); $i < $c; ++$i) { - list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); - if ($error === null) { - return $stmts; - } - } - throw $firstError; - } - private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) - { - $stmts = null; - $error = null; - try { - $stmts = $parser->parse($code, $errorHandler); - } catch (Error $error) { - } - return [$stmts, $error]; - } -} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php deleted file mode 100644 index 187660dd3..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php +++ /dev/null @@ -1,1320 +0,0 @@ -'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "';'", "'{'", "'}'", "'('", "')'", "'\$'", "'`'", "']'", "'\"'", "T_ENUM", "T_NULLSAFE_OBJECT_OPERATOR", "T_ATTRIBUTE"); - protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 164, 168, 161, 55, 168, 168, 159, 160, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 156, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 163, 36, 168, 162, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 157, 35, 158, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 165, 131, 132, 133, 166, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 167); - protected $action = array(701, 671, 672, 673, 674, 675, 286, 676, 677, 678, 714, 715, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 245, 246, 242, 243, 244, -32766, -32766, 679, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 1230, 245, 246, 1231, 680, 681, 682, 683, 684, 685, 686, 900, 901, 748, -32766, -32766, -32766, -32766, -32766, -32766, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 717, 740, 718, 719, 720, 721, 709, 710, 711, 739, 712, 713, 698, 699, 700, 702, 703, 704, 742, 743, 744, 745, 746, 747, 876, 705, 706, 707, 708, 738, 729, 727, 728, 724, 725, 1047, 716, 722, 723, 730, 731, 733, 732, 734, 735, 55, 56, 425, 57, 58, 726, 737, 736, 756, 59, 60, -226, 61, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 337, -32767, -32767, -32767, -32767, 29, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 621, -32766, -32766, -32766, -32766, 62, 63, 1047, -32766, -32766, -32766, 64, 419, 65, 294, 295, 66, 67, 68, 69, 70, 71, 72, 73, 824, 25, 302, 74, 418, 985, 987, 670, 669, 1101, 1102, 1079, 756, 756, 768, 1221, 769, 470, -32766, -32766, -32766, 341, 750, 825, 54, -32767, -32767, -32767, -32767, 98, 99, 100, 101, 102, 220, 221, 222, 362, 877, -32766, 27, -32766, -32766, -32766, -32766, -32766, 1047, 492, 126, 1081, 1080, 1082, 370, 1069, 931, 207, 478, 479, 953, 954, 955, 952, 951, 950, 128, 480, 481, 804, 1107, 1108, 1109, 1110, 1104, 1105, 319, 32, 297, 10, 211, -515, 1111, 1106, 670, 669, 1081, 1080, 1082, 220, 221, 222, 41, 364, 341, 334, 421, 336, 426, -128, -128, -128, 313, 1047, 469, -4, 825, 54, 813, 597, 207, 40, 21, 427, -128, 471, -128, 472, -128, 473, -128, 1047, 428, 220, 221, 222, -32766, 33, 34, 429, 361, 327, 52, 35, 474, -32766, -32766, -32766, 342, 357, 358, 475, 476, 48, 207, 249, 670, 669, 477, 443, 300, 796, 847, 430, 431, 28, -32766, 815, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 953, 954, 955, 952, 951, 950, 422, 756, 424, 426, 827, 635, -128, -32766, -32766, 469, 825, 54, 288, 813, 1152, 756, 40, 21, 427, 317, 471, 345, 472, 129, 473, 9, 1187, 428, 612, 360, 324, 906, 33, 34, 429, 361, 1047, 415, 35, 474, 945, 1069, 315, 125, 357, 358, 475, 476, -32766, -32766, -32766, 927, 302, 477, 121, 1069, 760, 847, 430, 431, 670, 669, 423, 756, 1153, 810, 1047, 480, 767, -32766, 806, -32766, -32766, -32766, -32766, -261, 127, 347, 436, 842, 341, 1079, 1201, 426, 446, 827, 635, -4, 808, 469, 825, 54, 436, 813, 341, 756, 40, 21, 427, 444, 471, 130, 472, 1069, 473, 346, 768, 428, 769, -211, -211, -211, 33, 34, 429, 361, 308, 1077, 35, 474, -32766, -32766, -32766, 1047, 357, 358, 475, 476, -32766, -32766, -32766, 907, 120, 477, 538, 1069, 796, 847, 430, 431, 436, -32766, 341, -32766, -32766, -32766, 1047, 480, 811, -32766, 926, -32766, -32766, 755, 1081, 1080, 1082, 49, -32766, -32766, -32766, 750, 752, 426, 1202, 827, 635, -211, 30, 469, 670, 669, 436, 813, 341, 75, 40, 21, 427, -32766, 471, 1065, 472, 124, 473, 670, 669, 428, 212, -210, -210, -210, 33, 34, 429, 361, 51, 1187, 35, 474, 756, -32766, -32766, -32766, 357, 358, 475, 476, 213, 825, 54, 221, 222, 477, 20, 580, 796, 847, 430, 431, 220, 221, 222, 756, 222, 247, 78, 79, 80, 81, 341, 207, 516, 103, 104, 105, 753, 307, 131, 638, 1069, 207, 341, 207, 122, 827, 635, -210, 36, 106, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 1113, 307, 346, 436, 214, 341, 825, 54, 426, 123, 250, 129, 134, 106, 469, -32766, 571, 1113, 813, 245, 246, 40, 21, 427, 251, 471, 252, 472, 341, 473, 453, 22, 428, 207, 900, 901, 639, 33, 34, 429, 825, 54, -86, 35, 474, 220, 221, 222, 314, 357, 358, 100, 101, 102, 239, 240, 241, 646, 477, -230, 458, 588, 135, 374, 595, 596, 207, 761, 641, 649, 643, 942, 655, 930, 663, 823, 133, 307, 838, 426, -32766, 106, 750, 43, 44, 469, 45, 442, 46, 813, 827, 635, 40, 21, 427, 47, 471, 50, 472, 53, 473, 132, 608, 428, 302, 604, -280, -32766, 33, 34, 429, 825, 54, 426, 35, 474, 756, 958, -84, 469, 357, 358, 520, 813, 629, 363, 40, 21, 427, 477, 471, 574, 472, -515, 473, 848, 617, 428, -423, -32766, 11, 647, 33, 34, 429, 825, 54, 445, 35, 474, 462, 285, 577, 1112, 357, 358, 592, 369, 849, 593, 290, 827, 635, 477, 0, 0, 531, 0, 0, 325, 0, 0, 0, 0, 0, 652, 0, 0, 0, 322, 326, 0, 0, 0, 426, 0, 0, 0, 0, 323, 469, 316, 318, -516, 813, 863, 635, 40, 21, 427, 0, 471, 0, 472, 0, 473, 1159, 0, 428, 0, -414, 6, 7, 33, 34, 429, 825, 54, 426, 35, 474, 12, 14, 373, 469, 357, 358, -424, 813, 562, 755, 40, 21, 427, 477, 471, 248, 472, 840, 473, 38, 39, 428, 658, 659, 814, 822, 33, 34, 429, 801, 816, 879, 35, 474, 215, 216, 870, 871, 357, 358, 217, 771, 218, 799, 864, 827, 635, 477, 770, 861, 859, 937, 938, 935, 209, 821, 805, 807, 809, 812, 934, 764, 1101, 1102, 765, 936, 24, 78, 426, 335, 1103, 359, 636, 640, 469, 642, 644, 645, 813, 827, 635, 40, 21, 427, 648, 471, 650, 472, 651, 473, 653, 654, 428, 637, 26, 660, 797, 33, 34, 429, 215, 216, 1227, 35, 474, 1229, 217, 763, 218, 357, 358, 846, 762, 845, 1228, 844, 1061, 832, 477, 558, 209, 1107, 1108, 1109, 1110, 1104, 1105, 398, 1101, 1102, 1049, 843, 1050, 1111, 1106, 830, 1103, 943, 868, 869, 457, 1226, 1158, 219, 1195, 1193, 1178, 1191, 1092, 918, 827, 635, 31, 1199, 1189, 1056, 37, 42, 76, 77, 210, 287, 292, 293, 308, 309, 310, 311, 339, 356, 416, 0, -227, -226, 16, 17, 18, 393, 454, 461, 463, 467, 552, 626, 1052, 558, 1055, 1107, 1108, 1109, 1110, 1104, 1105, 398, 908, 1117, 1051, 1027, 563, 1111, 1106, 1026, 1094, 1058, 0, -433, 1045, 0, 1057, 219, 1060, 1059, 1076, 0, 1192, 1177, 1173, 1190, 1091, 1224, 1118, 1172, 600); - protected $actionCheck = array(2, 3, 4, 5, 6, 7, 14, 9, 10, 11, 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, 53, 54, 55, 9, 10, 57, 30, 116, 32, 33, 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, 72, 73, 74, 75, 76, 77, 135, 136, 80, 33, 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 31, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 13, 134, 135, 136, 137, 138, 139, 140, 141, 142, 3, 4, 5, 6, 7, 148, 149, 150, 82, 12, 13, 160, 15, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 8, 44, 45, 46, 47, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 80, 33, 34, 35, 36, 50, 51, 13, 9, 10, 11, 56, 128, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, 73, 59, 60, 37, 38, 78, 79, 80, 82, 82, 106, 85, 108, 86, 9, 10, 11, 161, 80, 1, 2, 44, 45, 46, 47, 48, 49, 50, 51, 52, 9, 10, 11, 106, 156, 30, 8, 32, 33, 34, 35, 36, 13, 116, 8, 153, 154, 155, 8, 122, 158, 30, 125, 126, 116, 117, 118, 119, 120, 121, 31, 134, 135, 156, 137, 138, 139, 140, 141, 142, 143, 145, 146, 8, 8, 133, 149, 150, 37, 38, 153, 154, 155, 9, 10, 11, 159, 8, 161, 162, 8, 164, 74, 75, 76, 77, 8, 13, 80, 0, 1, 2, 84, 158, 30, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 13, 98, 9, 10, 11, 9, 103, 104, 105, 106, 8, 70, 109, 110, 9, 10, 11, 8, 115, 116, 117, 118, 70, 30, 31, 37, 38, 124, 31, 8, 127, 128, 129, 130, 8, 30, 156, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 116, 117, 118, 119, 120, 121, 8, 82, 8, 74, 156, 157, 158, 33, 34, 80, 1, 2, 8, 84, 163, 82, 87, 88, 89, 133, 91, 70, 93, 152, 95, 108, 82, 98, 158, 8, 113, 160, 103, 104, 105, 106, 13, 108, 109, 110, 123, 122, 113, 157, 115, 116, 117, 118, 9, 10, 11, 156, 71, 124, 157, 122, 127, 128, 129, 130, 37, 38, 8, 82, 160, 156, 13, 134, 156, 30, 156, 32, 33, 34, 35, 158, 157, 148, 159, 122, 161, 80, 1, 74, 133, 156, 157, 158, 156, 80, 1, 2, 159, 84, 161, 82, 87, 88, 89, 157, 91, 157, 93, 122, 95, 161, 106, 98, 108, 100, 101, 102, 103, 104, 105, 106, 159, 116, 109, 110, 9, 10, 11, 13, 115, 116, 117, 118, 9, 10, 11, 160, 16, 124, 81, 122, 127, 128, 129, 130, 159, 30, 161, 32, 33, 34, 13, 134, 156, 30, 156, 32, 33, 153, 153, 154, 155, 70, 9, 10, 11, 80, 80, 74, 160, 156, 157, 158, 14, 80, 37, 38, 159, 84, 161, 152, 87, 88, 89, 30, 91, 160, 93, 14, 95, 37, 38, 98, 16, 100, 101, 102, 103, 104, 105, 106, 70, 82, 109, 110, 82, 33, 34, 35, 115, 116, 117, 118, 16, 1, 2, 10, 11, 124, 160, 85, 127, 128, 129, 130, 9, 10, 11, 82, 11, 14, 157, 9, 10, 11, 161, 30, 85, 53, 54, 55, 154, 57, 157, 31, 122, 30, 161, 30, 157, 156, 157, 158, 30, 69, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 144, 57, 161, 159, 16, 161, 1, 2, 74, 157, 16, 152, 157, 69, 80, 116, 161, 144, 84, 69, 70, 87, 88, 89, 16, 91, 16, 93, 161, 95, 75, 76, 98, 30, 135, 136, 31, 103, 104, 105, 1, 2, 31, 109, 110, 9, 10, 11, 31, 115, 116, 50, 51, 52, 50, 51, 52, 31, 124, 160, 75, 76, 101, 102, 111, 112, 30, 156, 157, 31, 31, 156, 157, 156, 157, 31, 31, 57, 38, 74, 33, 69, 80, 70, 70, 80, 70, 89, 70, 84, 156, 157, 87, 88, 89, 70, 91, 70, 93, 70, 95, 70, 96, 98, 71, 77, 82, 85, 103, 104, 105, 1, 2, 74, 109, 110, 82, 82, 97, 80, 115, 116, 85, 84, 92, 106, 87, 88, 89, 124, 91, 90, 93, 133, 95, 128, 94, 98, 147, 116, 97, 31, 103, 104, 105, 1, 2, 97, 109, 110, 97, 97, 100, 144, 115, 116, 100, 106, 128, 113, 161, 156, 157, 124, -1, -1, 151, -1, -1, 114, -1, -1, -1, -1, -1, 31, -1, -1, -1, 131, 131, -1, -1, -1, 74, -1, -1, -1, -1, 132, 80, 133, 133, 133, 84, 156, 157, 87, 88, 89, -1, 91, -1, 93, -1, 95, 144, -1, 98, -1, 147, 147, 147, 103, 104, 105, 1, 2, 74, 109, 110, 147, 147, 147, 80, 115, 116, 147, 84, 151, 153, 87, 88, 89, 124, 91, 31, 93, 152, 95, 156, 156, 98, 156, 156, 156, 156, 103, 104, 105, 156, 156, 156, 109, 110, 50, 51, 156, 156, 115, 116, 56, 156, 58, 156, 156, 156, 157, 124, 156, 156, 156, 156, 156, 156, 70, 156, 156, 156, 156, 156, 156, 156, 78, 79, 156, 156, 159, 157, 74, 157, 86, 157, 157, 157, 80, 157, 157, 157, 84, 156, 157, 87, 88, 89, 157, 91, 157, 93, 157, 95, 157, 157, 98, 157, 159, 158, 158, 103, 104, 105, 50, 51, 158, 109, 110, 158, 56, 158, 58, 115, 116, 158, 158, 158, 158, 158, 158, 158, 124, 135, 70, 137, 138, 139, 140, 141, 142, 143, 78, 79, 158, 158, 158, 149, 150, 158, 86, 158, 158, 158, 158, 158, 164, 159, 158, 158, 158, 158, 158, 158, 156, 157, 159, 158, 158, 163, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, -1, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 135, 160, 137, 138, 139, 140, 141, 142, 143, 160, 160, 160, 160, 160, 149, 150, 160, 160, 163, -1, 162, 162, -1, 163, 159, 163, 163, 163, -1, 163, 163, 163, 163, 163, 163, 163, 163, 163); - protected $actionBase = array(0, 229, 310, 390, 470, 103, 325, 325, 785, -2, -2, 149, -2, -2, -2, 660, 765, 799, 765, 589, 694, 870, 870, 870, 252, 404, 404, 404, 514, 177, 177, 918, 434, 118, 295, 313, 240, 491, 491, 491, 491, 138, 138, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 89, 206, 775, 550, 535, 776, 777, 778, 912, 709, 913, 859, 862, 700, 863, 864, 865, 866, 867, 858, 871, 935, 872, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 322, 592, 285, 319, 232, 44, 691, 691, 691, 691, 691, 691, 691, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 582, 530, 530, 530, 594, 860, 658, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 500, -21, -21, 492, 702, 420, 355, 216, 549, 151, 26, 26, 331, 331, 331, 331, 331, 46, 46, 5, 5, 5, 5, 153, 188, 188, 188, 188, 121, 121, 121, 121, 314, 314, 394, 394, 362, 300, 298, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 67, 656, 656, 659, 659, 522, 554, 554, 554, 554, 679, -59, -59, 381, 462, 462, 462, 528, 717, 854, 382, 382, 382, 382, 382, 382, 561, 561, 561, -3, -3, -3, 692, 115, 137, 115, 137, 678, 732, 450, 732, 338, 677, -15, 510, 812, 468, 707, 856, 711, 857, 572, 735, 267, 529, 654, 674, 463, 529, 529, 529, 529, 654, 610, 640, 608, 463, 529, 463, 718, 323, 496, 89, 570, 507, 675, 779, 293, 670, 781, 290, 373, 332, 566, 278, 435, 733, 784, 914, 917, 385, 715, 675, 675, 675, 352, 511, 278, -8, 605, 605, 605, 605, 156, 605, 605, 605, 605, 251, 276, 375, 402, 780, 657, 657, 690, 869, 783, 783, 657, 689, 657, 690, 874, 874, 874, 874, 657, 657, 657, 657, 783, 783, 783, 688, 783, 239, 703, 704, 704, 874, 742, 743, 657, 657, 712, 783, 783, 783, 712, 695, 874, 701, 741, 277, 783, 874, 672, 689, 672, 657, 701, 672, 689, 689, 672, 22, 666, 668, 873, 875, 887, 791, 662, 685, 879, 880, 876, 878, 811, 699, 744, 497, 669, 671, 673, 680, 719, 682, 713, 674, 667, 667, 667, 655, 720, 655, 667, 667, 667, 667, 667, 667, 667, 667, 868, 646, 731, 714, 653, 745, 553, 573, 792, 664, 814, 900, 893, 919, 920, 881, 898, 655, 916, 739, 247, 643, 882, 813, 788, 655, 883, 655, 794, 655, 902, 820, 686, 823, 825, 667, 910, 921, 923, 924, 925, 927, 928, 929, 930, 684, 931, 749, 696, 894, 299, 877, 718, 729, 705, 790, 750, 829, 328, 932, 830, 655, 655, 795, 786, 655, 796, 751, 740, 890, 756, 895, 933, 664, 708, 896, 655, 706, 831, 934, 328, 681, 683, 888, 661, 757, 886, 911, 885, 803, 761, 649, 663, 832, 833, 834, 693, 763, 891, 892, 889, 764, 805, 665, 807, 768, 697, 835, 809, 884, 769, 848, 849, 899, 676, 730, 710, 698, 687, 810, 850, 897, 770, 771, 772, 853, 773, 855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, -2, -2, -2, -2, 0, 0, -2, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, -21, -21, -21, -21, 599, -21, -21, -21, -21, -21, -21, -21, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, -21, 599, 599, 599, -21, 382, -21, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 599, 0, 0, 599, -21, 599, -21, 599, -21, -21, 599, 599, 599, 599, 599, 599, 599, -21, -21, -21, -21, -21, -21, 0, 561, 561, 561, 561, -21, -21, -21, -21, 382, 382, 382, 382, 382, 382, 259, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 561, 561, -3, -3, 382, 382, 382, 382, 382, 259, 382, 382, 463, 689, 689, 689, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 463, 0, 463, 0, 382, 463, 689, 463, 657, 137, 689, 689, 463, 783, 616, 616, 616, 616, 328, 278, 0, 0, 689, 689, 0, 0, 0, 0, 0, 689, 0, 0, 0, 0, 0, 0, 783, 0, 0, 0, 0, 0, 667, 247, 0, 705, 335, 0, 0, 0, 0, 0, 0, 705, 335, 347, 347, 0, 684, 667, 667, 667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328); - protected $actionDefault = array(3, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 544, 544, 499, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 299, 299, 299, 32767, 32767, 32767, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 32767, 32767, 32767, 32767, 32767, 32767, 383, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 389, 549, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 364, 365, 367, 368, 298, 552, 533, 247, 390, 548, 297, 249, 327, 503, 32767, 32767, 32767, 329, 122, 258, 203, 502, 125, 296, 234, 382, 384, 328, 303, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 302, 458, 361, 360, 359, 460, 32767, 459, 496, 496, 499, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 325, 487, 486, 326, 456, 330, 457, 333, 461, 464, 331, 332, 349, 350, 347, 348, 351, 462, 463, 480, 481, 478, 479, 301, 352, 353, 354, 355, 482, 483, 484, 485, 32767, 32767, 543, 543, 32767, 32767, 282, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 340, 341, 471, 472, 32767, 238, 238, 238, 238, 283, 238, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 335, 336, 334, 466, 467, 465, 432, 32767, 32767, 32767, 434, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 504, 32767, 32767, 32767, 32767, 32767, 517, 421, 171, 32767, 413, 32767, 171, 171, 171, 171, 32767, 222, 224, 167, 32767, 171, 32767, 490, 32767, 32767, 32767, 32767, 522, 345, 32767, 32767, 116, 32767, 32767, 32767, 559, 32767, 517, 32767, 116, 32767, 32767, 32767, 32767, 358, 337, 338, 339, 32767, 32767, 521, 515, 474, 475, 476, 477, 32767, 468, 469, 470, 473, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 429, 435, 435, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 520, 519, 32767, 414, 498, 188, 186, 186, 32767, 208, 208, 32767, 32767, 190, 491, 510, 32767, 190, 173, 32767, 400, 175, 498, 32767, 32767, 240, 32767, 240, 32767, 400, 240, 32767, 32767, 240, 32767, 415, 439, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 379, 380, 493, 506, 32767, 507, 32767, 413, 343, 344, 346, 322, 32767, 324, 369, 370, 371, 372, 373, 374, 375, 377, 32767, 419, 32767, 422, 32767, 32767, 32767, 257, 32767, 557, 32767, 32767, 306, 557, 32767, 32767, 32767, 551, 32767, 32767, 300, 32767, 32767, 32767, 32767, 253, 32767, 169, 32767, 541, 32767, 558, 32767, 515, 32767, 342, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 516, 32767, 32767, 32767, 32767, 229, 32767, 452, 32767, 116, 32767, 32767, 32767, 189, 32767, 32767, 304, 248, 32767, 32767, 550, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 114, 32767, 170, 32767, 32767, 32767, 191, 32767, 32767, 515, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 295, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 515, 32767, 32767, 233, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 415, 32767, 276, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 127, 127, 3, 127, 127, 260, 3, 260, 127, 260, 260, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 216, 219, 208, 208, 164, 127, 127, 268); - protected $goto = array(166, 140, 140, 140, 166, 187, 168, 144, 147, 141, 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 138, 159, 160, 161, 162, 184, 139, 185, 493, 494, 377, 495, 499, 500, 501, 502, 503, 504, 505, 506, 971, 164, 145, 146, 148, 171, 176, 186, 203, 253, 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, 395, 396, 542, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, 158, 136, 622, 560, 758, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1114, 630, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 759, 519, 530, 508, 657, 555, 1184, 350, 508, 591, 787, 1184, 889, 613, 614, 885, 618, 619, 625, 627, 632, 634, 751, 856, 856, 856, 856, 851, 857, 174, 892, 892, 1206, 1206, 177, 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, 497, 497, 497, 497, 497, 497, 818, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 509, 585, 862, 601, 602, 509, 544, 545, 546, 547, 548, 549, 550, 551, 553, 586, 338, 559, 321, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 400, 607, 536, 536, 568, 532, 537, 534, 534, 496, 498, 524, 540, 569, 572, 583, 590, 298, 296, 296, 296, 298, 289, 299, 611, 1210, 510, 615, 910, 948, 375, 510, 437, 437, 437, 437, 437, 437, 594, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 1078, 949, 388, 1176, 561, 1078, 899, 899, 899, 899, 378, 899, 899, 1218, 1218, 1164, 754, 351, 352, 757, 1078, 1078, 1078, 1078, 1078, 1078, 1070, 384, 384, 384, 606, 1218, 878, 860, 858, 860, 656, 466, 511, 887, 882, 754, 384, 754, 384, 969, 384, 391, 385, 587, 353, 414, 384, 1232, 1203, 541, 1198, 1198, 1198, 567, 1095, 386, 386, 386, 1020, 916, 514, 1030, 19, 15, 372, 776, 916, 941, 448, 450, 633, 896, 1217, 1217, 1115, 616, 939, 841, 554, 905, 386, 340, 1071, 1074, 1075, 399, 1070, 1183, 914, 23, 1217, 774, 1183, 543, 603, 389, 1220, 1072, 1175, 1072, 518, 1200, 1200, 1200, 575, 605, 1073, 343, 522, 533, 518, 518, 773, 1090, 1089, 13, 578, 582, 628, 3, 4, 783, 1067, 772, 514, 1062, 1182, 784, 661, 919, 451, 866, 573, 957, 1161, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 528, 0, 0, 0, 0, 513, 0, 528, 0, 0, 0, 0, 610, 512, 515, 439, 440, 1068, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 781, 1225, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301); - protected $gotoCheck = array(43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 57, 69, 15, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 128, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 16, 102, 32, 69, 32, 32, 120, 72, 69, 32, 29, 120, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 6, 69, 69, 69, 69, 69, 69, 27, 77, 77, 77, 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 119, 119, 119, 119, 119, 119, 50, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 67, 33, 67, 67, 119, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 127, 57, 127, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 51, 51, 51, 51, 51, 51, 110, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 5, 5, 5, 5, 5, 5, 5, 63, 142, 124, 63, 84, 98, 63, 124, 57, 57, 57, 57, 57, 57, 129, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 98, 12, 82, 12, 57, 57, 57, 57, 57, 46, 57, 57, 144, 144, 133, 11, 72, 72, 14, 57, 57, 57, 57, 57, 57, 82, 13, 13, 13, 49, 144, 14, 14, 14, 14, 14, 57, 14, 14, 14, 11, 13, 11, 13, 102, 13, 48, 11, 70, 70, 70, 13, 13, 140, 2, 9, 9, 9, 2, 34, 125, 125, 125, 103, 13, 13, 34, 34, 34, 34, 25, 13, 8, 8, 8, 8, 79, 143, 143, 8, 8, 8, 9, 34, 81, 125, 18, 82, 82, 82, 125, 82, 121, 85, 34, 143, 24, 121, 47, 34, 17, 143, 82, 82, 82, 47, 121, 121, 121, 40, 40, 82, 58, 58, 58, 47, 47, 23, 126, 126, 58, 62, 62, 62, 30, 30, 23, 116, 23, 13, 114, 121, 26, 74, 86, 65, 71, 66, 100, 132, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, 9, -1, 9, -1, -1, -1, -1, 13, 9, 9, 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5); - protected $gotoBase = array(0, 0, -173, 0, 0, 353, 216, 0, 477, 149, 0, 110, 71, 117, 426, 112, 203, 170, 181, 0, 0, 0, 0, 168, 164, 143, 121, 27, 0, 205, -127, 0, -429, 279, 51, 0, 0, 0, 0, 0, 481, 0, 0, -24, 0, 0, 379, 484, 163, 153, 268, 75, 0, 0, 0, 0, 0, 107, 161, 0, 0, 0, 222, -77, 0, 104, 96, -344, 0, -94, 135, 123, -232, 0, 169, 0, 0, -50, 0, 173, 0, 180, 64, 0, 360, 139, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 124, 0, 165, 166, 0, 0, 0, 0, 0, 87, 340, 259, 0, 0, 120, 0, 177, 0, 0, -5, -91, 200, 0, 0, 84, 154, 211, -21, -48, 188, 0, 0, 93, 213, 0, 0, 0, 0, 0, 0, 175, 0, 358, 167, 102, 0, 0); - protected $gotoDefault = array(-32768, 468, 665, 2, 666, 836, 741, 749, 598, 482, 631, 581, 380, 1194, 793, 794, 795, 381, 368, 766, 379, 410, 405, 782, 775, 777, 785, 172, 411, 788, 1, 790, 517, 826, 1021, 365, 798, 366, 589, 800, 526, 802, 803, 137, 382, 383, 527, 483, 390, 576, 817, 276, 387, 819, 367, 820, 829, 371, 465, 455, 460, 529, 556, 609, 432, 447, 570, 564, 535, 1087, 565, 865, 349, 873, 662, 881, 884, 484, 557, 895, 452, 903, 1100, 397, 909, 915, 920, 291, 923, 417, 412, 584, 928, 929, 5, 933, 623, 624, 8, 312, 956, 599, 970, 420, 1040, 1042, 485, 486, 521, 459, 507, 525, 487, 1063, 441, 413, 1066, 433, 488, 489, 434, 435, 1084, 355, 1169, 354, 449, 320, 1156, 579, 1119, 456, 1209, 1165, 348, 490, 491, 376, 1188, 392, 1204, 438, 1211, 1219, 344, 539, 566); - protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, 48, 58, 58, 59, 59, 60, 60, 61, 61, 15, 16, 16, 16, 64, 64, 64, 65, 65, 68, 68, 66, 66, 70, 70, 41, 41, 50, 50, 53, 53, 53, 52, 52, 71, 42, 42, 42, 42, 72, 72, 73, 73, 74, 74, 39, 39, 35, 35, 75, 37, 37, 76, 36, 36, 38, 38, 49, 49, 49, 62, 62, 78, 78, 79, 79, 81, 81, 81, 80, 80, 63, 63, 82, 82, 82, 83, 83, 84, 84, 84, 44, 44, 85, 85, 85, 45, 45, 86, 86, 87, 87, 67, 88, 88, 88, 88, 93, 93, 94, 94, 95, 95, 95, 95, 95, 96, 97, 97, 92, 92, 89, 89, 91, 91, 99, 99, 98, 98, 98, 98, 98, 98, 90, 90, 101, 100, 100, 46, 46, 40, 40, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 34, 34, 47, 47, 106, 106, 107, 107, 107, 107, 113, 102, 102, 109, 109, 115, 115, 116, 117, 118, 118, 118, 118, 118, 118, 118, 69, 69, 57, 57, 57, 57, 103, 103, 122, 122, 119, 119, 123, 123, 123, 123, 104, 104, 104, 108, 108, 108, 114, 114, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 27, 27, 27, 27, 27, 27, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 112, 112, 105, 105, 105, 105, 129, 129, 132, 132, 131, 131, 133, 133, 51, 51, 51, 51, 135, 135, 134, 134, 134, 134, 134, 136, 136, 121, 121, 124, 124, 120, 120, 138, 137, 137, 137, 137, 125, 125, 125, 125, 111, 111, 126, 126, 126, 126, 77, 139, 139, 140, 140, 140, 110, 110, 141, 141, 142, 142, 142, 142, 142, 127, 127, 127, 127, 144, 145, 143, 143, 143, 143, 143, 143, 143, 146, 146, 146); - protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 1, 3, 1, 1, 8, 7, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, 3, 0, 1, 0, 1, 0, 1, 1, 1, 10, 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, 1, 3, 2, 1, 2, 2, 4, 6, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 1); - protected function initReduceCallbacks() - { - $this->reduceCallbacks = [0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); - }, 2 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 3 => function ($stackPos) { - $this->semValue = array(); - }, 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 84 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 85 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 88 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 89 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 90 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 91 => function ($stackPos) { - $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 92 => function ($stackPos) { - $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 93 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 94 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 96 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 97 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, 98 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 99 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 100 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 101 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 103 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 104 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, 105 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, 106 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 6)], $this->semStack[$stackPos - (8 - 2)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 107 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 2)], $this->semStack[$stackPos - (7 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 108 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 110 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 111 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 112 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 113 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 114 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 115 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 116 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 117 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 118 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, 119 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; - }, 120 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 121 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 122 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 123 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 124 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 125 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 126 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 127 => function ($stackPos) { - $this->semValue = array(); - }, 128 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 129 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 130 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 132 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 133 => function ($stackPos) { - if ($this->semStack[$stackPos - (3 - 2)]) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; - $stmts = $this->semValue; - if (!empty($attrs['comments'])) { - $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); - } - } else { - $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); - } else { - $this->semValue = null; - } - if (null === $this->semValue) { - $this->semValue = array(); - } - } - }, 134 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (5 - 2)], ['stmts' => \is_array($this->semStack[$stackPos - (5 - 3)]) ? $this->semStack[$stackPos - (5 - 3)] : array($this->semStack[$stackPos - (5 - 3)]), 'elseifs' => $this->semStack[$stackPos - (5 - 4)], 'else' => $this->semStack[$stackPos - (5 - 5)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 135 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (8 - 2)], ['stmts' => $this->semStack[$stackPos - (8 - 4)], 'elseifs' => $this->semStack[$stackPos - (8 - 5)], 'else' => $this->semStack[$stackPos - (8 - 6)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 136 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 137 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (5 - 4)], \is_array($this->semStack[$stackPos - (5 - 2)]) ? $this->semStack[$stackPos - (5 - 2)] : array($this->semStack[$stackPos - (5 - 2)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 138 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 139 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 140 => function ($stackPos) { - $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 141 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 142 => function ($stackPos) { - $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 143 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 144 => function ($stackPos) { - $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 145 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 146 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 147 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 148 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 149 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 150 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 151 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 152 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 153 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 154 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 155 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 156 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkTryCatch($this->semValue); - }, 157 => function ($stackPos) { - $this->semValue = new Stmt\Throw_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 158 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 159 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 160 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 161 => function ($stackPos) { - $this->semValue = array(); - /* means: no statement */ - }, 162 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 163 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); - } else { - $this->semValue = null; - } - if ($this->semValue === null) { - $this->semValue = array(); - } - /* means: no statement */ - }, 164 => function ($stackPos) { - $this->semValue = array(); - }, 165 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 166 => function ($stackPos) { - $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos - (8 - 3)]), $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 167 => function ($stackPos) { - $this->semValue = null; - }, 168 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 169 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 170 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 171 => function ($stackPos) { - $this->semValue = \false; - }, 172 => function ($stackPos) { - $this->semValue = \true; - }, 173 => function ($stackPos) { - $this->semValue = \false; - }, 174 => function ($stackPos) { - $this->semValue = \true; - }, 175 => function ($stackPos) { - $this->semValue = \false; - }, 176 => function ($stackPos) { - $this->semValue = \true; - }, 177 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 178 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 179 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (10 - 3)], ['byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 5)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 180 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos - (7 - 2)); - }, 181 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (6 - 2)], ['extends' => $this->semStack[$stackPos - (6 - 3)], 'stmts' => $this->semStack[$stackPos - (6 - 5)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos - (6 - 2)); - }, 182 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (5 - 2)], ['stmts' => $this->semStack[$stackPos - (5 - 4)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 183 => function ($stackPos) { - $this->semValue = 0; - }, 184 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 185 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 186 => function ($stackPos) { - $this->semValue = null; - }, 187 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 188 => function ($stackPos) { - $this->semValue = array(); - }, 189 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 190 => function ($stackPos) { - $this->semValue = array(); - }, 191 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 192 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 193 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 194 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 195 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 196 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 197 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 198 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 199 => function ($stackPos) { - $this->semValue = null; - }, 200 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 201 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 202 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 203 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 204 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 205 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 206 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 207 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (5 - 3)]; - }, 208 => function ($stackPos) { - $this->semValue = array(); - }, 209 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 210 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 211 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 212 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 214 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 215 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 216 => function ($stackPos) { - $this->semValue = array(); - }, 217 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 218 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (3 - 2)], \is_array($this->semStack[$stackPos - (3 - 3)]) ? $this->semStack[$stackPos - (3 - 3)] : array($this->semStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 219 => function ($stackPos) { - $this->semValue = array(); - }, 220 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 221 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 222 => function ($stackPos) { - $this->semValue = null; - }, 223 => function ($stackPos) { - $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 224 => function ($stackPos) { - $this->semValue = null; - }, 225 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 226 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 227 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); - }, 228 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 229 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 230 => function ($stackPos) { - $this->semValue = array(); - }, 231 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 232 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 233 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (4 - 4)], null, $this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - $this->checkParam($this->semValue); - }, 234 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 3)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkParam($this->semValue); - }, 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 236 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 237 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 238 => function ($stackPos) { - $this->semValue = null; - }, 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 240 => function ($stackPos) { - $this->semValue = null; - }, 241 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 242 => function ($stackPos) { - $this->semValue = array(); - }, 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 244 => function ($stackPos) { - $this->semValue = array(new Node\Arg($this->semStack[$stackPos - (3 - 2)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes)); - }, 245 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 246 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 247 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 248 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 249 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 250 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 251 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 252 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 253 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 254 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 255 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 256 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 257 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 258 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 259 => function ($stackPos) { - if ($this->semStack[$stackPos - (2 - 2)] !== null) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } else { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 260 => function ($stackPos) { - $this->semValue = array(); - }, 261 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 262 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkProperty($this->semValue, $stackPos - (3 - 1)); - }, 263 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (3 - 2)], 0, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 264 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (9 - 4)], ['type' => $this->semStack[$stackPos - (9 - 1)], 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos - (9 - 1)); - }, 265 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 266 => function ($stackPos) { - $this->semValue = array(); - }, 267 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 268 => function ($stackPos) { - $this->semValue = array(); - }, 269 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 270 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 271 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 272 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 273 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 274 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 275 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 276 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 277 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); - }, 278 => function ($stackPos) { - $this->semValue = null; - }, 279 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 280 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 281 => function ($stackPos) { - $this->semValue = 0; - }, 282 => function ($stackPos) { - $this->semValue = 0; - }, 283 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 284 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 285 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); - $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; - }, 286 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, 287 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, 288 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, 289 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, 290 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 291 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 292 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 293 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 294 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 295 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 296 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 297 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 298 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 299 => function ($stackPos) { - $this->semValue = array(); - }, 300 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 301 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 302 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 303 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 304 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 305 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 306 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 307 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 308 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 309 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 310 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 311 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 312 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 313 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 314 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 315 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 316 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 317 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 318 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 319 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 320 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 321 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 322 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 323 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 324 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 325 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 326 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 327 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 328 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 329 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 330 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 331 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 332 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 333 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 334 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 335 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 336 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 337 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 338 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 339 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 340 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 341 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 342 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 343 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 344 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 345 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 346 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 347 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 348 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 349 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 350 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 351 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 352 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 353 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 354 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 355 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 356 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 357 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 358 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 359 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 360 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 361 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 362 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 363 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 364 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 365 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 366 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 367 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 368 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 369 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 370 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 371 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 372 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 373 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 374 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 375 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 376 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 377 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 378 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 379 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 380 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 381 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 382 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 383 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 384 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 385 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 4)], 'uses' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 386 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (11 - 3)], 'params' => $this->semStack[$stackPos - (11 - 5)], 'uses' => $this->semStack[$stackPos - (11 - 7)], 'returnType' => $this->semStack[$stackPos - (11 - 8)], 'stmts' => $this->semStack[$stackPos - (11 - 10)]], $this->startAttributeStack[$stackPos - (11 - 1)] + $this->endAttributes); - }, 387 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 388 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 389 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 390 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 391 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; - $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); - }, 392 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; - $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 393 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 394 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos - (4 - 1)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 395 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 396 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 397 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (7 - 2)]); - $this->checkClass($this->semValue[0], -1); - }, 398 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 399 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 400 => function ($stackPos) { - $this->semValue = array(); - }, 401 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 402 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 403 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 404 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 405 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 406 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 407 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 408 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 409 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 410 => function ($stackPos) { - $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 411 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 412 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 413 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 414 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 415 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 416 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 417 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 418 => function ($stackPos) { - $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 419 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 420 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 421 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 422 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 423 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 424 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 425 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 426 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 427 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 428 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 429 => function ($stackPos) { - $this->semValue = null; - }, 430 => function ($stackPos) { - $this->semValue = null; - }, 431 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 432 => function ($stackPos) { - $this->semValue = array(); - }, 433 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`', \false), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); - }, 434 => function ($stackPos) { - foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \false); - } - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 435 => function ($stackPos) { - $this->semValue = array(); - }, 436 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 437 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \true); - }, 438 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 439 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \false); - }, 440 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 441 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 442 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 443 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 444 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 445 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 446 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 447 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 448 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \false); - }, 449 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \false); - }, 450 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 451 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 452 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 453 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 454 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 455 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 456 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 457 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 458 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 459 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 460 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 461 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 462 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 463 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 464 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 465 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 466 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 467 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 468 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 469 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 470 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 471 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 472 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 473 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 474 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 475 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 476 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 477 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 478 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 479 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 480 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 481 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 482 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 483 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 484 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 485 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 486 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 487 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 488 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 489 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 490 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 491 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 492 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 493 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 494 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; - $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); - } - } - $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 495 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); - }, 496 => function ($stackPos) { - $this->semValue = array(); - }, 497 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 498 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 499 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 500 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 501 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 502 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 503 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 504 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 505 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 506 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 507 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 508 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 509 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 510 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 511 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 512 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 513 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 514 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 515 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 516 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 517 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 518 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 519 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 520 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 521 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 522 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 523 => function ($stackPos) { - $var = \substr($this->semStack[$stackPos - (1 - 1)], 1); - $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; - }, 524 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 525 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 526 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 527 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 528 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 529 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 530 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 531 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 532 => function ($stackPos) { - $this->semValue = null; - }, 533 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 534 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 535 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 537 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 538 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 539 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 540 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 541 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 542 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 543 => function ($stackPos) { - $this->semValue = null; - }, 544 => function ($stackPos) { - $this->semValue = array(); - }, 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 546 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 547 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 548 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 549 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 550 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 551 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true); - }, 553 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 554 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 555 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 556 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - }, 557 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 558 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 560 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 561 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 562 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 563 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 564 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 565 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 566 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 567 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 568 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }]; - } -} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php index 1619488fd..6092bccec 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php @@ -1,8 +1,10 @@ '", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'{'", "'}'", "'('", "')'", "'`'", "'\"'", "'\$'"); - protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158); - protected $action = array(133, 134, 135, 580, 136, 137, 0, 749, 750, 751, 138, 38, 327, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 102, 103, 104, 105, 106, 1110, 1111, 1112, 1109, 1108, 1107, 1113, 743, 742, -32766, 1233, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 2, 107, 108, 109, 752, 274, 381, 380, -32766, -32766, -32766, -32766, 104, 105, 106, 1025, 423, 110, 265, 139, 402, 756, 757, 758, 759, 467, 468, 429, 939, 291, -32766, 287, -32766, -32766, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 790, 581, 791, 792, 793, 794, 782, 783, 344, 345, 785, 786, 771, 772, 773, 775, 776, 777, 355, 817, 818, 819, 820, 821, 582, 778, 779, 583, 584, 811, 802, 800, 801, 814, 797, 798, 688, -545, 585, 586, 796, 587, 588, 589, 590, 591, 592, -328, -593, -367, 1235, -367, 799, 593, 594, -593, 140, -32766, -32766, -32766, 133, 134, 135, 580, 136, 137, 1058, 749, 750, 751, 138, 38, 689, 1021, 1020, 1019, 1022, 390, -32766, 7, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 379, 380, 1034, 690, 691, 743, 742, -32766, -32766, -32766, 423, -545, -545, -590, -32766, -32766, -32766, 1033, -32766, 127, -590, 1237, 1236, 1238, 1319, 752, -545, 290, -32766, 283, -32766, -32766, -32766, -32766, -32766, 1237, 1236, 1238, -545, 265, 139, 402, 756, 757, 758, 759, 16, 482, 429, 459, 460, 461, 298, 723, 35, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 790, 581, 791, 792, 793, 794, 782, 783, 344, 345, 785, 786, 771, 772, 773, 775, 776, 777, 355, 817, 818, 819, 820, 821, 582, 778, 779, 583, 584, 811, 802, 800, 801, 814, 797, 798, 129, 825, 585, 586, 796, 587, 588, 589, 590, 591, 592, -328, 83, 84, 85, -593, 799, 593, 594, -593, 149, 774, 744, 745, 746, 747, 748, 825, 749, 750, 751, 787, 788, 37, 145, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 291, 274, 836, 254, 1110, 1111, 1112, 1109, 1108, 1107, 1113, -590, 861, 110, 862, -590, 483, 752, -32766, -32766, -32766, -32766, -32766, 142, 604, 1086, 743, 742, 1263, 326, 988, 753, 754, 755, 756, 757, 758, 759, 309, -32766, 823, -32766, -32766, -32766, -32766, 242, 554, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 790, 813, 791, 792, 793, 794, 782, 783, 784, 812, 785, 786, 771, 772, 773, 775, 776, 777, 816, 817, 818, 819, 820, 821, 822, 778, 779, 780, 781, 811, 802, 800, 801, 814, 797, 798, 311, 941, 789, 795, 796, 803, 804, 806, 805, 807, 808, 323, 610, 1275, 1034, 834, 799, 810, 809, 50, 51, 52, 513, 53, 54, 861, 241, 862, 919, 55, 56, -111, 57, -32766, -32766, -32766, -111, 827, -111, 290, 1303, 1348, 356, 305, 1349, 339, -111, -111, -111, -111, -111, -111, -111, -111, -32766, -194, -32766, -32766, -32766, -193, 957, 958, 830, -86, 989, 959, 835, 58, 59, 340, 429, 953, -544, 60, 833, 61, 247, 248, 62, 63, 64, 65, 66, 67, 68, 69, 1242, 28, 267, 70, 445, 514, -342, -32766, 141, 1269, 1270, 515, 919, 834, 326, -272, 919, 1267, 42, 25, 516, 941, 517, 14, 518, 909, 519, 829, 369, 520, 521, 373, 710, 1034, 44, 45, 446, 376, 375, 388, 46, 522, 713, -86, 441, 1102, 367, 338, -543, 442, -544, -544, 831, 1228, 443, 524, 525, 526, 290, 1237, 1236, 1238, 361, 1031, 444, -544, 1088, 527, 528, 840, 1256, 1257, 1258, 1259, 1253, 1254, 297, -544, 151, -550, -584, 834, 1260, 1255, -584, 1034, 1237, 1236, 1238, 298, -154, -154, -154, 152, 71, 909, 321, 322, 326, 909, 921, 1031, 708, 834, 154, -154, 1338, -154, 155, -154, 283, -154, -543, -543, 82, 1233, 1087, 1323, 735, 156, 326, 374, 158, 1034, 1322, -194, -79, -543, -88, -193, 743, 742, 957, 958, 654, 26, -32766, 523, -51, -543, 33, -549, 895, 953, -111, -111, -111, 32, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, -59, 75, 28, 673, 674, 326, -58, 36, 250, 921, 124, 708, 125, 921, 834, 708, -154, 130, 1267, 131, -32766, -547, 144, -542, 150, 406, 1235, 377, 378, 1147, 1149, 382, 383, -32766, -32766, -32766, -85, -32766, 1057, -32766, -542, -32766, 645, 646, -32766, 159, 160, 161, 1233, -32766, -32766, -32766, 162, -79, 1228, -32766, -32766, 743, 742, 163, -302, -32766, 420, -75, -4, 919, -73, 287, 527, 528, -32766, 1256, 1257, 1258, 1259, 1253, 1254, -72, -71, -70, -69, -68, -67, 1260, 1255, -547, -547, -542, -542, 743, 742, -66, -47, -18, -32766, 73, 148, 919, 322, 326, 1235, 273, -542, 284, -542, -542, 724, -32766, -32766, -32766, 727, -32766, -547, -32766, -542, -32766, 918, 147, -32766, -542, 288, 289, -298, -32766, -32766, -32766, -32766, 714, 279, -32766, -32766, -542, 1235, 280, 285, -32766, 420, 48, 286, -32766, -32766, -32766, 332, -32766, -32766, -32766, 292, -32766, 909, 293, -32766, 935, 274, 1031, 919, -32766, -32766, -32766, 110, 683, 132, -32766, -32766, 834, 146, -32766, 560, -32766, 420, 660, 374, 825, 436, 1350, 74, 1034, -32766, 296, 655, 1117, 909, 957, 958, 306, 715, 699, 523, 556, 303, 13, 310, 853, 953, -111, -111, -111, 701, 464, 493, 954, 283, 299, 300, -32766, 49, 676, 919, 304, 661, 1235, 677, 937, 1274, -32766, 10, 1264, -32766, -32766, -32766, 643, -32766, 919, -32766, 921, -32766, 708, -4, -32766, 126, 34, 919, 566, -32766, -32766, -32766, -32766, 0, 909, -32766, -32766, 0, 1235, 919, 0, -32766, 420, 0, 0, -32766, -32766, -32766, 718, -32766, -32766, -32766, 921, -32766, 708, 1034, -32766, 725, 1276, 0, 488, -32766, -32766, -32766, -32766, 301, 302, -32766, -32766, -507, 1235, 572, -497, -32766, 420, 608, 8, -32766, -32766, -32766, 372, -32766, -32766, -32766, 17, -32766, 909, 371, -32766, 833, 298, 320, 128, -32766, -32766, -32766, 40, 370, 41, -32766, -32766, 909, -250, -250, -250, -32766, 420, 732, 374, 974, 909, 708, 733, 900, -32766, 998, 975, 405, 982, 957, 958, 972, 909, 983, 523, 898, 970, 1091, 1094, 895, 953, -111, -111, -111, 28, 1095, 1092, 1093, -249, -249, -249, 1242, 1099, 709, 374, 845, 834, 1289, 1307, 1341, 1267, 648, 1268, 712, 716, 957, 958, 717, 1242, 719, 523, 921, 720, 708, -250, 895, 953, -111, -111, -111, 721, -16, 722, 726, 711, -511, 921, 409, 708, -578, 1233, 729, 896, 1345, 1347, 921, 1228, 708, -577, 856, 855, 947, 990, 1346, 946, 944, 945, 921, 948, 708, -249, 528, 1219, 1256, 1257, 1258, 1259, 1253, 1254, 928, 938, 926, 980, 981, 632, 1260, 1255, 1344, 1301, -32766, 1290, 1308, 834, 1317, -275, 1235, -576, 73, -550, -549, 322, 326, -32766, -32766, -32766, -548, -32766, -491, -32766, 834, -32766, 1, 29, -32766, 30, 39, 43, 47, -32766, -32766, -32766, 72, 76, 77, -32766, -32766, 1233, -111, -111, 78, -32766, 420, -111, 79, 80, 81, 143, 153, -111, -32766, 157, 246, 328, 1233, -111, -111, 356, -32766, 357, -111, 358, 359, 360, 361, 362, -111, 363, 364, 365, 366, 368, 437, 0, -273, -32766, -272, 19, 20, 298, 21, 22, 24, 404, 75, 1204, 484, 485, 326, 492, 0, 495, 496, 497, 498, 502, 298, 503, 504, 511, 694, 75, 0, 1246, 1187, 326, 1265, 1060, 1059, 1040, 1223, 1036, -277, -103, 18, 23, 27, 295, 403, 601, 605, 634, 700, 1191, 1241, 1188, 1320, 0, 0, 0, 326); - protected $actionCheck = array(2, 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, 13, 70, 9, 10, 11, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 8, 53, 54, 55, 57, 57, 106, 107, 137, 9, 10, 11, 50, 51, 52, 1, 116, 69, 71, 72, 73, 74, 75, 76, 77, 134, 135, 80, 1, 30, 30, 30, 32, 33, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 80, 70, 136, 137, 138, 139, 140, 141, 142, 143, 144, 8, 1, 106, 80, 108, 150, 151, 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, 6, 7, 164, 9, 10, 11, 12, 13, 116, 119, 120, 121, 122, 106, 30, 108, 32, 33, 34, 35, 36, 37, 38, 9, 10, 11, 106, 107, 138, 137, 138, 37, 38, 9, 10, 11, 116, 134, 135, 1, 9, 10, 11, 137, 30, 14, 8, 155, 156, 157, 1, 57, 149, 163, 30, 163, 32, 33, 34, 35, 36, 155, 156, 157, 161, 71, 72, 73, 74, 75, 76, 77, 8, 31, 80, 129, 130, 131, 158, 161, 8, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 8, 80, 136, 137, 138, 139, 140, 141, 142, 143, 144, 164, 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, 3, 4, 5, 6, 7, 80, 9, 10, 11, 12, 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 30, 57, 1, 8, 116, 117, 118, 119, 120, 121, 122, 160, 106, 69, 108, 164, 161, 57, 9, 10, 11, 9, 10, 161, 1, 1, 37, 38, 1, 167, 31, 71, 72, 73, 74, 75, 76, 77, 8, 30, 80, 32, 33, 34, 35, 14, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 8, 122, 136, 137, 138, 139, 140, 141, 142, 143, 144, 8, 51, 146, 138, 82, 150, 151, 152, 2, 3, 4, 5, 6, 7, 106, 97, 108, 1, 12, 13, 101, 15, 9, 10, 11, 106, 80, 108, 163, 1, 80, 163, 113, 83, 8, 116, 117, 118, 119, 120, 121, 122, 123, 30, 8, 32, 33, 34, 8, 117, 118, 80, 31, 159, 122, 159, 50, 51, 8, 80, 128, 70, 56, 155, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, 73, 74, 162, 9, 161, 78, 79, 80, 1, 82, 167, 164, 1, 86, 87, 88, 89, 122, 91, 101, 93, 84, 95, 156, 8, 98, 99, 8, 161, 138, 103, 104, 105, 106, 107, 8, 109, 110, 31, 97, 8, 123, 115, 116, 70, 8, 134, 135, 156, 122, 8, 124, 125, 126, 163, 155, 156, 157, 163, 116, 8, 149, 162, 136, 137, 8, 139, 140, 141, 142, 143, 144, 145, 161, 14, 163, 160, 82, 151, 152, 164, 138, 155, 156, 157, 158, 75, 76, 77, 14, 163, 84, 165, 166, 167, 84, 159, 116, 161, 82, 14, 90, 85, 92, 14, 94, 163, 96, 134, 135, 161, 116, 159, 1, 161, 14, 167, 106, 14, 138, 8, 164, 16, 149, 31, 164, 37, 38, 117, 118, 75, 76, 137, 122, 31, 161, 14, 163, 127, 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 16, 163, 70, 75, 76, 167, 16, 147, 148, 159, 16, 161, 16, 159, 82, 161, 162, 16, 86, 16, 74, 70, 16, 70, 101, 102, 80, 106, 107, 59, 60, 106, 107, 87, 88, 89, 31, 91, 1, 93, 70, 95, 111, 112, 98, 16, 16, 16, 116, 103, 104, 105, 16, 31, 122, 109, 110, 37, 38, 16, 35, 115, 116, 31, 0, 1, 31, 30, 136, 137, 124, 139, 140, 141, 142, 143, 144, 31, 31, 31, 31, 31, 31, 151, 152, 134, 135, 134, 135, 37, 38, 31, 31, 31, 74, 163, 31, 1, 166, 167, 80, 31, 149, 31, 134, 135, 31, 87, 88, 89, 31, 91, 161, 93, 161, 95, 31, 31, 98, 149, 37, 37, 35, 103, 104, 105, 74, 31, 35, 109, 110, 161, 80, 35, 35, 115, 116, 70, 35, 87, 88, 89, 35, 91, 124, 93, 37, 95, 84, 37, 98, 38, 57, 116, 1, 103, 104, 105, 69, 77, 31, 109, 110, 82, 70, 85, 89, 115, 116, 96, 106, 80, 108, 83, 154, 138, 124, 113, 90, 82, 84, 117, 118, 114, 31, 80, 122, 85, 132, 97, 132, 127, 128, 129, 130, 131, 92, 97, 97, 128, 163, 134, 135, 74, 70, 94, 1, 133, 100, 80, 100, 154, 146, 137, 150, 160, 87, 88, 89, 113, 91, 1, 93, 159, 95, 161, 162, 98, 161, 161, 1, 153, 103, 104, 105, 74, -1, 84, 109, 110, -1, 80, 1, -1, 115, 116, -1, -1, 87, 88, 89, 31, 91, 124, 93, 159, 95, 161, 138, 98, 31, 146, -1, 102, 103, 104, 105, 74, 134, 135, 109, 110, 149, 80, 81, 149, 115, 116, 153, 149, 87, 88, 89, 149, 91, 124, 93, 149, 95, 84, 149, 98, 155, 158, 161, 161, 103, 104, 105, 159, 161, 159, 109, 110, 84, 100, 101, 102, 115, 116, 159, 106, 159, 84, 161, 159, 159, 124, 159, 159, 162, 159, 117, 118, 159, 84, 159, 122, 159, 159, 159, 159, 127, 128, 129, 130, 131, 70, 159, 159, 159, 100, 101, 102, 1, 159, 161, 106, 160, 82, 160, 160, 160, 86, 160, 166, 161, 161, 117, 118, 161, 1, 161, 122, 159, 161, 161, 162, 127, 128, 129, 130, 131, 161, 31, 161, 161, 161, 165, 159, 162, 161, 163, 116, 162, 162, 162, 162, 159, 122, 161, 163, 162, 162, 162, 162, 162, 162, 162, 162, 159, 162, 161, 162, 137, 162, 139, 140, 141, 142, 143, 144, 162, 162, 162, 162, 162, 162, 151, 152, 162, 162, 74, 162, 162, 82, 162, 164, 80, 163, 163, 163, 163, 166, 167, 87, 88, 89, 163, 91, 163, 93, 82, 95, 163, 163, 98, 163, 163, 163, 163, 103, 104, 105, 163, 163, 163, 109, 110, 116, 117, 118, 163, 115, 116, 122, 163, 163, 163, 163, 163, 128, 124, 163, 163, 163, 116, 117, 118, 163, 137, 163, 122, 163, 163, 163, 163, 163, 128, 163, 163, 163, 163, 163, 163, -1, 164, 137, 164, 164, 164, 158, 164, 164, 164, 164, 163, 165, 164, 164, 167, 164, -1, 164, 164, 164, 164, 164, 158, 164, 164, 164, 164, 163, -1, 164, 164, 167, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -1, -1, -1, 167); - protected $actionBase = array(0, -2, 154, 542, 752, 893, 929, 52, 374, 431, 398, 869, 793, 235, 307, 307, 793, 307, 784, 908, 908, 917, 908, 538, 841, 468, 468, 468, 708, 708, 708, 708, 740, 740, 849, 849, 881, 817, 634, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 348, 346, 370, 653, 1063, 1069, 1065, 1070, 1061, 1060, 1064, 1066, 1071, 946, 947, 774, 949, 950, 943, 952, 1067, 882, 1062, 1068, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 525, 191, 359, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 174, 174, 174, 620, 620, 51, 465, 356, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 658, 184, 144, 144, 7, 7, 7, 7, 7, 1031, 371, 1048, -25, -25, -25, -25, 50, 725, 526, 449, 39, 317, 80, 474, 474, 13, 13, 512, 512, 422, 422, 512, 512, 512, 808, 808, 808, 808, 443, 505, 360, 308, -78, 209, 209, 209, 209, -78, -78, -78, -78, 803, 877, -78, -78, -78, 63, 641, 641, 822, -1, -1, -1, 641, 253, 790, 548, 253, 384, 548, 480, 402, 764, 759, -49, 447, 764, 639, 755, 198, 143, 825, 609, 825, 1059, 320, 768, 426, 749, 720, 874, 904, 1072, 796, 941, 798, 942, 106, -58, 710, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1073, 336, 1059, 423, 1073, 1073, 1073, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 619, 423, 586, 616, 423, 795, 336, 814, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 750, 202, 348, 348, 346, 78, 78, 348, 484, 65, 78, 78, 78, 78, 348, 348, 348, 348, 609, 783, 766, 613, 813, 492, 783, 783, 783, 473, 135, 378, 488, 713, 775, 67, 779, 779, 785, 969, 969, 779, 769, 779, 785, 975, 779, 779, 969, 969, 823, 280, 563, 478, 550, 568, 969, 377, 779, 779, 779, 779, 746, 573, 779, 342, 314, 779, 779, 746, 744, 760, 43, 762, 969, 969, 969, 746, 547, 762, 762, 762, 839, 844, 794, 758, 444, 433, 588, 232, 801, 758, 758, 779, 558, 794, 758, 794, 758, 745, 758, 758, 758, 794, 758, 769, 502, 758, 717, 583, 224, 758, 6, 979, 980, 624, 981, 973, 987, 1019, 991, 992, 873, 965, 999, 974, 993, 972, 970, 773, 682, 684, 818, 811, 963, 777, 777, 777, 956, 777, 777, 777, 777, 777, 777, 777, 777, 682, 743, 829, 765, 1006, 689, 691, 754, 911, 901, 1030, 1004, 1049, 994, 828, 694, 1028, 1008, 910, 821, 1009, 1010, 1029, 1050, 1052, 912, 782, 913, 918, 876, 1012, 883, 777, 979, 992, 693, 974, 993, 972, 970, 748, 739, 737, 738, 736, 735, 723, 734, 753, 1053, 954, 907, 878, 1011, 957, 682, 879, 1023, 756, 1032, 1033, 827, 788, 778, 880, 919, 1014, 1015, 1016, 884, 1054, 887, 830, 1024, 951, 1035, 789, 846, 1037, 1038, 1039, 1040, 889, 920, 892, 916, 900, 845, 776, 1020, 761, 921, 591, 787, 791, 800, 1018, 606, 1000, 902, 906, 922, 1041, 1043, 1044, 923, 924, 995, 847, 1026, 799, 1027, 1022, 848, 850, 617, 797, 1055, 781, 786, 772, 621, 632, 925, 927, 931, 998, 763, 770, 853, 855, 1056, 771, 1057, 938, 635, 857, 718, 939, 1046, 719, 724, 637, 678, 672, 731, 792, 903, 826, 757, 780, 1017, 724, 767, 858, 940, 859, 860, 867, 1045, 868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, 307, 307, 307, 0, 0, 307, 0, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 66, 66, 291, 291, 291, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 0, 291, 291, 291, 291, 291, 291, 291, 291, 66, 823, 66, -1, -1, -1, -1, 66, 66, 66, -88, -88, 66, 384, 66, 66, -1, -1, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 0, 0, 423, 548, 66, 769, 769, 769, 769, 66, 66, 66, 66, 548, 548, 66, 66, 66, 0, 0, 0, 0, 0, 0, 0, 0, 423, 548, 0, 423, 0, 0, 769, 769, 66, 384, 823, 643, 66, 0, 0, 0, 0, 423, 769, 423, 336, 779, 548, 779, 336, 336, 78, 348, 643, 611, 611, 611, 611, 0, 0, 609, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 769, 0, 823, 0, 769, 769, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, 969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 975, 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777, 788, 0, 788, 0, 777, 777, 777, 0, 0, 0, 0, 797, 771); - protected $actionDefault = array(3, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 596, 596, 596, 596, 32767, 32767, 254, 103, 32767, 32767, 469, 387, 387, 387, 32767, 32767, 540, 540, 540, 540, 540, 540, 32767, 32767, 32767, 32767, 32767, 32767, 469, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 37, 7, 8, 10, 11, 50, 17, 324, 32767, 32767, 32767, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 589, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 473, 452, 453, 455, 456, 386, 541, 595, 327, 592, 385, 146, 339, 329, 242, 330, 258, 474, 259, 475, 478, 479, 215, 287, 382, 150, 151, 416, 470, 418, 468, 472, 417, 392, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 390, 391, 471, 449, 448, 447, 32767, 32767, 414, 415, 419, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 389, 422, 420, 421, 438, 439, 436, 437, 440, 32767, 32767, 32767, 441, 442, 443, 444, 316, 32767, 32767, 366, 364, 316, 112, 32767, 32767, 429, 430, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 534, 446, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 101, 536, 411, 413, 503, 424, 425, 423, 393, 32767, 510, 32767, 103, 32767, 512, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 535, 32767, 542, 542, 32767, 496, 101, 195, 32767, 32767, 32767, 195, 195, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 603, 496, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 32767, 195, 111, 32767, 32767, 32767, 101, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 190, 32767, 268, 270, 103, 557, 195, 515, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 508, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 496, 434, 139, 32767, 139, 542, 426, 427, 428, 498, 542, 542, 542, 312, 289, 32767, 32767, 32767, 32767, 513, 513, 101, 101, 101, 101, 508, 32767, 32767, 32767, 32767, 112, 100, 100, 100, 100, 100, 104, 102, 32767, 32767, 32767, 32767, 223, 100, 32767, 102, 102, 32767, 32767, 223, 225, 212, 102, 227, 32767, 561, 562, 223, 102, 227, 227, 227, 247, 247, 485, 318, 102, 100, 102, 102, 197, 318, 318, 32767, 102, 485, 318, 485, 318, 199, 318, 318, 318, 485, 318, 32767, 102, 318, 214, 100, 100, 318, 32767, 32767, 32767, 498, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 222, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 529, 32767, 546, 559, 432, 433, 435, 544, 457, 458, 459, 460, 461, 462, 463, 465, 591, 32767, 502, 32767, 32767, 32767, 338, 601, 32767, 601, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 602, 32767, 542, 32767, 32767, 32767, 32767, 431, 9, 76, 491, 43, 44, 52, 58, 519, 520, 521, 522, 516, 517, 523, 518, 32767, 32767, 524, 567, 32767, 32767, 543, 594, 32767, 32767, 32767, 32767, 32767, 32767, 139, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 529, 32767, 137, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 525, 32767, 32767, 32767, 542, 32767, 32767, 32767, 32767, 314, 311, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 542, 32767, 32767, 32767, 32767, 32767, 291, 32767, 308, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 286, 32767, 32767, 381, 498, 294, 296, 297, 32767, 32767, 32767, 32767, 360, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 153, 153, 3, 3, 341, 153, 153, 153, 341, 341, 153, 341, 341, 341, 153, 153, 153, 153, 153, 153, 280, 185, 262, 265, 247, 247, 153, 352, 153); - protected $goto = array(196, 196, 1032, 704, 695, 431, 659, 1063, 1335, 1335, 425, 313, 314, 335, 574, 319, 430, 336, 432, 636, 652, 653, 851, 670, 671, 672, 1335, 167, 167, 167, 167, 221, 197, 193, 193, 177, 179, 216, 193, 193, 193, 193, 193, 194, 194, 194, 194, 194, 194, 188, 189, 190, 191, 192, 218, 216, 219, 535, 536, 421, 537, 539, 540, 541, 542, 543, 544, 545, 546, 1133, 168, 169, 170, 195, 171, 172, 173, 166, 174, 175, 176, 178, 215, 217, 220, 238, 243, 244, 245, 257, 258, 259, 260, 261, 262, 263, 264, 268, 269, 270, 271, 281, 282, 316, 317, 318, 426, 427, 428, 579, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 180, 237, 181, 198, 199, 200, 239, 188, 189, 190, 191, 192, 218, 1133, 201, 182, 183, 184, 202, 198, 185, 240, 203, 201, 165, 204, 205, 186, 206, 207, 208, 187, 209, 210, 211, 212, 213, 214, 854, 619, 656, 278, 278, 278, 278, 852, 621, 621, 350, 419, 598, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1284, 1284, 832, 1105, 1106, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 353, 353, 353, 353, 826, 558, 551, 908, 903, 904, 917, 860, 905, 857, 906, 907, 858, 1035, 1035, 911, 864, 679, 950, 458, 863, 1027, 1043, 1044, 832, 885, 832, 1085, 1080, 1081, 1082, 341, 551, 558, 567, 568, 343, 577, 600, 614, 615, 547, 547, 547, 547, 973, 602, 15, 394, 397, 559, 599, 603, 1213, 942, 1234, 571, 1234, 1214, 1217, 943, 1218, 1032, 1032, 1234, 440, 912, 1032, 913, 1032, 1032, 1038, 1037, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1316, 1316, 1316, 1316, 1234, 476, 1309, 1310, 348, 1234, 1234, 1234, 1234, 407, 408, 1234, 1234, 1234, 668, 1324, 669, 354, 412, 413, 414, 867, 682, 466, 466, 415, 994, 354, 354, 346, 924, 424, 466, 609, 925, 5, 879, 6, 940, 866, 940, 354, 354, 1282, 1282, 354, 392, 1351, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 553, 538, 538, 570, 354, 658, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 549, 565, 549, 1041, 1042, 731, 635, 637, 850, 549, 657, 965, 410, 703, 681, 685, 1008, 693, 702, 1004, 252, 252, 997, 971, 971, 969, 971, 730, 1056, 550, 1006, 1001, 1182, 456, 847, 1295, 1334, 1334, 967, 967, 967, 967, 325, 308, 456, 961, 968, 249, 249, 249, 249, 251, 253, 438, 1334, 351, 352, 684, 680, 552, 562, 450, 450, 450, 552, 1306, 562, 1306, 479, 395, 462, 1337, 1311, 1312, 1306, 664, 481, 500, 337, 501, 844, 469, 578, 470, 471, 507, 847, 877, 553, 872, 1342, 1343, 1011, 1011, 575, 612, 324, 275, 324, 1318, 1318, 1318, 1318, 607, 622, 625, 626, 627, 628, 649, 650, 651, 706, 956, 401, 692, 875, 1229, 828, 869, 692, 629, 631, 633, 692, 433, 1302, 1225, 734, 613, 433, 880, 868, 1068, 1072, 1069, 1016, 477, 1039, 1039, 881, 0, 976, 663, 1050, 1046, 1047, 1073, 1116, 978, 0, 1227, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 929, 1121, 450, 966, 1071, 0, 0, 617, 1304, 1304, 1071, 1230, 1231, 1013, 0, 0, 0, 0, 0, 842, 0, 871, 0, 662, 992, 1114, 884, 597, 1098, 865, 707, 0, 0, 508, 698, 0, 1096, 1232, 1292, 1293, 0, 1224, 0, 847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255); - protected $gotoCheck = array(42, 42, 72, 9, 72, 65, 65, 126, 181, 181, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 85, 85, 26, 85, 85, 85, 181, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 15, 55, 55, 23, 23, 23, 23, 27, 107, 107, 96, 43, 129, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 168, 168, 12, 143, 143, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 24, 24, 24, 24, 6, 75, 75, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 88, 88, 15, 15, 88, 88, 82, 15, 88, 88, 88, 12, 45, 12, 15, 15, 15, 15, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 106, 106, 106, 106, 49, 106, 75, 58, 58, 58, 58, 58, 78, 78, 72, 170, 72, 78, 78, 78, 78, 72, 72, 72, 82, 64, 72, 64, 72, 72, 117, 117, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 9, 9, 9, 9, 72, 174, 174, 174, 177, 72, 72, 72, 72, 81, 81, 72, 72, 72, 81, 179, 81, 14, 81, 81, 81, 35, 81, 148, 148, 81, 102, 14, 14, 81, 72, 13, 148, 13, 72, 46, 35, 46, 9, 35, 9, 14, 14, 169, 169, 14, 61, 14, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 14, 171, 171, 103, 14, 63, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 19, 48, 19, 118, 118, 48, 48, 48, 25, 19, 48, 92, 92, 92, 48, 48, 48, 48, 48, 48, 5, 5, 25, 25, 25, 25, 25, 25, 113, 25, 25, 25, 150, 19, 22, 14, 180, 180, 19, 19, 19, 19, 167, 167, 19, 19, 19, 5, 5, 5, 5, 5, 5, 112, 180, 96, 96, 14, 115, 9, 9, 23, 23, 23, 9, 129, 9, 129, 83, 9, 9, 180, 176, 176, 129, 119, 83, 154, 29, 154, 18, 9, 9, 9, 9, 154, 22, 9, 14, 39, 9, 9, 106, 106, 2, 2, 24, 24, 24, 129, 129, 129, 129, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 91, 28, 7, 9, 20, 7, 37, 7, 84, 84, 84, 7, 116, 129, 159, 98, 79, 116, 16, 16, 16, 16, 128, 109, 156, 116, 116, 41, -1, 16, 116, 116, 116, 116, 131, 146, 95, -1, 14, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 17, 17, 23, 16, 129, -1, -1, 17, 129, 129, 129, 20, 20, 17, -1, -1, -1, -1, -1, 20, -1, 17, -1, 17, 17, 16, 16, 8, 8, 17, 8, -1, -1, 8, 8, -1, 8, 20, 20, 20, -1, 17, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5); - protected $gotoBase = array(0, 0, -249, 0, 0, 386, 192, 475, 549, -10, 0, 0, -108, -13, 13, -184, 46, 65, 138, 102, 93, 0, 123, 163, 198, 371, 18, 166, 144, 149, 0, 0, 0, 0, 0, -56, 0, 147, 0, 133, 0, 66, -1, 162, 0, 214, -406, 0, -341, 226, 0, 0, 0, 0, 0, 124, 0, 0, 208, 0, 0, 297, 0, 114, 251, -236, 0, 0, 0, 0, 0, 0, -5, 0, 0, -138, 0, 0, -149, 153, 113, -189, -54, -34, 9, -696, 0, 0, -61, 0, 0, 151, 74, 0, 0, 73, -310, 0, 89, 0, 0, 0, 284, 311, 0, 0, 218, -70, 0, 134, 0, 0, 143, 122, 0, 142, 220, -3, 85, 152, 0, 0, 0, 0, 0, 0, 5, 0, 129, 167, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, 0, 0, 71, 0, 282, 0, 125, 0, 0, 0, -51, 0, 64, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 88, -55, 95, 232, 111, 0, 0, -6, 0, 68, 267, 0, 277, 96, -299, 0, 0); - protected $gotoDefault = array(-32768, 512, 738, 4, 739, 933, 815, 824, 595, 529, 705, 347, 623, 422, 1300, 910, 1120, 576, 843, 1243, 1251, 457, 846, 330, 728, 892, 893, 894, 398, 385, 859, 396, 647, 624, 494, 878, 453, 870, 486, 873, 452, 882, 164, 418, 510, 886, 3, 889, 555, 920, 386, 897, 387, 675, 899, 561, 901, 902, 393, 399, 400, 1125, 569, 620, 914, 256, 563, 915, 384, 916, 923, 389, 391, 686, 465, 505, 499, 411, 1100, 564, 606, 644, 447, 473, 618, 630, 616, 480, 434, 416, 329, 955, 963, 487, 463, 977, 349, 985, 736, 1132, 638, 489, 993, 639, 1000, 1003, 530, 531, 478, 1015, 272, 1018, 490, 12, 665, 1029, 1030, 666, 640, 1052, 641, 667, 642, 1054, 472, 596, 1062, 454, 1070, 1288, 455, 1074, 266, 1077, 277, 417, 435, 1083, 1084, 9, 1090, 696, 697, 11, 276, 509, 1115, 687, 451, 1131, 439, 1201, 1203, 557, 491, 1221, 1220, 678, 506, 1226, 448, 1291, 449, 532, 474, 315, 533, 307, 333, 312, 548, 294, 334, 534, 475, 1297, 1305, 331, 31, 1325, 1336, 342, 573, 611); - protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 26, 26, 27, 27, 27, 27, 27, 87, 87, 89, 89, 82, 82, 90, 90, 91, 91, 91, 83, 83, 86, 86, 84, 84, 92, 93, 93, 56, 56, 64, 64, 67, 67, 67, 66, 94, 94, 95, 57, 57, 57, 57, 96, 96, 97, 97, 98, 98, 99, 100, 100, 101, 101, 102, 102, 54, 54, 50, 50, 104, 52, 52, 105, 51, 51, 53, 53, 63, 63, 63, 63, 80, 80, 108, 108, 110, 110, 111, 111, 111, 111, 109, 109, 109, 113, 113, 113, 113, 88, 88, 116, 116, 116, 117, 117, 114, 114, 118, 118, 120, 120, 121, 121, 115, 122, 122, 119, 123, 123, 123, 123, 112, 112, 81, 81, 81, 20, 20, 20, 125, 124, 124, 126, 126, 126, 126, 59, 127, 127, 128, 60, 130, 130, 131, 131, 132, 132, 85, 133, 133, 133, 133, 133, 133, 133, 138, 138, 139, 139, 140, 140, 140, 140, 140, 141, 142, 142, 137, 137, 134, 134, 136, 136, 144, 144, 143, 143, 143, 143, 143, 143, 143, 135, 145, 145, 147, 146, 146, 61, 103, 148, 148, 55, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 155, 149, 149, 154, 154, 157, 158, 158, 159, 160, 161, 161, 161, 161, 19, 19, 72, 72, 72, 72, 150, 150, 150, 150, 163, 163, 151, 151, 153, 153, 153, 156, 156, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 107, 171, 171, 171, 171, 152, 152, 152, 152, 152, 152, 152, 152, 58, 58, 166, 166, 166, 166, 172, 172, 162, 162, 162, 173, 173, 173, 173, 173, 173, 73, 73, 65, 65, 65, 65, 129, 129, 129, 129, 176, 175, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 174, 174, 174, 174, 106, 170, 178, 178, 177, 177, 179, 179, 179, 179, 179, 179, 179, 179, 167, 167, 167, 167, 181, 182, 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183); - protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 1, 3, 1, 1, 8, 7, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 1, 1, 8, 9, 7, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 5, 6, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1); - protected function initReduceCallbacks() + public const YYERRTOK = 256; + public const T_THROW = 257; + public const T_INCLUDE = 258; + public const T_INCLUDE_ONCE = 259; + public const T_EVAL = 260; + public const T_REQUIRE = 261; + public const T_REQUIRE_ONCE = 262; + public const T_LOGICAL_OR = 263; + public const T_LOGICAL_XOR = 264; + public const T_LOGICAL_AND = 265; + public const T_PRINT = 266; + public const T_YIELD = 267; + public const T_DOUBLE_ARROW = 268; + public const T_YIELD_FROM = 269; + public const T_PLUS_EQUAL = 270; + public const T_MINUS_EQUAL = 271; + public const T_MUL_EQUAL = 272; + public const T_DIV_EQUAL = 273; + public const T_CONCAT_EQUAL = 274; + public const T_MOD_EQUAL = 275; + public const T_AND_EQUAL = 276; + public const T_OR_EQUAL = 277; + public const T_XOR_EQUAL = 278; + public const T_SL_EQUAL = 279; + public const T_SR_EQUAL = 280; + public const T_POW_EQUAL = 281; + public const T_COALESCE_EQUAL = 282; + public const T_COALESCE = 283; + public const T_BOOLEAN_OR = 284; + public const T_BOOLEAN_AND = 285; + public const T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG = 286; + public const T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG = 287; + public const T_IS_EQUAL = 288; + public const T_IS_NOT_EQUAL = 289; + public const T_IS_IDENTICAL = 290; + public const T_IS_NOT_IDENTICAL = 291; + public const T_SPACESHIP = 292; + public const T_IS_SMALLER_OR_EQUAL = 293; + public const T_IS_GREATER_OR_EQUAL = 294; + public const T_SL = 295; + public const T_SR = 296; + public const T_INSTANCEOF = 297; + public const T_INC = 298; + public const T_DEC = 299; + public const T_INT_CAST = 300; + public const T_DOUBLE_CAST = 301; + public const T_STRING_CAST = 302; + public const T_ARRAY_CAST = 303; + public const T_OBJECT_CAST = 304; + public const T_BOOL_CAST = 305; + public const T_UNSET_CAST = 306; + public const T_POW = 307; + public const T_NEW = 308; + public const T_CLONE = 309; + public const T_EXIT = 310; + public const T_IF = 311; + public const T_ELSEIF = 312; + public const T_ELSE = 313; + public const T_ENDIF = 314; + public const T_LNUMBER = 315; + public const T_DNUMBER = 316; + public const T_STRING = 317; + public const T_STRING_VARNAME = 318; + public const T_VARIABLE = 319; + public const T_NUM_STRING = 320; + public const T_INLINE_HTML = 321; + public const T_ENCAPSED_AND_WHITESPACE = 322; + public const T_CONSTANT_ENCAPSED_STRING = 323; + public const T_ECHO = 324; + public const T_DO = 325; + public const T_WHILE = 326; + public const T_ENDWHILE = 327; + public const T_FOR = 328; + public const T_ENDFOR = 329; + public const T_FOREACH = 330; + public const T_ENDFOREACH = 331; + public const T_DECLARE = 332; + public const T_ENDDECLARE = 333; + public const T_AS = 334; + public const T_SWITCH = 335; + public const T_MATCH = 336; + public const T_ENDSWITCH = 337; + public const T_CASE = 338; + public const T_DEFAULT = 339; + public const T_BREAK = 340; + public const T_CONTINUE = 341; + public const T_GOTO = 342; + public const T_FUNCTION = 343; + public const T_FN = 344; + public const T_CONST = 345; + public const T_RETURN = 346; + public const T_TRY = 347; + public const T_CATCH = 348; + public const T_FINALLY = 349; + public const T_USE = 350; + public const T_INSTEADOF = 351; + public const T_GLOBAL = 352; + public const T_STATIC = 353; + public const T_ABSTRACT = 354; + public const T_FINAL = 355; + public const T_PRIVATE = 356; + public const T_PROTECTED = 357; + public const T_PUBLIC = 358; + public const T_READONLY = 359; + public const T_PUBLIC_SET = 360; + public const T_PROTECTED_SET = 361; + public const T_PRIVATE_SET = 362; + public const T_VAR = 363; + public const T_UNSET = 364; + public const T_ISSET = 365; + public const T_EMPTY = 366; + public const T_HALT_COMPILER = 367; + public const T_CLASS = 368; + public const T_TRAIT = 369; + public const T_INTERFACE = 370; + public const T_ENUM = 371; + public const T_EXTENDS = 372; + public const T_IMPLEMENTS = 373; + public const T_OBJECT_OPERATOR = 374; + public const T_NULLSAFE_OBJECT_OPERATOR = 375; + public const T_LIST = 376; + public const T_ARRAY = 377; + public const T_CALLABLE = 378; + public const T_CLASS_C = 379; + public const T_TRAIT_C = 380; + public const T_METHOD_C = 381; + public const T_FUNC_C = 382; + public const T_PROPERTY_C = 383; + public const T_LINE = 384; + public const T_FILE = 385; + public const T_START_HEREDOC = 386; + public const T_END_HEREDOC = 387; + public const T_DOLLAR_OPEN_CURLY_BRACES = 388; + public const T_CURLY_OPEN = 389; + public const T_PAAMAYIM_NEKUDOTAYIM = 390; + public const T_NAMESPACE = 391; + public const T_NS_C = 392; + public const T_DIR = 393; + public const T_NS_SEPARATOR = 394; + public const T_ELLIPSIS = 395; + public const T_NAME_FULLY_QUALIFIED = 396; + public const T_NAME_QUALIFIED = 397; + public const T_NAME_RELATIVE = 398; + public const T_ATTRIBUTE = 399; + protected int $tokenToSymbolMapSize = 400; + protected int $actionTableSize = 1291; + protected int $gotoTableSize = 609; + protected int $invalidSymbol = 172; + protected int $errorSymbol = 1; + protected int $defaultAction = -32766; + protected int $unexpectedTokenRule = 32767; + protected int $YY2TBLSTATE = 439; + protected int $numNonLeafStates = 745; + protected array $symbolToName = array("EOF", "error", "T_THROW", "T_INCLUDE", "T_INCLUDE_ONCE", "T_EVAL", "T_REQUIRE", "T_REQUIRE_ONCE", "','", "T_LOGICAL_OR", "T_LOGICAL_XOR", "T_LOGICAL_AND", "T_PRINT", "T_YIELD", "T_DOUBLE_ARROW", "T_YIELD_FROM", "'='", "T_PLUS_EQUAL", "T_MINUS_EQUAL", "T_MUL_EQUAL", "T_DIV_EQUAL", "T_CONCAT_EQUAL", "T_MOD_EQUAL", "T_AND_EQUAL", "T_OR_EQUAL", "T_XOR_EQUAL", "T_SL_EQUAL", "T_SR_EQUAL", "T_POW_EQUAL", "T_COALESCE_EQUAL", "'?'", "':'", "T_COALESCE", "T_BOOLEAN_OR", "T_BOOLEAN_AND", "'|'", "'^'", "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG", "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG", "T_IS_EQUAL", "T_IS_NOT_EQUAL", "T_IS_IDENTICAL", "T_IS_NOT_IDENTICAL", "T_SPACESHIP", "'<'", "T_IS_SMALLER_OR_EQUAL", "'>'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_PUBLIC_SET", "T_PROTECTED_SET", "T_PRIVATE_SET", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_PROPERTY_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'('", "')'", "'{'", "'}'", "'`'", "'\"'", "'\$'"); + protected array $tokenToSymbol = array(0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 56, 170, 172, 171, 55, 172, 172, 165, 166, 53, 50, 8, 51, 52, 54, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 31, 163, 44, 16, 46, 30, 68, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 70, 172, 164, 36, 172, 169, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 167, 35, 168, 58, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162); + protected array $action = array(128, 129, 130, 568, 131, 132, 948, 757, 758, 759, 133, 38, 841, -85, 0, 1369, -32766, -32766, -32766, 488, 832, 1126, 1127, 1128, 1122, 1121, 1120, 1129, 1123, 1124, 1125, -32766, -32766, -32766, -333, 751, 750, -32766, 843, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, -372, -32766, -372, 1038, 760, 1126, 1127, 1128, 1122, 1121, 1120, 1129, 1123, 1124, 1125, 382, 383, 442, 265, 134, 385, 764, 765, 766, 767, 427, 837, 428, -85, 330, 36, 248, 2, 292, 821, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 797, 569, 798, 799, 800, 801, 789, 790, 347, 348, 792, 793, 778, 779, 780, 782, 783, 784, 358, 824, 825, 826, 827, 828, 570, 26, 300, -195, 785, 786, 571, 572, -194, 809, 807, 808, 820, 804, 805, -32766, -32766, 573, 574, 803, 575, 576, 577, 578, -32766, 579, 580, 474, 475, 869, 238, 870, 806, 581, 582, 489, 135, 838, 128, 129, 130, 568, 131, 132, 1071, 757, 758, 759, 133, 38, -32766, 35, 731, 1031, 1030, 1029, 1035, 1032, 1033, 1034, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 101, 102, 103, 104, 105, -333, 751, 750, 1047, 927, -32766, -32766, -32766, 842, -32766, 840, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 760, -32766, -32766, -32766, 614, -32766, 291, -32766, -32766, -32766, -32766, -32766, 136, 721, 265, 134, 385, 764, 765, 766, 767, -616, -32766, 428, -32766, -32766, -32766, -32766, -616, 145, 821, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 797, 569, 798, 799, 800, 801, 789, 790, 347, 348, 792, 793, 778, 779, 780, 782, 783, 784, 358, 824, 825, 826, 827, 828, 570, 917, 428, -195, 785, 786, 571, 572, -194, 809, 807, 808, 820, 804, 805, 1292, 251, 573, 574, 803, 575, 576, 577, 578, -274, 579, 580, 1100, 82, 83, 84, 743, 806, 581, 582, 237, 148, 781, 752, 753, 754, 755, 756, 150, 757, 758, 759, 794, 795, 37, 24, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 1115, 276, -32766, -32766, -32766, 929, 1267, 1266, 1268, 716, 834, 311, 394, 109, 7, 1101, -569, 760, -32766, -32766, -32766, 841, 1354, -32766, 1099, -32766, -32766, -32766, 1272, 1353, 313, 761, 762, 763, 764, 765, 766, 767, 998, -32766, 830, -32766, -32766, 927, -616, 325, -616, 821, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 797, 819, 798, 799, 800, 801, 789, 790, 791, 818, 792, 793, 778, 779, 780, 782, 783, 784, 823, 824, 825, 826, 827, 828, 829, -569, -569, 343, 785, 786, 787, 788, 836, 809, 807, 808, 820, 804, 805, 718, 564, 796, 802, 803, 810, 811, 813, 812, 140, 814, 815, 841, 328, 344, -32766, -569, 806, 817, 816, 49, 50, 51, 520, 52, 53, 869, -110, 870, 917, 54, 55, -110, 56, -110, -567, -32766, -32766, -32766, 307, 1047, 126, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -613, 372, 106, 107, 108, 376, 276, -613, 392, 1334, -32766, 291, 288, 1304, 446, 57, 58, -32766, 109, 447, 999, 59, 47, 60, 245, 246, 61, 62, 63, 64, 65, 66, 67, 68, -32766, 28, 267, 69, 444, 521, 448, -347, 74, 1298, 1299, 522, 449, 841, 328, -567, -567, 1296, 42, 20, 523, 929, 524, 927, 525, 716, 526, -565, 696, 527, 528, -567, 927, 847, 44, 45, 450, 379, 378, -78, 46, 529, 927, -573, -32766, -567, 370, 342, 1350, 103, 104, 105, -564, 1258, 927, 301, 302, 1044, 531, 532, 533, -607, 722, -607, 697, 464, 465, 466, 151, 1047, 535, 536, 723, 1284, 1285, 1286, 1287, 1289, 1281, 1282, 299, -58, 1047, 153, 726, 125, 1288, 1283, 698, 699, 1267, 1266, 1268, 300, -565, -565, 70, -154, -154, -154, 323, 324, 328, -57, -4, 927, 917, 1267, 1266, 1268, -565, -87, -154, 284, -154, 917, -154, 154, -154, -564, -564, 155, -572, 157, -565, 917, 33, 832, 377, -613, 123, -613, 751, 750, 124, -564, 137, 917, 289, 967, 968, 81, 751, 750, 530, 328, 138, -571, 620, -564, 663, 21, 903, 963, -110, -110, -110, 32, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 144, -566, 382, 383, 28, 268, 1379, 158, 927, 1380, 967, 968, 427, 159, 929, 969, 841, 917, 716, -154, 1296, 951, 160, 929, 963, 384, 383, 716, 832, 1174, 1176, 682, 683, 984, 1044, 427, 161, 716, 733, 377, -563, 440, 1070, 141, 162, 929, 298, 328, -84, 716, 967, 968, 149, 410, -307, 530, 1258, -78, 300, 1047, 751, 750, -73, 534, 963, -110, -110, -110, -566, -566, 950, 288, 1272, 535, 536, -72, 1284, 1285, 1286, 1287, 1289, 1281, 1282, 284, -566, 380, 381, 11, 1265, 1288, 1283, 917, -71, 751, 750, -70, 929, -32766, -566, 72, 716, -4, -16, 1265, 324, 328, -69, -563, -563, 292, -32766, -32766, -32766, -68, -32766, -67, -32766, -66, -32766, 386, 387, -32766, -65, -563, 1263, -46, -32766, -32766, -32766, -18, -32766, 142, -32766, -32766, 275, 285, 1265, -563, -32766, 424, 28, 267, 732, -32766, -32766, -32766, 735, -32766, 1046, -32766, -32766, -32766, 841, 841, -32766, 926, 1296, 1044, 147, -32766, -32766, -32766, 654, 655, -303, -32766, -32766, 1267, 1266, 1268, 929, -32766, 424, 280, 716, 28, 268, 281, 286, 287, 336, 73, 1047, -32766, 290, 293, 294, 841, -110, -110, -563, 1296, 1258, -110, 944, -32766, 276, 109, 692, 832, 146, 1381, -110, 707, 841, 585, 284, 1133, 685, 709, 536, -32766, 1284, 1285, 1286, 1287, 1289, 1281, 1282, -32766, 1047, 664, -50, 10, 308, 1288, 1283, 1258, 669, 306, 471, 305, 499, 300, 312, 72, 74, 670, 964, 1303, 324, 328, 328, -529, 291, 536, 686, 1284, 1285, 1286, 1287, 1289, 1281, 1282, 652, 139, 1305, -563, -563, 591, 1288, 1283, -519, 300, 34, -32766, 8, 840, 0, 618, 72, 1265, 0, -563, 0, 324, 328, 0, -32766, -32766, -32766, 0, -32766, 0, -32766, 0, -32766, -563, 0, -32766, -32766, 0, 0, 27, -32766, -32766, -32766, 927, -32766, 40, -32766, -32766, 0, 0, 1265, 374, -32766, 424, 0, 946, 0, -32766, -32766, -32766, 0, -32766, 41, -32766, -32766, -32766, 927, 740, -32766, 741, 860, 908, 1008, -32766, -32766, -32766, 985, -32766, 992, -32766, -32766, 982, 993, 1265, 906, -32766, 424, 48, 980, 1104, -32766, -32766, -32766, 1107, -32766, 1108, -32766, -32766, -32766, 1105, -601, -32766, 1106, 1112, -277, 494, -32766, -32766, -32766, 1293, -32766, 852, -32766, -32766, 1320, 1338, 1265, 598, -32766, 424, 1372, 657, 1272, -32766, -32766, -32766, 917, -32766, -600, -32766, -32766, -32766, -599, -573, -32766, -275, -572, -571, -570, -32766, -32766, -32766, -252, -252, -252, -32766, -32766, -513, 377, 917, 1, -32766, 424, 29, 303, 304, 30, 39, 43, 967, 968, 71, 75, -32766, 530, -251, -251, -251, -274, 76, 375, 377, 903, 963, -110, -110, -110, 77, 78, 79, 80, 143, 967, 968, 127, 152, 156, 530, 243, 332, 359, 360, 361, 362, 363, 903, 963, -110, -110, -110, -32766, 13, 364, 841, 365, 929, 1265, 14, 366, 716, -252, 367, 368, -32766, -32766, -32766, 369, -32766, 371, -32766, 441, -32766, 563, 322, -32766, 15, 16, 18, 929, -32766, -32766, -32766, 716, -251, 408, -32766, -32766, 490, -110, -110, 491, -32766, 424, -110, 498, 501, 502, 503, 504, 508, 509, 510, -110, -32766, 518, 596, 702, 1073, 1214, 1294, 1072, -32766, 1053, 1253, 1049, -279, -102, 12, 17, 22, 297, 407, 610, 615, 643, 708, 1218, 1271, 1215, 1351, 0, 373, 717, 300, 720, 724, 74, 725, 1231, 727, 728, 729, 328, 409, 730, 734, 719, 0, 413, 737, 904, 1376, 1378, 863, 862, 957, 1000, 1377, 956, 954, 955, 958, 1246, 937, 947, 935, 990, 991, 641, 1375, 1332, 1321, 1339, 1348, 0, 0, 1297, 0, 328); + protected array $actionCheck = array(2, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 82, 31, 0, 85, 9, 10, 11, 31, 80, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 9, 10, 11, 8, 37, 38, 30, 1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 106, 30, 108, 1, 57, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 106, 107, 108, 71, 72, 73, 74, 75, 76, 77, 116, 80, 80, 97, 70, 151, 152, 8, 30, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 8, 162, 8, 126, 127, 128, 129, 8, 131, 132, 133, 134, 135, 136, 9, 10, 139, 140, 141, 142, 143, 144, 145, 9, 147, 148, 137, 138, 106, 14, 108, 154, 155, 156, 167, 158, 160, 2, 3, 4, 5, 6, 7, 166, 9, 10, 11, 12, 13, 116, 8, 167, 119, 120, 121, 122, 123, 124, 125, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 166, 37, 38, 141, 1, 9, 10, 11, 163, 30, 159, 32, 33, 34, 35, 36, 37, 38, 9, 10, 11, 57, 9, 10, 11, 1, 30, 165, 32, 33, 34, 35, 36, 8, 31, 71, 72, 73, 74, 75, 76, 77, 1, 30, 80, 32, 33, 34, 35, 8, 8, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 84, 80, 166, 126, 127, 128, 129, 166, 131, 132, 133, 134, 135, 136, 1, 8, 139, 140, 141, 142, 143, 144, 145, 166, 147, 148, 163, 9, 10, 11, 167, 154, 155, 156, 97, 158, 2, 3, 4, 5, 6, 7, 14, 9, 10, 11, 12, 13, 30, 101, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 126, 57, 9, 10, 11, 163, 159, 160, 161, 167, 80, 8, 106, 69, 108, 168, 70, 57, 9, 10, 11, 82, 1, 30, 1, 32, 33, 34, 1, 8, 8, 71, 72, 73, 74, 75, 76, 77, 31, 30, 80, 32, 33, 1, 164, 8, 166, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 137, 138, 8, 126, 127, 128, 129, 160, 131, 132, 133, 134, 135, 136, 167, 85, 139, 140, 141, 142, 143, 144, 145, 167, 147, 148, 82, 171, 8, 116, 167, 154, 155, 156, 2, 3, 4, 5, 6, 7, 106, 101, 108, 84, 12, 13, 106, 15, 108, 70, 9, 10, 11, 113, 141, 14, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 1, 8, 53, 54, 55, 8, 57, 8, 8, 1, 116, 165, 30, 150, 8, 50, 51, 140, 69, 8, 163, 56, 70, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 140, 70, 71, 72, 73, 74, 8, 168, 165, 78, 79, 80, 8, 82, 171, 137, 138, 86, 87, 88, 89, 163, 91, 1, 93, 167, 95, 70, 80, 98, 99, 153, 1, 8, 103, 104, 105, 106, 107, 16, 109, 110, 1, 165, 116, 167, 115, 116, 1, 50, 51, 52, 70, 122, 1, 137, 138, 116, 127, 128, 129, 164, 31, 166, 116, 132, 133, 134, 14, 141, 139, 140, 31, 142, 143, 144, 145, 146, 147, 148, 149, 16, 141, 14, 31, 167, 155, 156, 140, 141, 159, 160, 161, 162, 137, 138, 165, 75, 76, 77, 169, 170, 171, 16, 0, 1, 84, 159, 160, 161, 153, 31, 90, 165, 92, 84, 94, 14, 96, 137, 138, 14, 165, 14, 167, 84, 14, 80, 106, 164, 16, 166, 37, 38, 16, 153, 16, 84, 37, 117, 118, 167, 37, 38, 122, 171, 16, 165, 51, 167, 75, 76, 130, 131, 132, 133, 134, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 16, 70, 106, 107, 70, 71, 80, 16, 1, 83, 117, 118, 116, 16, 163, 122, 82, 84, 167, 168, 86, 73, 16, 163, 131, 106, 107, 167, 80, 59, 60, 75, 76, 163, 116, 116, 16, 167, 31, 106, 70, 108, 1, 167, 16, 163, 113, 171, 31, 167, 117, 118, 101, 102, 35, 122, 122, 31, 162, 141, 37, 38, 31, 130, 131, 132, 133, 134, 137, 138, 122, 30, 1, 139, 140, 31, 142, 143, 144, 145, 146, 147, 148, 165, 153, 106, 107, 154, 80, 155, 156, 84, 31, 37, 38, 31, 163, 74, 167, 165, 167, 168, 31, 80, 170, 171, 31, 137, 138, 30, 87, 88, 89, 31, 91, 31, 93, 31, 95, 106, 107, 98, 31, 153, 116, 31, 103, 104, 105, 31, 74, 31, 109, 110, 31, 31, 80, 167, 115, 116, 70, 71, 31, 87, 88, 89, 31, 91, 140, 93, 127, 95, 82, 82, 98, 31, 86, 116, 31, 103, 104, 105, 111, 112, 35, 109, 110, 159, 160, 161, 163, 115, 116, 35, 167, 70, 71, 35, 35, 35, 35, 158, 141, 127, 37, 37, 37, 82, 117, 118, 70, 86, 122, 122, 38, 116, 57, 69, 77, 80, 70, 83, 131, 80, 82, 89, 165, 82, 94, 92, 140, 140, 142, 143, 144, 145, 146, 147, 148, 85, 141, 90, 31, 97, 114, 155, 156, 122, 96, 136, 97, 135, 97, 162, 135, 165, 165, 100, 131, 150, 170, 171, 171, 153, 165, 140, 100, 142, 143, 144, 145, 146, 147, 148, 113, 31, 150, 137, 138, 157, 155, 156, 153, 162, 167, 74, 153, 159, -1, 157, 165, 80, -1, 153, -1, 170, 171, -1, 87, 88, 89, -1, 91, -1, 93, -1, 95, 167, -1, 98, 140, -1, -1, 153, 103, 104, 105, 1, 74, 163, 109, 110, -1, -1, 80, 153, 115, 116, -1, 158, -1, 87, 88, 89, -1, 91, 163, 93, 127, 95, 1, 163, 98, 163, 163, 163, 163, 103, 104, 105, 163, 74, 163, 109, 110, 163, 163, 80, 163, 115, 116, 70, 163, 163, 87, 88, 89, 163, 91, 163, 93, 127, 95, 163, 165, 98, 163, 163, 166, 102, 103, 104, 105, 164, 74, 164, 109, 110, 164, 164, 80, 81, 115, 116, 164, 164, 1, 87, 88, 89, 84, 91, 165, 93, 127, 95, 165, 165, 98, 166, 165, 165, 165, 103, 104, 105, 100, 101, 102, 109, 110, 165, 106, 84, 165, 115, 116, 165, 137, 138, 165, 165, 165, 117, 118, 165, 165, 127, 122, 100, 101, 102, 166, 165, 153, 106, 130, 131, 132, 133, 134, 165, 165, 165, 165, 165, 117, 118, 167, 165, 165, 122, 165, 165, 165, 165, 165, 165, 165, 130, 131, 132, 133, 134, 74, 166, 165, 82, 165, 163, 80, 166, 165, 167, 168, 165, 165, 87, 88, 89, 165, 91, 165, 93, 165, 95, 165, 167, 98, 166, 166, 166, 163, 103, 104, 105, 167, 168, 166, 109, 110, 166, 117, 118, 166, 115, 116, 122, 166, 166, 166, 166, 166, 166, 166, 166, 131, 127, 166, 166, 166, 166, 166, 166, 166, 140, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, -1, 167, 167, 162, 167, 167, 165, 167, 169, 167, 167, 167, 171, 168, 167, 167, 167, -1, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, -1, -1, 170, -1, 171); + protected array $actionBase = array(0, -2, 156, 559, 641, 1004, 1027, 485, 292, 200, -60, 283, 568, 590, 590, 715, 590, 195, 578, 901, 395, 395, 395, 831, 313, 313, 831, 313, 731, 731, 731, 731, 764, 764, 965, 965, 998, 932, 899, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 37, 360, 216, 649, 1066, 1072, 1068, 1073, 1064, 1063, 1067, 1069, 1074, 1113, 1114, 835, 1115, 1116, 1112, 1117, 1070, 919, 1065, 1071, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 135, 477, 126, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 642, 642, 22, 22, 22, 362, 813, 778, 813, 813, 813, 813, 813, 813, 813, 813, 346, 205, 678, 188, 171, 171, 7, 7, 7, 7, 7, 376, 779, 54, 1083, 1083, 139, 139, 139, 139, 227, -55, 749, 380, -40, 787, 604, 626, 626, 536, 536, 478, 478, 349, 349, 478, 478, 478, 465, 465, 465, 465, 415, 494, 519, 43, 366, 858, 584, 584, 584, 584, 858, 858, 858, 858, 814, 1118, 858, 858, 858, 639, 828, 828, 979, 452, 452, 452, 828, 370, -70, -70, 370, 601, -70, 511, 987, 634, 999, 397, 815, 627, 434, 397, 299, 455, 502, 233, 816, 687, 816, 1062, 842, 842, 802, 739, 902, 1091, 1075, 845, 1110, 854, 1111, 470, 10, 734, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1119, 632, 1062, -3, 1119, 1119, 1119, 632, 632, 632, 632, 632, 632, 632, 632, 806, 632, 632, 759, -3, 612, 664, -3, 853, 632, 817, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, -12, 37, 37, 360, 5, 5, 37, 142, 53, 5, 5, 5, 5, 37, 37, 37, 37, 687, 847, 810, 721, -18, 820, 120, 847, 847, 847, 26, 136, 115, 727, 837, 259, 827, 827, 827, 833, 947, 947, 827, 830, 827, 833, 827, 827, 947, 947, 809, 947, 217, 509, 430, 500, 514, 947, 356, 827, 827, 827, 827, 807, 947, 75, 535, 827, 286, 234, 827, 827, 807, 804, 812, 801, 947, 947, 947, 807, 496, 801, 801, 801, 866, 868, 849, 811, 390, 375, 562, 163, 864, 811, 811, 827, 503, 849, 811, 849, 811, 859, 811, 811, 811, 849, 811, 830, 456, 811, 699, 705, 541, 113, 811, 14, 958, 959, 617, 966, 954, 974, 1017, 975, 976, 1077, 944, 985, 955, 977, 1019, 953, 950, 832, 651, 655, 821, 798, 935, 836, 836, 836, 930, 933, 836, 836, 836, 836, 836, 836, 836, 836, 651, 907, 860, 824, 988, 657, 667, 1051, 797, 1094, 1081, 987, 958, 976, 725, 955, 977, 953, 950, 799, 794, 790, 792, 783, 772, 752, 769, 808, 1053, 978, 844, 692, 1023, 989, 1093, 1018, 990, 991, 1030, 1054, 869, 1055, 1095, 838, 1096, 1097, 909, 1001, 1079, 836, 929, 897, 912, 999, 934, 651, 913, 1056, 997, 805, 1033, 1036, 1076, 841, 826, 918, 1098, 1005, 1008, 1009, 1080, 1082, 861, 1003, 900, 1040, 843, 1087, 1041, 1042, 1043, 1044, 1084, 1099, 1085, 925, 1086, 870, 839, 931, 840, 1100, 307, 851, 852, 857, 1015, 591, 986, 1089, 1092, 1101, 1045, 1046, 1047, 1102, 1103, 982, 871, 1021, 822, 1022, 964, 875, 877, 606, 856, 1058, 846, 850, 855, 640, 644, 1104, 1105, 1106, 983, 819, 829, 880, 881, 1059, 638, 1060, 1107, 646, 883, 1108, 1052, 714, 728, 560, 624, 602, 736, 825, 1090, 848, 818, 834, 1013, 728, 823, 887, 1109, 888, 892, 894, 1050, 898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 468, 468, 468, 468, 468, 313, 313, 313, 313, 313, 468, 468, 468, 468, 468, 468, 468, 313, 468, 468, 468, 313, 0, 0, 313, 0, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 716, 716, 297, 297, 297, 297, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 297, 297, 0, 297, 297, 297, 297, 297, 297, 297, 297, 809, 716, 716, 716, 716, 452, 452, 452, 452, -95, -95, 716, 716, 601, 716, 601, 716, 716, 452, 452, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 0, 0, 0, -3, -70, 716, 830, 830, 830, 830, 716, 716, 716, 716, -70, -70, 716, 716, 716, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, -3, 0, 0, 830, 656, 830, 656, 716, 601, 809, 374, 716, 0, 0, 0, 0, -3, 830, -3, 632, -70, -70, 632, 632, 5, 37, 374, 659, 659, 659, 659, 0, 0, 687, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 830, 0, 809, 0, 830, 830, 830, 0, 0, 0, 0, 0, 0, 0, 0, 947, 0, 0, 0, 0, 0, 0, 0, 830, 0, 947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 836, 841, 0, 0, 841, 0, 836, 836, 836, 0, 0, 0, 856, 638); + protected array $actionDefault = array(3, 32767, 102, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 100, 32767, 619, 619, 619, 619, 32767, 32767, 256, 102, 32767, 32767, 488, 405, 405, 405, 32767, 32767, 561, 561, 561, 561, 561, 32767, 32767, 32767, 32767, 32767, 32767, 488, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 36, 7, 8, 10, 11, 49, 17, 329, 100, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 102, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 612, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 393, 492, 471, 472, 474, 475, 404, 562, 618, 332, 615, 334, 403, 146, 344, 335, 244, 260, 493, 261, 494, 497, 498, 217, 390, 150, 151, 435, 489, 437, 487, 491, 436, 410, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 408, 409, 490, 32767, 32767, 468, 467, 466, 433, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 102, 32767, 434, 438, 407, 441, 439, 440, 457, 458, 455, 456, 459, 32767, 32767, 321, 32767, 32767, 460, 461, 462, 463, 371, 369, 32767, 32767, 111, 321, 111, 32767, 32767, 448, 449, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 505, 555, 465, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 102, 32767, 100, 557, 430, 432, 525, 443, 444, 442, 411, 32767, 530, 32767, 102, 32767, 532, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 556, 32767, 563, 563, 32767, 518, 100, 196, 32767, 531, 196, 196, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 626, 518, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 32767, 196, 110, 32767, 32767, 32767, 100, 196, 196, 196, 196, 196, 196, 196, 196, 533, 196, 196, 191, 32767, 270, 272, 102, 580, 196, 535, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 518, 453, 139, 32767, 520, 139, 563, 445, 446, 447, 563, 563, 563, 317, 294, 32767, 32767, 32767, 32767, 32767, 533, 533, 100, 100, 100, 100, 32767, 32767, 32767, 32767, 111, 504, 99, 99, 99, 99, 99, 103, 101, 32767, 32767, 32767, 32767, 225, 32767, 101, 99, 32767, 101, 101, 32767, 32767, 225, 227, 214, 229, 32767, 584, 585, 225, 101, 229, 229, 229, 249, 249, 507, 323, 101, 99, 101, 101, 198, 323, 323, 32767, 101, 507, 323, 507, 323, 200, 323, 323, 323, 507, 323, 32767, 101, 323, 216, 393, 99, 99, 323, 32767, 32767, 32767, 520, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 224, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 550, 32767, 568, 582, 451, 452, 454, 567, 565, 476, 477, 478, 479, 480, 481, 482, 484, 614, 32767, 524, 32767, 32767, 32767, 343, 32767, 624, 32767, 32767, 32767, 9, 74, 513, 42, 43, 51, 57, 539, 540, 541, 542, 536, 537, 543, 538, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 625, 32767, 563, 32767, 32767, 32767, 32767, 450, 545, 590, 32767, 32767, 564, 617, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 139, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 550, 32767, 137, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 546, 32767, 32767, 32767, 563, 32767, 32767, 32767, 32767, 319, 316, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 563, 32767, 32767, 32767, 32767, 32767, 296, 32767, 313, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 389, 520, 299, 301, 302, 32767, 32767, 32767, 32767, 365, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 153, 153, 3, 3, 346, 153, 153, 153, 346, 346, 153, 346, 346, 346, 153, 153, 153, 153, 153, 153, 282, 186, 264, 267, 249, 249, 153, 357, 153); + protected array $goto = array(196, 196, 1045, 1076, 703, 468, 590, 473, 473, 858, 739, 644, 646, 1209, 859, 666, 473, 833, 712, 690, 693, 1018, 701, 710, 1014, 423, 353, 166, 166, 166, 166, 220, 197, 193, 193, 176, 178, 215, 193, 193, 193, 193, 193, 194, 194, 194, 194, 194, 188, 189, 190, 191, 192, 217, 215, 218, 543, 544, 425, 545, 548, 549, 550, 551, 552, 553, 554, 555, 1160, 167, 168, 169, 195, 170, 171, 172, 165, 173, 174, 175, 177, 214, 216, 219, 239, 242, 253, 254, 256, 257, 258, 259, 260, 261, 262, 263, 269, 270, 271, 272, 282, 283, 318, 319, 320, 431, 432, 433, 605, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 179, 236, 180, 188, 189, 190, 191, 192, 217, 1160, 198, 199, 200, 201, 240, 181, 182, 202, 183, 203, 199, 184, 241, 198, 164, 204, 205, 185, 206, 207, 208, 186, 209, 210, 187, 211, 212, 213, 279, 277, 279, 279, 861, 983, 411, 412, 920, 607, 921, 677, 854, 678, 854, 416, 417, 418, 357, 691, 345, 463, 419, 463, 435, 668, 893, 349, 357, 357, 430, 321, 315, 316, 339, 600, 434, 340, 436, 645, 485, 597, 357, 357, 346, 345, 357, 487, 351, 1382, 916, 911, 912, 925, 867, 913, 864, 914, 915, 865, 868, 562, 919, 872, 357, 357, 429, 871, 619, 854, 445, 1355, 630, 630, 1098, 1093, 1094, 1095, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 617, 631, 634, 635, 636, 637, 658, 659, 660, 714, 1264, 1045, 1264, 1264, 661, 662, 1004, 679, 680, 681, 1045, 1264, 396, 1045, 1326, 1045, 1045, 354, 355, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 900, 857, 900, 900, 595, 1264, 515, 506, 667, 507, 1264, 1264, 1264, 1264, 1069, 513, 1264, 1264, 1264, 1347, 1347, 1347, 1347, 567, 560, 356, 356, 356, 356, 1157, 5, 558, 6, 558, 558, 628, 665, 933, 562, 1051, 1050, 934, 558, 556, 556, 556, 556, 949, 611, 949, 482, 1340, 1341, 329, 560, 567, 592, 593, 331, 603, 609, 854, 624, 625, 249, 249, 461, 975, 414, 711, 25, 977, 977, 977, 977, 1314, 1314, 461, 971, 978, 443, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 247, 247, 247, 247, 244, 250, 1311, 1311, 1118, 1119, 839, 1257, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 547, 547, 398, 401, 608, 612, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 638, 640, 642, 689, 454, 454, 673, 454, 454, 1337, 1259, 1337, 1337, 546, 546, 839, 341, 839, 851, 546, 1337, 546, 546, 546, 546, 546, 546, 546, 546, 561, 587, 561, 623, 1007, 405, 561, 979, 587, 738, 399, 467, 559, 1016, 1011, 966, 1349, 1349, 1349, 1349, 1054, 1055, 880, 476, 604, 477, 478, 877, 1365, 1365, 437, 885, 1255, 700, 1373, 1374, 1082, 835, 1260, 1261, 742, 1247, 437, 1333, 875, 1026, 1365, 849, 406, 700, 1052, 1052, 700, 889, 1247, 672, 1063, 1059, 1060, 883, 887, 327, 310, 874, 1368, 1368, 1262, 1323, 1324, 483, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 1342, 1343, 454, 613, 1084, 1086, 938, 1147, 1335, 1335, 1084, 601, 622, 1021, 1021, 988, 1036, 1132, 1023, 888, 876, 1081, 1085, 0, 0, 0, 879, 0, 671, 1002, 0, 0, 986, 0, 873, 1048, 1048, 0, 0, 688, 960, 606, 1111, 1040, 1056, 1057, 1254, 273, 326, 0, 326, 326, 715, 0, 0, 976, 0, 514, 706, 0, 1109, 252, 252, 1240, 952, 0, 0, 0, 1241, 1244, 953, 1245, 0, 0, 0, 0, 0, 0, 1130, 892); + protected array $gotoCheck = array(42, 42, 73, 128, 73, 156, 48, 154, 154, 26, 48, 48, 48, 156, 27, 48, 154, 6, 9, 48, 48, 48, 48, 48, 48, 43, 97, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 23, 23, 23, 23, 15, 49, 82, 82, 65, 131, 65, 82, 22, 82, 22, 82, 82, 82, 14, 82, 174, 83, 82, 83, 66, 66, 45, 82, 14, 14, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 84, 178, 14, 14, 174, 174, 14, 84, 185, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 14, 14, 13, 15, 13, 22, 83, 187, 108, 108, 15, 15, 15, 15, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 73, 73, 73, 73, 86, 86, 103, 86, 86, 86, 73, 73, 62, 73, 14, 73, 73, 97, 97, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 25, 25, 25, 25, 104, 73, 14, 160, 64, 160, 73, 73, 73, 73, 115, 160, 73, 73, 73, 9, 9, 9, 9, 76, 76, 24, 24, 24, 24, 155, 46, 19, 46, 19, 19, 56, 56, 73, 14, 119, 119, 73, 19, 107, 107, 107, 107, 9, 107, 9, 182, 182, 182, 76, 76, 76, 76, 76, 76, 76, 76, 22, 76, 76, 5, 5, 19, 93, 93, 93, 76, 19, 19, 19, 19, 176, 176, 19, 19, 19, 113, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 5, 5, 5, 5, 5, 5, 177, 177, 145, 145, 12, 14, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 179, 179, 59, 59, 59, 59, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 85, 85, 85, 117, 23, 23, 121, 23, 23, 131, 20, 131, 131, 162, 162, 12, 29, 12, 18, 162, 131, 162, 162, 162, 162, 162, 162, 162, 162, 9, 9, 9, 80, 50, 28, 9, 50, 9, 50, 9, 9, 50, 50, 50, 92, 131, 131, 131, 131, 120, 120, 39, 9, 9, 9, 9, 37, 188, 188, 118, 9, 166, 7, 9, 9, 130, 7, 20, 20, 99, 20, 118, 131, 35, 110, 188, 20, 31, 7, 118, 118, 7, 41, 20, 118, 118, 118, 118, 9, 35, 175, 175, 35, 188, 188, 20, 20, 20, 157, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 184, 184, 23, 17, 131, 133, 17, 17, 131, 131, 131, 2, 2, 107, 107, 96, 114, 148, 17, 16, 16, 16, 16, -1, -1, -1, 17, -1, 17, 17, -1, -1, 16, -1, 17, 89, 89, -1, -1, 89, 89, 8, 8, 89, 89, 89, 17, 24, 24, -1, 24, 24, 8, -1, -1, 16, -1, 8, 8, -1, 8, 5, 5, 79, 79, -1, -1, -1, 79, 79, 79, 79, -1, -1, -1, -1, -1, -1, 16, 16); + protected array $gotoBase = array(0, 0, -178, 0, 0, 353, 7, 474, 562, 8, 0, 0, 93, -113, -119, -184, 91, 63, 126, 56, 34, 0, -103, 159, 312, 287, 5, 10, 112, 137, 0, 54, 0, 0, 0, 119, 0, 132, 0, 145, 0, 55, -1, 2, 0, 162, -422, 0, -711, 149, 440, 0, 0, 0, 0, 0, 285, 0, 0, 360, 0, 0, 230, 0, 60, 156, -51, 0, 0, 0, 0, 0, 0, -5, 0, 0, -34, 0, 0, 181, 120, -110, -329, -94, -274, -66, -460, 0, 0, 284, 0, 0, 130, 51, 0, 0, 96, -463, 0, 78, 0, 0, 0, 231, 251, 0, 0, 305, -3, 0, 121, 0, 0, 92, 30, 29, 0, 138, 212, 49, 182, 134, 0, 0, 0, 0, 0, 0, 1, 0, 108, 163, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 97, 0, 0, 0, 0, 0, -27, 75, -263, 72, 0, 0, -204, 0, 195, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, -117, 186, 128, 150, 174, 166, 0, 0, 38, 0, 155, 180, 0, 202, 167, 0, 0); + protected array $gotoDefault = array(-32768, 519, 746, 4, 747, 942, 822, 831, 583, 537, 713, 350, 632, 426, 1331, 918, 1146, 602, 850, 1273, 1279, 462, 853, 334, 736, 930, 901, 902, 402, 389, 866, 400, 656, 633, 500, 886, 458, 878, 492, 881, 457, 890, 163, 422, 517, 894, 3, 897, 565, 928, 981, 390, 905, 391, 684, 907, 586, 909, 910, 397, 403, 404, 1151, 594, 629, 922, 255, 588, 923, 388, 924, 932, 393, 395, 694, 472, 511, 505, 415, 1113, 589, 616, 653, 451, 479, 627, 639, 626, 486, 438, 420, 333, 965, 973, 493, 470, 987, 352, 995, 744, 1159, 647, 495, 1003, 648, 1010, 1013, 538, 539, 484, 1025, 266, 1028, 496, 1037, 23, 674, 1042, 1043, 675, 649, 1065, 650, 676, 651, 1067, 469, 584, 1075, 459, 1083, 1319, 460, 1087, 264, 1090, 278, 421, 439, 1096, 1097, 9, 1103, 704, 705, 19, 274, 516, 1131, 695, -32768, -32768, -32768, -32768, 456, 1158, 455, 1228, 1230, 566, 497, 1248, 295, 1251, 687, 512, 1256, 452, 1322, 453, 540, 480, 317, 541, 1366, 309, 337, 314, 557, 296, 338, 542, 481, 1328, 1336, 335, 31, 1356, 1367, 599, 621); + protected array $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 50, 69, 69, 72, 72, 71, 70, 70, 63, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 26, 26, 27, 27, 27, 27, 27, 88, 88, 90, 90, 83, 83, 91, 91, 92, 92, 92, 84, 84, 87, 87, 85, 85, 93, 94, 94, 57, 57, 65, 65, 68, 68, 68, 67, 95, 95, 96, 58, 58, 58, 58, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 55, 55, 51, 51, 105, 53, 53, 106, 52, 52, 54, 54, 64, 64, 64, 64, 81, 81, 109, 109, 111, 111, 112, 112, 112, 112, 112, 112, 112, 110, 110, 110, 115, 115, 115, 115, 89, 89, 118, 118, 118, 119, 119, 116, 116, 120, 120, 122, 122, 123, 123, 117, 124, 124, 121, 125, 125, 125, 125, 113, 113, 82, 82, 82, 20, 20, 20, 127, 126, 126, 128, 128, 128, 128, 60, 129, 129, 130, 61, 132, 132, 133, 133, 134, 134, 86, 135, 135, 135, 135, 135, 135, 135, 140, 140, 141, 141, 142, 142, 142, 142, 142, 143, 144, 144, 139, 139, 136, 136, 138, 138, 146, 146, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 137, 147, 147, 149, 148, 148, 150, 150, 114, 151, 151, 153, 153, 153, 152, 152, 62, 104, 154, 154, 56, 56, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 161, 162, 162, 163, 155, 155, 160, 160, 164, 165, 165, 166, 167, 168, 168, 168, 168, 19, 19, 73, 73, 73, 73, 156, 156, 156, 156, 170, 170, 159, 159, 159, 157, 157, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 108, 179, 179, 179, 179, 158, 158, 158, 158, 158, 158, 158, 158, 59, 59, 173, 173, 173, 173, 173, 180, 180, 169, 169, 169, 169, 181, 181, 181, 181, 181, 181, 74, 74, 66, 66, 66, 66, 131, 131, 131, 131, 184, 183, 172, 172, 172, 172, 172, 172, 172, 171, 171, 171, 182, 182, 182, 182, 107, 178, 186, 186, 185, 185, 187, 187, 187, 187, 187, 187, 187, 187, 175, 175, 175, 175, 174, 189, 188, 188, 188, 188, 188, 188, 188, 188, 190, 190, 190, 190); + protected array $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 4, 3, 5, 4, 3, 4, 1, 3, 4, 1, 1, 8, 7, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 1, 1, 1, 8, 9, 7, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 1, 1, 1, 7, 9, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 5, 6, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 0, 2, 0, 5, 8, 1, 3, 3, 0, 2, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 2, 1, 1, 0, 4, 2, 1, 3, 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1); + protected function initReduceCallbacks() : void { - $this->reduceCallbacks = [0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); - }, 2 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 3 => function ($stackPos) { - $this->semValue = array(); - }, 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; + $this->reduceCallbacks = [0 => null, 1 => static function ($self, $stackPos) { + $self->semValue = $self->handleNamespaces($self->semStack[$stackPos - (1 - 1)]); + }, 2 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (2 - 2)] !== null) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; } + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 3 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 4 => static function ($self, $stackPos) { + $nop = $self->maybeCreateZeroLengthNop($self->tokenPos); if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; + $self->semStack[$stackPos - (1 - 1)][] = $nop; } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 84 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 85 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 88 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 89 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 90 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 91 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 92 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 93 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 94 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 96 => function ($stackPos) { - $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 97 => function ($stackPos) { - $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 98 => function ($stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 5 => null, 6 => null, 7 => null, 8 => null, 9 => null, 10 => null, 11 => null, 12 => null, 13 => null, 14 => null, 15 => null, 16 => null, 17 => null, 18 => null, 19 => null, 20 => null, 21 => null, 22 => null, 23 => null, 24 => null, 25 => null, 26 => null, 27 => null, 28 => null, 29 => null, 30 => null, 31 => null, 32 => null, 33 => null, 34 => null, 35 => null, 36 => null, 37 => null, 38 => null, 39 => null, 40 => null, 41 => null, 42 => null, 43 => null, 44 => null, 45 => null, 46 => null, 47 => null, 48 => null, 49 => null, 50 => null, 51 => null, 52 => null, 53 => null, 54 => null, 55 => null, 56 => null, 57 => null, 58 => null, 59 => null, 60 => null, 61 => null, 62 => null, 63 => null, 64 => null, 65 => null, 66 => null, 67 => null, 68 => null, 69 => null, 70 => null, 71 => null, 72 => null, 73 => null, 74 => null, 75 => null, 76 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + if ($self->semValue === "emitError(new Error('Cannot use "getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]))); + } + }, 77 => null, 78 => null, 79 => null, 80 => null, 81 => null, 82 => null, 83 => null, 84 => null, 85 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 86 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 87 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 88 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 89 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 90 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 91 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 92 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 93 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 94 => null, 95 => static function ($self, $stackPos) { + $self->semValue = new Name(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 96 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 97 => static function ($self, $stackPos) { /* nothing */ - }, 99 => function ($stackPos) { + }, 98 => static function ($self, $stackPos) { /* nothing */ - }, 100 => function ($stackPos) { + }, 99 => static function ($self, $stackPos) { /* nothing */ - }, 101 => function ($stackPos) { - $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); - }, 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 103 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 104 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos - (1 - 1)], [], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 105 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 106 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 107 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 108 => function ($stackPos) { - $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 110 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 111 => function ($stackPos) { - $this->semValue = []; - }, 112 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 113 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 114 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 115 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 116 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 117 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, 118 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 119 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 120 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 121 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 122 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 123 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 124 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, 125 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, 126 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 6)], $this->semStack[$stackPos - (8 - 2)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 127 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 2)], $this->semStack[$stackPos - (7 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 128 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 129 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 130 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 132 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 133 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 134 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 135 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 136 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 137 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 138 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 139 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 140 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 141 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, 142 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; - }, 143 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 144 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 145 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 146 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 147 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 148 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 149 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 150 => function ($stackPos) { - $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos - (3 - 1)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributeStack[$stackPos - (3 - 1)]), $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 151 => function ($stackPos) { - $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos - (3 - 1)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributeStack[$stackPos - (3 - 1)]), $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 152 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 153 => function ($stackPos) { - $this->semValue = array(); - }, 154 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; + }, 100 => static function ($self, $stackPos) { + $self->emitError(new Error('A trailing comma is not allowed here', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]))); + }, 101 => null, 102 => null, 103 => static function ($self, $stackPos) { + $self->semValue = new Node\Attribute($self->semStack[$stackPos - (1 - 1)], [], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 104 => static function ($self, $stackPos) { + $self->semValue = new Node\Attribute($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 105 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 106 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 107 => static function ($self, $stackPos) { + $self->semValue = new Node\AttributeGroup($self->semStack[$stackPos - (4 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 108 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 109 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 110 => static function ($self, $stackPos) { + $self->semValue = []; + }, 111 => null, 112 => null, 113 => null, 114 => null, 115 => static function ($self, $stackPos) { + $self->semValue = new Stmt\HaltCompiler($self->handleHaltCompiler(), $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 116 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos - (3 - 2)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $self->checkNamespace($self->semValue); + }, 117 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos - (5 - 2)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $self->checkNamespace($self->semValue); + }, 118 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Namespace_(null, $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $self->checkNamespace($self->semValue); + }, 119 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Use_($self->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 120 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Use_($self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 121 => null, 122 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Const_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), []); + }, 123 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Const_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (4 - 1)]); + $self->checkConstantAttributes($self->semValue); + }, 124 => static function ($self, $stackPos) { + $self->semValue = Stmt\Use_::TYPE_FUNCTION; + }, 125 => static function ($self, $stackPos) { + $self->semValue = Stmt\Use_::TYPE_CONSTANT; + }, 126 => static function ($self, $stackPos) { + $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos - (8 - 3)], $self->semStack[$stackPos - (8 - 6)], $self->semStack[$stackPos - (8 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 127 => static function ($self, $stackPos) { + $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos - (7 - 2)], $self->semStack[$stackPos - (7 - 5)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 128 => null, 129 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 130 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 131 => null, 132 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 133 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 134 => null, 135 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 136 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 137 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (1 - 1)); + }, 138 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (3 - 3)); + }, 139 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (1 - 1)); + }, 140 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (3 - 3)); + }, 141 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + $self->semValue->type = Stmt\Use_::TYPE_NORMAL; + }, 142 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue->type = $self->semStack[$stackPos - (2 - 1)]; + }, 143 => null, 144 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 145 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 146 => static function ($self, $stackPos) { + $self->semValue = new Node\Const_($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 147 => null, 148 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 149 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 150 => static function ($self, $stackPos) { + $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos - (3 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos - (3 - 1)])), $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 151 => static function ($self, $stackPos) { + $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos - (3 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos - (3 - 1)])), $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 152 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (2 - 2)] !== null) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; } + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 153 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 154 => static function ($self, $stackPos) { + $nop = $self->maybeCreateZeroLengthNop($self->tokenPos); if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; + $self->semStack[$stackPos - (1 - 1)][] = $nop; } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 155 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 156 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 157 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 158 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 159 => function ($stackPos) { - if ($this->semStack[$stackPos - (3 - 2)]) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; - $stmts = $this->semValue; - if (!empty($attrs['comments'])) { - $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); - } + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 155 => null, 156 => null, 157 => null, 158 => static function ($self, $stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 159 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Block($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 160 => static function ($self, $stackPos) { + $self->semValue = new Stmt\If_($self->semStack[$stackPos - (7 - 3)], ['stmts' => $self->semStack[$stackPos - (7 - 5)], 'elseifs' => $self->semStack[$stackPos - (7 - 6)], 'else' => $self->semStack[$stackPos - (7 - 7)]], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 161 => static function ($self, $stackPos) { + $self->semValue = new Stmt\If_($self->semStack[$stackPos - (10 - 3)], ['stmts' => $self->semStack[$stackPos - (10 - 6)], 'elseifs' => $self->semStack[$stackPos - (10 - 7)], 'else' => $self->semStack[$stackPos - (10 - 8)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + }, 162 => static function ($self, $stackPos) { + $self->semValue = new Stmt\While_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 163 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Do_($self->semStack[$stackPos - (7 - 5)], $self->semStack[$stackPos - (7 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 164 => static function ($self, $stackPos) { + $self->semValue = new Stmt\For_(['init' => $self->semStack[$stackPos - (9 - 3)], 'cond' => $self->semStack[$stackPos - (9 - 5)], 'loop' => $self->semStack[$stackPos - (9 - 7)], 'stmts' => $self->semStack[$stackPos - (9 - 9)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 165 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Switch_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 166 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Break_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 167 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Continue_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 168 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Return_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 169 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Global_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 170 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Static_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 171 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Echo_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 172 => static function ($self, $stackPos) { + $self->semValue = new Stmt\InlineHTML($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('hasLeadingNewline', $self->inlineHtmlHasLeadingNewline($stackPos - (1 - 1))); + }, 173 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Expression($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 174 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Unset_($self->semStack[$stackPos - (5 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 175 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos - (7 - 3)], $self->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $self->semStack[$stackPos - (7 - 5)][1], 'stmts' => $self->semStack[$stackPos - (7 - 7)]], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 176 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos - (9 - 3)], $self->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $self->semStack[$stackPos - (9 - 5)], 'byRef' => $self->semStack[$stackPos - (9 - 7)][1], 'stmts' => $self->semStack[$stackPos - (9 - 9)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 177 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos - (6 - 3)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (6 - 4)], $self->tokenEndStack[$stackPos - (6 - 4)])), ['stmts' => $self->semStack[$stackPos - (6 - 6)]], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + }, 178 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Declare_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 179 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TryCatch($self->semStack[$stackPos - (6 - 3)], $self->semStack[$stackPos - (6 - 5)], $self->semStack[$stackPos - (6 - 6)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkTryCatch($self->semValue); + }, 180 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Goto_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 181 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Label($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 182 => static function ($self, $stackPos) { + $self->semValue = null; + /* means: no statement */ + }, 183 => null, 184 => static function ($self, $stackPos) { + $self->semValue = $self->maybeCreateNop($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]); + }, 185 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (1 - 1)] instanceof Stmt\Block) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]->stmts; } else { - $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); + if ($self->semStack[$stackPos - (1 - 1)] === null) { + $self->semValue = []; } else { - $this->semValue = null; + $self->semValue = [$self->semStack[$stackPos - (1 - 1)]]; } - if (null === $this->semValue) { - $this->semValue = array(); - } - } - }, 160 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (7 - 3)], ['stmts' => \is_array($this->semStack[$stackPos - (7 - 5)]) ? $this->semStack[$stackPos - (7 - 5)] : array($this->semStack[$stackPos - (7 - 5)]), 'elseifs' => $this->semStack[$stackPos - (7 - 6)], 'else' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 161 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (10 - 3)], ['stmts' => $this->semStack[$stackPos - (10 - 6)], 'elseifs' => $this->semStack[$stackPos - (10 - 7)], 'else' => $this->semStack[$stackPos - (10 - 8)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 162 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 163 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (7 - 5)], \is_array($this->semStack[$stackPos - (7 - 2)]) ? $this->semStack[$stackPos - (7 - 2)] : array($this->semStack[$stackPos - (7 - 2)]), $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 164 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 165 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 166 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 167 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 168 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 169 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 170 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 171 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 172 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 173 => function ($stackPos) { - $e = $this->semStack[$stackPos - (2 - 1)]; - if ($e instanceof Expr\Throw_) { - // For backwards-compatibility reasons, convert throw in statement position into - // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). - $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - } else { - $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - } - }, 174 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 175 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 176 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 177 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (6 - 3)], new Expr\Error($this->startAttributeStack[$stackPos - (6 - 4)] + $this->endAttributeStack[$stackPos - (6 - 4)]), ['stmts' => $this->semStack[$stackPos - (6 - 6)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 178 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 179 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkTryCatch($this->semValue); - }, 180 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 181 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 182 => function ($stackPos) { - $this->semValue = array(); - /* means: no statement */ - }, 183 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 184 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); - } else { - $this->semValue = null; - } - if ($this->semValue === null) { - $this->semValue = array(); } - /* means: no statement */ - }, 185 => function ($stackPos) { - $this->semValue = array(); - }, 186 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 187 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 188 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 189 => function ($stackPos) { - $this->semValue = new Stmt\Catch_($this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 190 => function ($stackPos) { - $this->semValue = null; - }, 191 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 192 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 193 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 194 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 195 => function ($stackPos) { - $this->semValue = \false; - }, 196 => function ($stackPos) { - $this->semValue = \true; - }, 197 => function ($stackPos) { - $this->semValue = \false; - }, 198 => function ($stackPos) { - $this->semValue = \true; - }, 199 => function ($stackPos) { - $this->semValue = \false; - }, 200 => function ($stackPos) { - $this->semValue = \true; - }, 201 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 202 => function ($stackPos) { - $this->semValue = []; - }, 203 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 204 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 205 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (8 - 3)], ['byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 5)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 206 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (9 - 4)], ['byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 207 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos - (7 - 2)); - }, 208 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (8 - 3)], ['type' => $this->semStack[$stackPos - (8 - 2)], 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos - (8 - 3)); - }, 209 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (7 - 3)], ['extends' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)], 'attrGroups' => $this->semStack[$stackPos - (7 - 1)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos - (7 - 3)); - }, 210 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (6 - 3)], ['stmts' => $this->semStack[$stackPos - (6 - 5)], 'attrGroups' => $this->semStack[$stackPos - (6 - 1)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 211 => function ($stackPos) { - $this->semValue = new Stmt\Enum_($this->semStack[$stackPos - (8 - 3)], ['scalarType' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - $this->checkEnum($this->semValue, $stackPos - (8 - 3)); - }, 212 => function ($stackPos) { - $this->semValue = null; - }, 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 214 => function ($stackPos) { - $this->semValue = null; - }, 215 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 216 => function ($stackPos) { - $this->semValue = 0; - }, 217 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 218 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 219 => function ($stackPos) { - $this->checkClassModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); - $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; - }, 220 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 221 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 222 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, 223 => function ($stackPos) { - $this->semValue = null; - }, 224 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 225 => function ($stackPos) { - $this->semValue = array(); - }, 226 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 227 => function ($stackPos) { - $this->semValue = array(); - }, 228 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 229 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 230 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 231 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 232 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 233 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 234 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 236 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 237 => function ($stackPos) { - $this->semValue = null; - }, 238 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 240 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 241 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 242 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 244 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 245 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 246 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (5 - 3)]; - }, 247 => function ($stackPos) { - $this->semValue = array(); - }, 248 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 249 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 250 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 251 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 252 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 253 => function ($stackPos) { - $this->semValue = new Expr\Match_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 254 => function ($stackPos) { - $this->semValue = []; - }, 255 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 256 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 257 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 258 => function ($stackPos) { - $this->semValue = new Node\MatchArm($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 259 => function ($stackPos) { - $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 260 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 261 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 262 => function ($stackPos) { - $this->semValue = array(); - }, 263 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 264 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (5 - 3)], \is_array($this->semStack[$stackPos - (5 - 5)]) ? $this->semStack[$stackPos - (5 - 5)] : array($this->semStack[$stackPos - (5 - 5)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 265 => function ($stackPos) { - $this->semValue = array(); - }, 266 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 267 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->fixupAlternativeElse($this->semValue); - }, 268 => function ($stackPos) { - $this->semValue = null; - }, 269 => function ($stackPos) { - $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 270 => function ($stackPos) { - $this->semValue = null; - }, 271 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->fixupAlternativeElse($this->semValue); - }, 272 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 273 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); - }, 274 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 275 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 276 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 277 => function ($stackPos) { - $this->semValue = array(); - }, 278 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 279 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 280 => function ($stackPos) { - $this->semValue = 0; - }, 281 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); - $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; - }, 282 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, 283 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, 284 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, 285 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, 286 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 6)], null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); - $this->checkParam($this->semValue); - }, 287 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (8 - 6)], $this->semStack[$stackPos - (8 - 8)], $this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 5)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (8 - 2)], $this->semStack[$stackPos - (8 - 1)]); - $this->checkParam($this->semValue); - }, 288 => function ($stackPos) { - $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes), null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); - }, 289 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 290 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 291 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 292 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 293 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 294 => function ($stackPos) { - $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 295 => function ($stackPos) { - $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos - (1 - 1)]); - }, 296 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 297 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 299 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 300 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 301 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 302 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 303 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 304 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 305 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 306 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 307 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 308 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 309 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 310 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 311 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 312 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 313 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 314 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 315 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 316 => function ($stackPos) { - $this->semValue = null; - }, 317 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 318 => function ($stackPos) { - $this->semValue = null; - }, 319 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 320 => function ($stackPos) { - $this->semValue = null; - }, 321 => function ($stackPos) { - $this->semValue = array(); - }, 322 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 323 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 2)]); - }, 324 => function ($stackPos) { - $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 325 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 326 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 327 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 328 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 329 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 330 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (3 - 3)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (3 - 1)]); - }, 331 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 332 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 333 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 334 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 335 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 336 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 337 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 338 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 339 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 340 => function ($stackPos) { - if ($this->semStack[$stackPos - (2 - 2)] !== null) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 186 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 187 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 188 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 189 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 190 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Catch_($self->semStack[$stackPos - (8 - 3)], $self->semStack[$stackPos - (8 - 4)], $self->semStack[$stackPos - (8 - 7)], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 191 => static function ($self, $stackPos) { + $self->semValue = null; + }, 192 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Finally_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 193 => null, 194 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 195 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 196 => static function ($self, $stackPos) { + $self->semValue = \false; + }, 197 => static function ($self, $stackPos) { + $self->semValue = \true; + }, 198 => static function ($self, $stackPos) { + $self->semValue = \false; + }, 199 => static function ($self, $stackPos) { + $self->semValue = \true; + }, 200 => static function ($self, $stackPos) { + $self->semValue = \false; + }, 201 => static function ($self, $stackPos) { + $self->semValue = \true; + }, 202 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 203 => static function ($self, $stackPos) { + $self->semValue = []; + }, 204 => null, 205 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 206 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 207 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Function_($self->semStack[$stackPos - (8 - 3)], ['byRef' => $self->semStack[$stackPos - (8 - 2)], 'params' => $self->semStack[$stackPos - (8 - 5)], 'returnType' => $self->semStack[$stackPos - (8 - 7)], 'stmts' => $self->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 208 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Function_($self->semStack[$stackPos - (9 - 4)], ['byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 6)], 'returnType' => $self->semStack[$stackPos - (9 - 8)], 'stmts' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => $self->semStack[$stackPos - (9 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 209 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Class_($self->semStack[$stackPos - (7 - 2)], ['type' => $self->semStack[$stackPos - (7 - 1)], 'extends' => $self->semStack[$stackPos - (7 - 3)], 'implements' => $self->semStack[$stackPos - (7 - 4)], 'stmts' => $self->semStack[$stackPos - (7 - 6)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkClass($self->semValue, $stackPos - (7 - 2)); + }, 210 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Class_($self->semStack[$stackPos - (8 - 3)], ['type' => $self->semStack[$stackPos - (8 - 2)], 'extends' => $self->semStack[$stackPos - (8 - 4)], 'implements' => $self->semStack[$stackPos - (8 - 5)], 'stmts' => $self->semStack[$stackPos - (8 - 7)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkClass($self->semValue, $stackPos - (8 - 3)); + }, 211 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Interface_($self->semStack[$stackPos - (7 - 3)], ['extends' => $self->semStack[$stackPos - (7 - 4)], 'stmts' => $self->semStack[$stackPos - (7 - 6)], 'attrGroups' => $self->semStack[$stackPos - (7 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkInterface($self->semValue, $stackPos - (7 - 3)); + }, 212 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Trait_($self->semStack[$stackPos - (6 - 3)], ['stmts' => $self->semStack[$stackPos - (6 - 5)], 'attrGroups' => $self->semStack[$stackPos - (6 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + }, 213 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Enum_($self->semStack[$stackPos - (8 - 3)], ['scalarType' => $self->semStack[$stackPos - (8 - 4)], 'implements' => $self->semStack[$stackPos - (8 - 5)], 'stmts' => $self->semStack[$stackPos - (8 - 7)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkEnum($self->semValue, $stackPos - (8 - 3)); + }, 214 => static function ($self, $stackPos) { + $self->semValue = null; + }, 215 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 216 => static function ($self, $stackPos) { + $self->semValue = null; + }, 217 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 218 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 219 => null, 220 => null, 221 => static function ($self, $stackPos) { + $self->checkClassModifier($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 222 => static function ($self, $stackPos) { + $self->semValue = Modifiers::ABSTRACT; + }, 223 => static function ($self, $stackPos) { + $self->semValue = Modifiers::FINAL; + }, 224 => static function ($self, $stackPos) { + $self->semValue = Modifiers::READONLY; + }, 225 => static function ($self, $stackPos) { + $self->semValue = null; + }, 226 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 227 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 228 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 229 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 230 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 231 => null, 232 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 233 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 234 => null, 235 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 236 => null, 237 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 238 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (1 - 1)] instanceof Stmt\Block) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]->stmts; } else { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + if ($self->semStack[$stackPos - (1 - 1)] === null) { + $self->semValue = []; + } else { + $self->semValue = [$self->semStack[$stackPos - (1 - 1)]]; + } } - }, 341 => function ($stackPos) { - $this->semValue = array(); - }, 342 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); + }, 239 => static function ($self, $stackPos) { + $self->semValue = null; + }, 240 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 241 => null, 242 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 243 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 244 => static function ($self, $stackPos) { + $self->semValue = new Node\DeclareItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 245 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 246 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 3)]; + }, 247 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 248 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (5 - 3)]; + }, 249 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 250 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 251 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Case_($self->semStack[$stackPos - (4 - 2)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 252 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Case_(null, $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 253 => null, 254 => null, 255 => static function ($self, $stackPos) { + $self->semValue = new Expr\Match_($self->semStack[$stackPos - (7 - 3)], $self->semStack[$stackPos - (7 - 6)], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 256 => static function ($self, $stackPos) { + $self->semValue = []; + }, 257 => null, 258 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 259 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 260 => static function ($self, $stackPos) { + $self->semValue = new Node\MatchArm($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 261 => static function ($self, $stackPos) { + $self->semValue = new Node\MatchArm(null, $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 262 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 263 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 264 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 265 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 266 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 267 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 268 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 269 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos - (6 - 3)], $self->semStack[$stackPos - (6 - 6)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + $self->fixupAlternativeElse($self->semValue); + }, 270 => static function ($self, $stackPos) { + $self->semValue = null; + }, 271 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Else_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 272 => static function ($self, $stackPos) { + $self->semValue = null; + }, 273 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Else_($self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->fixupAlternativeElse($self->semValue); + }, 274 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)], \false); + }, 275 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (2 - 2)], \true); + }, 276 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)], \false); + }, 277 => static function ($self, $stackPos) { + $self->semValue = array($self->fixupArrayDestructuring($self->semStack[$stackPos - (1 - 1)]), \false); + }, 278 => null, 279 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 280 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 281 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 282 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 283 => static function ($self, $stackPos) { + $self->checkModifier($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 284 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC; + }, 285 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED; + }, 286 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE; + }, 287 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC_SET; + }, 288 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED_SET; + }, 289 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE_SET; + }, 290 => static function ($self, $stackPos) { + $self->semValue = Modifiers::READONLY; + }, 291 => static function ($self, $stackPos) { + $self->semValue = new Node\Param($self->semStack[$stackPos - (7 - 6)], null, $self->semStack[$stackPos - (7 - 3)], $self->semStack[$stackPos - (7 - 4)], $self->semStack[$stackPos - (7 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (7 - 2)], $self->semStack[$stackPos - (7 - 1)], $self->semStack[$stackPos - (7 - 7)]); + $self->checkParam($self->semValue); + $self->addPropertyNameToHooks($self->semValue); + }, 292 => static function ($self, $stackPos) { + $self->semValue = new Node\Param($self->semStack[$stackPos - (9 - 6)], $self->semStack[$stackPos - (9 - 8)], $self->semStack[$stackPos - (9 - 3)], $self->semStack[$stackPos - (9 - 4)], $self->semStack[$stackPos - (9 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (9 - 2)], $self->semStack[$stackPos - (9 - 1)], $self->semStack[$stackPos - (9 - 9)]); + $self->checkParam($self->semValue); + $self->addPropertyNameToHooks($self->semValue); + }, 293 => static function ($self, $stackPos) { + $self->semValue = new Node\Param(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])), null, $self->semStack[$stackPos - (6 - 3)], $self->semStack[$stackPos - (6 - 4)], $self->semStack[$stackPos - (6 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (6 - 2)], $self->semStack[$stackPos - (6 - 1)]); + }, 294 => null, 295 => static function ($self, $stackPos) { + $self->semValue = new Node\NullableType($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 296 => static function ($self, $stackPos) { + $self->semValue = new Node\UnionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 297 => null, 298 => null, 299 => static function ($self, $stackPos) { + $self->semValue = new Node\Name('static', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 300 => static function ($self, $stackPos) { + $self->semValue = $self->handleBuiltinTypes($self->semStack[$stackPos - (1 - 1)]); + }, 301 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier('array', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 302 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier('callable', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 303 => null, 304 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 305 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 306 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 307 => null, 308 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 309 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 310 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 311 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 312 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 313 => static function ($self, $stackPos) { + $self->semValue = new Node\IntersectionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 314 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 315 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 316 => static function ($self, $stackPos) { + $self->semValue = new Node\IntersectionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 317 => null, 318 => static function ($self, $stackPos) { + $self->semValue = new Node\NullableType($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 319 => static function ($self, $stackPos) { + $self->semValue = new Node\UnionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 320 => null, 321 => static function ($self, $stackPos) { + $self->semValue = null; + }, 322 => null, 323 => static function ($self, $stackPos) { + $self->semValue = null; + }, 324 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 325 => static function ($self, $stackPos) { + $self->semValue = null; + }, 326 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 327 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 328 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 2)]); + }, 329 => static function ($self, $stackPos) { + $self->semValue = new Node\VariadicPlaceholder($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 330 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 331 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 332 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (1 - 1)], \false, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 333 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (2 - 2)], \true, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 334 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (2 - 2)], \false, \true, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 335 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (3 - 3)], \false, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (3 - 1)]); + }, 336 => null, 337 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 338 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 339 => null, 340 => null, 341 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 342 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 343 => static function ($self, $stackPos) { + $self->semValue = new Node\StaticVar($self->semStack[$stackPos - (1 - 1)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 344 => static function ($self, $stackPos) { + $self->semValue = new Node\StaticVar($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 345 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (2 - 2)] !== null) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; } else { - $nop = null; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; } + }, 346 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 347 => static function ($self, $stackPos) { + $nop = $self->maybeCreateZeroLengthNop($self->tokenPos); if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; + $self->semStack[$stackPos - (1 - 1)][] = $nop; } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 343 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 1)]); - $this->checkProperty($this->semValue, $stackPos - (5 - 2)); - }, 344 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 2)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 1)]); - $this->checkClassConst($this->semValue, $stackPos - (5 - 2)); - }, 345 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 2)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 4)]); - $this->checkClassConst($this->semValue, $stackPos - (6 - 2)); - }, 346 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (10 - 5)], ['type' => $this->semStack[$stackPos - (10 - 2)], 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 7)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos - (10 - 2)); - }, 347 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 348 => function ($stackPos) { - $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 1)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 349 => function ($stackPos) { - $this->semValue = null; + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 348 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Property($self->semStack[$stackPos - (5 - 2)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 1)]); + }, 349 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos - (5 - 4)], $self->semStack[$stackPos - (5 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (5 - 1)]); + $self->checkClassConst($self->semValue, $stackPos - (5 - 2)); + }, 350 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos - (6 - 5)], $self->semStack[$stackPos - (6 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (6 - 1)], $self->semStack[$stackPos - (6 - 4)]); + $self->checkClassConst($self->semValue, $stackPos - (6 - 2)); + }, 351 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ClassMethod($self->semStack[$stackPos - (10 - 5)], ['type' => $self->semStack[$stackPos - (10 - 2)], 'byRef' => $self->semStack[$stackPos - (10 - 4)], 'params' => $self->semStack[$stackPos - (10 - 7)], 'returnType' => $self->semStack[$stackPos - (10 - 9)], 'stmts' => $self->semStack[$stackPos - (10 - 10)], 'attrGroups' => $self->semStack[$stackPos - (10 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkClassMethod($self->semValue, $stackPos - (10 - 2)); + }, 352 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUse($self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 353 => static function ($self, $stackPos) { + $self->semValue = new Stmt\EnumCase($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 4)], $self->semStack[$stackPos - (5 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 354 => static function ($self, $stackPos) { + $self->semValue = null; /* will be skipped */ - }, 350 => function ($stackPos) { - $this->semValue = array(); - }, 351 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 352 => function ($stackPos) { - $this->semValue = array(); - }, 353 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 354 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 355 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 356 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 357 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 358 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 359 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 360 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 361 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); - }, 362 => function ($stackPos) { - $this->semValue = null; - }, 363 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 364 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 365 => function ($stackPos) { - $this->semValue = 0; - }, 366 => function ($stackPos) { - $this->semValue = 0; - }, 367 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 368 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 369 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); - $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; - }, 370 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, 371 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, 372 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, 373 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, 374 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 375 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 376 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, 377 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 378 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 379 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 380 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 381 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 382 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 383 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 384 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 385 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 386 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 387 => function ($stackPos) { - $this->semValue = array(); - }, 388 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 389 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 390 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 391 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 392 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 393 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 394 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 395 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 396 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 397 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 398 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 399 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 400 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 401 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 402 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 403 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 404 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 405 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 406 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 407 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 408 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 409 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 410 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 411 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 412 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 413 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 414 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 415 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 416 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 417 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 418 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 419 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 420 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 421 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 422 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 423 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 424 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 425 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 426 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 427 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 428 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 429 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 430 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 431 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 432 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 433 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 434 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 435 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 436 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 437 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 438 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 439 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 440 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 441 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 442 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 443 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 444 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 445 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 446 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 447 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 448 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 449 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 450 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 451 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 452 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 453 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 454 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 455 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 456 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 457 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 458 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 459 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 460 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 461 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 462 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 463 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 464 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 465 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 466 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 467 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 468 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 469 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 470 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 471 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 472 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 473 => function ($stackPos) { - $this->semValue = new Expr\Throw_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 474 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'returnType' => $this->semStack[$stackPos - (8 - 6)], 'expr' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 475 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 476 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'uses' => $this->semStack[$stackPos - (8 - 6)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 477 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 478 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 479 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 8)], 'expr' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 480 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 481 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'uses' => $this->semStack[$stackPos - (10 - 8)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 482 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => $this->semStack[$stackPos - (8 - 2)], 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (8 - 3)]); - $this->checkClass($this->semValue[0], -1); - }, 483 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 484 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 485 => function ($stackPos) { - $this->semValue = array(); - }, 486 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 487 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 488 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 489 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 490 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 491 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 492 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 493 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 494 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 495 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 496 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 497 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 498 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 499 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 500 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 501 => function ($stackPos) { - $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 502 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 503 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 504 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 505 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 506 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 507 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 508 => function ($stackPos) { - $this->semValue = null; - }, 509 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 510 => function ($stackPos) { - $this->semValue = array(); - }, 511 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`'), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); - }, 512 => function ($stackPos) { - foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \true); + }, 355 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 356 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 357 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 358 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 359 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Precedence($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 360 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (5 - 1)][0], $self->semStack[$stackPos - (5 - 1)][1], $self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 361 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], $self->semStack[$stackPos - (4 - 3)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 362 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], null, $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 363 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], null, $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 364 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 365 => null, 366 => static function ($self, $stackPos) { + $self->semValue = array(null, $self->semStack[$stackPos - (1 - 1)]); + }, 367 => static function ($self, $stackPos) { + $self->semValue = null; + }, 368 => null, 369 => null, 370 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 371 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 372 => null, 373 => null, 374 => static function ($self, $stackPos) { + $self->checkModifier($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 375 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC; + }, 376 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED; + }, 377 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE; + }, 378 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC_SET; + }, 379 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED_SET; + }, 380 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE_SET; + }, 381 => static function ($self, $stackPos) { + $self->semValue = Modifiers::STATIC; + }, 382 => static function ($self, $stackPos) { + $self->semValue = Modifiers::ABSTRACT; + }, 383 => static function ($self, $stackPos) { + $self->semValue = Modifiers::FINAL; + }, 384 => static function ($self, $stackPos) { + $self->semValue = Modifiers::READONLY; + }, 385 => null, 386 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 387 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 388 => static function ($self, $stackPos) { + $self->semValue = new Node\VarLikeIdentifier(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 389 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyItem($self->semStack[$stackPos - (1 - 1)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 390 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 391 => static function ($self, $stackPos) { + $self->semValue = []; + }, 392 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 393 => static function ($self, $stackPos) { + $self->semValue = []; + }, 394 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyHook($self->semStack[$stackPos - (5 - 4)], $self->semStack[$stackPos - (5 - 5)], ['flags' => $self->semStack[$stackPos - (5 - 2)], 'byRef' => $self->semStack[$stackPos - (5 - 3)], 'params' => [], 'attrGroups' => $self->semStack[$stackPos - (5 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkPropertyHook($self->semValue, null); + }, 395 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyHook($self->semStack[$stackPos - (8 - 4)], $self->semStack[$stackPos - (8 - 8)], ['flags' => $self->semStack[$stackPos - (8 - 2)], 'byRef' => $self->semStack[$stackPos - (8 - 3)], 'params' => $self->semStack[$stackPos - (8 - 6)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkPropertyHook($self->semValue, $stackPos - (8 - 5)); + }, 396 => static function ($self, $stackPos) { + $self->semValue = null; + }, 397 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 398 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 399 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 400 => static function ($self, $stackPos) { + $self->checkPropertyHookModifiers($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 401 => null, 402 => null, 403 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 404 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 405 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 406 => null, 407 => null, 408 => static function ($self, $stackPos) { + $self->semValue = new Expr\Assign($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 409 => static function ($self, $stackPos) { + $self->semValue = new Expr\Assign($self->fixupArrayDestructuring($self->semStack[$stackPos - (3 - 1)]), $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 410 => static function ($self, $stackPos) { + $self->semValue = new Expr\Assign($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 411 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignRef($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 412 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignRef($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + if (!$self->phpVersion->allowsAssignNewByReference()) { + $self->emitError(new Error('Cannot assign new by reference', $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos]))); + } + }, 413 => null, 414 => null, 415 => static function ($self, $stackPos) { + $self->semValue = new Expr\Clone_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 416 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Plus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 417 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Minus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 418 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Mul($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 419 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Div($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 420 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Concat($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 421 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Mod($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 422 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\BitwiseAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 423 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\BitwiseOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 424 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\BitwiseXor($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 425 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\ShiftLeft($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 426 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\ShiftRight($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 427 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Pow($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 428 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Coalesce($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 429 => static function ($self, $stackPos) { + $self->semValue = new Expr\PostInc($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 430 => static function ($self, $stackPos) { + $self->semValue = new Expr\PreInc($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 431 => static function ($self, $stackPos) { + $self->semValue = new Expr\PostDec($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 432 => static function ($self, $stackPos) { + $self->semValue = new Expr\PreDec($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 433 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BooleanOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 434 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BooleanAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 435 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\LogicalOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 436 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\LogicalAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 437 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\LogicalXor($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 438 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 439 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 440 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 441 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseXor($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 442 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Concat($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 443 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Plus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 444 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Minus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 445 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Mul($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 446 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Div($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 447 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Mod($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 448 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\ShiftLeft($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 449 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\ShiftRight($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 450 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Pow($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 451 => static function ($self, $stackPos) { + $self->semValue = new Expr\UnaryPlus($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 452 => static function ($self, $stackPos) { + $self->semValue = new Expr\UnaryMinus($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 453 => static function ($self, $stackPos) { + $self->semValue = new Expr\BooleanNot($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 454 => static function ($self, $stackPos) { + $self->semValue = new Expr\BitwiseNot($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 455 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Identical($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 456 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\NotIdentical($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 457 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Equal($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 458 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\NotEqual($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 459 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Spaceship($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 460 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Smaller($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 461 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\SmallerOrEqual($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 462 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Greater($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 463 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\GreaterOrEqual($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 464 => static function ($self, $stackPos) { + $self->semValue = new Expr\Instanceof_($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 465 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 466 => static function ($self, $stackPos) { + $self->semValue = new Expr\Ternary($self->semStack[$stackPos - (5 - 1)], $self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 467 => static function ($self, $stackPos) { + $self->semValue = new Expr\Ternary($self->semStack[$stackPos - (4 - 1)], null, $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 468 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Coalesce($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 469 => static function ($self, $stackPos) { + $self->semValue = new Expr\Isset_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 470 => static function ($self, $stackPos) { + $self->semValue = new Expr\Empty_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 471 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 472 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 473 => static function ($self, $stackPos) { + $self->semValue = new Expr\Eval_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 474 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 475 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 476 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 477 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos]); + $attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos - (2 - 1)]); + $self->semValue = new Expr\Cast\Double($self->semStack[$stackPos - (2 - 2)], $attrs); + }, 478 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\String_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 479 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Array_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 480 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Object_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 481 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 482 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Unset_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 483 => static function ($self, $stackPos) { + $self->semValue = $self->createExitExpr($self->semStack[$stackPos - (2 - 1)], $stackPos - (2 - 1), $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 484 => static function ($self, $stackPos) { + $self->semValue = new Expr\ErrorSuppress($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 485 => null, 486 => static function ($self, $stackPos) { + $self->semValue = new Expr\ShellExec($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 487 => static function ($self, $stackPos) { + $self->semValue = new Expr\Print_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 488 => static function ($self, $stackPos) { + $self->semValue = new Expr\Yield_(null, null, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 489 => static function ($self, $stackPos) { + $self->semValue = new Expr\Yield_($self->semStack[$stackPos - (2 - 2)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 490 => static function ($self, $stackPos) { + $self->semValue = new Expr\Yield_($self->semStack[$stackPos - (4 - 4)], $self->semStack[$stackPos - (4 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 491 => static function ($self, $stackPos) { + $self->semValue = new Expr\YieldFrom($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 492 => static function ($self, $stackPos) { + $self->semValue = new Expr\Throw_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 493 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $self->semStack[$stackPos - (8 - 2)], 'params' => $self->semStack[$stackPos - (8 - 4)], 'returnType' => $self->semStack[$stackPos - (8 - 6)], 'expr' => $self->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 494 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'returnType' => $self->semStack[$stackPos - (9 - 7)], 'expr' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 495 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \false, 'byRef' => $self->semStack[$stackPos - (8 - 2)], 'params' => $self->semStack[$stackPos - (8 - 4)], 'uses' => $self->semStack[$stackPos - (8 - 6)], 'returnType' => $self->semStack[$stackPos - (8 - 7)], 'stmts' => $self->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 496 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \true, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'uses' => $self->semStack[$stackPos - (9 - 7)], 'returnType' => $self->semStack[$stackPos - (9 - 8)], 'stmts' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 497 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'returnType' => $self->semStack[$stackPos - (9 - 7)], 'expr' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => $self->semStack[$stackPos - (9 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 498 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $self->semStack[$stackPos - (10 - 4)], 'params' => $self->semStack[$stackPos - (10 - 6)], 'returnType' => $self->semStack[$stackPos - (10 - 8)], 'expr' => $self->semStack[$stackPos - (10 - 10)], 'attrGroups' => $self->semStack[$stackPos - (10 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + }, 499 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \false, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'uses' => $self->semStack[$stackPos - (9 - 7)], 'returnType' => $self->semStack[$stackPos - (9 - 8)], 'stmts' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => $self->semStack[$stackPos - (9 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 500 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \true, 'byRef' => $self->semStack[$stackPos - (10 - 4)], 'params' => $self->semStack[$stackPos - (10 - 6)], 'uses' => $self->semStack[$stackPos - (10 - 8)], 'returnType' => $self->semStack[$stackPos - (10 - 9)], 'stmts' => $self->semStack[$stackPos - (10 - 10)], 'attrGroups' => $self->semStack[$stackPos - (10 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + }, 501 => static function ($self, $stackPos) { + $self->semValue = array(new Stmt\Class_(null, ['type' => $self->semStack[$stackPos - (8 - 2)], 'extends' => $self->semStack[$stackPos - (8 - 4)], 'implements' => $self->semStack[$stackPos - (8 - 5)], 'stmts' => $self->semStack[$stackPos - (8 - 7)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])), $self->semStack[$stackPos - (8 - 3)]); + $self->checkClass($self->semValue[0], -1); + }, 502 => static function ($self, $stackPos) { + $self->semValue = new Expr\New_($self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 503 => static function ($self, $stackPos) { + list($class, $ctorArgs) = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = new Expr\New_($class, $ctorArgs, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 504 => static function ($self, $stackPos) { + $self->semValue = new Expr\New_($self->semStack[$stackPos - (2 - 2)], [], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 505 => null, 506 => null, 507 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 508 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 3)]; + }, 509 => null, 510 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 511 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 512 => static function ($self, $stackPos) { + $self->semValue = new Node\ClosureUse($self->semStack[$stackPos - (2 - 2)], $self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 513 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 514 => static function ($self, $stackPos) { + $self->semValue = new Expr\FuncCall($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 515 => static function ($self, $stackPos) { + $self->semValue = new Expr\FuncCall($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 516 => static function ($self, $stackPos) { + $self->semValue = new Expr\FuncCall($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 517 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticCall($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 518 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 519 => null, 520 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 521 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 522 => static function ($self, $stackPos) { + $self->semValue = new Name\FullyQualified(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 523 => static function ($self, $stackPos) { + $self->semValue = new Name\Relative(\substr($self->semStack[$stackPos - (1 - 1)], 10), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 524 => null, 525 => null, 526 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 527 => static function ($self, $stackPos) { + $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 528 => null, 529 => null, 530 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 531 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + foreach ($self->semValue as $s) { + if ($s instanceof Node\InterpolatedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); + } + } + }, 532 => static function ($self, $stackPos) { + foreach ($self->semStack[$stackPos - (1 - 1)] as $s) { + if ($s instanceof Node\InterpolatedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); } } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 513 => function ($stackPos) { - $this->semValue = array(); - }, 514 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 515 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 516 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 517 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 518 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 519 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 520 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 521 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 522 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 523 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 524 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 525 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 526 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], new Expr\Error($this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 527 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 533 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 534 => null, 535 => static function ($self, $stackPos) { + $self->semValue = new Expr\ConstFetch($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 536 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Line($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 537 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\File($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 538 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Dir($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 539 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Class_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 540 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Trait_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 541 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Method($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 542 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Function_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 543 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Namespace_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 544 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Property($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 545 => static function ($self, $stackPos) { + $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 546 => static function ($self, $stackPos) { + $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos - (5 - 1)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 547 => static function ($self, $stackPos) { + $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos - (3 - 1)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (3 - 3)], $self->tokenEndStack[$stackPos - (3 - 3)])), $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 548 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 528 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; + $self->semValue = new Expr\Array_($self->semStack[$stackPos - (3 - 2)], $attrs); + }, 549 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); - }, 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 530 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 531 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; + $self->semValue = new Expr\Array_($self->semStack[$stackPos - (4 - 3)], $attrs); + $self->createdArrays->attach($self->semValue); + }, 550 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + $self->createdArrays->attach($self->semValue); + }, 551 => static function ($self, $stackPos) { + $self->semValue = Scalar\String_::fromString($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->supportsUnicodeEscapes()); + }, 552 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); + foreach ($self->semStack[$stackPos - (3 - 2)] as $s) { + if ($s instanceof Node\InterpolatedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', $self->phpVersion->supportsUnicodeEscapes()); } } - $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 532 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 533 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 534 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 535 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 537 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); - }, 538 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \true); - }, 539 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); - }, 540 => function ($stackPos) { - $this->semValue = null; - }, 541 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 542 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 543 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 544 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 546 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 547 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 548 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 549 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 550 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 551 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 553 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 554 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 555 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 556 => function ($stackPos) { - $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 557 => function ($stackPos) { - $this->semValue = null; - }, 558 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 560 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 561 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 562 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 563 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 564 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 565 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 566 => function ($stackPos) { - $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 567 => function ($stackPos) { - $var = $this->semStack[$stackPos - (1 - 1)]->name; - $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; - }, 568 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 569 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 570 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 571 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 572 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 573 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 574 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 575 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 576 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 577 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 578 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 579 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 580 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 581 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 582 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 583 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 584 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - $end = \count($this->semValue) - 1; - if ($this->semValue[$end] === null) { - \array_pop($this->semValue); + $self->semValue = new Scalar\InterpolatedString($self->semStack[$stackPos - (3 - 2)], $attrs); + }, 553 => static function ($self, $stackPos) { + $self->semValue = $self->parseLNumber($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->allowsInvalidOctals()); + }, 554 => static function ($self, $stackPos) { + $self->semValue = Scalar\Float_::fromString($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 555 => null, 556 => null, 557 => null, 558 => static function ($self, $stackPos) { + $self->semValue = $self->parseDocString($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 3)], $self->tokenEndStack[$stackPos - (3 - 3)]), \true); + }, 559 => static function ($self, $stackPos) { + $self->semValue = $self->parseDocString($self->semStack[$stackPos - (2 - 1)], '', $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 2)], $self->tokenEndStack[$stackPos - (2 - 2)]), \true); + }, 560 => static function ($self, $stackPos) { + $self->semValue = $self->parseDocString($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 3)], $self->tokenEndStack[$stackPos - (3 - 3)]), \true); + }, 561 => static function ($self, $stackPos) { + $self->semValue = null; + }, 562 => null, 563 => null, 564 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 565 => null, 566 => null, 567 => null, 568 => null, 569 => null, 570 => null, 571 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 572 => null, 573 => null, 574 => null, 575 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 576 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 577 => null, 578 => static function ($self, $stackPos) { + $self->semValue = new Expr\MethodCall($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 579 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafeMethodCall($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 580 => static function ($self, $stackPos) { + $self->semValue = null; + }, 581 => null, 582 => null, 583 => null, 584 => static function ($self, $stackPos) { + $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 585 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 586 => null, 587 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 588 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 589 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])), $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 590 => static function ($self, $stackPos) { + $var = $self->semStack[$stackPos - (1 - 1)]->name; + $self->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])) : $var; + }, 591 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 592 => null, 593 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 594 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 595 => static function ($self, $stackPos) { + $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 596 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 597 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 598 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 599 => null, 600 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 601 => null, 602 => null, 603 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 604 => null, 605 => static function ($self, $stackPos) { + $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 606 => static function ($self, $stackPos) { + $self->semValue = new Expr\List_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Expr\List_::KIND_LIST); + $self->postprocessList($self->semValue); + }, 607 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + $end = \count($self->semValue) - 1; + if ($self->semValue[$end]->value instanceof Expr\Error) { + \array_pop($self->semValue); } - }, 585 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 586 => function ($stackPos) { - /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ - }, 587 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 588 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 589 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 590 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 591 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 592 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 593 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 594 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 595 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true); - }, 596 => function ($stackPos) { - $this->semValue = null; - }, 597 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 598 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 599 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 600 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - }, 601 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 602 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 603 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 604 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 605 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 606 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 607 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 608 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 609 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 610 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 611 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 612 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 613 => function ($stackPos) { - $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 614 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }]; + }, 608 => null, 609 => static function ($self, $stackPos) { + /* do nothing -- prevent default action of $$=$self->semStack[$1]. See $551. */ + }, 610 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 611 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 612 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (1 - 1)], null, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 613 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (2 - 2)], null, \true, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 614 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (1 - 1)], null, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 615 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (3 - 3)], $self->semStack[$stackPos - (3 - 1)], \false, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 616 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (4 - 4)], $self->semStack[$stackPos - (4 - 1)], \true, $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 617 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (3 - 3)], $self->semStack[$stackPos - (3 - 1)], \false, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 618 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (2 - 2)], null, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos]), \true); + }, 619 => static function ($self, $stackPos) { + /* Create an Error node now to remember the position. We'll later either report an error, + or convert this into a null element, depending on whether this is a creation or destructuring context. */ + $attrs = $self->createEmptyElemAttributes($self->tokenPos); + $self->semValue = new Node\ArrayItem(new Expr\Error($attrs), null, \false, $attrs); + }, 620 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 621 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 622 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 623 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)]); + }, 624 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]); + $attrs['rawValue'] = $self->semStack[$stackPos - (1 - 1)]; + $self->semValue = new Node\InterpolatedStringPart($self->semStack[$stackPos - (1 - 1)], $attrs); + }, 625 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 626 => null, 627 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 628 => static function ($self, $stackPos) { + $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 629 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 630 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 631 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 632 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (6 - 2)], $self->semStack[$stackPos - (6 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + }, 633 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 634 => static function ($self, $stackPos) { + $self->semValue = new Scalar\String_($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 635 => static function ($self, $stackPos) { + $self->semValue = $self->parseNumString($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 636 => static function ($self, $stackPos) { + $self->semValue = $self->parseNumString('-' . $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 637 => null]; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php new file mode 100644 index 000000000..c74521157 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php @@ -0,0 +1,1288 @@ +'", "T_IS_GREATER_OR_EQUAL", "'.'", "T_SL", "T_SR", "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_PUBLIC_SET", "T_PROTECTED_SET", "T_PRIVATE_SET", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_PROPERTY_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'('", "')'", "'{'", "'}'", "'`'", "'\"'", "'\$'"); + protected array $tokenToSymbol = array(0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 56, 170, 172, 171, 55, 172, 172, 165, 166, 53, 51, 8, 52, 48, 54, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 31, 163, 44, 16, 46, 30, 68, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 70, 172, 164, 36, 172, 169, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 167, 35, 168, 58, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 49, 50, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162); + protected array $action = array(126, 127, 128, 573, 129, 130, 959, 768, 769, 770, 131, 38, 852, 493, 569, 1380, -32766, -32766, -32766, 0, 843, 1138, 1139, 1140, 1134, 1133, 1132, 1141, 1135, 1136, 1137, -32766, -32766, -32766, 854, 762, 761, -32766, 1049, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 1009, -32766, -32766, -32766, 771, 1138, 1139, 1140, 1134, 1133, 1132, 1141, 1135, 1136, 1137, 387, 388, 447, 263, 132, 390, 775, 776, 777, 778, 432, 848, 433, 1317, -571, 36, 246, 47, 292, 832, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 808, 574, 809, 810, 811, 812, 800, 801, 345, 346, 803, 804, 789, 790, 791, 793, 794, 795, 360, 835, 836, 837, 838, 839, 575, 2, 297, -333, 796, 797, 576, 577, 236, 820, 818, 819, 831, 815, 816, 26, -195, 578, 579, 814, 580, 581, 582, 583, 324, 584, 585, -571, -571, 494, 298, 299, 817, 586, 587, 35, 133, 849, 126, 127, 128, 573, 129, 130, 1082, 768, 769, 770, 131, 38, -32766, 134, 738, 1042, 1041, 1040, 1046, 1043, 1044, 1045, -32766, -32766, -32766, 1010, 104, 105, 106, 107, 108, 880, 275, 881, -32766, 762, 761, 1058, 853, -32766, -32766, -32766, 143, -32766, 109, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 479, 480, 771, -32766, -32766, -32766, 1058, -32766, 291, -32766, -32766, -32766, -32766, -32766, -194, 249, 263, 132, 390, 775, 776, 777, 778, -32766, -32766, 433, -32766, -32766, -32766, -32766, 291, 851, 832, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 808, 574, 809, 810, 811, 812, 800, 801, 345, 346, 803, 804, 789, 790, 791, 793, 794, 795, 360, 835, 836, 837, 838, 839, 575, 962, -274, -333, 796, 797, 576, 577, 843, 820, 818, 819, 831, 815, 816, 1305, -195, 578, 579, 814, 580, 581, 582, 583, 308, 584, 585, -32766, 82, 83, 84, -85, 817, 586, 587, 161, 146, 792, 763, 764, 765, 766, 767, 1346, 768, 769, 770, 805, 806, 37, 961, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 310, 275, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 101, 102, 103, 1112, 109, 319, 625, 751, 771, -32766, -32766, -32766, 852, -85, -32766, 1111, -32766, -32766, -32766, 389, 388, -194, 772, 773, 774, 775, 776, 777, 778, 432, -32766, 841, -32766, -32766, 1390, 341, 1285, 1391, 832, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 808, 830, 809, 810, 811, 812, 800, 801, 802, 829, 803, 804, 789, 790, 791, 793, 794, 795, 834, 835, 836, 837, 838, 839, 840, 1081, 433, -568, 796, 797, 798, 799, 1365, 820, 818, 819, 831, 815, 816, 1364, 24, 807, 813, 814, 821, 822, 824, 823, 138, 825, 826, 1154, 322, 342, 286, 743, 817, 828, 827, 49, 50, 51, 525, 52, 53, 1127, -110, 375, 852, 54, 55, -110, 56, -110, 619, -32766, 81, 381, 304, 1361, 322, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, -110, 157, 938, -568, -568, 292, 978, 979, 397, 1058, 845, 980, 451, 286, 1280, 1279, 1281, 57, 58, -568, 974, 148, 59, 1113, 60, 243, 244, 61, 62, 63, 64, 65, 66, 67, 68, -32766, 28, 265, 69, 449, 526, 452, -347, 1055, 1311, 1312, 527, 938, 852, 1055, 762, 761, 1309, 42, 20, 528, 938, 529, 938, 530, 74, 531, 453, 701, 532, 533, 322, 843, 1058, 44, 45, 455, 384, 383, 1058, 46, 534, 728, -569, 235, 454, 373, 340, 858, 1285, 928, 729, 938, 1271, -567, 847, -32766, 282, 536, 537, 538, 149, 725, 282, 702, -78, -373, 1278, -373, 151, 540, 541, -58, 1297, 1298, 1299, 1300, 1302, 1294, 1295, 296, 1058, 730, -32766, -32766, -32766, 1301, 1296, 703, 704, 1280, 1279, 1281, 297, -565, 928, 70, -154, -154, -154, 317, 318, 322, 1276, 928, 291, 928, 1280, 1279, 1281, -569, -569, -154, 282, -154, -57, -154, 753, -154, 139, 1055, -567, -567, 322, 762, 761, -569, 1057, 382, 940, 852, 152, 399, 723, 7, 928, 153, -567, -575, 978, 979, 469, 470, 471, 535, 1058, 1280, 1279, 1281, -574, 102, 103, 914, 974, -110, -110, -110, 28, 266, -32766, -32766, -565, -565, 668, 21, -110, -110, 687, 688, 852, -110, 155, 48, 1309, 940, 385, 386, -565, 723, -110, 147, 415, 880, 940, 881, 940, 33, 723, -32766, 723, -154, 391, 392, 32, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 659, 660, 1271, 297, 762, 761, 74, 995, 123, 938, 124, 723, 322, -4, 938, -607, 938, -607, 135, 540, 541, 136, 1297, 1298, 1299, 1300, 1302, 1294, 1295, 1187, 1189, -307, 300, 301, -566, 1301, 1296, 762, 761, 733, -565, -32766, 142, 156, 158, 72, 740, 1278, 380, 159, 318, 322, 160, -87, -32766, -32766, -32766, 287, -32766, -303, -32766, -84, -32766, -78, 280, -32766, -73, 275, 387, 388, -32766, -32766, -32766, -72, -32766, -71, -32766, -32766, 432, -70, 1278, -69, -32766, 429, 28, 265, -68, -32766, -32766, -32766, -67, -32766, 928, -32766, -32766, -32766, 852, 928, -32766, 928, 1309, -566, -566, -32766, -32766, -32766, -66, -565, -565, -32766, -32766, -65, -46, -18, 140, -32766, 429, -566, 274, 382, 283, 445, 739, -565, 297, 73, 295, -32766, 742, -573, 978, 979, 937, 145, 281, 535, 1271, 28, 266, 284, 285, 330, 109, 539, 974, -110, -110, -110, 288, 852, -32766, -32766, -32766, 1309, 541, 125, 1297, 1298, 1299, 1300, 1302, 1294, 1295, 293, 294, 144, 955, 11, 843, 1301, 1296, 940, 712, 697, 590, 723, 940, 1392, 940, 72, 723, -4, 723, -32766, 318, 322, -50, 690, 305, 1271, 852, 1145, 714, 669, 975, 302, 309, 657, 303, 1316, -531, 1318, 596, 674, -32766, -521, 8, 541, 297, 1297, 1298, 1299, 1300, 1302, 1294, 1295, 10, 476, 504, 137, 40, 27, 1301, 1296, 675, 691, 623, 1244, 957, -32766, 379, 851, 72, 34, 41, 1278, 322, 318, 322, 748, 0, 749, -32766, -32766, -32766, -277, -32766, 0, -32766, 871, -32766, 0, 0, -32766, 1306, 0, 0, 0, -32766, -32766, -32766, 938, -32766, 0, -32766, -32766, 0, 0, 1278, 0, -32766, 429, 0, 919, 0, -32766, -32766, -32766, 1019, -32766, 996, -32766, -32766, -32766, 938, 1003, -32766, 863, 1310, 0, 0, -32766, -32766, -32766, 993, -32766, 1004, -32766, -32766, 917, 991, 1278, 1116, -32766, 429, 1119, 1120, 1117, -32766, -32766, -32766, 1156, -32766, 1118, -32766, -32766, -32766, 1124, -601, -32766, 1333, 1350, 1383, 499, -32766, -32766, -32766, 662, -32766, -600, -32766, -32766, -599, -575, 1278, 603, -32766, 429, -574, -573, -572, -32766, -32766, -32766, 928, -32766, -515, -32766, -32766, -32766, 1, 29, -32766, -275, 30, 39, 43, -32766, -32766, -32766, -252, -252, -252, -32766, -32766, 71, 382, 928, 75, -32766, 429, 76, 77, 78, 1285, 79, 80, 978, 979, 141, 150, -32766, 535, -251, -251, -251, -274, 154, 241, 382, 914, 974, -110, -110, -110, 326, 361, 362, 363, 364, 978, 979, 365, 366, -16, 535, 367, 368, 369, 370, 371, 374, 446, 914, 974, -110, -110, -110, -32766, 13, 568, 372, 0, 940, 1278, 14, 414, 723, -252, 15, 16, -32766, -32766, -32766, 18, -32766, 355, -32766, 413, -32766, 495, 496, -32766, 503, 506, 507, 940, -32766, -32766, -32766, 723, -251, 508, -32766, -32766, 852, 509, 513, 514, -32766, 429, 515, 522, 601, 707, 1084, 1227, 1307, 1083, 1064, 1266, -32766, 1060, -279, -102, 12, 17, 22, 313, 412, 615, 620, 648, 713, 1231, 1284, 1228, 1362, 0, 316, -110, -110, 376, 724, 727, -110, 731, 732, 734, 735, 736, 737, 741, 753, -110, 726, 754, 0, 418, 745, 915, 1387, 0, -32766, 1389, 874, 873, 968, 1011, 1388, 967, 965, 966, 969, 1259, 948, 958, 946, 1155, 1151, 1105, 1001, 1002, 646, 1386, 297, 1344, 1359, 74, 0, 0, 0, 0, 0, 322); + protected array $actionCheck = array(2, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 82, 31, 85, 85, 9, 10, 11, 0, 80, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 9, 10, 11, 1, 37, 38, 30, 1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 31, 30, 9, 10, 57, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 106, 107, 108, 71, 72, 73, 74, 75, 76, 77, 116, 80, 80, 150, 70, 151, 152, 70, 30, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 8, 162, 8, 126, 127, 128, 129, 14, 131, 132, 133, 134, 135, 136, 8, 8, 139, 140, 141, 142, 143, 144, 145, 70, 147, 148, 137, 138, 167, 137, 138, 154, 155, 156, 8, 158, 160, 2, 3, 4, 5, 6, 7, 166, 9, 10, 11, 12, 13, 116, 8, 167, 119, 120, 121, 122, 123, 124, 125, 9, 10, 11, 163, 51, 52, 53, 54, 55, 106, 57, 108, 116, 37, 38, 141, 163, 9, 10, 11, 8, 30, 69, 32, 33, 34, 35, 36, 37, 38, 116, 137, 138, 57, 9, 10, 11, 141, 30, 165, 32, 33, 34, 35, 36, 8, 8, 71, 72, 73, 74, 75, 76, 77, 140, 30, 80, 32, 33, 34, 35, 165, 159, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 73, 166, 166, 126, 127, 128, 129, 80, 131, 132, 133, 134, 135, 136, 1, 166, 139, 140, 141, 142, 143, 144, 145, 8, 147, 148, 9, 9, 10, 11, 31, 154, 155, 156, 14, 158, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 30, 122, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 8, 57, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 163, 69, 8, 52, 167, 57, 9, 10, 11, 82, 97, 30, 1, 32, 33, 34, 106, 107, 166, 71, 72, 73, 74, 75, 76, 77, 116, 30, 80, 32, 33, 80, 8, 1, 83, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 1, 80, 70, 126, 127, 128, 129, 1, 131, 132, 133, 134, 135, 136, 8, 101, 139, 140, 141, 142, 143, 144, 145, 167, 147, 148, 163, 171, 8, 30, 167, 154, 155, 156, 2, 3, 4, 5, 6, 7, 126, 101, 8, 82, 12, 13, 106, 15, 108, 1, 116, 167, 8, 113, 1, 171, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 16, 1, 137, 138, 30, 117, 118, 8, 141, 80, 122, 8, 30, 159, 160, 161, 51, 52, 153, 131, 14, 56, 168, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 140, 70, 71, 72, 73, 74, 8, 168, 116, 78, 79, 80, 1, 82, 116, 37, 38, 86, 87, 88, 89, 1, 91, 1, 93, 165, 95, 8, 80, 98, 99, 171, 80, 141, 103, 104, 105, 106, 107, 141, 109, 110, 31, 70, 97, 8, 115, 116, 8, 1, 84, 31, 1, 122, 70, 160, 116, 165, 127, 128, 129, 14, 167, 165, 116, 16, 106, 80, 108, 14, 139, 140, 16, 142, 143, 144, 145, 146, 147, 148, 149, 141, 31, 9, 10, 11, 155, 156, 140, 141, 159, 160, 161, 162, 70, 84, 165, 75, 76, 77, 169, 170, 171, 116, 84, 165, 84, 159, 160, 161, 137, 138, 90, 165, 92, 16, 94, 167, 96, 167, 116, 137, 138, 171, 37, 38, 153, 140, 106, 163, 82, 14, 106, 167, 108, 84, 14, 153, 165, 117, 118, 132, 133, 134, 122, 141, 159, 160, 161, 165, 49, 50, 130, 131, 132, 133, 134, 70, 71, 51, 52, 137, 138, 75, 76, 117, 118, 75, 76, 82, 122, 14, 70, 86, 163, 106, 107, 153, 167, 131, 101, 102, 106, 163, 108, 163, 14, 167, 140, 167, 168, 106, 107, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 111, 112, 122, 162, 37, 38, 165, 163, 16, 1, 16, 167, 171, 0, 1, 164, 1, 166, 16, 139, 140, 16, 142, 143, 144, 145, 146, 147, 148, 59, 60, 35, 137, 138, 70, 155, 156, 37, 38, 31, 70, 74, 16, 16, 16, 165, 31, 80, 153, 16, 170, 171, 16, 31, 87, 88, 89, 37, 91, 35, 93, 31, 95, 31, 35, 98, 31, 57, 106, 107, 103, 104, 105, 31, 74, 31, 109, 110, 116, 31, 80, 31, 115, 116, 70, 71, 31, 87, 88, 89, 31, 91, 84, 93, 127, 95, 82, 84, 98, 84, 86, 137, 138, 103, 104, 105, 31, 137, 138, 109, 110, 31, 31, 31, 31, 115, 116, 153, 31, 106, 31, 108, 31, 153, 162, 158, 113, 127, 31, 165, 117, 118, 31, 31, 35, 122, 122, 70, 71, 35, 35, 35, 69, 130, 131, 132, 133, 134, 37, 82, 9, 10, 11, 86, 140, 14, 142, 143, 144, 145, 146, 147, 148, 37, 37, 70, 38, 154, 80, 155, 156, 163, 80, 77, 89, 167, 163, 83, 163, 165, 167, 168, 167, 85, 170, 171, 31, 94, 114, 122, 82, 82, 92, 90, 131, 135, 135, 113, 136, 150, 153, 150, 157, 96, 140, 153, 153, 140, 162, 142, 143, 144, 145, 146, 147, 148, 97, 97, 97, 31, 163, 153, 155, 156, 100, 100, 157, 169, 158, 74, 153, 159, 165, 167, 163, 80, 171, 170, 171, 163, -1, 163, 87, 88, 89, 166, 91, -1, 93, 163, 95, -1, -1, 98, 164, -1, -1, -1, 103, 104, 105, 1, 74, -1, 109, 110, -1, -1, 80, -1, 115, 116, -1, 163, -1, 87, 88, 89, 163, 91, 163, 93, 127, 95, 1, 163, 98, 164, 170, -1, -1, 103, 104, 105, 163, 74, 163, 109, 110, 163, 163, 80, 163, 115, 116, 163, 163, 163, 87, 88, 89, 163, 91, 163, 93, 127, 95, 163, 165, 98, 164, 164, 164, 102, 103, 104, 105, 164, 74, 165, 109, 110, 165, 165, 80, 81, 115, 116, 165, 165, 165, 87, 88, 89, 84, 91, 165, 93, 127, 95, 165, 165, 98, 166, 165, 165, 165, 103, 104, 105, 100, 101, 102, 109, 110, 165, 106, 84, 165, 115, 116, 165, 165, 165, 1, 165, 165, 117, 118, 165, 165, 127, 122, 100, 101, 102, 166, 165, 165, 106, 130, 131, 132, 133, 134, 165, 165, 165, 165, 165, 117, 118, 165, 165, 31, 122, 165, 165, 165, 165, 165, 165, 165, 130, 131, 132, 133, 134, 74, 166, 165, 165, -1, 163, 80, 166, 168, 167, 168, 166, 166, 87, 88, 89, 166, 91, 166, 93, 166, 95, 166, 166, 98, 166, 166, 166, 163, 103, 104, 105, 167, 168, 166, 109, 110, 82, 166, 166, 166, 115, 116, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 127, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, -1, 167, 117, 118, 167, 167, 167, 122, 167, 167, 167, 167, 167, 167, 167, 167, 131, 167, 167, -1, 168, 168, 168, 168, -1, 140, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 162, 168, 168, 165, -1, -1, -1, -1, -1, 171); + protected array $actionBase = array(0, -2, 156, 559, 757, 1004, 1027, 485, 292, 357, -60, 432, 557, 752, 752, 759, 752, 548, 588, 894, 503, 503, 503, 836, 313, 313, 836, 313, 711, 711, 711, 711, 744, 744, 965, 965, 998, 932, 899, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 33, 20, 484, 1080, 709, 1056, 1062, 1058, 1063, 1054, 1053, 1057, 1059, 1064, 1110, 1112, 846, 1109, 1113, 1060, 907, 1055, 1061, 892, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 296, 885, 44, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 624, 624, 22, 22, 22, 362, 811, 758, 811, 811, 811, 811, 811, 811, 811, 811, 346, 205, 188, 714, 171, 171, 7, 7, 7, 7, 7, 376, 1117, 54, 585, 585, 314, 314, 314, 314, 350, 515, 497, 435, 397, -40, 638, 477, 706, 429, 429, 541, 541, 76, 76, 541, 541, 541, 133, 133, 370, 370, 370, 370, 83, -71, 808, 489, 489, 489, 489, 808, 808, 808, 808, 795, 862, 808, 808, 808, 510, 521, 708, 645, 645, 613, -70, -70, 613, 391, -70, 320, 975, 316, 982, 94, 807, 275, 595, 94, 1000, 368, 561, 561, 639, 561, 561, 561, 816, 606, 816, 1052, 842, 842, 825, 779, 898, 1082, 1065, 868, 1107, 869, 1108, 1083, 299, 546, 10, 13, 74, 776, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 809, 515, 1052, -3, 1105, 1106, 809, 809, 809, 515, 515, 515, 515, 515, 515, 515, 515, 826, 515, 515, 633, -3, 625, 629, -3, 850, 515, 796, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, -18, 33, 33, 20, 5, 5, 33, 202, 37, 5, 5, 5, 487, 5, 33, 33, 33, 606, 754, 789, 622, 278, 813, 217, 754, 754, 754, 115, 114, 128, 740, 768, 563, 832, 832, 832, 853, 929, 929, 832, 852, 832, 853, 832, 832, 929, 929, 790, 929, 163, 506, 389, 480, 535, 929, 294, 832, 832, 832, 832, 805, 929, 113, 556, 832, 218, 192, 832, 832, 805, 804, 833, 806, 929, 929, 929, 805, 470, 806, 806, 806, 820, 822, 828, 831, 359, 345, 577, 147, 872, 831, 831, 832, 502, 828, 831, 828, 831, 814, 831, 831, 831, 828, 831, 852, 456, 831, 771, 574, 127, 831, 832, 19, 944, 947, 766, 950, 934, 951, 991, 952, 954, 1070, 925, 967, 935, 955, 999, 933, 930, 845, 736, 738, 797, 791, 919, 817, 817, 817, 912, 917, 817, 817, 817, 817, 817, 817, 817, 817, 736, 834, 821, 829, 976, 746, 749, 1041, 793, 1086, 802, 975, 944, 954, 774, 935, 955, 933, 930, 824, 819, 799, 803, 794, 792, 786, 788, 827, 1043, 958, 801, 770, 1012, 977, 1085, 1066, 978, 981, 1016, 1044, 830, 1045, 1087, 839, 1090, 1091, 867, 985, 1071, 817, 911, 897, 900, 982, 918, 736, 901, 1046, 997, 810, 1018, 1019, 1069, 864, 838, 902, 1092, 986, 987, 988, 1073, 1074, 815, 1003, 823, 1021, 865, 1002, 1022, 1023, 1030, 1034, 1075, 1093, 1076, 908, 1077, 854, 847, 931, 851, 1094, 509, 848, 849, 871, 990, 584, 974, 1078, 1084, 1095, 1035, 1036, 1039, 1096, 1097, 959, 859, 1007, 837, 1008, 964, 861, 866, 592, 870, 1047, 773, 843, 855, 654, 659, 1098, 1099, 1100, 966, 835, 840, 875, 877, 1048, 764, 1050, 1101, 694, 880, 1102, 1042, 772, 777, 586, 636, 593, 780, 844, 1079, 812, 818, 863, 989, 777, 841, 881, 1103, 883, 886, 887, 1040, 888, 1014, 1104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 468, 468, 468, 468, 468, 313, 313, 313, 313, 313, 468, 468, 468, 468, 468, 468, 468, 313, 468, 468, 468, 313, 0, 0, 313, 0, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 524, 524, 297, 297, 297, 297, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 297, 297, 297, 0, 297, 297, 297, 297, 297, 297, 297, 790, 524, 524, 524, 524, 133, 133, 133, 133, -95, -95, -95, 524, 524, 391, 133, 524, 391, 524, 524, 524, 524, 524, 524, 524, 524, 524, 0, 0, 524, 524, 524, 524, -3, -70, 524, 852, 852, 852, 852, 524, 524, 524, 524, -70, -70, 524, 524, 524, 0, 0, 0, 133, 133, -3, 0, 0, -3, 0, 0, 852, 206, 852, 206, 524, 391, 790, 442, 524, 299, 0, 0, 0, 0, 0, 0, 0, -3, 852, -3, 515, -70, -70, 515, 515, 5, 33, 442, 616, 616, 616, 616, 33, 0, 0, 0, 0, 0, 606, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 852, 0, 790, 0, 790, 790, 852, 852, 852, 0, 0, 0, 0, 0, 0, 0, 0, 929, 0, 0, 0, 0, 0, 0, 0, 852, 0, 929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 817, 864, 0, 0, 864, 0, 817, 817, 817, 0, 0, 0, 870, 764); + protected array $actionDefault = array(3, 32767, 102, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 100, 32767, 619, 619, 619, 619, 32767, 32767, 256, 102, 32767, 32767, 490, 407, 407, 407, 32767, 32767, 563, 563, 563, 563, 563, 32767, 32767, 32767, 32767, 32767, 32767, 490, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 36, 7, 8, 10, 11, 49, 17, 329, 100, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 102, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 394, 612, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 494, 473, 474, 476, 477, 406, 564, 618, 332, 615, 334, 405, 146, 344, 335, 244, 260, 495, 261, 496, 499, 500, 217, 391, 150, 151, 437, 491, 439, 489, 493, 438, 412, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 410, 411, 492, 32767, 32767, 470, 469, 468, 435, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 102, 32767, 436, 440, 443, 409, 441, 442, 459, 460, 457, 458, 461, 32767, 32767, 321, 32767, 32767, 462, 463, 464, 465, 372, 196, 370, 32767, 32767, 111, 444, 321, 111, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 450, 451, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 102, 32767, 100, 507, 557, 467, 445, 446, 32767, 532, 32767, 102, 32767, 534, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 559, 432, 434, 527, 613, 413, 616, 32767, 520, 100, 196, 32767, 533, 196, 196, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 558, 32767, 626, 520, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 32767, 196, 110, 32767, 110, 110, 32767, 32767, 100, 196, 196, 196, 196, 196, 196, 196, 196, 535, 196, 196, 191, 32767, 270, 272, 102, 581, 196, 537, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 394, 32767, 32767, 32767, 32767, 520, 455, 139, 32767, 522, 139, 565, 447, 448, 449, 565, 565, 565, 317, 294, 32767, 32767, 32767, 32767, 32767, 535, 535, 100, 100, 100, 100, 32767, 32767, 32767, 32767, 111, 506, 99, 99, 99, 99, 99, 103, 101, 32767, 32767, 32767, 32767, 225, 32767, 101, 99, 32767, 101, 101, 32767, 32767, 225, 227, 214, 229, 32767, 585, 586, 225, 101, 229, 229, 229, 249, 249, 509, 323, 101, 99, 101, 101, 198, 323, 323, 32767, 101, 509, 323, 509, 323, 200, 323, 323, 323, 509, 323, 32767, 101, 323, 216, 99, 99, 323, 32767, 32767, 32767, 32767, 522, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 224, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 552, 32767, 570, 583, 453, 454, 456, 569, 567, 478, 479, 480, 481, 482, 483, 484, 486, 614, 32767, 526, 32767, 32767, 32767, 343, 32767, 624, 32767, 32767, 32767, 9, 74, 515, 42, 43, 51, 57, 541, 542, 543, 544, 538, 539, 545, 540, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 625, 32767, 565, 32767, 32767, 32767, 32767, 452, 547, 591, 32767, 32767, 566, 617, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 139, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 552, 32767, 137, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 548, 32767, 32767, 32767, 565, 32767, 32767, 32767, 32767, 319, 316, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 565, 32767, 32767, 32767, 32767, 32767, 296, 32767, 313, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 390, 522, 299, 301, 302, 32767, 32767, 32767, 32767, 366, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 153, 153, 3, 3, 346, 153, 153, 153, 346, 346, 153, 346, 346, 346, 153, 153, 153, 153, 153, 153, 153, 282, 186, 264, 267, 249, 249, 153, 358, 153, 392, 392, 401); + protected array $goto = array(194, 194, 1056, 490, 708, 279, 276, 279, 279, 994, 492, 551, 551, 911, 868, 911, 911, 551, 717, 551, 551, 551, 551, 551, 551, 551, 551, 166, 166, 166, 166, 218, 195, 191, 191, 176, 178, 213, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 186, 187, 188, 189, 190, 215, 213, 216, 548, 549, 430, 550, 553, 554, 555, 556, 557, 558, 559, 560, 1173, 167, 168, 169, 193, 170, 171, 172, 164, 173, 174, 175, 177, 212, 214, 217, 237, 240, 251, 252, 253, 255, 256, 257, 258, 259, 260, 261, 267, 268, 269, 270, 277, 289, 290, 314, 315, 436, 437, 438, 610, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 186, 187, 188, 189, 190, 215, 1173, 196, 197, 198, 199, 238, 179, 180, 200, 181, 201, 197, 182, 239, 196, 163, 202, 203, 183, 204, 205, 206, 184, 207, 208, 165, 209, 210, 211, 185, 872, 563, 1087, 563, 563, 869, 1104, 1376, 1376, 478, 478, 595, 473, 563, 612, 747, 649, 651, 478, 351, 671, 1222, 1376, 870, 695, 698, 1029, 706, 715, 1025, 722, 1059, 1059, 693, 971, 466, 844, 1051, 1067, 1068, 988, 988, 988, 988, 1379, 1379, 466, 982, 989, 356, 356, 356, 356, 927, 922, 923, 936, 878, 924, 875, 925, 926, 876, 879, 1018, 930, 883, 990, 428, 746, 882, 343, 564, 1027, 1022, 440, 673, 904, 1110, 1106, 1107, 435, 337, 333, 334, 336, 605, 439, 338, 441, 650, 602, 344, 343, 611, 1123, 349, 1277, 1056, 1277, 1277, 633, 670, 459, 459, 720, 459, 459, 1056, 1277, 519, 711, 1056, 1121, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 850, 523, 1056, 1056, 1056, 1056, 666, 667, 1277, 684, 685, 686, 1366, 1277, 1277, 1277, 1277, 359, 1015, 1277, 1277, 1277, 1358, 1358, 1358, 1358, 672, 359, 359, 403, 406, 613, 617, 468, 1062, 1061, 468, 944, 359, 359, 401, 945, 359, 600, 850, 1393, 850, 960, 1170, 960, 622, 636, 639, 640, 641, 642, 663, 664, 665, 719, 721, 567, 1253, 963, 359, 359, 1080, 1254, 1257, 964, 865, 1258, 678, 865, 572, 565, 931, 450, 932, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 635, 635, 459, 448, 459, 459, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1130, 1158, 1131, 694, 323, 565, 572, 597, 598, 325, 608, 614, 1338, 629, 630, 865, 1327, 1327, 487, 1351, 1352, 25, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1065, 1066, 424, 561, 561, 561, 561, 1349, 616, 1349, 1349, 352, 353, 339, 1324, 1324, 643, 645, 647, 1349, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 566, 592, 566, 434, 567, 624, 566, 862, 592, 886, 404, 472, 1360, 1360, 1360, 1360, 271, 320, 628, 320, 320, 247, 247, 481, 609, 482, 483, 898, 321, 307, 885, 896, 552, 552, 1384, 1385, 1345, 891, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 245, 245, 245, 245, 242, 248, 1272, 977, 416, 417, 705, 894, 410, 682, 846, 683, 1268, 421, 422, 423, 1270, 696, 888, 511, 425, 512, 705, 1153, 347, 705, 331, 518, 1037, 5, 618, 6, 865, 949, 1160, 1095, 899, 887, 1092, 1096, 750, 1347, 1347, 1095, 1093, 1034, 986, 419, 716, 997, 1353, 1354, 1047, 890, 488, 676, 1013, 606, 627, 1273, 1274, 884, 1260, 442, 411, 900, 999, 378, 860, 0, 1097, 0, 987, 1267, 1144, 1260, 0, 442, 0, 755, 755, 0, 0, 1063, 1063, 0, 0, 1275, 1335, 1336, 677, 1074, 1070, 1071, 1142, 903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 250); + protected array $gotoCheck = array(42, 42, 73, 84, 73, 23, 23, 23, 23, 49, 84, 162, 162, 25, 25, 25, 25, 162, 9, 162, 162, 162, 162, 162, 162, 162, 162, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 15, 19, 128, 19, 19, 26, 15, 188, 188, 154, 154, 48, 156, 19, 131, 48, 48, 48, 154, 97, 48, 156, 188, 27, 48, 48, 48, 48, 48, 48, 48, 89, 89, 89, 89, 19, 6, 89, 89, 89, 19, 19, 19, 19, 188, 188, 19, 19, 19, 24, 24, 24, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 50, 15, 15, 50, 43, 50, 15, 174, 50, 50, 50, 66, 66, 45, 15, 15, 15, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 178, 174, 174, 8, 8, 185, 73, 73, 73, 73, 56, 56, 23, 23, 8, 23, 23, 73, 73, 8, 8, 73, 8, 73, 73, 73, 73, 73, 73, 73, 73, 73, 12, 76, 73, 73, 73, 73, 86, 86, 73, 86, 86, 86, 187, 73, 73, 73, 73, 14, 103, 73, 73, 73, 9, 9, 9, 9, 64, 14, 14, 59, 59, 59, 59, 83, 119, 119, 83, 73, 14, 14, 62, 73, 14, 104, 12, 14, 12, 9, 155, 9, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 14, 79, 79, 14, 14, 115, 79, 79, 79, 22, 79, 121, 22, 76, 76, 65, 83, 65, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 108, 108, 23, 113, 23, 23, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 146, 146, 146, 117, 76, 76, 76, 76, 76, 76, 76, 76, 14, 76, 76, 22, 176, 176, 182, 182, 182, 76, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 120, 120, 14, 107, 107, 107, 107, 131, 107, 131, 131, 97, 97, 29, 177, 177, 85, 85, 85, 131, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 9, 9, 9, 13, 14, 13, 9, 18, 9, 35, 9, 9, 131, 131, 131, 131, 24, 24, 80, 24, 24, 5, 5, 9, 9, 9, 9, 35, 175, 175, 35, 9, 179, 179, 9, 9, 131, 39, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 5, 5, 5, 5, 5, 5, 20, 92, 82, 82, 7, 9, 28, 82, 7, 82, 166, 82, 82, 82, 14, 82, 37, 160, 82, 160, 7, 153, 82, 7, 9, 160, 110, 46, 17, 46, 22, 17, 17, 131, 16, 16, 16, 16, 99, 131, 131, 131, 130, 17, 93, 93, 93, 16, 184, 184, 114, 17, 157, 17, 17, 2, 2, 20, 20, 17, 20, 118, 31, 41, 96, 138, 20, -1, 133, -1, 16, 17, 149, 20, -1, 118, -1, 24, 24, -1, -1, 118, 118, -1, -1, 20, 20, 20, 118, 118, 118, 118, 16, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5); + protected array $gotoBase = array(0, 0, -163, 0, 0, 473, 187, 504, 247, 8, 0, 0, -11, 117, 5, -187, 79, 61, 152, -101, 107, 0, 78, 2, 207, 10, 162, 180, 174, 141, 0, 122, 0, 0, 0, 86, 0, 182, 0, 171, 0, 119, -1, 206, 0, 212, -216, 0, -552, -9, 213, 0, 0, 0, 0, 0, 222, 0, 0, 268, 0, 0, 282, 0, 74, 346, 1, 0, 0, 0, 0, 0, 0, -5, 0, 0, 13, 0, 0, -70, 146, -28, 7, 41, -478, -51, -441, 0, 0, -88, 0, 0, 181, 248, 0, 0, 118, -314, 0, 130, 0, 0, 0, 267, 284, 0, 0, 398, 140, 0, 158, 0, 0, 100, 133, 76, 0, 112, 304, 38, 139, 65, 0, 0, 0, 0, 0, 0, 161, 0, 168, 167, 0, 123, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 125, 0, 0, 0, 173, 136, 90, -93, 109, 0, 0, 18, 0, -224, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, -64, 164, 172, 202, 223, 250, 0, 0, 110, 0, 176, 227, 0, 265, -138, 0, 0); + protected array $gotoDefault = array(-32768, 524, 757, 4, 758, 953, 833, 842, 588, 542, 718, 348, 637, 431, 1343, 929, 1159, 607, 861, 1286, 1292, 467, 864, 328, 744, 941, 912, 913, 407, 394, 877, 405, 661, 638, 505, 897, 463, 889, 497, 892, 462, 901, 162, 427, 521, 905, 3, 908, 570, 939, 992, 395, 916, 396, 689, 918, 591, 920, 921, 402, 408, 409, 1164, 599, 634, 933, 254, 593, 934, 393, 935, 943, 398, 400, 699, 477, 516, 510, 420, 1125, 594, 621, 658, 456, 484, 632, 644, 631, 491, 443, 426, 327, 976, 984, 498, 475, 998, 350, 1006, 752, 1172, 652, 500, 1014, 653, 1021, 1024, 543, 544, 489, 1036, 264, 1039, 501, 1048, 23, 679, 1053, 1054, 680, 654, 1076, 655, 681, 656, 1078, 474, 589, 1086, 464, 1094, 1332, 465, 1098, 262, 1101, 278, 354, 377, 444, 1108, 1109, 9, 1115, 709, 710, 19, 273, 520, 1143, 700, 1149, 272, 1152, 461, 1171, 460, 1241, 1243, 571, 502, 1261, 311, 1264, 692, 517, 1269, 457, 1334, 458, 545, 485, 335, 546, 1377, 306, 357, 332, 562, 312, 358, 547, 486, 1340, 1348, 329, 31, 1367, 1378, 604, 626); + protected array $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 50, 69, 69, 72, 72, 71, 70, 70, 63, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 26, 26, 27, 27, 27, 27, 27, 88, 88, 90, 90, 83, 83, 91, 91, 92, 92, 92, 84, 84, 87, 87, 85, 85, 93, 94, 94, 57, 57, 65, 65, 68, 68, 68, 67, 95, 95, 96, 58, 58, 58, 58, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 55, 55, 51, 51, 105, 53, 53, 106, 52, 52, 54, 54, 64, 64, 64, 64, 81, 81, 109, 109, 111, 111, 112, 112, 112, 112, 112, 112, 112, 110, 110, 110, 115, 115, 115, 115, 89, 89, 118, 118, 118, 119, 119, 116, 116, 120, 120, 122, 122, 123, 123, 117, 124, 124, 121, 125, 125, 125, 125, 113, 113, 82, 82, 82, 20, 20, 20, 127, 126, 126, 128, 128, 128, 128, 60, 129, 129, 130, 61, 132, 132, 133, 133, 134, 134, 86, 135, 135, 135, 135, 135, 135, 135, 135, 141, 141, 142, 142, 143, 143, 143, 143, 143, 144, 145, 145, 140, 140, 136, 136, 139, 139, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 137, 148, 148, 150, 149, 149, 138, 138, 114, 114, 151, 151, 153, 153, 153, 152, 152, 62, 104, 154, 154, 56, 56, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 161, 162, 162, 163, 155, 155, 160, 160, 164, 165, 165, 166, 167, 168, 168, 168, 168, 19, 19, 73, 73, 73, 73, 156, 156, 156, 156, 170, 170, 159, 159, 159, 157, 157, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 108, 179, 179, 179, 179, 158, 158, 158, 158, 158, 158, 158, 158, 59, 59, 173, 173, 173, 173, 173, 180, 180, 169, 169, 169, 169, 181, 181, 181, 181, 181, 74, 74, 66, 66, 66, 66, 131, 131, 131, 131, 184, 183, 172, 172, 172, 172, 172, 172, 171, 171, 171, 182, 182, 182, 182, 107, 178, 186, 186, 185, 185, 187, 187, 187, 187, 187, 187, 187, 187, 175, 175, 175, 175, 174, 189, 188, 188, 188, 188, 188, 188, 188, 188, 190, 190, 190, 190); + protected array $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 4, 3, 5, 4, 3, 4, 1, 3, 4, 1, 1, 8, 7, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 1, 1, 1, 8, 9, 7, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 1, 1, 1, 7, 9, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 7, 5, 6, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 0, 2, 0, 3, 5, 8, 1, 3, 3, 0, 2, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 2, 1, 1, 0, 4, 2, 1, 3, 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1); + protected function initReduceCallbacks() : void + { + $this->reduceCallbacks = [0 => null, 1 => static function ($self, $stackPos) { + $self->semValue = $self->handleNamespaces($self->semStack[$stackPos - (1 - 1)]); + }, 2 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (2 - 2)] !== null) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + } + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 3 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 4 => static function ($self, $stackPos) { + $nop = $self->maybeCreateZeroLengthNop($self->tokenPos); + if ($nop !== null) { + $self->semStack[$stackPos - (1 - 1)][] = $nop; + } + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 5 => null, 6 => null, 7 => null, 8 => null, 9 => null, 10 => null, 11 => null, 12 => null, 13 => null, 14 => null, 15 => null, 16 => null, 17 => null, 18 => null, 19 => null, 20 => null, 21 => null, 22 => null, 23 => null, 24 => null, 25 => null, 26 => null, 27 => null, 28 => null, 29 => null, 30 => null, 31 => null, 32 => null, 33 => null, 34 => null, 35 => null, 36 => null, 37 => null, 38 => null, 39 => null, 40 => null, 41 => null, 42 => null, 43 => null, 44 => null, 45 => null, 46 => null, 47 => null, 48 => null, 49 => null, 50 => null, 51 => null, 52 => null, 53 => null, 54 => null, 55 => null, 56 => null, 57 => null, 58 => null, 59 => null, 60 => null, 61 => null, 62 => null, 63 => null, 64 => null, 65 => null, 66 => null, 67 => null, 68 => null, 69 => null, 70 => null, 71 => null, 72 => null, 73 => null, 74 => null, 75 => null, 76 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + if ($self->semValue === "emitError(new Error('Cannot use "getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]))); + } + }, 77 => null, 78 => null, 79 => null, 80 => null, 81 => null, 82 => null, 83 => null, 84 => null, 85 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 86 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 87 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 88 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 89 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 90 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 91 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 92 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 93 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 94 => null, 95 => static function ($self, $stackPos) { + $self->semValue = new Name(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 96 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 97 => static function ($self, $stackPos) { + /* nothing */ + }, 98 => static function ($self, $stackPos) { + /* nothing */ + }, 99 => static function ($self, $stackPos) { + /* nothing */ + }, 100 => static function ($self, $stackPos) { + $self->emitError(new Error('A trailing comma is not allowed here', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]))); + }, 101 => null, 102 => null, 103 => static function ($self, $stackPos) { + $self->semValue = new Node\Attribute($self->semStack[$stackPos - (1 - 1)], [], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 104 => static function ($self, $stackPos) { + $self->semValue = new Node\Attribute($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 105 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 106 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 107 => static function ($self, $stackPos) { + $self->semValue = new Node\AttributeGroup($self->semStack[$stackPos - (4 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 108 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 109 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 110 => static function ($self, $stackPos) { + $self->semValue = []; + }, 111 => null, 112 => null, 113 => null, 114 => null, 115 => static function ($self, $stackPos) { + $self->semValue = new Stmt\HaltCompiler($self->handleHaltCompiler(), $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 116 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos - (3 - 2)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $self->checkNamespace($self->semValue); + }, 117 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Namespace_($self->semStack[$stackPos - (5 - 2)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $self->checkNamespace($self->semValue); + }, 118 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Namespace_(null, $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $self->checkNamespace($self->semValue); + }, 119 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Use_($self->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 120 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Use_($self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 121 => null, 122 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Const_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), []); + }, 123 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Const_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (4 - 1)]); + $self->checkConstantAttributes($self->semValue); + }, 124 => static function ($self, $stackPos) { + $self->semValue = Stmt\Use_::TYPE_FUNCTION; + }, 125 => static function ($self, $stackPos) { + $self->semValue = Stmt\Use_::TYPE_CONSTANT; + }, 126 => static function ($self, $stackPos) { + $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos - (8 - 3)], $self->semStack[$stackPos - (8 - 6)], $self->semStack[$stackPos - (8 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 127 => static function ($self, $stackPos) { + $self->semValue = new Stmt\GroupUse($self->semStack[$stackPos - (7 - 2)], $self->semStack[$stackPos - (7 - 5)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 128 => null, 129 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 130 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 131 => null, 132 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 133 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 134 => null, 135 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 136 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 137 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (1 - 1)); + }, 138 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (3 - 3)); + }, 139 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (1 - 1)); + }, 140 => static function ($self, $stackPos) { + $self->semValue = new Node\UseItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkUseUse($self->semValue, $stackPos - (3 - 3)); + }, 141 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + $self->semValue->type = Stmt\Use_::TYPE_NORMAL; + }, 142 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue->type = $self->semStack[$stackPos - (2 - 1)]; + }, 143 => null, 144 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 145 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 146 => static function ($self, $stackPos) { + $self->semValue = new Node\Const_($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 147 => null, 148 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 149 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 150 => static function ($self, $stackPos) { + $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos - (3 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos - (3 - 1)])), $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 151 => static function ($self, $stackPos) { + $self->semValue = new Node\Const_(new Node\Identifier($self->semStack[$stackPos - (3 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos - (3 - 1)])), $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 152 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (2 - 2)] !== null) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + } + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 153 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 154 => static function ($self, $stackPos) { + $nop = $self->maybeCreateZeroLengthNop($self->tokenPos); + if ($nop !== null) { + $self->semStack[$stackPos - (1 - 1)][] = $nop; + } + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 155 => null, 156 => null, 157 => null, 158 => static function ($self, $stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 159 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Block($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 160 => static function ($self, $stackPos) { + $self->semValue = new Stmt\If_($self->semStack[$stackPos - (7 - 3)], ['stmts' => $self->semStack[$stackPos - (7 - 5)], 'elseifs' => $self->semStack[$stackPos - (7 - 6)], 'else' => $self->semStack[$stackPos - (7 - 7)]], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 161 => static function ($self, $stackPos) { + $self->semValue = new Stmt\If_($self->semStack[$stackPos - (10 - 3)], ['stmts' => $self->semStack[$stackPos - (10 - 6)], 'elseifs' => $self->semStack[$stackPos - (10 - 7)], 'else' => $self->semStack[$stackPos - (10 - 8)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + }, 162 => static function ($self, $stackPos) { + $self->semValue = new Stmt\While_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 163 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Do_($self->semStack[$stackPos - (7 - 5)], $self->semStack[$stackPos - (7 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 164 => static function ($self, $stackPos) { + $self->semValue = new Stmt\For_(['init' => $self->semStack[$stackPos - (9 - 3)], 'cond' => $self->semStack[$stackPos - (9 - 5)], 'loop' => $self->semStack[$stackPos - (9 - 7)], 'stmts' => $self->semStack[$stackPos - (9 - 9)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 165 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Switch_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 166 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Break_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 167 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Continue_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 168 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Return_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 169 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Global_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 170 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Static_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 171 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Echo_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 172 => static function ($self, $stackPos) { + $self->semValue = new Stmt\InlineHTML($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('hasLeadingNewline', $self->inlineHtmlHasLeadingNewline($stackPos - (1 - 1))); + }, 173 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Expression($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 174 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Unset_($self->semStack[$stackPos - (5 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 175 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos - (7 - 3)], $self->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $self->semStack[$stackPos - (7 - 5)][1], 'stmts' => $self->semStack[$stackPos - (7 - 7)]], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 176 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos - (9 - 3)], $self->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $self->semStack[$stackPos - (9 - 5)], 'byRef' => $self->semStack[$stackPos - (9 - 7)][1], 'stmts' => $self->semStack[$stackPos - (9 - 9)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 177 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Foreach_($self->semStack[$stackPos - (6 - 3)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (6 - 4)], $self->tokenEndStack[$stackPos - (6 - 4)])), ['stmts' => $self->semStack[$stackPos - (6 - 6)]], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + }, 178 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Declare_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 179 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TryCatch($self->semStack[$stackPos - (6 - 3)], $self->semStack[$stackPos - (6 - 5)], $self->semStack[$stackPos - (6 - 6)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkTryCatch($self->semValue); + }, 180 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Goto_($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 181 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Label($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 182 => static function ($self, $stackPos) { + $self->semValue = null; + /* means: no statement */ + }, 183 => null, 184 => static function ($self, $stackPos) { + $self->semValue = $self->maybeCreateNop($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]); + }, 185 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (1 - 1)] instanceof Stmt\Block) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]->stmts; + } else { + if ($self->semStack[$stackPos - (1 - 1)] === null) { + $self->semValue = []; + } else { + $self->semValue = [$self->semStack[$stackPos - (1 - 1)]]; + } + } + }, 186 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 187 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 188 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 189 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 190 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Catch_($self->semStack[$stackPos - (8 - 3)], $self->semStack[$stackPos - (8 - 4)], $self->semStack[$stackPos - (8 - 7)], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 191 => static function ($self, $stackPos) { + $self->semValue = null; + }, 192 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Finally_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 193 => null, 194 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 195 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 196 => static function ($self, $stackPos) { + $self->semValue = \false; + }, 197 => static function ($self, $stackPos) { + $self->semValue = \true; + }, 198 => static function ($self, $stackPos) { + $self->semValue = \false; + }, 199 => static function ($self, $stackPos) { + $self->semValue = \true; + }, 200 => static function ($self, $stackPos) { + $self->semValue = \false; + }, 201 => static function ($self, $stackPos) { + $self->semValue = \true; + }, 202 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 203 => static function ($self, $stackPos) { + $self->semValue = []; + }, 204 => null, 205 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 206 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 207 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Function_($self->semStack[$stackPos - (8 - 3)], ['byRef' => $self->semStack[$stackPos - (8 - 2)], 'params' => $self->semStack[$stackPos - (8 - 5)], 'returnType' => $self->semStack[$stackPos - (8 - 7)], 'stmts' => $self->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 208 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Function_($self->semStack[$stackPos - (9 - 4)], ['byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 6)], 'returnType' => $self->semStack[$stackPos - (9 - 8)], 'stmts' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => $self->semStack[$stackPos - (9 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 209 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Class_($self->semStack[$stackPos - (7 - 2)], ['type' => $self->semStack[$stackPos - (7 - 1)], 'extends' => $self->semStack[$stackPos - (7 - 3)], 'implements' => $self->semStack[$stackPos - (7 - 4)], 'stmts' => $self->semStack[$stackPos - (7 - 6)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkClass($self->semValue, $stackPos - (7 - 2)); + }, 210 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Class_($self->semStack[$stackPos - (8 - 3)], ['type' => $self->semStack[$stackPos - (8 - 2)], 'extends' => $self->semStack[$stackPos - (8 - 4)], 'implements' => $self->semStack[$stackPos - (8 - 5)], 'stmts' => $self->semStack[$stackPos - (8 - 7)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkClass($self->semValue, $stackPos - (8 - 3)); + }, 211 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Interface_($self->semStack[$stackPos - (7 - 3)], ['extends' => $self->semStack[$stackPos - (7 - 4)], 'stmts' => $self->semStack[$stackPos - (7 - 6)], 'attrGroups' => $self->semStack[$stackPos - (7 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkInterface($self->semValue, $stackPos - (7 - 3)); + }, 212 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Trait_($self->semStack[$stackPos - (6 - 3)], ['stmts' => $self->semStack[$stackPos - (6 - 5)], 'attrGroups' => $self->semStack[$stackPos - (6 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + }, 213 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Enum_($self->semStack[$stackPos - (8 - 3)], ['scalarType' => $self->semStack[$stackPos - (8 - 4)], 'implements' => $self->semStack[$stackPos - (8 - 5)], 'stmts' => $self->semStack[$stackPos - (8 - 7)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkEnum($self->semValue, $stackPos - (8 - 3)); + }, 214 => static function ($self, $stackPos) { + $self->semValue = null; + }, 215 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 216 => static function ($self, $stackPos) { + $self->semValue = null; + }, 217 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 218 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 219 => null, 220 => null, 221 => static function ($self, $stackPos) { + $self->checkClassModifier($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 222 => static function ($self, $stackPos) { + $self->semValue = Modifiers::ABSTRACT; + }, 223 => static function ($self, $stackPos) { + $self->semValue = Modifiers::FINAL; + }, 224 => static function ($self, $stackPos) { + $self->semValue = Modifiers::READONLY; + }, 225 => static function ($self, $stackPos) { + $self->semValue = null; + }, 226 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 227 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 228 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 229 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 230 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 231 => null, 232 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 233 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 234 => null, 235 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 236 => null, 237 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 238 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (1 - 1)] instanceof Stmt\Block) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]->stmts; + } else { + if ($self->semStack[$stackPos - (1 - 1)] === null) { + $self->semValue = []; + } else { + $self->semValue = [$self->semStack[$stackPos - (1 - 1)]]; + } + } + }, 239 => static function ($self, $stackPos) { + $self->semValue = null; + }, 240 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 241 => null, 242 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 243 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 244 => static function ($self, $stackPos) { + $self->semValue = new Node\DeclareItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 245 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 246 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 3)]; + }, 247 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 248 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (5 - 3)]; + }, 249 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 250 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 251 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Case_($self->semStack[$stackPos - (4 - 2)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 252 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Case_(null, $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 253 => null, 254 => null, 255 => static function ($self, $stackPos) { + $self->semValue = new Expr\Match_($self->semStack[$stackPos - (7 - 3)], $self->semStack[$stackPos - (7 - 6)], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos])); + }, 256 => static function ($self, $stackPos) { + $self->semValue = []; + }, 257 => null, 258 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 259 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 260 => static function ($self, $stackPos) { + $self->semValue = new Node\MatchArm($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 261 => static function ($self, $stackPos) { + $self->semValue = new Node\MatchArm(null, $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 262 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 263 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 264 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 265 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 266 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 267 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 268 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 269 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ElseIf_($self->semStack[$stackPos - (6 - 3)], $self->semStack[$stackPos - (6 - 6)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + $self->fixupAlternativeElse($self->semValue); + }, 270 => static function ($self, $stackPos) { + $self->semValue = null; + }, 271 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Else_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 272 => static function ($self, $stackPos) { + $self->semValue = null; + }, 273 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Else_($self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->fixupAlternativeElse($self->semValue); + }, 274 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)], \false); + }, 275 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (2 - 2)], \true); + }, 276 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)], \false); + }, 277 => static function ($self, $stackPos) { + $self->semValue = array($self->fixupArrayDestructuring($self->semStack[$stackPos - (1 - 1)]), \false); + }, 278 => null, 279 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 280 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 281 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 282 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 283 => static function ($self, $stackPos) { + $self->checkModifier($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 284 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC; + }, 285 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED; + }, 286 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE; + }, 287 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC_SET; + }, 288 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED_SET; + }, 289 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE_SET; + }, 290 => static function ($self, $stackPos) { + $self->semValue = Modifiers::READONLY; + }, 291 => static function ($self, $stackPos) { + $self->semValue = new Node\Param($self->semStack[$stackPos - (7 - 6)], null, $self->semStack[$stackPos - (7 - 3)], $self->semStack[$stackPos - (7 - 4)], $self->semStack[$stackPos - (7 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (7 - 2)], $self->semStack[$stackPos - (7 - 1)], $self->semStack[$stackPos - (7 - 7)]); + $self->checkParam($self->semValue); + $self->addPropertyNameToHooks($self->semValue); + }, 292 => static function ($self, $stackPos) { + $self->semValue = new Node\Param($self->semStack[$stackPos - (9 - 6)], $self->semStack[$stackPos - (9 - 8)], $self->semStack[$stackPos - (9 - 3)], $self->semStack[$stackPos - (9 - 4)], $self->semStack[$stackPos - (9 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (9 - 2)], $self->semStack[$stackPos - (9 - 1)], $self->semStack[$stackPos - (9 - 9)]); + $self->checkParam($self->semValue); + $self->addPropertyNameToHooks($self->semValue); + }, 293 => static function ($self, $stackPos) { + $self->semValue = new Node\Param(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])), null, $self->semStack[$stackPos - (6 - 3)], $self->semStack[$stackPos - (6 - 4)], $self->semStack[$stackPos - (6 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (6 - 2)], $self->semStack[$stackPos - (6 - 1)]); + }, 294 => null, 295 => static function ($self, $stackPos) { + $self->semValue = new Node\NullableType($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 296 => static function ($self, $stackPos) { + $self->semValue = new Node\UnionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 297 => null, 298 => null, 299 => static function ($self, $stackPos) { + $self->semValue = new Node\Name('static', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 300 => static function ($self, $stackPos) { + $self->semValue = $self->handleBuiltinTypes($self->semStack[$stackPos - (1 - 1)]); + }, 301 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier('array', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 302 => static function ($self, $stackPos) { + $self->semValue = new Node\Identifier('callable', $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 303 => null, 304 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 305 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 306 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 307 => null, 308 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 309 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 310 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 311 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 312 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 313 => static function ($self, $stackPos) { + $self->semValue = new Node\IntersectionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 314 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 315 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 316 => static function ($self, $stackPos) { + $self->semValue = new Node\IntersectionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 317 => null, 318 => static function ($self, $stackPos) { + $self->semValue = new Node\NullableType($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 319 => static function ($self, $stackPos) { + $self->semValue = new Node\UnionType($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 320 => null, 321 => static function ($self, $stackPos) { + $self->semValue = null; + }, 322 => null, 323 => static function ($self, $stackPos) { + $self->semValue = null; + }, 324 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (2 - 2)]; + }, 325 => static function ($self, $stackPos) { + $self->semValue = null; + }, 326 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 327 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 2)]; + }, 328 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 2)]); + }, 329 => static function ($self, $stackPos) { + $self->semValue = new Node\VariadicPlaceholder($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 330 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 331 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 332 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (1 - 1)], \false, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 333 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (2 - 2)], \true, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 334 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (2 - 2)], \false, \true, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 335 => static function ($self, $stackPos) { + $self->semValue = new Node\Arg($self->semStack[$stackPos - (3 - 3)], \false, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (3 - 1)]); + }, 336 => null, 337 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 338 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 339 => null, 340 => null, 341 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 342 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 343 => static function ($self, $stackPos) { + $self->semValue = new Node\StaticVar($self->semStack[$stackPos - (1 - 1)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 344 => static function ($self, $stackPos) { + $self->semValue = new Node\StaticVar($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 345 => static function ($self, $stackPos) { + if ($self->semStack[$stackPos - (2 - 2)] !== null) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + } else { + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + } + }, 346 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 347 => static function ($self, $stackPos) { + $nop = $self->maybeCreateZeroLengthNop($self->tokenPos); + if ($nop !== null) { + $self->semStack[$stackPos - (1 - 1)][] = $nop; + } + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 348 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Property($self->semStack[$stackPos - (5 - 2)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 1)]); + }, 349 => static function ($self, $stackPos) { + $self->semValue = new Stmt\Property($self->semStack[$stackPos - (7 - 2)], $self->semStack[$stackPos - (7 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (7 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (7 - 3)], $self->semStack[$stackPos - (7 - 1)], $self->semStack[$stackPos - (7 - 6)]); + $self->checkPropertyHooksForMultiProperty($self->semValue, $stackPos - (7 - 5)); + $self->checkEmptyPropertyHookList($self->semStack[$stackPos - (7 - 6)], $stackPos - (7 - 5)); + $self->addPropertyNameToHooks($self->semValue); + }, 350 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos - (5 - 4)], $self->semStack[$stackPos - (5 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (5 - 1)]); + $self->checkClassConst($self->semValue, $stackPos - (5 - 2)); + }, 351 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ClassConst($self->semStack[$stackPos - (6 - 5)], $self->semStack[$stackPos - (6 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos]), $self->semStack[$stackPos - (6 - 1)], $self->semStack[$stackPos - (6 - 4)]); + $self->checkClassConst($self->semValue, $stackPos - (6 - 2)); + }, 352 => static function ($self, $stackPos) { + $self->semValue = new Stmt\ClassMethod($self->semStack[$stackPos - (10 - 5)], ['type' => $self->semStack[$stackPos - (10 - 2)], 'byRef' => $self->semStack[$stackPos - (10 - 4)], 'params' => $self->semStack[$stackPos - (10 - 7)], 'returnType' => $self->semStack[$stackPos - (10 - 9)], 'stmts' => $self->semStack[$stackPos - (10 - 10)], 'attrGroups' => $self->semStack[$stackPos - (10 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkClassMethod($self->semValue, $stackPos - (10 - 2)); + }, 353 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUse($self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 354 => static function ($self, $stackPos) { + $self->semValue = new Stmt\EnumCase($self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 4)], $self->semStack[$stackPos - (5 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 355 => static function ($self, $stackPos) { + $self->semValue = null; + /* will be skipped */ + }, 356 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 357 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 358 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 359 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 360 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Precedence($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 361 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (5 - 1)][0], $self->semStack[$stackPos - (5 - 1)][1], $self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 362 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], $self->semStack[$stackPos - (4 - 3)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 363 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], null, $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 364 => static function ($self, $stackPos) { + $self->semValue = new Stmt\TraitUseAdaptation\Alias($self->semStack[$stackPos - (4 - 1)][0], $self->semStack[$stackPos - (4 - 1)][1], null, $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 365 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)]); + }, 366 => null, 367 => static function ($self, $stackPos) { + $self->semValue = array(null, $self->semStack[$stackPos - (1 - 1)]); + }, 368 => static function ($self, $stackPos) { + $self->semValue = null; + }, 369 => null, 370 => null, 371 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 372 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 373 => null, 374 => null, 375 => static function ($self, $stackPos) { + $self->checkModifier($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 376 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC; + }, 377 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED; + }, 378 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE; + }, 379 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PUBLIC_SET; + }, 380 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PROTECTED_SET; + }, 381 => static function ($self, $stackPos) { + $self->semValue = Modifiers::PRIVATE_SET; + }, 382 => static function ($self, $stackPos) { + $self->semValue = Modifiers::STATIC; + }, 383 => static function ($self, $stackPos) { + $self->semValue = Modifiers::ABSTRACT; + }, 384 => static function ($self, $stackPos) { + $self->semValue = Modifiers::FINAL; + }, 385 => static function ($self, $stackPos) { + $self->semValue = Modifiers::READONLY; + }, 386 => null, 387 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 388 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 389 => static function ($self, $stackPos) { + $self->semValue = new Node\VarLikeIdentifier(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 390 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyItem($self->semStack[$stackPos - (1 - 1)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 391 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyItem($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 392 => static function ($self, $stackPos) { + $self->semValue = []; + }, 393 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 394 => static function ($self, $stackPos) { + $self->semValue = []; + }, 395 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + $self->checkEmptyPropertyHookList($self->semStack[$stackPos - (3 - 2)], $stackPos - (3 - 1)); + }, 396 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyHook($self->semStack[$stackPos - (5 - 4)], $self->semStack[$stackPos - (5 - 5)], ['flags' => $self->semStack[$stackPos - (5 - 2)], 'byRef' => $self->semStack[$stackPos - (5 - 3)], 'params' => [], 'attrGroups' => $self->semStack[$stackPos - (5 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkPropertyHook($self->semValue, null); + }, 397 => static function ($self, $stackPos) { + $self->semValue = new Node\PropertyHook($self->semStack[$stackPos - (8 - 4)], $self->semStack[$stackPos - (8 - 8)], ['flags' => $self->semStack[$stackPos - (8 - 2)], 'byRef' => $self->semStack[$stackPos - (8 - 3)], 'params' => $self->semStack[$stackPos - (8 - 6)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + $self->checkPropertyHook($self->semValue, $stackPos - (8 - 5)); + }, 398 => static function ($self, $stackPos) { + $self->semValue = null; + }, 399 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 400 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 401 => static function ($self, $stackPos) { + $self->semValue = 0; + }, 402 => static function ($self, $stackPos) { + $self->checkPropertyHookModifiers($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $self->semValue = $self->semStack[$stackPos - (2 - 1)] | $self->semStack[$stackPos - (2 - 2)]; + }, 403 => null, 404 => null, 405 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 406 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 407 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 408 => null, 409 => null, 410 => static function ($self, $stackPos) { + $self->semValue = new Expr\Assign($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 411 => static function ($self, $stackPos) { + $self->semValue = new Expr\Assign($self->fixupArrayDestructuring($self->semStack[$stackPos - (3 - 1)]), $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 412 => static function ($self, $stackPos) { + $self->semValue = new Expr\Assign($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 413 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignRef($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 414 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignRef($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + if (!$self->phpVersion->allowsAssignNewByReference()) { + $self->emitError(new Error('Cannot assign new by reference', $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos]))); + } + }, 415 => null, 416 => null, 417 => static function ($self, $stackPos) { + $self->semValue = new Expr\Clone_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 418 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Plus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 419 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Minus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 420 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Mul($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 421 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Div($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 422 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Concat($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 423 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Mod($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 424 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\BitwiseAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 425 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\BitwiseOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 426 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\BitwiseXor($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 427 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\ShiftLeft($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 428 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\ShiftRight($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 429 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Pow($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 430 => static function ($self, $stackPos) { + $self->semValue = new Expr\AssignOp\Coalesce($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 431 => static function ($self, $stackPos) { + $self->semValue = new Expr\PostInc($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 432 => static function ($self, $stackPos) { + $self->semValue = new Expr\PreInc($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 433 => static function ($self, $stackPos) { + $self->semValue = new Expr\PostDec($self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 434 => static function ($self, $stackPos) { + $self->semValue = new Expr\PreDec($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 435 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BooleanOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 436 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BooleanAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 437 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\LogicalOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 438 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\LogicalAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 439 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\LogicalXor($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 440 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseOr($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 441 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 442 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseAnd($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 443 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\BitwiseXor($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 444 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Concat($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 445 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Plus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 446 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Minus($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 447 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Mul($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 448 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Div($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 449 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Mod($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 450 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\ShiftLeft($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 451 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\ShiftRight($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 452 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Pow($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 453 => static function ($self, $stackPos) { + $self->semValue = new Expr\UnaryPlus($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 454 => static function ($self, $stackPos) { + $self->semValue = new Expr\UnaryMinus($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 455 => static function ($self, $stackPos) { + $self->semValue = new Expr\BooleanNot($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 456 => static function ($self, $stackPos) { + $self->semValue = new Expr\BitwiseNot($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 457 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Identical($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 458 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\NotIdentical($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 459 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Equal($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 460 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\NotEqual($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 461 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Spaceship($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 462 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Smaller($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 463 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\SmallerOrEqual($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 464 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Greater($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 465 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\GreaterOrEqual($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 466 => static function ($self, $stackPos) { + $self->semValue = new Expr\Instanceof_($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 467 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 468 => static function ($self, $stackPos) { + $self->semValue = new Expr\Ternary($self->semStack[$stackPos - (5 - 1)], $self->semStack[$stackPos - (5 - 3)], $self->semStack[$stackPos - (5 - 5)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 469 => static function ($self, $stackPos) { + $self->semValue = new Expr\Ternary($self->semStack[$stackPos - (4 - 1)], null, $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 470 => static function ($self, $stackPos) { + $self->semValue = new Expr\BinaryOp\Coalesce($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 471 => static function ($self, $stackPos) { + $self->semValue = new Expr\Isset_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 472 => static function ($self, $stackPos) { + $self->semValue = new Expr\Empty_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 473 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 474 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 475 => static function ($self, $stackPos) { + $self->semValue = new Expr\Eval_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 476 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 477 => static function ($self, $stackPos) { + $self->semValue = new Expr\Include_($self->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 478 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 479 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos]); + $attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos - (2 - 1)]); + $self->semValue = new Expr\Cast\Double($self->semStack[$stackPos - (2 - 2)], $attrs); + }, 480 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\String_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 481 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Array_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 482 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Object_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 483 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 484 => static function ($self, $stackPos) { + $self->semValue = new Expr\Cast\Unset_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 485 => static function ($self, $stackPos) { + $self->semValue = $self->createExitExpr($self->semStack[$stackPos - (2 - 1)], $stackPos - (2 - 1), $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 486 => static function ($self, $stackPos) { + $self->semValue = new Expr\ErrorSuppress($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 487 => null, 488 => static function ($self, $stackPos) { + $self->semValue = new Expr\ShellExec($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 489 => static function ($self, $stackPos) { + $self->semValue = new Expr\Print_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 490 => static function ($self, $stackPos) { + $self->semValue = new Expr\Yield_(null, null, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 491 => static function ($self, $stackPos) { + $self->semValue = new Expr\Yield_($self->semStack[$stackPos - (2 - 2)], null, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 492 => static function ($self, $stackPos) { + $self->semValue = new Expr\Yield_($self->semStack[$stackPos - (4 - 4)], $self->semStack[$stackPos - (4 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 493 => static function ($self, $stackPos) { + $self->semValue = new Expr\YieldFrom($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 494 => static function ($self, $stackPos) { + $self->semValue = new Expr\Throw_($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 495 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $self->semStack[$stackPos - (8 - 2)], 'params' => $self->semStack[$stackPos - (8 - 4)], 'returnType' => $self->semStack[$stackPos - (8 - 6)], 'expr' => $self->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 496 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'returnType' => $self->semStack[$stackPos - (9 - 7)], 'expr' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 497 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \false, 'byRef' => $self->semStack[$stackPos - (8 - 2)], 'params' => $self->semStack[$stackPos - (8 - 4)], 'uses' => $self->semStack[$stackPos - (8 - 6)], 'returnType' => $self->semStack[$stackPos - (8 - 7)], 'stmts' => $self->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])); + }, 498 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \true, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'uses' => $self->semStack[$stackPos - (9 - 7)], 'returnType' => $self->semStack[$stackPos - (9 - 8)], 'stmts' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 499 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'returnType' => $self->semStack[$stackPos - (9 - 7)], 'expr' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => $self->semStack[$stackPos - (9 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 500 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $self->semStack[$stackPos - (10 - 4)], 'params' => $self->semStack[$stackPos - (10 - 6)], 'returnType' => $self->semStack[$stackPos - (10 - 8)], 'expr' => $self->semStack[$stackPos - (10 - 10)], 'attrGroups' => $self->semStack[$stackPos - (10 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + }, 501 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \false, 'byRef' => $self->semStack[$stackPos - (9 - 3)], 'params' => $self->semStack[$stackPos - (9 - 5)], 'uses' => $self->semStack[$stackPos - (9 - 7)], 'returnType' => $self->semStack[$stackPos - (9 - 8)], 'stmts' => $self->semStack[$stackPos - (9 - 9)], 'attrGroups' => $self->semStack[$stackPos - (9 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (9 - 1)], $self->tokenEndStack[$stackPos])); + }, 502 => static function ($self, $stackPos) { + $self->semValue = new Expr\Closure(['static' => \true, 'byRef' => $self->semStack[$stackPos - (10 - 4)], 'params' => $self->semStack[$stackPos - (10 - 6)], 'uses' => $self->semStack[$stackPos - (10 - 8)], 'returnType' => $self->semStack[$stackPos - (10 - 9)], 'stmts' => $self->semStack[$stackPos - (10 - 10)], 'attrGroups' => $self->semStack[$stackPos - (10 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (10 - 1)], $self->tokenEndStack[$stackPos])); + }, 503 => static function ($self, $stackPos) { + $self->semValue = array(new Stmt\Class_(null, ['type' => $self->semStack[$stackPos - (8 - 2)], 'extends' => $self->semStack[$stackPos - (8 - 4)], 'implements' => $self->semStack[$stackPos - (8 - 5)], 'stmts' => $self->semStack[$stackPos - (8 - 7)], 'attrGroups' => $self->semStack[$stackPos - (8 - 1)]], $self->getAttributes($self->tokenStartStack[$stackPos - (8 - 1)], $self->tokenEndStack[$stackPos])), $self->semStack[$stackPos - (8 - 3)]); + $self->checkClass($self->semValue[0], -1); + }, 504 => static function ($self, $stackPos) { + $self->semValue = new Expr\New_($self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 505 => static function ($self, $stackPos) { + list($class, $ctorArgs) = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = new Expr\New_($class, $ctorArgs, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 506 => static function ($self, $stackPos) { + $self->semValue = new Expr\New_($self->semStack[$stackPos - (2 - 2)], [], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 507 => null, 508 => null, 509 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 510 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (4 - 3)]; + }, 511 => null, 512 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 513 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 514 => static function ($self, $stackPos) { + $self->semValue = new Node\ClosureUse($self->semStack[$stackPos - (2 - 2)], $self->semStack[$stackPos - (2 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 515 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 516 => static function ($self, $stackPos) { + $self->semValue = new Expr\FuncCall($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 517 => static function ($self, $stackPos) { + $self->semValue = new Expr\FuncCall($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 518 => static function ($self, $stackPos) { + $self->semValue = new Expr\FuncCall($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 519 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticCall($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 520 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 521 => null, 522 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 523 => static function ($self, $stackPos) { + $self->semValue = new Name($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 524 => static function ($self, $stackPos) { + $self->semValue = new Name\FullyQualified(\substr($self->semStack[$stackPos - (1 - 1)], 1), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 525 => static function ($self, $stackPos) { + $self->semValue = new Name\Relative(\substr($self->semStack[$stackPos - (1 - 1)], 10), $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 526 => null, 527 => null, 528 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 529 => static function ($self, $stackPos) { + $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 530 => null, 531 => null, 532 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 533 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + foreach ($self->semValue as $s) { + if ($s instanceof Node\InterpolatedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); + } + } + }, 534 => static function ($self, $stackPos) { + foreach ($self->semStack[$stackPos - (1 - 1)] as $s) { + if ($s instanceof Node\InterpolatedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', $self->phpVersion->supportsUnicodeEscapes()); + } + } + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + }, 535 => static function ($self, $stackPos) { + $self->semValue = array(); + }, 536 => null, 537 => static function ($self, $stackPos) { + $self->semValue = new Expr\ConstFetch($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 538 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Line($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 539 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\File($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 540 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Dir($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 541 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Class_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 542 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Trait_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 543 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Method($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 544 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Function_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 545 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Namespace_($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 546 => static function ($self, $stackPos) { + $self->semValue = new Scalar\MagicConst\Property($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 547 => static function ($self, $stackPos) { + $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 548 => static function ($self, $stackPos) { + $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos - (5 - 1)], $self->semStack[$stackPos - (5 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (5 - 1)], $self->tokenEndStack[$stackPos])); + }, 549 => static function ($self, $stackPos) { + $self->semValue = new Expr\ClassConstFetch($self->semStack[$stackPos - (3 - 1)], new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (3 - 3)], $self->tokenEndStack[$stackPos - (3 - 3)])), $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 550 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]); + $attrs['kind'] = Expr\Array_::KIND_SHORT; + $self->semValue = new Expr\Array_($self->semStack[$stackPos - (3 - 2)], $attrs); + }, 551 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos]); + $attrs['kind'] = Expr\Array_::KIND_LONG; + $self->semValue = new Expr\Array_($self->semStack[$stackPos - (4 - 3)], $attrs); + $self->createdArrays->attach($self->semValue); + }, 552 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + $self->createdArrays->attach($self->semValue); + }, 553 => static function ($self, $stackPos) { + $self->semValue = Scalar\String_::fromString($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->supportsUnicodeEscapes()); + }, 554 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]); + $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($self->semStack[$stackPos - (3 - 2)] as $s) { + if ($s instanceof Node\InterpolatedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', $self->phpVersion->supportsUnicodeEscapes()); + } + } + $self->semValue = new Scalar\InterpolatedString($self->semStack[$stackPos - (3 - 2)], $attrs); + }, 555 => static function ($self, $stackPos) { + $self->semValue = $self->parseLNumber($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]), $self->phpVersion->allowsInvalidOctals()); + }, 556 => static function ($self, $stackPos) { + $self->semValue = Scalar\Float_::fromString($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 557 => null, 558 => null, 559 => null, 560 => static function ($self, $stackPos) { + $self->semValue = $self->parseDocString($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 3)], $self->tokenEndStack[$stackPos - (3 - 3)]), \true); + }, 561 => static function ($self, $stackPos) { + $self->semValue = $self->parseDocString($self->semStack[$stackPos - (2 - 1)], '', $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 2)], $self->tokenEndStack[$stackPos - (2 - 2)]), \true); + }, 562 => static function ($self, $stackPos) { + $self->semValue = $self->parseDocString($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 2)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos]), $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 3)], $self->tokenEndStack[$stackPos - (3 - 3)]), \true); + }, 563 => static function ($self, $stackPos) { + $self->semValue = null; + }, 564 => null, 565 => null, 566 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 567 => null, 568 => null, 569 => null, 570 => null, 571 => null, 572 => null, 573 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 574 => null, 575 => null, 576 => null, 577 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 578 => null, 579 => static function ($self, $stackPos) { + $self->semValue = new Expr\MethodCall($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 580 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafeMethodCall($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->semStack[$stackPos - (4 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 581 => static function ($self, $stackPos) { + $self->semValue = null; + }, 582 => null, 583 => null, 584 => null, 585 => static function ($self, $stackPos) { + $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 586 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 587 => null, 588 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 589 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 590 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable(new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])), $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 591 => static function ($self, $stackPos) { + $var = $self->semStack[$stackPos - (1 - 1)]->name; + $self->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])) : $var; + }, 592 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 593 => null, 594 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 595 => static function ($self, $stackPos) { + $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 596 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 597 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 598 => static function ($self, $stackPos) { + $self->semValue = new Expr\StaticPropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 599 => null, 600 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 601 => null, 602 => null, 603 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 604 => null, 605 => static function ($self, $stackPos) { + $self->semValue = new Expr\Error($self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + $self->errorState = 2; + }, 606 => static function ($self, $stackPos) { + $self->semValue = new Expr\List_($self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + $self->semValue->setAttribute('kind', Expr\List_::KIND_LIST); + $self->postprocessList($self->semValue); + }, 607 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (1 - 1)]; + $end = \count($self->semValue) - 1; + if ($self->semValue[$end]->value instanceof Expr\Error) { + \array_pop($self->semValue); + } + }, 608 => null, 609 => static function ($self, $stackPos) { + /* do nothing -- prevent default action of $$=$self->semStack[$1]. See $551. */ + }, 610 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (3 - 1)][] = $self->semStack[$stackPos - (3 - 3)]; + $self->semValue = $self->semStack[$stackPos - (3 - 1)]; + }, 611 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 612 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (1 - 1)], null, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 613 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (2 - 2)], null, \true, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 614 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (1 - 1)], null, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 615 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (3 - 3)], $self->semStack[$stackPos - (3 - 1)], \false, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 616 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (4 - 4)], $self->semStack[$stackPos - (4 - 1)], \true, $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 617 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (3 - 3)], $self->semStack[$stackPos - (3 - 1)], \false, $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 618 => static function ($self, $stackPos) { + $self->semValue = new Node\ArrayItem($self->semStack[$stackPos - (2 - 2)], null, \false, $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos]), \true); + }, 619 => static function ($self, $stackPos) { + /* Create an Error node now to remember the position. We'll later either report an error, + or convert this into a null element, depending on whether this is a creation or destructuring context. */ + $attrs = $self->createEmptyElemAttributes($self->tokenPos); + $self->semValue = new Node\ArrayItem(new Expr\Error($attrs), null, \false, $attrs); + }, 620 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 621 => static function ($self, $stackPos) { + $self->semStack[$stackPos - (2 - 1)][] = $self->semStack[$stackPos - (2 - 2)]; + $self->semValue = $self->semStack[$stackPos - (2 - 1)]; + }, 622 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (1 - 1)]); + }, 623 => static function ($self, $stackPos) { + $self->semValue = array($self->semStack[$stackPos - (2 - 1)], $self->semStack[$stackPos - (2 - 2)]); + }, 624 => static function ($self, $stackPos) { + $attrs = $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos]); + $attrs['rawValue'] = $self->semStack[$stackPos - (1 - 1)]; + $self->semValue = new Node\InterpolatedStringPart($self->semStack[$stackPos - (1 - 1)], $attrs); + }, 625 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 626 => null, 627 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (4 - 1)], $self->semStack[$stackPos - (4 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (4 - 1)], $self->tokenEndStack[$stackPos])); + }, 628 => static function ($self, $stackPos) { + $self->semValue = new Expr\PropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 629 => static function ($self, $stackPos) { + $self->semValue = new Expr\NullsafePropertyFetch($self->semStack[$stackPos - (3 - 1)], $self->semStack[$stackPos - (3 - 3)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 630 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 631 => static function ($self, $stackPos) { + $self->semValue = new Expr\Variable($self->semStack[$stackPos - (3 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (3 - 1)], $self->tokenEndStack[$stackPos])); + }, 632 => static function ($self, $stackPos) { + $self->semValue = new Expr\ArrayDimFetch($self->semStack[$stackPos - (6 - 2)], $self->semStack[$stackPos - (6 - 4)], $self->getAttributes($self->tokenStartStack[$stackPos - (6 - 1)], $self->tokenEndStack[$stackPos])); + }, 633 => static function ($self, $stackPos) { + $self->semValue = $self->semStack[$stackPos - (3 - 2)]; + }, 634 => static function ($self, $stackPos) { + $self->semValue = new Scalar\String_($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 635 => static function ($self, $stackPos) { + $self->semValue = $self->parseNumString($self->semStack[$stackPos - (1 - 1)], $self->getAttributes($self->tokenStartStack[$stackPos - (1 - 1)], $self->tokenEndStack[$stackPos])); + }, 636 => static function ($self, $stackPos) { + $self->semValue = $self->parseNumString('-' . $self->semStack[$stackPos - (2 - 2)], $self->getAttributes($self->tokenStartStack[$stackPos - (2 - 1)], $self->tokenEndStack[$stackPos])); + }, 637 => null]; + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php deleted file mode 100644 index b76a5d94c..000000000 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php +++ /dev/null @@ -1,148 +0,0 @@ - Map of PHP token IDs to drop */ + protected array $dropTokens; + /** @var int[] Map of external symbols (static::T_*) to internal symbols */ + protected array $tokenToSymbol; /** @var string[] Map of symbols to their names */ - protected $symbolToName; - /** @var array Names of the production rules (only necessary for debugging) */ - protected $productions; + protected array $symbolToName; + /** @var array Names of the production rules (only necessary for debugging) */ + protected array $productions; /** @var int[] Map of states to a displacement into the $action table. The corresponding action for this * state/symbol pair is $action[$actionBase[$state] + $symbol]. If $actionBase[$state] is 0, the * action is defaulted, i.e. $actionDefault[$state] should be used instead. */ - protected $actionBase; + protected array $actionBase; /** @var int[] Table of actions. Indexed according to $actionBase comment. */ - protected $action; + protected array $action; /** @var int[] Table indexed analogously to $action. If $actionCheck[$actionBase[$state] + $symbol] != $symbol * then the action is defaulted, i.e. $actionDefault[$state] should be used instead. */ - protected $actionCheck; + protected array $actionCheck; /** @var int[] Map of states to their default action */ - protected $actionDefault; + protected array $actionDefault; /** @var callable[] Semantic action callbacks */ - protected $reduceCallbacks; + protected array $reduceCallbacks; /** @var int[] Map of non-terminals to a displacement into the $goto table. The corresponding goto state for this * non-terminal/state pair is $goto[$gotoBase[$nonTerminal] + $state] (unless defaulted) */ - protected $gotoBase; + protected array $gotoBase; /** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. */ - protected $goto; + protected array $goto; /** @var int[] Table indexed analogously to $goto. If $gotoCheck[$gotoBase[$nonTerminal] + $state] != $nonTerminal * then the goto state is defaulted, i.e. $gotoDefault[$nonTerminal] should be used. */ - protected $gotoCheck; + protected array $gotoCheck; /** @var int[] Map of non-terminals to the default state to goto after their reduction */ - protected $gotoDefault; + protected array $gotoDefault; /** @var int[] Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for * determining the state to goto after reduction. */ - protected $ruleToNonTerminal; + protected array $ruleToNonTerminal; /** @var int[] Map of rules to the length of their right-hand side, which is the number of elements that have to * be popped from the stack(s) on reduction. */ - protected $ruleToLength; + protected array $ruleToLength; /* * The following members are part of the parser state: */ - /** @var Lexer Lexer that is used when parsing */ - protected $lexer; /** @var mixed Temporary value containing the result of last semantic action (reduction) */ protected $semValue; - /** @var array Semantic value stack (contains values of tokens and semantic action results) */ - protected $semStack; - /** @var array[] Start attribute stack */ - protected $startAttributeStack; - /** @var array[] End attribute stack */ - protected $endAttributeStack; - /** @var array End attributes of last *shifted* token */ - protected $endAttributes; - /** @var array Start attributes of last *read* token */ - protected $lookaheadStartAttributes; + /** @var mixed[] Semantic value stack (contains values of tokens and semantic action results) */ + protected array $semStack; + /** @var int[] Token start position stack */ + protected array $tokenStartStack; + /** @var int[] Token end position stack */ + protected array $tokenEndStack; /** @var ErrorHandler Error handler */ - protected $errorHandler; + protected \PhpParser\ErrorHandler $errorHandler; /** @var int Error state, used to avoid error floods */ - protected $errorState; + protected int $errorState; + /** @var \SplObjectStorage|null Array nodes created during parsing, for postprocessing of empty elements. */ + protected ?\SplObjectStorage $createdArrays; + /** @var Token[] Tokens for the current parse */ + protected array $tokens; + /** @var int Current position in token array */ + protected int $tokenPos; /** * Initialize $reduceCallbacks map. */ - protected abstract function initReduceCallbacks(); + protected abstract function initReduceCallbacks() : void; /** * Creates a parser instance. * - * Options: Currently none. + * Options: + * * phpVersion: ?PhpVersion, * * @param Lexer $lexer A lexer - * @param array $options Options array. + * @param PhpVersion $phpVersion PHP version to target, defaults to latest supported. This + * option is best-effort: Even if specified, parsing will generally assume the latest + * supported version and only adjust behavior in minor ways, for example by omitting + * errors in older versions and interpreting type hints as a name or identifier depending + * on version. */ - public function __construct(\PhpParser\Lexer $lexer, array $options = []) + public function __construct(\PhpParser\Lexer $lexer, ?\PhpParser\PhpVersion $phpVersion = null) { $this->lexer = $lexer; - if (isset($options['throwOnError'])) { - throw new \LogicException('"throwOnError" is no longer supported, use "errorHandler" instead'); - } + $this->phpVersion = $phpVersion ?? \PhpParser\PhpVersion::getNewestSupported(); $this->initReduceCallbacks(); + $this->phpTokenToSymbol = $this->createTokenMap(); + $this->dropTokens = \array_fill_keys([\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], \true); } /** * Parses PHP code into a node tree. @@ -139,32 +160,49 @@ public function __construct(\PhpParser\Lexer $lexer, array $options = []) * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and * the parser was unable to recover from an error). */ - public function parse(string $code, ?\PhpParser\ErrorHandler $errorHandler = null) + public function parse(string $code, ?\PhpParser\ErrorHandler $errorHandler = null) : ?array { $this->errorHandler = $errorHandler ?: new \PhpParser\ErrorHandler\Throwing(); - $this->lexer->startLexing($code, $this->errorHandler); + $this->createdArrays = new \SplObjectStorage(); + $this->tokens = $this->lexer->tokenize($code, $this->errorHandler); $result = $this->doParse(); + // Report errors for any empty elements used inside arrays. This is delayed until after the main parse, + // because we don't know a priori whether a given array expression will be used in a destructuring context + // or not. + foreach ($this->createdArrays as $node) { + foreach ($node->items as $item) { + if ($item->value instanceof Expr\Error) { + $this->errorHandler->handleError(new \PhpParser\Error('Cannot use empty array elements in arrays', $item->getAttributes())); + } + } + } // Clear out some of the interior state, so we don't hold onto unnecessary // memory between uses of the parser - $this->startAttributeStack = []; - $this->endAttributeStack = []; + $this->tokenStartStack = []; + $this->tokenEndStack = []; $this->semStack = []; $this->semValue = null; + $this->createdArrays = null; + if ($result !== null) { + $traverser = new \PhpParser\NodeTraverser(new CommentAnnotatingVisitor($this->tokens)); + $traverser->traverse($result); + } return $result; } - protected function doParse() + public function getTokens() : array + { + return $this->tokens; + } + /** @return Stmt[]|null */ + protected function doParse() : ?array { // We start off with no lookahead-token $symbol = self::SYMBOL_NONE; - // The attributes for a node are taken from the first and last token of the node. - // From the first token only the startAttributes are taken and from the last only - // the endAttributes. Both are merged using the array union operator (+). - $startAttributes = []; - $endAttributes = []; - $this->endAttributes = $endAttributes; + $tokenValue = null; + $this->tokenPos = -1; // Keep stack of start and end attributes - $this->startAttributeStack = []; - $this->endAttributeStack = [$endAttributes]; + $this->tokenStartStack = []; + $this->tokenEndStack = [0]; // Start off in the initial state and keep a stack of previous states $state = 0; $stateStack = [$state]; @@ -179,18 +217,16 @@ protected function doParse() $rule = $this->actionDefault[$state]; } else { if ($symbol === self::SYMBOL_NONE) { - // Fetch the next token id from the lexer and fetch additional info by-ref. - // The end attributes are fetched into a temporary variable and only set once the token is really - // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is - // reduced after a token was read but not yet shifted. - $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); - // map the lexer token id to the internally used symbols - $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize ? $this->tokenToSymbol[$tokenId] : $this->invalidSymbol; - if ($symbol === $this->invalidSymbol) { + do { + $token = $this->tokens[++$this->tokenPos]; + $tokenId = $token->id; + } while (isset($this->dropTokens[$tokenId])); + // Map the lexer token id to the internally used symbols. + $tokenValue = $token->text; + if (!isset($this->phpTokenToSymbol[$tokenId])) { throw new \RangeException(\sprintf('The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue)); } - // Allow productions to access the start attributes of the lookahead token. - $this->lookaheadStartAttributes = $startAttributes; + $symbol = $this->phpTokenToSymbol[$tokenId]; //$this->traceRead($symbol); } $idx = $this->actionBase[$state] + $symbol; @@ -208,9 +244,8 @@ protected function doParse() ++$stackPos; $stateStack[$stackPos] = $state = $action; $this->semStack[$stackPos] = $tokenValue; - $this->startAttributeStack[$stackPos] = $startAttributes; - $this->endAttributeStack[$stackPos] = $endAttributes; - $this->endAttributes = $endAttributes; + $this->tokenStartStack[$stackPos] = $this->tokenPos; + $this->tokenEndStack[$stackPos] = $this->tokenPos; $symbol = self::SYMBOL_NONE; if ($this->errorState) { --$this->errorState; @@ -232,22 +267,28 @@ protected function doParse() /* accept */ //$this->traceAccept(); return $this->semValue; - } elseif ($rule !== $this->unexpectedTokenRule) { + } + if ($rule !== $this->unexpectedTokenRule) { /* reduce */ //$this->traceReduce($rule); + $ruleLength = $this->ruleToLength[$rule]; try { - $this->reduceCallbacks[$rule]($stackPos); + $callback = $this->reduceCallbacks[$rule]; + if ($callback !== null) { + $callback($this, $stackPos); + } elseif ($ruleLength > 0) { + $this->semValue = $this->semStack[$stackPos - $ruleLength + 1]; + } } catch (\PhpParser\Error $e) { - if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { - $e->setStartLine($startAttributes['startLine']); + if (-1 === $e->getStartLine()) { + $e->setStartLine($this->tokens[$this->tokenPos]->line); } $this->emitError($e); // Can't recover from this type of error return null; } /* Goto - shift nonterminal */ - $lastEndAttributes = $this->endAttributeStack[$stackPos]; - $ruleLength = $this->ruleToLength[$rule]; + $lastTokenEnd = $this->tokenEndStack[$stackPos]; $stackPos -= $ruleLength; $nonTerminal = $this->ruleToNonTerminal[$rule]; $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; @@ -259,18 +300,19 @@ protected function doParse() ++$stackPos; $stateStack[$stackPos] = $state; $this->semStack[$stackPos] = $this->semValue; - $this->endAttributeStack[$stackPos] = $lastEndAttributes; + $this->tokenEndStack[$stackPos] = $lastTokenEnd; if ($ruleLength === 0) { // Empty productions use the start attributes of the lookahead token. - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; + $this->tokenStartStack[$stackPos] = $this->tokenPos; } } else { /* error */ switch ($this->errorState) { case 0: $msg = $this->getErrorMessage($symbol, $state); - $this->emitError(new \PhpParser\Error($msg, $startAttributes + $endAttributes)); + $this->emitError(new \PhpParser\Error($msg, $this->getAttributesForToken($this->tokenPos))); // Break missing intentionally + // no break case 1: case 2: $this->errorState = 3; @@ -289,9 +331,8 @@ protected function doParse() $stateStack[$stackPos] = $state = $action; // We treat the error symbol as being empty, so we reset the end attributes // to the end attributes of the last non-error symbol - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; - $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; + $this->tokenStartStack[$stackPos] = $this->tokenPos; + $this->tokenEndStack[$stackPos] = $this->tokenEndStack[$stackPos - 1]; break; case 3: if ($symbol === 0) { @@ -310,9 +351,8 @@ protected function doParse() $rule = $state - $this->numNonLeafStates; } } - throw new \RuntimeException('Reached end of parser loop'); } - protected function emitError(\PhpParser\Error $error) + protected function emitError(\PhpParser\Error $error) : void { $this->errorHandler->handleError($error); } @@ -320,7 +360,7 @@ protected function emitError(\PhpParser\Error $error) * Format error message including expected tokens. * * @param int $symbol Unexpected symbol - * @param int $state State at time of error + * @param int $state State at time of error * * @return string Formatted error message */ @@ -357,36 +397,63 @@ protected function getExpectedTokens(int $state) : array } return $expected; } + /** + * Get attributes for a node with the given start and end token positions. + * + * @param int $tokenStartPos Token position the node starts at + * @param int $tokenEndPos Token position the node ends at + * @return array Attributes + */ + protected function getAttributes(int $tokenStartPos, int $tokenEndPos) : array + { + $startToken = $this->tokens[$tokenStartPos]; + $afterEndToken = $this->tokens[$tokenEndPos + 1]; + return ['startLine' => $startToken->line, 'startTokenPos' => $tokenStartPos, 'startFilePos' => $startToken->pos, 'endLine' => $afterEndToken->line, 'endTokenPos' => $tokenEndPos, 'endFilePos' => $afterEndToken->pos - 1]; + } + /** + * Get attributes for a single token at the given token position. + * + * @return array Attributes + */ + protected function getAttributesForToken(int $tokenPos) : array + { + if ($tokenPos < \count($this->tokens) - 1) { + return $this->getAttributes($tokenPos, $tokenPos); + } + // Get attributes for the sentinel token. + $token = $this->tokens[$tokenPos]; + return ['startLine' => $token->line, 'startTokenPos' => $tokenPos, 'startFilePos' => $token->pos, 'endLine' => $token->line, 'endTokenPos' => $tokenPos, 'endFilePos' => $token->pos]; + } /* * Tracing functions used for debugging the parser. */ /* - protected function traceNewState($state, $symbol) { + protected function traceNewState($state, $symbol): void { echo '% State ' . $state . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; } - protected function traceRead($symbol) { + protected function traceRead($symbol): void { echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; } - protected function traceShift($symbol) { + protected function traceShift($symbol): void { echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; } - protected function traceAccept() { + protected function traceAccept(): void { echo "% Accepted.\n"; } - protected function traceReduce($n) { + protected function traceReduce($n): void { echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; } - protected function tracePop($state) { + protected function tracePop($state): void { echo '% Recovering, uncovered state ' . $state . "\n"; } - protected function traceDiscard($symbol) { + protected function traceDiscard($symbol): void { echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; } */ @@ -406,7 +473,8 @@ protected function handleNamespaces(array $stmts) : array if (null === $style) { // not namespaced, nothing to do return $stmts; - } elseif ('brace' === $style) { + } + if ('brace' === $style) { // For braced namespaces we only have to check that there are no invalid statements between the namespaces $afterFirstNamespace = \false; foreach ($stmts as $stmt) { @@ -452,7 +520,7 @@ protected function handleNamespaces(array $stmts) : array return $resultStmts; } } - private function fixupNamespaceAttributes(\PhpParser\Node\Stmt\Namespace_ $stmt) + private function fixupNamespaceAttributes(\PhpParser\Node\Stmt\Namespace_ $stmt) : void { // We moved the statements into the namespace node, as such the end of the namespace node // needs to be extended to the end of the statements. @@ -469,6 +537,22 @@ private function fixupNamespaceAttributes(\PhpParser\Node\Stmt\Namespace_ $stmt) } } } + /** @return array */ + private function getNamespaceErrorAttributes(Namespace_ $node) : array + { + $attrs = $node->getAttributes(); + // Adjust end attributes to only cover the "namespace" keyword, not the whole namespace. + if (isset($attrs['startLine'])) { + $attrs['endLine'] = $attrs['startLine']; + } + if (isset($attrs['startTokenPos'])) { + $attrs['endTokenPos'] = $attrs['startTokenPos']; + } + if (isset($attrs['startFilePos'])) { + $attrs['endFilePos'] = $attrs['startFilePos'] + \strlen('namespace') - 1; + } + return $attrs; + } /** * Determine namespacing style (semicolon or brace) * @@ -476,7 +560,7 @@ private function fixupNamespaceAttributes(\PhpParser\Node\Stmt\Namespace_ $stmt) * * @return null|string One of "semicolon", "brace" or null (no namespaces) */ - private function getNamespacingStyle(array $stmts) + private function getNamespacingStyle(array $stmts) : ?string { $style = null; $hasNotAllowedStmts = \false; @@ -486,10 +570,10 @@ private function getNamespacingStyle(array $stmts) if (null === $style) { $style = $currentStyle; if ($hasNotAllowedStmts) { - $this->emitError(new \PhpParser\Error('Namespace declaration statement has to be the very first statement in the script', $stmt->getLine())); + $this->emitError(new \PhpParser\Error('Namespace declaration statement has to be the very first statement in the script', $this->getNamespaceErrorAttributes($stmt))); } } elseif ($style !== $currentStyle) { - $this->emitError(new \PhpParser\Error('Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $stmt->getLine())); + $this->emitError(new \PhpParser\Error('Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $this->getNamespaceErrorAttributes($stmt))); // Treat like semicolon style for namespace normalization return 'semicolon'; } @@ -508,64 +592,14 @@ private function getNamespacingStyle(array $stmts) } return $style; } - /** - * Fix up parsing of static property calls in PHP 5. - * - * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is - * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the - * latter as the former initially and this method fixes the AST into the correct form when we - * encounter the "()". - * - * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop - * @param Node\Arg[] $args - * @param array $attributes - * - * @return Expr\StaticCall - */ - protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall - { - if ($prop instanceof \PhpParser\Node\Expr\StaticPropertyFetch) { - $name = $prop->name instanceof VarLikeIdentifier ? $prop->name->toString() : $prop->name; - $var = new Expr\Variable($name, $prop->name->getAttributes()); - return new Expr\StaticCall($prop->class, $var, $args, $attributes); - } elseif ($prop instanceof \PhpParser\Node\Expr\ArrayDimFetch) { - $tmp = $prop; - while ($tmp->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - } - /** @var Expr\StaticPropertyFetch $staticProp */ - $staticProp = $tmp->var; - // Set start attributes to attributes of innermost node - $tmp = $prop; - $this->fixupStartAttributes($tmp, $staticProp->name); - while ($tmp->var instanceof \PhpParser\Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - $this->fixupStartAttributes($tmp, $staticProp->name); - } - $name = $staticProp->name instanceof VarLikeIdentifier ? $staticProp->name->toString() : $staticProp->name; - $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); - return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); - } else { - throw new \Exception(); - } - } - protected function fixupStartAttributes(\PhpParser\Node $to, \PhpParser\Node $from) - { - $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; - foreach ($startAttributes as $startAttribute) { - if ($from->hasAttribute($startAttribute)) { - $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); - } - } - } + /** @return Name|Identifier */ protected function handleBuiltinTypes(Name $name) { - $builtinTypes = ['bool' => \true, 'int' => \true, 'float' => \true, 'string' => \true, 'iterable' => \true, 'void' => \true, 'object' => \true, 'null' => \true, 'false' => \true, 'mixed' => \true, 'never' => \true, 'true' => \true]; if (!$name->isUnqualified()) { return $name; } $lowerName = $name->toLowerString(); - if (!isset($builtinTypes[$lowerName])) { + if (!$this->phpVersion->supportsBuiltinType($lowerName)) { return $name; } return new \PhpParser\Node\Identifier($lowerName, $name->getAttributes()); @@ -573,13 +607,13 @@ protected function handleBuiltinTypes(Name $name) /** * Get combined start and end attributes at a stack location * - * @param int $pos Stack location + * @param int $stackPos Stack location * - * @return array Combined start and end attributes + * @return array Combined start and end attributes */ - protected function getAttributesAt(int $pos) : array + protected function getAttributesAt(int $stackPos) : array { - return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; + return $this->getAttributes($this->tokenStartStack[$stackPos], $this->tokenEndStack[$stackPos]); } protected function getFloatCastKind(string $cast) : int { @@ -592,23 +626,24 @@ protected function getFloatCastKind(string $cast) : int } return Double::KIND_DOUBLE; } - protected function parseLNumber($str, $attributes, $allowInvalidOctal = \false) + /** @param array $attributes */ + protected function parseLNumber(string $str, array $attributes, bool $allowInvalidOctal = \false) : Int_ { try { - return LNumber::fromString($str, $attributes, $allowInvalidOctal); + return Int_::fromString($str, $attributes, $allowInvalidOctal); } catch (\PhpParser\Error $error) { $this->emitError($error); // Use dummy value - return new LNumber(0, $attributes); + return new Int_(0, $attributes); } } /** * Parse a T_NUM_STRING token into either an integer or string node. * - * @param string $str Number string - * @param array $attributes Attributes + * @param string $str Number string + * @param array $attributes Attributes * - * @return LNumber|String_ Integer or string node. + * @return Int_|String_ Integer or string node. */ protected function parseNumString(string $str, array $attributes) { @@ -619,9 +654,10 @@ protected function parseNumString(string $str, array $attributes) if (!\is_int($num)) { return new String_($str, $attributes); } - return new LNumber($num, $attributes); + return new Int_($num, $attributes); } - protected function stripIndentation(string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes) + /** @param array $attributes */ + protected function stripIndentation(string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes) : string { if ($indentLen === 0) { return $string; @@ -639,7 +675,12 @@ protected function stripIndentation(string $string, int $indentLen, string $inde return \substr($matches[0], \strlen($prefix)); }, $string); } - protected function parseDocString(string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape) + /** + * @param string|(Expr|InterpolatedStringPart)[] $contents + * @param array $attributes + * @param array $endTokenAttributes + */ + protected function parseDocString(string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape) : Expr { $kind = \strpos($startToken, "'") === \false ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; $regex = '/\\A[bB]?<<<[ \\t]*[\'"]?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)[\'"]?(?:\\r\\n|\\n|\\r)\\z/'; @@ -663,67 +704,136 @@ protected function parseDocString(string $startToken, $contents, string $endToke $indentChar = $indentHasSpaces ? " " : "\t"; if (\is_string($contents)) { if ($contents === '') { + $attributes['rawValue'] = $contents; return new String_('', $attributes); } $contents = $this->stripIndentation($contents, $indentLen, $indentChar, \true, \true, $attributes); $contents = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $contents); + $attributes['rawValue'] = $contents; if ($kind === String_::KIND_HEREDOC) { $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); } return new String_($contents, $attributes); } else { \assert(\count($contents) > 0); - if (!$contents[0] instanceof \PhpParser\Node\Scalar\EncapsedStringPart) { + if (!$contents[0] instanceof \PhpParser\Node\InterpolatedStringPart) { // If there is no leading encapsed string part, pretend there is an empty one $this->stripIndentation('', $indentLen, $indentChar, \true, \false, $contents[0]->getAttributes()); } $newContents = []; foreach ($contents as $i => $part) { - if ($part instanceof \PhpParser\Node\Scalar\EncapsedStringPart) { + if ($part instanceof \PhpParser\Node\InterpolatedStringPart) { $isLast = $i === \count($contents) - 1; $part->value = $this->stripIndentation($part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes()); - $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); if ($isLast) { $part->value = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $part->value); } + $part->setAttribute('rawValue', $part->value); + $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); if ('' === $part->value) { continue; } } $newContents[] = $part; } - return new Encapsed($newContents, $attributes); + return new InterpolatedString($newContents, $attributes); } } + protected function createCommentFromToken(\PhpParser\Token $token, int $tokenPos) : \PhpParser\Comment + { + \assert($token->id === \T_COMMENT || $token->id == \T_DOC_COMMENT); + return \T_DOC_COMMENT === $token->id ? new \PhpParser\Comment\Doc($token->text, $token->line, $token->pos, $tokenPos, $token->getEndLine(), $token->getEndPos() - 1, $tokenPos) : new \PhpParser\Comment($token->text, $token->line, $token->pos, $tokenPos, $token->getEndLine(), $token->getEndPos() - 1, $tokenPos); + } /** - * Create attributes for a zero-length common-capturing nop. - * - * @param Comment[] $comments - * @return array + * Get last comment before the given token position, if any */ - protected function createCommentNopAttributes(array $comments) + protected function getCommentBeforeToken(int $tokenPos) : ?\PhpParser\Comment { - $comment = $comments[\count($comments) - 1]; + while (--$tokenPos >= 0) { + $token = $this->tokens[$tokenPos]; + if (!isset($this->dropTokens[$token->id])) { + break; + } + if ($token->id === \T_COMMENT || $token->id === \T_DOC_COMMENT) { + return $this->createCommentFromToken($token, $tokenPos); + } + } + return null; + } + /** + * Create a zero-length nop to capture preceding comments, if any. + */ + protected function maybeCreateZeroLengthNop(int $tokenPos) : ?Nop + { + $comment = $this->getCommentBeforeToken($tokenPos); + if ($comment === null) { + return null; + } $commentEndLine = $comment->getEndLine(); $commentEndFilePos = $comment->getEndFilePos(); $commentEndTokenPos = $comment->getEndTokenPos(); - $attributes = ['comments' => $comments]; - if (-1 !== $commentEndLine) { - $attributes['startLine'] = $commentEndLine; - $attributes['endLine'] = $commentEndLine; + $attributes = ['startLine' => $commentEndLine, 'endLine' => $commentEndLine, 'startFilePos' => $commentEndFilePos + 1, 'endFilePos' => $commentEndFilePos, 'startTokenPos' => $commentEndTokenPos + 1, 'endTokenPos' => $commentEndTokenPos]; + return new Nop($attributes); + } + protected function maybeCreateNop(int $tokenStartPos, int $tokenEndPos) : ?Nop + { + if ($this->getCommentBeforeToken($tokenStartPos) === null) { + return null; } - if (-1 !== $commentEndFilePos) { - $attributes['startFilePos'] = $commentEndFilePos + 1; - $attributes['endFilePos'] = $commentEndFilePos; + return new Nop($this->getAttributes($tokenStartPos, $tokenEndPos)); + } + protected function handleHaltCompiler() : string + { + // Prevent the lexer from returning any further tokens. + $nextToken = $this->tokens[$this->tokenPos + 1]; + $this->tokenPos = \count($this->tokens) - 2; + // Return text after __halt_compiler. + return $nextToken->id === \T_INLINE_HTML ? $nextToken->text : ''; + } + protected function inlineHtmlHasLeadingNewline(int $stackPos) : bool + { + $tokenPos = $this->tokenStartStack[$stackPos]; + $token = $this->tokens[$tokenPos]; + \assert($token->id == \T_INLINE_HTML); + if ($tokenPos > 0) { + $prevToken = $this->tokens[$tokenPos - 1]; + \assert($prevToken->id == \T_CLOSE_TAG); + return \false !== \strpos($prevToken->text, "\n") || \false !== \strpos($prevToken->text, "\r"); } - if (-1 !== $commentEndTokenPos) { - $attributes['startTokenPos'] = $commentEndTokenPos + 1; - $attributes['endTokenPos'] = $commentEndTokenPos; + return \true; + } + /** + * @return array + */ + protected function createEmptyElemAttributes(int $tokenPos) : array + { + return $this->getAttributesForToken($tokenPos); + } + protected function fixupArrayDestructuring(Array_ $node) : Expr\List_ + { + $this->createdArrays->detach($node); + return new Expr\List_(\array_map(function (\PhpParser\Node\ArrayItem $item) { + if ($item->value instanceof Expr\Error) { + // We used Error as a placeholder for empty elements, which are legal for destructuring. + return null; + } + if ($item->value instanceof Array_) { + return new \PhpParser\Node\ArrayItem($this->fixupArrayDestructuring($item->value), $item->key, $item->byRef, $item->getAttributes()); + } + return $item; + }, $node->items), ['kind' => Expr\List_::KIND_ARRAY] + $node->getAttributes()); + } + protected function postprocessList(Expr\List_ $node) : void + { + foreach ($node->items as $i => $item) { + if ($item->value instanceof Expr\Error) { + // We used Error as a placeholder for empty elements, which are legal for destructuring. + $node->items[$i] = null; + } } - return $attributes; } /** @param ElseIf_|Else_ $node */ - protected function fixupAlternativeElse($node) + protected function fixupAlternativeElse($node) : void { // Make sure a trailing nop statement carrying comments is part of the node. $numStmts = \count($node->stmts); @@ -740,38 +850,38 @@ protected function fixupAlternativeElse($node) } } } - protected function checkClassModifier($a, $b, $modifierPos) + protected function checkClassModifier(int $a, int $b, int $modifierPos) : void { try { - Class_::verifyClassModifier($a, $b); + \PhpParser\Modifiers::verifyClassModifier($a, $b); } catch (\PhpParser\Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } - protected function checkModifier($a, $b, $modifierPos) + protected function checkModifier(int $a, int $b, int $modifierPos) : void { // Jumping through some hoops here because verifyModifier() is also used elsewhere try { - Class_::verifyModifier($a, $b); + \PhpParser\Modifiers::verifyModifier($a, $b); } catch (\PhpParser\Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } - protected function checkParam(Param $node) + protected function checkParam(Param $node) : void { if ($node->variadic && null !== $node->default) { $this->emitError(new \PhpParser\Error('Variadic parameter cannot have a default value', $node->default->getAttributes())); } } - protected function checkTryCatch(TryCatch $node) + protected function checkTryCatch(TryCatch $node) : void { if (empty($node->catches) && null === $node->finally) { $this->emitError(new \PhpParser\Error('Cannot use try without catch or finally', $node->getAttributes())); } } - protected function checkNamespace(Namespace_ $node) + protected function checkNamespace(Namespace_ $node) : void { if (null !== $node->stmts) { foreach ($node->stmts as $stmt) { @@ -781,13 +891,14 @@ protected function checkNamespace(Namespace_ $node) } } } - private function checkClassName($name, $namePos) + private function checkClassName(?Identifier $name, int $namePos) : void { if (null !== $name && $name->isSpecialClassName()) { $this->emitError(new \PhpParser\Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $name), $this->getAttributesAt($namePos))); } } - private function checkImplementedInterfaces(array $interfaces) + /** @param Name[] $interfaces */ + private function checkImplementedInterfaces(array $interfaces) : void { foreach ($interfaces as $interface) { if ($interface->isSpecialClassName()) { @@ -795,7 +906,7 @@ private function checkImplementedInterfaces(array $interfaces) } } } - protected function checkClass(Class_ $node, $namePos) + protected function checkClass(Class_ $node, int $namePos) : void { $this->checkClassName($node->name, $namePos); if ($node->extends && $node->extends->isSpecialClassName()) { @@ -803,19 +914,19 @@ protected function checkClass(Class_ $node, $namePos) } $this->checkImplementedInterfaces($node->implements); } - protected function checkInterface(Interface_ $node, $namePos) + protected function checkInterface(Interface_ $node, int $namePos) : void { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->extends); } - protected function checkEnum(Enum_ $node, $namePos) + protected function checkEnum(Enum_ $node, int $namePos) : void { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->implements); } - protected function checkClassMethod(ClassMethod $node, $modifierPos) + protected function checkClassMethod(ClassMethod $node, int $modifierPos) : void { - if ($node->flags & Class_::MODIFIER_STATIC) { + if ($node->flags & \PhpParser\Modifiers::STATIC) { switch ($node->name->toLowerString()) { case '__construct': $this->emitError(new \PhpParser\Error(\sprintf('Constructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); @@ -828,35 +939,139 @@ protected function checkClassMethod(ClassMethod $node, $modifierPos) break; } } - if ($node->flags & Class_::MODIFIER_READONLY) { + if ($node->flags & \PhpParser\Modifiers::READONLY) { $this->emitError(new \PhpParser\Error(\sprintf('Method %s() cannot be readonly', $node->name), $this->getAttributesAt($modifierPos))); } } - protected function checkClassConst(ClassConst $node, $modifierPos) + protected function checkClassConst(ClassConst $node, int $modifierPos) : void { - if ($node->flags & Class_::MODIFIER_STATIC) { - $this->emitError(new \PhpParser\Error("Cannot use 'static' as constant modifier", $this->getAttributesAt($modifierPos))); + foreach ([\PhpParser\Modifiers::STATIC, \PhpParser\Modifiers::ABSTRACT, \PhpParser\Modifiers::READONLY] as $modifier) { + if ($node->flags & $modifier) { + $this->emitError(new \PhpParser\Error("Cannot use '" . \PhpParser\Modifiers::toString($modifier) . "' as constant modifier", $this->getAttributesAt($modifierPos))); + } } - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new \PhpParser\Error("Cannot use 'abstract' as constant modifier", $this->getAttributesAt($modifierPos))); + } + protected function checkUseUse(UseItem $node, int $namePos) : void + { + if ($node->alias && $node->alias->isSpecialClassName()) { + $this->emitError(new \PhpParser\Error(\sprintf('Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias), $this->getAttributesAt($namePos))); + } + } + protected function checkPropertyHooksForMultiProperty(Property $property, int $hookPos) : void + { + if (\count($property->props) > 1) { + $this->emitError(new \PhpParser\Error('Cannot use hooks when declaring multiple properties', $this->getAttributesAt($hookPos))); } - if ($node->flags & Class_::MODIFIER_READONLY) { - $this->emitError(new \PhpParser\Error("Cannot use 'readonly' as constant modifier", $this->getAttributesAt($modifierPos))); + } + /** @param PropertyHook[] $hooks */ + protected function checkEmptyPropertyHookList(array $hooks, int $hookPos) : void + { + if (empty($hooks)) { + $this->emitError(new \PhpParser\Error('Property hook list cannot be empty', $this->getAttributesAt($hookPos))); } } - protected function checkProperty(Property $node, $modifierPos) + protected function checkPropertyHook(PropertyHook $hook, ?int $paramListPos) : void { - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new \PhpParser\Error('Properties cannot be declared abstract', $this->getAttributesAt($modifierPos))); + $name = $hook->name->toLowerString(); + if ($name !== 'get' && $name !== 'set') { + $this->emitError(new \PhpParser\Error('Unknown hook "' . $hook->name . '", expected "get" or "set"', $hook->name->getAttributes())); } - if ($node->flags & Class_::MODIFIER_FINAL) { - $this->emitError(new \PhpParser\Error('Properties cannot be declared final', $this->getAttributesAt($modifierPos))); + if ($name === 'get' && $paramListPos !== null) { + $this->emitError(new \PhpParser\Error('get hook must not have a parameter list', $this->getAttributesAt($paramListPos))); } } - protected function checkUseUse(UseUse $node, $namePos) + protected function checkPropertyHookModifiers(int $a, int $b, int $modifierPos) : void { - if ($node->alias && $node->alias->isSpecialClassName()) { - $this->emitError(new \PhpParser\Error(\sprintf('Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias), $this->getAttributesAt($namePos))); + try { + \PhpParser\Modifiers::verifyModifier($a, $b); + } catch (\PhpParser\Error $error) { + $error->setAttributes($this->getAttributesAt($modifierPos)); + $this->emitError($error); + } + if ($b != \PhpParser\Modifiers::FINAL) { + $this->emitError(new \PhpParser\Error('Cannot use the ' . \PhpParser\Modifiers::toString($b) . ' modifier on a property hook', $this->getAttributesAt($modifierPos))); + } + } + protected function checkConstantAttributes(Const_ $node) : void + { + if ($node->attrGroups !== [] && \count($node->consts) > 1) { + $this->emitError(new \PhpParser\Error('Cannot use attributes on multiple constants at once', $node->getAttributes())); + } + } + /** + * @param Property|Param $node + */ + protected function addPropertyNameToHooks(\PhpParser\Node $node) : void + { + if ($node instanceof Property) { + $name = $node->props[0]->name->toString(); + } else { + $name = $node->var->name; + } + foreach ($node->hooks as $hook) { + $hook->setAttribute('propertyName', $name); + } + } + /** @param array $args */ + private function isSimpleExit(array $args) : bool + { + if (\count($args) === 0) { + return \true; + } + if (\count($args) === 1) { + $arg = $args[0]; + return $arg instanceof Arg && $arg->name === null && $arg->byRef === \false && $arg->unpack === \false; + } + return \false; + } + /** + * @param array $args + * @param array $attrs + */ + protected function createExitExpr(string $name, int $namePos, array $args, array $attrs) : Expr + { + if ($this->isSimpleExit($args)) { + // Create Exit node for backwards compatibility. + $attrs['kind'] = \strtolower($name) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + return new Expr\Exit_(\count($args) === 1 ? $args[0]->value : null, $attrs); + } + return new Expr\FuncCall(new Name($name, $this->getAttributesAt($namePos)), $args, $attrs); + } + /** + * Creates the token map. + * + * The token map maps the PHP internal token identifiers + * to the identifiers used by the Parser. Additionally it + * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. + * + * @return array The token map + */ + protected function createTokenMap() : array + { + $tokenMap = []; + // Single-char tokens use an identity mapping. + for ($i = 0; $i < 256; ++$i) { + $tokenMap[$i] = $i; + } + foreach ($this->symbolToName as $name) { + if ($name[0] === 'T') { + $tokenMap[\constant($name)] = \constant(static::class . '::' . $name); + } + } + // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO + $tokenMap[\T_OPEN_TAG_WITH_ECHO] = static::T_ECHO; + // T_CLOSE_TAG is equivalent to ';' + $tokenMap[\T_CLOSE_TAG] = \ord(';'); + // We have created a map from PHP token IDs to external symbol IDs. + // Now map them to the internal symbol ID. + $fullTokenMap = []; + foreach ($tokenMap as $phpToken => $extSymbol) { + $intSymbol = $this->tokenToSymbol[$extSymbol]; + if ($intSymbol === $this->invalidSymbol) { + continue; + } + $fullTokenMap[$phpToken] = $intSymbol; } + return $fullTokenMap; } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php index 95e0e6d16..e05d2daa5 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php @@ -3,66 +3,42 @@ declare (strict_types=1); namespace PhpParser; -use PhpParser\Lexer\Emulative; use PhpParser\Parser\Php7; +use PhpParser\Parser\Php8; class ParserFactory { - const PREFER_PHP7 = 1; - const PREFER_PHP5 = 2; - const ONLY_PHP7 = 3; - const ONLY_PHP5 = 4; /** - * Creates a Parser instance, according to the provided kind. - * - * @param int $kind One of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5 - * @param Lexer|null $lexer Lexer to use. Defaults to emulative lexer when not specified - * @param array $parserOptions Parser options. See ParserAbstract::__construct() argument - * - * @return Parser The parser instance + * Create a parser targeting the given version on a best-effort basis. The parser will generally + * accept code for the newest supported version, but will try to accommodate code that becomes + * invalid in newer versions or changes in interpretation. */ - public function create(int $kind, ?\PhpParser\Lexer $lexer = null, array $parserOptions = []) : \PhpParser\Parser + public function createForVersion(\PhpParser\PhpVersion $version) : \PhpParser\Parser { - if (null === $lexer) { - $lexer = new \PhpParser\Lexer\Emulative(); + if ($version->isHostVersion()) { + $lexer = new \PhpParser\Lexer(); + } else { + $lexer = new \PhpParser\Lexer\Emulative($version); } - switch ($kind) { - case self::PREFER_PHP7: - return new \PhpParser\Parser\Multiple([new \PhpParser\Parser\Php7($lexer, $parserOptions), new \PhpParser\Parser\Php5($lexer, $parserOptions)]); - case self::PREFER_PHP5: - return new \PhpParser\Parser\Multiple([new \PhpParser\Parser\Php5($lexer, $parserOptions), new \PhpParser\Parser\Php7($lexer, $parserOptions)]); - case self::ONLY_PHP7: - return new \PhpParser\Parser\Php7($lexer, $parserOptions); - case self::ONLY_PHP5: - return new \PhpParser\Parser\Php5($lexer, $parserOptions); - default: - throw new \LogicException('Kind must be one of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5'); + if ($version->id >= 80000) { + return new Php8($lexer, $version); } + return new Php7($lexer, $version); } /** * Create a parser targeting the newest version supported by this library. Code for older * versions will be accepted if there have been no relevant backwards-compatibility breaks in * PHP. - * - * All supported lexer attributes (comments, startLine, endLine, startTokenPos, endTokenPos, - * startFilePos, endFilePos) will be enabled. */ public function createForNewestSupportedVersion() : \PhpParser\Parser { - return new Php7(new Emulative($this->getLexerOptions())); + return $this->createForVersion(\PhpParser\PhpVersion::getNewestSupported()); } /** * Create a parser targeting the host PHP version, that is the PHP version we're currently * running on. This parser will not use any token emulation. - * - * All supported lexer attributes (comments, startLine, endLine, startTokenPos, endTokenPos, - * startFilePos, endFilePos) will be enabled. */ public function createForHostVersion() : \PhpParser\Parser { - return new Php7(new \PhpParser\Lexer($this->getLexerOptions())); - } - private function getLexerOptions() : array - { - return ['usedAttributes' => ['comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos', 'startFilePos', 'endFilePos']]; + return $this->createForVersion(\PhpParser\PhpVersion::getHostVersion()); } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php new file mode 100644 index 000000000..1db07c2cd --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php @@ -0,0 +1,157 @@ + 50100, 'callable' => 50400, 'bool' => 70000, 'int' => 70000, 'float' => 70000, 'string' => 70000, 'iterable' => 70100, 'void' => 70100, 'object' => 70200, 'null' => 80000, 'false' => 80000, 'mixed' => 80000, 'never' => 80100, 'true' => 80200]; + private function __construct(int $id) + { + $this->id = $id; + } + /** + * Create a PhpVersion object from major and minor version components. + */ + public static function fromComponents(int $major, int $minor) : self + { + return new self($major * 10000 + $minor * 100); + } + /** + * Get the newest PHP version supported by this library. Support for this version may be partial, + * if it is still under development. + */ + public static function getNewestSupported() : self + { + return self::fromComponents(8, 4); + } + /** + * Get the host PHP version, that is the PHP version we're currently running on. + */ + public static function getHostVersion() : self + { + return self::fromComponents(\PHP_MAJOR_VERSION, \PHP_MINOR_VERSION); + } + /** + * Parse the version from a string like "8.1". + */ + public static function fromString(string $version) : self + { + if (!\preg_match('/^(\\d+)\\.(\\d+)/', $version, $matches)) { + throw new \LogicException("Invalid PHP version \"{$version}\""); + } + return self::fromComponents((int) $matches[1], (int) $matches[2]); + } + /** + * Check whether two versions are the same. + */ + public function equals(\PhpParser\PhpVersion $other) : bool + { + return $this->id === $other->id; + } + /** + * Check whether this version is greater than or equal to the argument. + */ + public function newerOrEqual(\PhpParser\PhpVersion $other) : bool + { + return $this->id >= $other->id; + } + /** + * Check whether this version is older than the argument. + */ + public function older(\PhpParser\PhpVersion $other) : bool + { + return $this->id < $other->id; + } + /** + * Check whether this is the host PHP version. + */ + public function isHostVersion() : bool + { + return $this->equals(self::getHostVersion()); + } + /** + * Check whether this PHP version supports the given builtin type. Type name must be lowercase. + */ + public function supportsBuiltinType(string $type) : bool + { + $minVersion = self::BUILTIN_TYPE_VERSIONS[$type] ?? null; + return $minVersion !== null && $this->id >= $minVersion; + } + /** + * Whether this version supports [] array literals. + */ + public function supportsShortArraySyntax() : bool + { + return $this->id >= 50400; + } + /** + * Whether this version supports [] for destructuring. + */ + public function supportsShortArrayDestructuring() : bool + { + return $this->id >= 70100; + } + /** + * Whether this version supports flexible heredoc/nowdoc. + */ + public function supportsFlexibleHeredoc() : bool + { + return $this->id >= 70300; + } + /** + * Whether this version supports trailing commas in parameter lists. + */ + public function supportsTrailingCommaInParamList() : bool + { + return $this->id >= 80000; + } + /** + * Whether this version allows "$var =& new Obj". + */ + public function allowsAssignNewByReference() : bool + { + return $this->id < 70000; + } + /** + * Whether this version allows invalid octals like "08". + */ + public function allowsInvalidOctals() : bool + { + return $this->id < 70000; + } + /** + * Whether this version allows DEL (\x7f) to occur in identifiers. + */ + public function allowsDelInIdentifiers() : bool + { + return $this->id < 70100; + } + /** + * Whether this version supports yield in expression context without parentheses. + */ + public function supportsYieldWithoutParentheses() : bool + { + return $this->id >= 70000; + } + /** + * Whether this version supports unicode escape sequences in strings. + */ + public function supportsUnicodeEscapes() : bool + { + return $this->id >= 70000; + } + /* + * Whether this version supports attributes. + */ + public function supportsAttributes() : bool + { + return $this->id >= 80000; + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php new file mode 100644 index 000000000..dcaac130a --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php @@ -0,0 +1,49 @@ +pAttrGroups($node->attrGroups, \true) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : ''); + return $this->pAttrGroups($node->attrGroups, $this->phpVersion->supportsAttributes()) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : '') . ($node->hooks ? ' {' . $this->pStmts($node->hooks) . $this->nl . '}' : ''); } - protected function pArg(Node\Arg $node) + protected function pArg(Node\Arg $node) : string { return ($node->name ? $node->name->toString() . ': ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } - protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) + protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) : string { return '...'; } - protected function pConst(Node\Const_ $node) + protected function pConst(Node\Const_ $node) : string { return $node->name . ' = ' . $this->p($node->value); } - protected function pNullableType(Node\NullableType $node) + protected function pNullableType(Node\NullableType $node) : string { return '?' . $this->p($node->type); } - protected function pUnionType(Node\UnionType $node) + protected function pUnionType(Node\UnionType $node) : string { $types = []; foreach ($node->types as $typeNode) { @@ -48,125 +48,143 @@ protected function pUnionType(Node\UnionType $node) } return \implode('|', $types); } - protected function pIntersectionType(Node\IntersectionType $node) + protected function pIntersectionType(Node\IntersectionType $node) : string { return $this->pImplode($node->types, '&'); } - protected function pIdentifier(Node\Identifier $node) + protected function pIdentifier(Node\Identifier $node) : string { return $node->name; } - protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) + protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) : string { return '$' . $node->name; } - protected function pAttribute(Node\Attribute $node) + protected function pAttribute(Node\Attribute $node) : string { return $this->p($node->name) . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); } - protected function pAttributeGroup(Node\AttributeGroup $node) + protected function pAttributeGroup(Node\AttributeGroup $node) : string { return '#[' . $this->pCommaSeparated($node->attrs) . ']'; } // Names - protected function pName(Name $node) + protected function pName(Name $node) : string { - return \implode('\\', $node->parts); + return $node->name; } - protected function pName_FullyQualified(Name\FullyQualified $node) + protected function pName_FullyQualified(Name\FullyQualified $node) : string { - return '\\' . \implode('\\', $node->parts); + return '\\' . $node->name; } - protected function pName_Relative(Name\Relative $node) + protected function pName_Relative(Name\Relative $node) : string { - return 'namespace\\' . \implode('\\', $node->parts); + return 'namespace\\' . $node->name; } // Magic Constants - protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) + protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) : string { return '__CLASS__'; } - protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) + protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) : string { return '__DIR__'; } - protected function pScalar_MagicConst_File(MagicConst\File $node) + protected function pScalar_MagicConst_File(MagicConst\File $node) : string { return '__FILE__'; } - protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) + protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) : string { return '__FUNCTION__'; } - protected function pScalar_MagicConst_Line(MagicConst\Line $node) + protected function pScalar_MagicConst_Line(MagicConst\Line $node) : string { return '__LINE__'; } - protected function pScalar_MagicConst_Method(MagicConst\Method $node) + protected function pScalar_MagicConst_Method(MagicConst\Method $node) : string { return '__METHOD__'; } - protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) + protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) : string { return '__NAMESPACE__'; } - protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) + protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) : string { return '__TRAIT__'; } + protected function pScalar_MagicConst_Property(MagicConst\Property $node) : string + { + return '__PROPERTY__'; + } // Scalars - protected function pScalar_String(Scalar\String_ $node) + private function indentString(string $str) : string + { + return \str_replace("\n", $this->nl, $str); + } + protected function pScalar_String(Scalar\String_ $node) : string { $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); switch ($kind) { case Scalar\String_::KIND_NOWDOC: $label = $node->getAttribute('docLabel'); if ($label && !$this->containsEndLabel($node->value, $label)) { + $shouldIdent = $this->phpVersion->supportsFlexibleHeredoc(); + $nl = $shouldIdent ? $this->nl : $this->newline; if ($node->value === '') { - return "<<<'{$label}'\n{$label}" . $this->docStringEndToken; + return "<<<'{$label}'{$nl}{$label}{$this->docStringEndToken}"; + } + // Make sure trailing \r is not combined with following \n into CRLF. + if ($node->value[\strlen($node->value) - 1] !== "\r") { + $value = $shouldIdent ? $this->indentString($node->value) : $node->value; + return "<<<'{$label}'{$nl}{$value}{$nl}{$label}{$this->docStringEndToken}"; } - return "<<<'{$label}'\n{$node->value}\n{$label}" . $this->docStringEndToken; } /* break missing intentionally */ + // no break case Scalar\String_::KIND_SINGLE_QUOTED: return $this->pSingleQuotedString($node->value); case Scalar\String_::KIND_HEREDOC: $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<{$label}\n{$label}" . $this->docStringEndToken; + $escaped = $this->escapeString($node->value, null); + if ($label && !$this->containsEndLabel($escaped, $label)) { + $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline; + if ($escaped === '') { + return "<<<{$label}{$nl}{$label}{$this->docStringEndToken}"; } - $escaped = $this->escapeString($node->value, null); - return "<<<{$label}\n" . $escaped . "\n{$label}" . $this->docStringEndToken; + return "<<<{$label}{$nl}{$escaped}{$nl}{$label}{$this->docStringEndToken}"; } /* break missing intentionally */ + // no break case Scalar\String_::KIND_DOUBLE_QUOTED: return '"' . $this->escapeString($node->value, '"') . '"'; } throw new \Exception('Invalid string kind'); } - protected function pScalar_Encapsed(Scalar\Encapsed $node) + protected function pScalar_InterpolatedString(Scalar\InterpolatedString $node) : string { if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { $label = $node->getAttribute('docLabel'); if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { - if (\count($node->parts) === 1 && $node->parts[0] instanceof Scalar\EncapsedStringPart && $node->parts[0]->value === '') { - return "<<<{$label}\n{$label}" . $this->docStringEndToken; + $nl = $this->phpVersion->supportsFlexibleHeredoc() ? $this->nl : $this->newline; + if (\count($node->parts) === 1 && $node->parts[0] instanceof Node\InterpolatedStringPart && $node->parts[0]->value === '') { + return "<<<{$label}{$nl}{$label}{$this->docStringEndToken}"; } - return "<<<{$label}\n" . $this->pEncapsList($node->parts, null) . "\n{$label}" . $this->docStringEndToken; + return "<<<{$label}{$nl}" . $this->pEncapsList($node->parts, null) . "{$nl}{$label}{$this->docStringEndToken}"; } } return '"' . $this->pEncapsList($node->parts, '"') . '"'; } - protected function pScalar_LNumber(Scalar\LNumber $node) + protected function pScalar_Int(Scalar\Int_ $node) : string { if ($node->value === -\PHP_INT_MAX - 1) { // PHP_INT_MIN cannot be represented as a literal, // because the sign is not part of the literal return '(-' . \PHP_INT_MAX . '-1)'; } - $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); - if (Scalar\LNumber::KIND_DEC === $kind) { + $kind = $node->getAttribute('kind', Scalar\Int_::KIND_DEC); + if (Scalar\Int_::KIND_DEC === $kind) { return (string) $node->value; } if ($node->value < 0) { @@ -177,29 +195,30 @@ protected function pScalar_LNumber(Scalar\LNumber $node) $str = (string) $node->value; } switch ($kind) { - case Scalar\LNumber::KIND_BIN: + case Scalar\Int_::KIND_BIN: return $sign . '0b' . \base_convert($str, 10, 2); - case Scalar\LNumber::KIND_OCT: + case Scalar\Int_::KIND_OCT: return $sign . '0' . \base_convert($str, 10, 8); - case Scalar\LNumber::KIND_HEX: + case Scalar\Int_::KIND_HEX: return $sign . '0x' . \base_convert($str, 10, 16); } throw new \Exception('Invalid number kind'); } - protected function pScalar_DNumber(Scalar\DNumber $node) + protected function pScalar_Float(Scalar\Float_ $node) : string { if (!\is_finite($node->value)) { if ($node->value === \INF) { - return '\\INF'; - } elseif ($node->value === -\INF) { - return '-\\INF'; + return '1.0E+1000'; + } + if ($node->value === -\INF) { + return '-1.0E+1000'; } else { return '\\NAN'; } } // Try to find a short full-precision representation $stringValue = \sprintf('%.16G', $node->value); - if ($node->value !== (double) $stringValue) { + if ($node->value !== (float) $stringValue) { $stringValue = \sprintf('%.17G', $node->value); } // %G is locale dependent and there exists no locale-independent alternative. We don't want @@ -209,319 +228,312 @@ protected function pScalar_DNumber(Scalar\DNumber $node) // ensure that number is really printed as float return \preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; } - protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) - { - throw new \LogicException('Cannot directly print EncapsedStringPart'); - } // Assignments - protected function pExpr_Assign(Expr\Assign $node) + protected function pExpr_Assign(Expr\Assign $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); + return $this->pPrefixOp(Expr\Assign::class, $this->p($node->var) . ' = ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignRef(Expr\AssignRef $node) + protected function pExpr_AssignRef(Expr\AssignRef $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); + return $this->pPrefixOp(Expr\AssignRef::class, $this->p($node->var) . ' =& ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) + protected function pExpr_AssignOp_Plus(AssignOp\Plus $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); + return $this->pPrefixOp(AssignOp\Plus::class, $this->p($node->var) . ' += ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) + protected function pExpr_AssignOp_Minus(AssignOp\Minus $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); + return $this->pPrefixOp(AssignOp\Minus::class, $this->p($node->var) . ' -= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) + protected function pExpr_AssignOp_Mul(AssignOp\Mul $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); + return $this->pPrefixOp(AssignOp\Mul::class, $this->p($node->var) . ' *= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Div(AssignOp\Div $node) + protected function pExpr_AssignOp_Div(AssignOp\Div $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); + return $this->pPrefixOp(AssignOp\Div::class, $this->p($node->var) . ' /= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) + protected function pExpr_AssignOp_Concat(AssignOp\Concat $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); + return $this->pPrefixOp(AssignOp\Concat::class, $this->p($node->var) . ' .= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) + protected function pExpr_AssignOp_Mod(AssignOp\Mod $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); + return $this->pPrefixOp(AssignOp\Mod::class, $this->p($node->var) . ' %= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) + protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); + return $this->pPrefixOp(AssignOp\BitwiseAnd::class, $this->p($node->var) . ' &= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) + protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); + return $this->pPrefixOp(AssignOp\BitwiseOr::class, $this->p($node->var) . ' |= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) + protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); + return $this->pPrefixOp(AssignOp\BitwiseXor::class, $this->p($node->var) . ' ^= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) + protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); + return $this->pPrefixOp(AssignOp\ShiftLeft::class, $this->p($node->var) . ' <<= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) + protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); + return $this->pPrefixOp(AssignOp\ShiftRight::class, $this->p($node->var) . ' >>= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) + protected function pExpr_AssignOp_Pow(AssignOp\Pow $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); + return $this->pPrefixOp(AssignOp\Pow::class, $this->p($node->var) . ' **= ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) + protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); + return $this->pPrefixOp(AssignOp\Coalesce::class, $this->p($node->var) . ' ??= ', $node->expr, $precedence, $lhsPrecedence); } // Binary expressions - protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) + protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); + return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) + protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); + return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) + protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); + return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) + protected function pExpr_BinaryOp_Div(BinaryOp\Div $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); + return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) + protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); + return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) + protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); + return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) + protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); + return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) + protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); + return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) + protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); + return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) + protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); + return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) + protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); + return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) + protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); + return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) + protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); + return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) + protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); + return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) + protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); + return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) + protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); + return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) + protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); + return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) + protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); + return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) + protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); + return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) + protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); + return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) + protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); + return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) + protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); + return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) + protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); + return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) + protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); + return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) + protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); + return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) + protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); + return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) + protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node, int $precedence, int $lhsPrecedence) : string { - return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); + return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right, $precedence, $lhsPrecedence); } - protected function pExpr_Instanceof(Expr\Instanceof_ $node) + protected function pExpr_Instanceof(Expr\Instanceof_ $node, int $precedence, int $lhsPrecedence) : string { - list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; - return $this->pPrec($node->expr, $precedence, $associativity, -1) . ' instanceof ' . $this->pNewVariable($node->class); + return $this->pPostfixOp(Expr\Instanceof_::class, $node->expr, ' instanceof ' . $this->pNewOperand($node->class), $precedence, $lhsPrecedence); } // Unary expressions - protected function pExpr_BooleanNot(Expr\BooleanNot $node) + protected function pExpr_BooleanNot(Expr\BooleanNot $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); + return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) + protected function pExpr_BitwiseNot(Expr\BitwiseNot $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); + return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) + protected function pExpr_UnaryMinus(Expr\UnaryMinus $node, int $precedence, int $lhsPrecedence) : string { - if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { - // Enforce -(-$expr) instead of --$expr - return '-(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); + return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) + protected function pExpr_UnaryPlus(Expr\UnaryPlus $node, int $precedence, int $lhsPrecedence) : string { - if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { - // Enforce +(+$expr) instead of ++$expr - return '+(' . $this->p($node->expr) . ')'; - } - return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); + return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_PreInc(Expr\PreInc $node) + protected function pExpr_PreInc(Expr\PreInc $node) : string { - return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); + return '++' . $this->p($node->var); } - protected function pExpr_PreDec(Expr\PreDec $node) + protected function pExpr_PreDec(Expr\PreDec $node) : string { - return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); + return '--' . $this->p($node->var); } - protected function pExpr_PostInc(Expr\PostInc $node) + protected function pExpr_PostInc(Expr\PostInc $node) : string { - return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); + return $this->p($node->var) . '++'; } - protected function pExpr_PostDec(Expr\PostDec $node) + protected function pExpr_PostDec(Expr\PostDec $node) : string { - return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); + return $this->p($node->var) . '--'; } - protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) + protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); + return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_YieldFrom(Expr\YieldFrom $node) + protected function pExpr_YieldFrom(Expr\YieldFrom $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); + return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Print(Expr\Print_ $node) + protected function pExpr_Print(Expr\Print_ $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); + return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr, $precedence, $lhsPrecedence); } // Casts - protected function pExpr_Cast_Int(Cast\Int_ $node) + protected function pExpr_Cast_Int(Cast\Int_ $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); + return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Double(Cast\Double $node) + protected function pExpr_Cast_Double(Cast\Double $node, int $precedence, int $lhsPrecedence) : string { $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); if ($kind === Cast\Double::KIND_DOUBLE) { $cast = '(double)'; } elseif ($kind === Cast\Double::KIND_FLOAT) { $cast = '(float)'; - } elseif ($kind === Cast\Double::KIND_REAL) { + } else { + \assert($kind === Cast\Double::KIND_REAL); $cast = '(real)'; } - return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); + return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_String(Cast\String_ $node) + protected function pExpr_Cast_String(Cast\String_ $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); + return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Array(Cast\Array_ $node) + protected function pExpr_Cast_Array(Cast\Array_ $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); + return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Object(Cast\Object_ $node) + protected function pExpr_Cast_Object(Cast\Object_ $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); + return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Bool(Cast\Bool_ $node) + protected function pExpr_Cast_Bool(Cast\Bool_ $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); + return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Cast_Unset(Cast\Unset_ $node) + protected function pExpr_Cast_Unset(Cast\Unset_ $node, int $precedence, int $lhsPrecedence) : string { - return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); + return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr, $precedence, $lhsPrecedence); } // Function calls and similar constructs - protected function pExpr_FuncCall(Expr\FuncCall $node) + protected function pExpr_FuncCall(Expr\FuncCall $node) : string { return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_MethodCall(Expr\MethodCall $node) + protected function pExpr_MethodCall(Expr\MethodCall $node) : string { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) + protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) : string { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_StaticCall(Expr\StaticCall $node) + protected function pExpr_StaticCall(Expr\StaticCall $node) : string { return $this->pStaticDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? $node->name instanceof Expr\Variable ? $this->p($node->name) : '{' . $this->p($node->name) . '}' : $node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_Empty(Expr\Empty_ $node) + protected function pExpr_Empty(Expr\Empty_ $node) : string { return 'empty(' . $this->p($node->expr) . ')'; } - protected function pExpr_Isset(Expr\Isset_ $node) + protected function pExpr_Isset(Expr\Isset_ $node) : string { return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; } - protected function pExpr_Eval(Expr\Eval_ $node) + protected function pExpr_Eval(Expr\Eval_ $node) : string { return 'eval(' . $this->p($node->expr) . ')'; } - protected function pExpr_Include(Expr\Include_ $node) + protected function pExpr_Include(Expr\Include_ $node, int $precedence, int $lhsPrecedence) : string { static $map = [Expr\Include_::TYPE_INCLUDE => 'include', Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', Expr\Include_::TYPE_REQUIRE => 'require', Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once']; - return $map[$node->type] . ' ' . $this->p($node->expr); + return $this->pPrefixOp(Expr\Include_::class, $map[$node->type] . ' ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_List(Expr\List_ $node) + protected function pExpr_List(Expr\List_ $node) : string { - return 'list(' . $this->pCommaSeparated($node->items) . ')'; + $syntax = $node->getAttribute('kind', $this->phpVersion->supportsShortArrayDestructuring() ? Expr\List_::KIND_ARRAY : Expr\List_::KIND_LIST); + if ($syntax === Expr\List_::KIND_ARRAY) { + return '[' . $this->pMaybeMultiline($node->items, \true) . ']'; + } else { + return 'list(' . $this->pMaybeMultiline($node->items, \true) . ')'; + } } // Other - protected function pExpr_Error(Expr\Error $node) + protected function pExpr_Error(Expr\Error $node) : string { throw new \LogicException('Cannot pretty-print AST with Error nodes'); } - protected function pExpr_Variable(Expr\Variable $node) + protected function pExpr_Variable(Expr\Variable $node) : string { if ($node->name instanceof Expr) { return '${' . $this->p($node->name) . '}'; @@ -529,105 +541,131 @@ protected function pExpr_Variable(Expr\Variable $node) return '$' . $node->name; } } - protected function pExpr_Array(Expr\Array_ $node) + protected function pExpr_Array(Expr\Array_ $node) : string { - $syntax = $node->getAttribute('kind', $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); + $syntax = $node->getAttribute('kind', $this->shortArraySyntax ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); if ($syntax === Expr\Array_::KIND_SHORT) { return '[' . $this->pMaybeMultiline($node->items, \true) . ']'; } else { return 'array(' . $this->pMaybeMultiline($node->items, \true) . ')'; } } - protected function pExpr_ArrayItem(Expr\ArrayItem $node) + protected function pKey(?Node $node) : string { - return (null !== $node->key ? $this->p($node->key) . ' => ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); + if ($node === null) { + return ''; + } + // => is not really an operator and does not typically participate in precedence resolution. + // However, there is an exception if yield expressions with keys are involved: + // [yield $a => $b] is interpreted as [(yield $a => $b)], so we need to ensure that + // [(yield $a) => $b] is printed with parentheses. We approximate this by lowering the LHS + // precedence to that of yield (which will also print unnecessary parentheses for rare low + // precedence unary operators like include). + $yieldPrecedence = $this->precedenceMap[Expr\Yield_::class][0]; + return $this->p($node, self::MAX_PRECEDENCE, $yieldPrecedence) . ' => '; + } + protected function pArrayItem(Node\ArrayItem $node) : string + { + return $this->pKey($node->key) . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } - protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) + protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) : string { return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; } - protected function pExpr_ConstFetch(Expr\ConstFetch $node) + protected function pExpr_ConstFetch(Expr\ConstFetch $node) : string { return $this->p($node->name); } - protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) + protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) : string { return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name); } - protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) + protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) : string { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); } - protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) + protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) : string { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); } - protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) + protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) : string { return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); } - protected function pExpr_ShellExec(Expr\ShellExec $node) + protected function pExpr_ShellExec(Expr\ShellExec $node) : string { return '`' . $this->pEncapsList($node->parts, '`') . '`'; } - protected function pExpr_Closure(Expr\Closure $node) + protected function pExpr_Closure(Expr\Closure $node) : string { - return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; + return $this->pAttrGroups($node->attrGroups, \true) . $this->pStatic($node->static) . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pParams($node->params) . ')' . (!empty($node->uses) ? ' use (' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pExpr_Match(Expr\Match_ $node) + protected function pExpr_Match(Expr\Match_ $node) : string { return 'match (' . $this->p($node->cond) . ') {' . $this->pCommaSeparatedMultiline($node->arms, \true) . $this->nl . '}'; } - protected function pMatchArm(Node\MatchArm $node) + protected function pMatchArm(Node\MatchArm $node) : string { - return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') . ' => ' . $this->p($node->body); + $result = ''; + if ($node->conds) { + for ($i = 0, $c = \count($node->conds); $i + 1 < $c; $i++) { + $result .= $this->p($node->conds[$i]) . ', '; + } + $result .= $this->pKey($node->conds[$i]); + } else { + $result = 'default => '; + } + return $result . $this->p($node->body); } - protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) + protected function pExpr_ArrowFunction(Expr\ArrowFunction $node, int $precedence, int $lhsPrecedence) : string { - return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ' . $this->p($node->expr); + return $this->pPrefixOp(Expr\ArrowFunction::class, $this->pAttrGroups($node->attrGroups, \true) . $this->pStatic($node->static) . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pParams($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_ClosureUse(Expr\ClosureUse $node) + protected function pClosureUse(Node\ClosureUse $node) : string { return ($node->byRef ? '&' : '') . $this->p($node->var); } - protected function pExpr_New(Expr\New_ $node) + protected function pExpr_New(Expr\New_ $node) : string { if ($node->class instanceof Stmt\Class_) { $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; return 'new ' . $this->pClassCommon($node->class, $args); } - return 'new ' . $this->pNewVariable($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; + return 'new ' . $this->pNewOperand($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; } - protected function pExpr_Clone(Expr\Clone_ $node) + protected function pExpr_Clone(Expr\Clone_ $node, int $precedence, int $lhsPrecedence) : string { - return 'clone ' . $this->p($node->expr); + return $this->pPrefixOp(Expr\Clone_::class, 'clone ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Ternary(Expr\Ternary $node) + protected function pExpr_Ternary(Expr\Ternary $node, int $precedence, int $lhsPrecedence) : string { // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. // this is okay because the part between ? and : never needs parentheses. - return $this->pInfixOp(Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else); + return $this->pInfixOp(Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else, $precedence, $lhsPrecedence); } - protected function pExpr_Exit(Expr\Exit_ $node) + protected function pExpr_Exit(Expr\Exit_ $node) : string { $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); } - protected function pExpr_Throw(Expr\Throw_ $node) + protected function pExpr_Throw(Expr\Throw_ $node, int $precedence, int $lhsPrecedence) : string { - return 'throw ' . $this->p($node->expr); + return $this->pPrefixOp(Expr\Throw_::class, 'throw ', $node->expr, $precedence, $lhsPrecedence); } - protected function pExpr_Yield(Expr\Yield_ $node) + protected function pExpr_Yield(Expr\Yield_ $node, int $precedence, int $lhsPrecedence) : string { if ($node->value === null) { - return 'yield'; + $opPrecedence = $this->precedenceMap[Expr\Yield_::class][0]; + return $opPrecedence >= $lhsPrecedence ? '(yield)' : 'yield'; } else { - // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary - return '(yield ' . ($node->key !== null ? $this->p($node->key) . ' => ' : '') . $this->p($node->value) . ')'; + if (!$this->phpVersion->supportsYieldWithoutParentheses()) { + return '(yield ' . $this->pKey($node->key) . $this->p($node->value) . ')'; + } + return $this->pPrefixOp(Expr\Yield_::class, 'yield ' . $this->pKey($node->key), $node->value, $precedence, $lhsPrecedence); } } // Declarations - protected function pStmt_Namespace(Stmt\Namespace_ $node) + protected function pStmt_Namespace(Stmt\Namespace_ $node) : string { if ($this->canUseSemicolonNamespaces) { return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, \false); @@ -635,215 +673,225 @@ protected function pStmt_Namespace(Stmt\Namespace_ $node) return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } } - protected function pStmt_Use(Stmt\Use_ $node) + protected function pStmt_Use(Stmt\Use_ $node) : string { return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';'; } - protected function pStmt_GroupUse(Stmt\GroupUse $node) + protected function pStmt_GroupUse(Stmt\GroupUse $node) : string { return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\\{' . $this->pCommaSeparated($node->uses) . '};'; } - protected function pStmt_UseUse(Stmt\UseUse $node) + protected function pUseItem(Node\UseItem $node) : string { return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : ''); } - protected function pUseType($type) + protected function pUseType(int $type) : string { return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); } - protected function pStmt_Interface(Stmt\Interface_ $node) + protected function pStmt_Interface(Stmt\Interface_ $node) : string { return $this->pAttrGroups($node->attrGroups) . 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Enum(Stmt\Enum_ $node) + protected function pStmt_Enum(Stmt\Enum_ $node) : string { - return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name . ($node->scalarType ? " : {$node->scalarType}" : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name . ($node->scalarType ? ' : ' . $this->p($node->scalarType) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Class(Stmt\Class_ $node) + protected function pStmt_Class(Stmt\Class_ $node) : string { return $this->pClassCommon($node, ' ' . $node->name); } - protected function pStmt_Trait(Stmt\Trait_ $node) + protected function pStmt_Trait(Stmt\Trait_ $node) : string { return $this->pAttrGroups($node->attrGroups) . 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_EnumCase(Stmt\EnumCase $node) + protected function pStmt_EnumCase(Stmt\EnumCase $node) : string { return $this->pAttrGroups($node->attrGroups) . 'case ' . $node->name . ($node->expr ? ' = ' . $this->p($node->expr) : '') . ';'; } - protected function pStmt_TraitUse(Stmt\TraitUse $node) + protected function pStmt_TraitUse(Stmt\TraitUse $node) : string { return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); } - protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) + protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) : string { return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; } - protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) + protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) : string { return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . \rtrim($this->pModifiers($node->newModifier), ' ') : '') . (null !== $node->newName ? ' ' . $node->newName : '') . ';'; } - protected function pStmt_Property(Stmt\Property $node) + protected function pStmt_Property(Stmt\Property $node) : string { - return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ';'; + return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ($node->hooks ? ' {' . $this->pStmts($node->hooks) . $this->nl . '}' : ';'); } - protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) + protected function pPropertyItem(Node\PropertyItem $node) : string { return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } - protected function pStmt_ClassMethod(Stmt\ClassMethod $node) + protected function pPropertyHook(Node\PropertyHook $node) : string { - return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pMaybeMultiline($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); + return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . ($node->byRef ? '&' : '') . $node->name . ($node->params ? '(' . $this->pParams($node->params) . ')' : '') . (\is_array($node->body) ? ' {' . $this->pStmts($node->body) . $this->nl . '}' : ($node->body !== null ? ' => ' . $this->p($node->body) : '') . ';'); } - protected function pStmt_ClassConst(Stmt\ClassConst $node) + protected function pStmt_ClassMethod(Stmt\ClassMethod $node) : string + { + return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pParams($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); + } + protected function pStmt_ClassConst(Stmt\ClassConst $node) : string { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'const ' . (null !== $node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->consts) . ';'; } - protected function pStmt_Function(Stmt\Function_ $node) + protected function pStmt_Function(Stmt\Function_ $node) : string { - return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pParams($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Const(Stmt\Const_ $node) + protected function pStmt_Const(Stmt\Const_ $node) : string { - return 'const ' . $this->pCommaSeparated($node->consts) . ';'; + return $this->pAttrGroups($node->attrGroups) . 'const ' . $this->pCommaSeparated($node->consts) . ';'; } - protected function pStmt_Declare(Stmt\Declare_ $node) + protected function pStmt_Declare(Stmt\Declare_ $node) : string { return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } - protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) + protected function pDeclareItem(Node\DeclareItem $node) : string { return $node->key . '=' . $this->p($node->value); } // Control flow - protected function pStmt_If(Stmt\If_ $node) + protected function pStmt_If(Stmt\If_ $node) : string { return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : ''); } - protected function pStmt_ElseIf(Stmt\ElseIf_ $node) + protected function pStmt_ElseIf(Stmt\ElseIf_ $node) : string { return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Else(Stmt\Else_ $node) + protected function pStmt_Else(Stmt\Else_ $node) : string { + if (\count($node->stmts) === 1 && $node->stmts[0] instanceof Stmt\If_) { + // Print as "else if" rather than "else { if }" + return 'else ' . $this->p($node->stmts[0]); + } return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_For(Stmt\For_ $node) + protected function pStmt_For(Stmt\For_ $node) : string { return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') . $this->pCommaSeparated($node->loop) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Foreach(Stmt\Foreach_ $node) + protected function pStmt_Foreach(Stmt\Foreach_ $node) : string { return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_While(Stmt\While_ $node) + protected function pStmt_While(Stmt\While_ $node) : string { return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Do(Stmt\Do_ $node) + protected function pStmt_Do(Stmt\Do_ $node) : string { return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');'; } - protected function pStmt_Switch(Stmt\Switch_ $node) + protected function pStmt_Switch(Stmt\Switch_ $node) : string { return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}'; } - protected function pStmt_Case(Stmt\Case_ $node) + protected function pStmt_Case(Stmt\Case_ $node) : string { return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts); } - protected function pStmt_TryCatch(Stmt\TryCatch $node) + protected function pStmt_TryCatch(Stmt\TryCatch $node) : string { return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); } - protected function pStmt_Catch(Stmt\Catch_ $node) + protected function pStmt_Catch(Stmt\Catch_ $node) : string { return 'catch (' . $this->pImplode($node->types, '|') . ($node->var !== null ? ' ' . $this->p($node->var) : '') . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Finally(Stmt\Finally_ $node) + protected function pStmt_Finally(Stmt\Finally_ $node) : string { return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pStmt_Break(Stmt\Break_ $node) + protected function pStmt_Break(Stmt\Break_ $node) : string { return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } - protected function pStmt_Continue(Stmt\Continue_ $node) + protected function pStmt_Continue(Stmt\Continue_ $node) : string { return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } - protected function pStmt_Return(Stmt\Return_ $node) + protected function pStmt_Return(Stmt\Return_ $node) : string { return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; } - protected function pStmt_Throw(Stmt\Throw_ $node) - { - return 'throw ' . $this->p($node->expr) . ';'; - } - protected function pStmt_Label(Stmt\Label $node) + protected function pStmt_Label(Stmt\Label $node) : string { return $node->name . ':'; } - protected function pStmt_Goto(Stmt\Goto_ $node) + protected function pStmt_Goto(Stmt\Goto_ $node) : string { return 'goto ' . $node->name . ';'; } // Other - protected function pStmt_Expression(Stmt\Expression $node) + protected function pStmt_Expression(Stmt\Expression $node) : string { return $this->p($node->expr) . ';'; } - protected function pStmt_Echo(Stmt\Echo_ $node) + protected function pStmt_Echo(Stmt\Echo_ $node) : string { return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; } - protected function pStmt_Static(Stmt\Static_ $node) + protected function pStmt_Static(Stmt\Static_ $node) : string { return 'static ' . $this->pCommaSeparated($node->vars) . ';'; } - protected function pStmt_Global(Stmt\Global_ $node) + protected function pStmt_Global(Stmt\Global_ $node) : string { return 'global ' . $this->pCommaSeparated($node->vars) . ';'; } - protected function pStmt_StaticVar(Stmt\StaticVar $node) + protected function pStaticVar(Node\StaticVar $node) : string { return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } - protected function pStmt_Unset(Stmt\Unset_ $node) + protected function pStmt_Unset(Stmt\Unset_ $node) : string { return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; } - protected function pStmt_InlineHTML(Stmt\InlineHTML $node) + protected function pStmt_InlineHTML(Stmt\InlineHTML $node) : string { - $newline = $node->getAttribute('hasLeadingNewline', \true) ? "\n" : ''; + $newline = $node->getAttribute('hasLeadingNewline', \true) ? $this->newline : ''; return '?>' . $newline . $node->value . 'remaining; } - protected function pStmt_Nop(Stmt\Nop $node) + protected function pStmt_Nop(Stmt\Nop $node) : string { return ''; } + protected function pStmt_Block(Stmt\Block $node) : string + { + return '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } // Helpers - protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) + protected function pClassCommon(Stmt\Class_ $node, string $afterClassToken) : string { return $this->pAttrGroups($node->attrGroups, $node->name === null) . $this->pModifiers($node->flags) . 'class' . $afterClassToken . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } - protected function pObjectProperty($node) + protected function pObjectProperty(Node $node) : string { if ($node instanceof Expr) { return '{' . $this->p($node) . '}'; } else { - return $node; + \assert($node instanceof Node\Identifier); + return $node->name; } } - protected function pEncapsList(array $encapsList, $quote) + /** @param (Expr|Node\InterpolatedStringPart)[] $encapsList */ + protected function pEncapsList(array $encapsList, ?string $quote) : string { $return = ''; foreach ($encapsList as $element) { - if ($element instanceof Scalar\EncapsedStringPart) { + if ($element instanceof Node\InterpolatedStringPart) { $return .= $this->escapeString($element->value, $quote); } else { $return .= '{' . $this->p($element) . '}'; @@ -851,15 +899,26 @@ protected function pEncapsList(array $encapsList, $quote) } return $return; } - protected function pSingleQuotedString(string $string) + protected function pSingleQuotedString(string $string) : string { - return '\'' . \addcslashes($string, '\'\\') . '\''; + // It is idiomatic to only escape backslashes when necessary, i.e. when followed by ', \ or + // the end of the string ('Foo\Bar' instead of 'Foo\\Bar'). However, we also don't want to + // produce an odd number of backslashes, so '\\\\a' should not get rendered as '\\\a', even + // though that would be legal. + $regex = '/\'|\\\\(?=[\'\\\\]|$)|(?<=\\\\)\\\\/'; + return '\'' . \preg_replace($regex, '\\\\$0', $string) . '\''; } - protected function escapeString($string, $quote) + protected function escapeString(string $string, ?string $quote) : string { if (null === $quote) { // For doc strings, don't escape newlines $escaped = \addcslashes($string, "\t\f\v\$\\"); + // But do escape isolated \r. Combined with the terminating newline, it might get + // interpreted as \r\n and dropped from the string contents. + $escaped = \preg_replace('/\\r(?!\\n)/', '\\r', $escaped); + if ($this->phpVersion->supportsFlexibleHeredoc()) { + $escaped = $this->indentString($escaped); + } } else { $escaped = \addcslashes($string, "\n\r\t\f\v\$" . $quote . "\\"); } @@ -880,30 +939,28 @@ protected function escapeString($string, $quote) | (?<=[\\xF0-\\xF4])[\\x80-\\xBF](?![\\x80-\\xBF]{2}) # Short 4 byte sequence | (?<=[\\xF0-\\xF4][\\x80-\\xBF])[\\x80-\\xBF](?![\\x80-\\xBF]) # Short 4 byte sequence (2) )/x'; - return \preg_replace_callback($regex, function ($matches) { + return \preg_replace_callback($regex, function ($matches) : string { \assert(\strlen($matches[0]) === 1); $hex = \dechex(\ord($matches[0])); return '\\x' . \str_pad($hex, 2, '0', \STR_PAD_LEFT); }, $escaped); } - protected function containsEndLabel($string, $label, $atStart = \true, $atEnd = \true) + protected function containsEndLabel(string $string, string $label, bool $atStart = \true) : bool { - $start = $atStart ? '(?:^|[\\r\\n])' : '[\\r\\n]'; - $end = $atEnd ? '(?:$|[;\\r\\n])' : '[;\\r\\n]'; - return \false !== \strpos($string, $label) && \preg_match('/' . $start . $label . $end . '/', $string); + $start = $atStart ? '(?:^|[\\r\\n])[ \\t]*' : '[\\r\\n][ \\t]*'; + return \false !== \strpos($string, $label) && \preg_match('/' . $start . $label . '(?:$|[^_A-Za-z0-9\\x80-\\xff])/', $string); } - protected function encapsedContainsEndLabel(array $parts, $label) + /** @param (Expr|Node\InterpolatedStringPart)[] $parts */ + protected function encapsedContainsEndLabel(array $parts, string $label) : bool { foreach ($parts as $i => $part) { - $atStart = $i === 0; - $atEnd = $i === \count($parts) - 1; - if ($part instanceof Scalar\EncapsedStringPart && $this->containsEndLabel($part->value, $label, $atStart, $atEnd)) { + if ($part instanceof Node\InterpolatedStringPart && $this->containsEndLabel($this->escapeString($part->value, null), $label, $i === 0)) { return \true; } } return \false; } - protected function pDereferenceLhs(Node $node) + protected function pDereferenceLhs(Node $node) : string { if (!$this->dereferenceLhsRequiresParens($node)) { return $this->p($node); @@ -911,7 +968,7 @@ protected function pDereferenceLhs(Node $node) return '(' . $this->p($node) . ')'; } } - protected function pStaticDereferenceLhs(Node $node) + protected function pStaticDereferenceLhs(Node $node) : string { if (!$this->staticDereferenceLhsRequiresParens($node)) { return $this->p($node); @@ -919,7 +976,7 @@ protected function pStaticDereferenceLhs(Node $node) return '(' . $this->p($node) . ')'; } } - protected function pCallLhs(Node $node) + protected function pCallLhs(Node $node) : string { if (!$this->callLhsRequiresParens($node)) { return $this->p($node); @@ -927,7 +984,7 @@ protected function pCallLhs(Node $node) return '(' . $this->p($node) . ')'; } } - protected function pNewVariable(Node $node) : string + protected function pNewOperand(Node $node) : string { if (!$this->newOperandRequiresParens($node)) { return $this->p($node); @@ -937,9 +994,8 @@ protected function pNewVariable(Node $node) : string } /** * @param Node[] $nodes - * @return bool */ - protected function hasNodeWithComments(array $nodes) + protected function hasNodeWithComments(array $nodes) : bool { foreach ($nodes as $node) { if ($node && $node->getComments()) { @@ -948,7 +1004,8 @@ protected function hasNodeWithComments(array $nodes) } return \false; } - protected function pMaybeMultiline(array $nodes, bool $trailingComma = \false) + /** @param Node[] $nodes */ + protected function pMaybeMultiline(array $nodes, bool $trailingComma = \false) : string { if (!$this->hasNodeWithComments($nodes)) { return $this->pCommaSeparated($nodes); @@ -956,6 +1013,26 @@ protected function pMaybeMultiline(array $nodes, bool $trailingComma = \false) return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; } } + /** @param Node\Param[] $params + */ + private function hasParamWithAttributes(array $params) : bool + { + foreach ($params as $param) { + if ($param->attrGroups) { + return \true; + } + } + return \false; + } + /** @param Node\Param[] $params */ + protected function pParams(array $params) : string + { + if ($this->hasNodeWithComments($params) || $this->hasParamWithAttributes($params) && !$this->phpVersion->supportsAttributes()) { + return $this->pCommaSeparatedMultiline($params, $this->phpVersion->supportsTrailingCommaInParamList()) . $this->nl; + } + return $this->pCommaSeparated($params); + } + /** @param Node\AttributeGroup[] $nodes */ protected function pAttrGroups(array $nodes, bool $inline = \false) : string { $result = ''; diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php index 918ff2165..2b2f2a0c3 100644 --- a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php @@ -4,166 +4,222 @@ namespace PhpParser; use PhpParser\Internal\DiffElem; +use PhpParser\Internal\Differ; use PhpParser\Internal\PrintableNewAnonClassNode; use PhpParser\Internal\TokenStream; +use PhpParser\Node\AttributeGroup; use PhpParser\Node\Expr; use PhpParser\Node\Expr\AssignOp; use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\Cast; +use PhpParser\Node\IntersectionType; +use PhpParser\Node\MatchArm; +use PhpParser\Node\Param; +use PhpParser\Node\PropertyHook; use PhpParser\Node\Scalar; use PhpParser\Node\Stmt; -abstract class PrettyPrinterAbstract +use PhpParser\Node\UnionType; +abstract class PrettyPrinterAbstract implements \PhpParser\PrettyPrinter { - const FIXUP_PREC_LEFT = 0; + protected const FIXUP_PREC_LEFT = 0; // LHS operand affected by precedence - const FIXUP_PREC_RIGHT = 1; + protected const FIXUP_PREC_RIGHT = 1; // RHS operand affected by precedence - const FIXUP_CALL_LHS = 2; + protected const FIXUP_PREC_UNARY = 2; + // Only operand affected by precedence + protected const FIXUP_CALL_LHS = 3; // LHS of call - const FIXUP_DEREF_LHS = 3; + protected const FIXUP_DEREF_LHS = 4; // LHS of dereferencing operation - const FIXUP_BRACED_NAME = 4; + protected const FIXUP_STATIC_DEREF_LHS = 5; + // LHS of static dereferencing operation + protected const FIXUP_BRACED_NAME = 6; // Name operand that may require bracing - const FIXUP_VAR_BRACED_NAME = 5; + protected const FIXUP_VAR_BRACED_NAME = 7; // Name operand that may require ${} bracing - const FIXUP_ENCAPSED = 6; + protected const FIXUP_ENCAPSED = 8; // Encapsed string part - const FIXUP_NEW = 7; + protected const FIXUP_NEW = 9; // New/instanceof operand - const FIXUP_STATIC_DEREF_LHS = 8; - // LHS of static dereferencing operation - protected $precedenceMap = [ - // [precedence, associativity] - // where for precedence -1 is %left, 0 is %nonassoc and 1 is %right - BinaryOp\Pow::class => [0, 1], - Expr\BitwiseNot::class => [10, 1], - Expr\PreInc::class => [10, 1], - Expr\PreDec::class => [10, 1], - Expr\PostInc::class => [10, -1], - Expr\PostDec::class => [10, -1], - Expr\UnaryPlus::class => [10, 1], - Expr\UnaryMinus::class => [10, 1], - Cast\Int_::class => [10, 1], - Cast\Double::class => [10, 1], - Cast\String_::class => [10, 1], - Cast\Array_::class => [10, 1], - Cast\Object_::class => [10, 1], - Cast\Bool_::class => [10, 1], - Cast\Unset_::class => [10, 1], - Expr\ErrorSuppress::class => [10, 1], - Expr\Instanceof_::class => [20, 0], - Expr\BooleanNot::class => [30, 1], - BinaryOp\Mul::class => [40, -1], - BinaryOp\Div::class => [40, -1], - BinaryOp\Mod::class => [40, -1], - BinaryOp\Plus::class => [50, -1], - BinaryOp\Minus::class => [50, -1], - BinaryOp\Concat::class => [50, -1], - BinaryOp\ShiftLeft::class => [60, -1], - BinaryOp\ShiftRight::class => [60, -1], - BinaryOp\Smaller::class => [70, 0], - BinaryOp\SmallerOrEqual::class => [70, 0], - BinaryOp\Greater::class => [70, 0], - BinaryOp\GreaterOrEqual::class => [70, 0], - BinaryOp\Equal::class => [80, 0], - BinaryOp\NotEqual::class => [80, 0], - BinaryOp\Identical::class => [80, 0], - BinaryOp\NotIdentical::class => [80, 0], - BinaryOp\Spaceship::class => [80, 0], - BinaryOp\BitwiseAnd::class => [90, -1], - BinaryOp\BitwiseXor::class => [100, -1], - BinaryOp\BitwiseOr::class => [110, -1], - BinaryOp\BooleanAnd::class => [120, -1], - BinaryOp\BooleanOr::class => [130, -1], - BinaryOp\Coalesce::class => [140, 1], - Expr\Ternary::class => [150, 0], - // parser uses %left for assignments, but they really behave as %right - Expr\Assign::class => [160, 1], - Expr\AssignRef::class => [160, 1], - AssignOp\Plus::class => [160, 1], - AssignOp\Minus::class => [160, 1], - AssignOp\Mul::class => [160, 1], - AssignOp\Div::class => [160, 1], - AssignOp\Concat::class => [160, 1], - AssignOp\Mod::class => [160, 1], - AssignOp\BitwiseAnd::class => [160, 1], - AssignOp\BitwiseOr::class => [160, 1], - AssignOp\BitwiseXor::class => [160, 1], - AssignOp\ShiftLeft::class => [160, 1], - AssignOp\ShiftRight::class => [160, 1], - AssignOp\Pow::class => [160, 1], - AssignOp\Coalesce::class => [160, 1], - Expr\YieldFrom::class => [165, 1], - Expr\Print_::class => [168, 1], - BinaryOp\LogicalAnd::class => [170, -1], - BinaryOp\LogicalXor::class => [180, -1], - BinaryOp\LogicalOr::class => [190, -1], - Expr\Include_::class => [200, -1], + protected const MAX_PRECEDENCE = 1000; + /** @var array */ + protected array $precedenceMap = [ + // [precedence, precedenceLHS, precedenceRHS] + // Where the latter two are the precedences to use for the LHS and RHS of a binary operator, + // where 1 is added to one of the sides depending on associativity. This information is not + // used for unary operators and set to -1. + Expr\Clone_::class => [-10, 0, 1], + BinaryOp\Pow::class => [0, 0, 1], + Expr\BitwiseNot::class => [10, -1, -1], + Expr\UnaryPlus::class => [10, -1, -1], + Expr\UnaryMinus::class => [10, -1, -1], + Cast\Int_::class => [10, -1, -1], + Cast\Double::class => [10, -1, -1], + Cast\String_::class => [10, -1, -1], + Cast\Array_::class => [10, -1, -1], + Cast\Object_::class => [10, -1, -1], + Cast\Bool_::class => [10, -1, -1], + Cast\Unset_::class => [10, -1, -1], + Expr\ErrorSuppress::class => [10, -1, -1], + Expr\Instanceof_::class => [20, -1, -1], + Expr\BooleanNot::class => [30, -1, -1], + BinaryOp\Mul::class => [40, 41, 40], + BinaryOp\Div::class => [40, 41, 40], + BinaryOp\Mod::class => [40, 41, 40], + BinaryOp\Plus::class => [50, 51, 50], + BinaryOp\Minus::class => [50, 51, 50], + BinaryOp\Concat::class => [50, 51, 50], + BinaryOp\ShiftLeft::class => [60, 61, 60], + BinaryOp\ShiftRight::class => [60, 61, 60], + BinaryOp\Smaller::class => [70, 70, 70], + BinaryOp\SmallerOrEqual::class => [70, 70, 70], + BinaryOp\Greater::class => [70, 70, 70], + BinaryOp\GreaterOrEqual::class => [70, 70, 70], + BinaryOp\Equal::class => [80, 80, 80], + BinaryOp\NotEqual::class => [80, 80, 80], + BinaryOp\Identical::class => [80, 80, 80], + BinaryOp\NotIdentical::class => [80, 80, 80], + BinaryOp\Spaceship::class => [80, 80, 80], + BinaryOp\BitwiseAnd::class => [90, 91, 90], + BinaryOp\BitwiseXor::class => [100, 101, 100], + BinaryOp\BitwiseOr::class => [110, 111, 110], + BinaryOp\BooleanAnd::class => [120, 121, 120], + BinaryOp\BooleanOr::class => [130, 131, 130], + BinaryOp\Coalesce::class => [140, 140, 141], + Expr\Ternary::class => [150, 150, 150], + Expr\Assign::class => [160, -1, -1], + Expr\AssignRef::class => [160, -1, -1], + AssignOp\Plus::class => [160, -1, -1], + AssignOp\Minus::class => [160, -1, -1], + AssignOp\Mul::class => [160, -1, -1], + AssignOp\Div::class => [160, -1, -1], + AssignOp\Concat::class => [160, -1, -1], + AssignOp\Mod::class => [160, -1, -1], + AssignOp\BitwiseAnd::class => [160, -1, -1], + AssignOp\BitwiseOr::class => [160, -1, -1], + AssignOp\BitwiseXor::class => [160, -1, -1], + AssignOp\ShiftLeft::class => [160, -1, -1], + AssignOp\ShiftRight::class => [160, -1, -1], + AssignOp\Pow::class => [160, -1, -1], + AssignOp\Coalesce::class => [160, -1, -1], + Expr\YieldFrom::class => [170, -1, -1], + Expr\Yield_::class => [175, -1, -1], + Expr\Print_::class => [180, -1, -1], + BinaryOp\LogicalAnd::class => [190, 191, 190], + BinaryOp\LogicalXor::class => [200, 201, 200], + BinaryOp\LogicalOr::class => [210, 211, 210], + Expr\Include_::class => [220, -1, -1], + Expr\ArrowFunction::class => [230, -1, -1], + Expr\Throw_::class => [240, -1, -1], ]; /** @var int Current indentation level. */ - protected $indentLevel; + protected int $indentLevel; + /** @var string String for single level of indentation */ + private string $indent; + /** @var int Width in spaces to indent by. */ + private int $indentWidth; + /** @var bool Whether to use tab indentation. */ + private bool $useTabs; + /** @var int Width in spaces of one tab. */ + private int $tabWidth = 4; + /** @var string Newline style. Does not include current indentation. */ + protected string $newline; /** @var string Newline including current indentation. */ - protected $nl; - /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ - protected $docStringEndToken; + protected string $nl; + /** @var string|null Token placed at end of doc string to ensure it is followed by a newline. + * Null if flexible doc strings are used. */ + protected ?string $docStringEndToken; /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ - protected $canUseSemicolonNamespaces; - /** @var array Pretty printer options */ - protected $options; - /** @var TokenStream Original tokens for use in format-preserving pretty print */ - protected $origTokens; - /** @var Internal\Differ Differ for node lists */ - protected $nodeListDiffer; - /** @var bool[] Map determining whether a certain character is a label character */ - protected $labelCharMap; + protected bool $canUseSemicolonNamespaces; + /** @var bool Whether to use short array syntax if the node specifies no preference */ + protected bool $shortArraySyntax; + /** @var PhpVersion PHP version to target */ + protected \PhpParser\PhpVersion $phpVersion; + /** @var TokenStream|null Original tokens for use in format-preserving pretty print */ + protected ?TokenStream $origTokens; + /** @var Internal\Differ Differ for node lists */ + protected Differ $nodeListDiffer; + /** @var array Map determining whether a certain character is a label character */ + protected array $labelCharMap; + /** + * @var array> Map from token classes and subnode names to FIXUP_* constants. + * This is used during format-preserving prints to place additional parens/braces if necessary. + */ + protected array $fixupMap; /** - * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used - * during format-preserving prints to place additional parens/braces if necessary. + * @var array Map from "{$node->getType()}->{$subNode}" + * to ['left' => $l, 'right' => $r], where $l and $r specify the token type that needs to be stripped + * when removing this node. */ - protected $fixupMap; + protected array $removalMap; /** - * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], - * where $l and $r specify the token type that needs to be stripped when removing - * this node. + * @var array Map from + * "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. + * $find is an optional token after which the insertion occurs. $extraLeft/Right + * are optionally added before/after the main insertions. */ - protected $removalMap; + protected array $insertionMap; /** - * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. - * $find is an optional token after which the insertion occurs. $extraLeft/Right - * are optionally added before/after the main insertions. + * @var array Map From "{$class}->{$subNode}" to string that should be inserted + * between elements of this list subnode. */ - protected $insertionMap; + protected array $listInsertionMap; /** - * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted - * between elements of this list subnode. + * @var array */ - protected $listInsertionMap; - protected $emptyListInsertionMap; - /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers - * should be reprinted. */ - protected $modifierChangeMap; + protected array $emptyListInsertionMap; + /** @var array Map from "{$class}->{$subNode}" to [$printFn, $token] + * where $printFn is the function to print the modifiers and $token is the token before which + * the modifiers should be reprinted. */ + protected array $modifierChangeMap; /** * Creates a pretty printer instance using the given options. * * Supported options: - * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array - * syntax, if the node does not specify a format. + * * PhpVersion $phpVersion: The PHP version to target (default to PHP 7.4). This option + * controls compatibility of the generated code with older PHP + * versions in cases where a simple stylistic choice exists (e.g. + * array() vs []). It is safe to pretty-print an AST for a newer + * PHP version while specifying an older target (but the result will + * of course not be compatible with the older version in that case). + * * string $newline: The newline style to use. Should be "\n" (default) or "\r\n". + * * string $indent: The indentation to use. Should either be all spaces or a single + * tab. Defaults to four spaces (" "). + * * bool $shortArraySyntax: Whether to use [] instead of array() as the default array + * syntax, if the node does not specify a format. Defaults to whether + * the phpVersion support short array syntax. * - * @param array $options Dictionary of formatting options + * @param array{ + * phpVersion?: PhpVersion, newline?: string, indent?: string, shortArraySyntax?: bool + * } $options Dictionary of formatting options */ public function __construct(array $options = []) { - $this->docStringEndToken = '_DOC_STRING_END_' . \mt_rand(); - $defaultOptions = ['shortArraySyntax' => \false]; - $this->options = $options + $defaultOptions; + $this->phpVersion = $options['phpVersion'] ?? \PhpParser\PhpVersion::fromComponents(7, 4); + $this->newline = $options['newline'] ?? "\n"; + if ($this->newline !== "\n" && $this->newline != "\r\n") { + throw new \LogicException('Option "newline" must be one of "\\n" or "\\r\\n"'); + } + $this->shortArraySyntax = $options['shortArraySyntax'] ?? $this->phpVersion->supportsShortArraySyntax(); + $this->docStringEndToken = $this->phpVersion->supportsFlexibleHeredoc() ? null : '_DOC_STRING_END_' . \mt_rand(); + $this->indent = $indent = $options['indent'] ?? ' '; + if ($indent === "\t") { + $this->useTabs = \true; + $this->indentWidth = $this->tabWidth; + } elseif ($indent === \str_repeat(' ', \strlen($indent))) { + $this->useTabs = \false; + $this->indentWidth = \strlen($indent); + } else { + throw new \LogicException('Option "indent" must either be all spaces or a single tab'); + } } /** * Reset pretty printing state. */ - protected function resetState() + protected function resetState() : void { $this->indentLevel = 0; - $this->nl = "\n"; + $this->nl = $this->newline; $this->origTokens = null; } /** @@ -171,27 +227,32 @@ protected function resetState() * * @param int $level Level in number of spaces */ - protected function setIndentLevel(int $level) + protected function setIndentLevel(int $level) : void { $this->indentLevel = $level; - $this->nl = "\n" . \str_repeat(' ', $level); + if ($this->useTabs) { + $tabs = \intdiv($level, $this->tabWidth); + $spaces = $level % $this->tabWidth; + $this->nl = $this->newline . \str_repeat("\t", $tabs) . \str_repeat(' ', $spaces); + } else { + $this->nl = $this->newline . \str_repeat(' ', $level); + } } /** * Increase indentation level. */ - protected function indent() + protected function indent() : void { - $this->indentLevel += 4; - $this->nl .= ' '; + $this->indentLevel += $this->indentWidth; + $this->nl .= $this->indent; } /** * Decrease indentation level. */ - protected function outdent() + protected function outdent() : void { - \assert($this->indentLevel >= 4); - $this->indentLevel -= 4; - $this->nl = "\n" . \str_repeat(' ', $this->indentLevel); + \assert($this->indentLevel >= $this->indentWidth); + $this->setIndentLevel($this->indentLevel - $this->indentWidth); } /** * Pretty prints an array of statements. @@ -228,11 +289,11 @@ public function prettyPrintExpr(Expr $node) : string public function prettyPrintFile(array $stmts) : string { if (!$stmts) { - return "newline . $this->newline; } - $p = "prettyPrint($stmts); + $p = "newline . $this->newline . $this->prettyPrint($stmts); if ($stmts[0] instanceof Stmt\InlineHTML) { - $p = \preg_replace('/^<\\?php\\s+\\?>\\n?/', '', $p); + $p = \preg_replace('/^<\\?php\\s+\\?>\\r?\\n?/', '', $p); } if ($stmts[\count($stmts) - 1] instanceof Stmt\InlineHTML) { $p = \preg_replace('/<\\?php$/', '', \rtrim($p)); @@ -244,7 +305,7 @@ public function prettyPrintFile(array $stmts) : string * * @param Node[] $nodes Array of nodes */ - protected function preprocessNodes(array $nodes) + protected function preprocessNodes(array $nodes) : void { /* We can use semicolon-namespaces unless there is a global namespace declaration */ $this->canUseSemicolonNamespaces = \true; @@ -256,23 +317,22 @@ protected function preprocessNodes(array $nodes) } } /** - * Handles (and removes) no-indent and doc-string-end tokens. - * - * @param string $str - * @return string + * Handles (and removes) doc-string-end tokens. */ protected function handleMagicTokens(string $str) : string { - // Replace doc-string-end tokens with nothing or a newline - $str = \str_replace($this->docStringEndToken . ";\n", ";\n", $str); - $str = \str_replace($this->docStringEndToken, "\n", $str); + if ($this->docStringEndToken !== null) { + // Replace doc-string-end tokens with nothing or a newline + $str = \str_replace($this->docStringEndToken . ';' . $this->newline, ';' . $this->newline, $str); + $str = \str_replace($this->docStringEndToken, $this->newline, $str); + } return $str; } /** * Pretty prints an array of nodes (statements) and indents them optionally. * - * @param Node[] $nodes Array of nodes - * @param bool $indent Whether to indent the printed nodes + * @param Node[] $nodes Array of nodes + * @param bool $indent Whether to indent the printed nodes * * @return string Pretty printed statements */ @@ -300,76 +360,88 @@ protected function pStmts(array $nodes, bool $indent = \true) : string /** * Pretty-print an infix operation while taking precedence into account. * - * @param string $class Node class of operator - * @param Node $leftNode Left-hand side node + * @param string $class Node class of operator + * @param Node $leftNode Left-hand side node * @param string $operatorString String representation of the operator - * @param Node $rightNode Right-hand side node + * @param Node $rightNode Right-hand side node + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed infix operation */ - protected function pInfixOp(string $class, \PhpParser\Node $leftNode, string $operatorString, \PhpParser\Node $rightNode) : string + protected function pInfixOp(string $class, \PhpParser\Node $leftNode, string $operatorString, \PhpParser\Node $rightNode, int $precedence, int $lhsPrecedence) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $this->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . $this->pPrec($rightNode, $precedence, $associativity, 1); + list($opPrecedence, $newPrecedenceLHS, $newPrecedenceRHS) = $this->precedenceMap[$class]; + $prefix = ''; + $suffix = ''; + if ($opPrecedence >= $precedence) { + $prefix = '('; + $suffix = ')'; + $lhsPrecedence = self::MAX_PRECEDENCE; + } + return $prefix . $this->p($leftNode, $newPrecedenceLHS, $newPrecedenceLHS) . $operatorString . $this->p($rightNode, $newPrecedenceRHS, $lhsPrecedence) . $suffix; } /** * Pretty-print a prefix operation while taking precedence into account. * - * @param string $class Node class of operator + * @param string $class Node class of operator * @param string $operatorString String representation of the operator - * @param Node $node Node + * @param Node $node Node + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed prefix operation */ - protected function pPrefixOp(string $class, string $operatorString, \PhpParser\Node $node) : string + protected function pPrefixOp(string $class, string $operatorString, \PhpParser\Node $node, int $precedence, int $lhsPrecedence) : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); + $opPrecedence = $this->precedenceMap[$class][0]; + $prefix = ''; + $suffix = ''; + if ($opPrecedence >= $lhsPrecedence) { + $prefix = '('; + $suffix = ')'; + $lhsPrecedence = self::MAX_PRECEDENCE; + } + $printedArg = $this->p($node, $opPrecedence, $lhsPrecedence); + if ($operatorString === '+' && $printedArg[0] === '+' || $operatorString === '-' && $printedArg[0] === '-') { + // Avoid printing +(+$a) as ++$a and similar. + $printedArg = '(' . $printedArg . ')'; + } + return $prefix . $operatorString . $printedArg . $suffix; } /** * Pretty-print a postfix operation while taking precedence into account. * - * @param string $class Node class of operator + * @param string $class Node class of operator * @param string $operatorString String representation of the operator - * @param Node $node Node + * @param Node $node Node + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * * @return string Pretty printed postfix operation */ - protected function pPostfixOp(string $class, \PhpParser\Node $node, string $operatorString) : string - { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; - } - /** - * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. - * - * @param Node $node Node to pretty print - * @param int $parentPrecedence Precedence of the parent operator - * @param int $parentAssociativity Associativity of parent operator - * (-1 is left, 0 is nonassoc, 1 is right) - * @param int $childPosition Position of the node relative to the operator - * (-1 is left, 1 is right) - * - * @return string The pretty printed node - */ - protected function pPrec(\PhpParser\Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string + protected function pPostfixOp(string $class, \PhpParser\Node $node, string $operatorString, int $precedence, int $lhsPrecedence) : string { - $class = \get_class($node); - if (isset($this->precedenceMap[$class])) { - $childPrecedence = $this->precedenceMap[$class][0]; - if ($childPrecedence > $parentPrecedence || $parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) { - return '(' . $this->p($node) . ')'; - } + $opPrecedence = $this->precedenceMap[$class][0]; + $prefix = ''; + $suffix = ''; + if ($opPrecedence >= $precedence) { + $prefix = '('; + $suffix = ')'; + $lhsPrecedence = self::MAX_PRECEDENCE; + } + if ($opPrecedence < $lhsPrecedence) { + $lhsPrecedence = $opPrecedence; } - return $this->p($node); + return $prefix . $this->p($node, $opPrecedence, $lhsPrecedence) . $operatorString . $suffix; } /** * Pretty prints an array of nodes and implodes the printed values. * * @param Node[] $nodes Array of Nodes to be printed - * @param string $glue Character to implode with + * @param string $glue Character to implode with * - * @return string Imploded pretty printed nodes + * @return string Imploded pretty printed nodes> $pre */ protected function pImplode(array $nodes, string $glue = '') : string { @@ -399,8 +471,8 @@ protected function pCommaSeparated(array $nodes) : string * * The result includes a leading newline and one level of indentation (same as pStmts). * - * @param Node[] $nodes Array of Nodes to be printed - * @param bool $trailingComma Whether to use a trailing comma + * @param Node[] $nodes Array of Nodes to be printed + * @param bool $trailingComma Whether to use a trailing comma * * @return string Comma separated pretty printed nodes in multiline style */ @@ -452,11 +524,9 @@ protected function pComments(array $comments) : string * * The CloningVisitor must be run on the AST prior to modification. * * The original tokens must be provided, using the getTokens() method on the lexer. * - * @param Node[] $stmts Modified AST with links to original AST - * @param Node[] $origStmts Original AST with token offset information - * @param array $origTokens Tokens of the original code - * - * @return string + * @param Node[] $stmts Modified AST with links to original AST + * @param Node[] $origStmts Original AST with token offset information + * @param Token[] $origTokens Tokens of the original code */ public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string { @@ -469,22 +539,22 @@ public function printFormatPreserving(array $stmts, array $origStmts, array $ori $this->initializeEmptyListInsertionMap(); $this->initializeModifierChangeMap(); $this->resetState(); - $this->origTokens = new TokenStream($origTokens); + $this->origTokens = new TokenStream($origTokens, $this->tabWidth); $this->preprocessNodes($stmts); $pos = 0; $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); if (null !== $result) { - $result .= $this->origTokens->getTokenCode($pos, \count($origTokens), 0); + $result .= $this->origTokens->getTokenCode($pos, \count($origTokens) - 1, 0); } else { // Fallback // TODO Add pStmts($stmts, \false); + $result = "newline . $this->pStmts($stmts, \false); } - return \ltrim($this->handleMagicTokens($result)); + return $this->handleMagicTokens($result); } - protected function pFallback(\PhpParser\Node $node) + protected function pFallback(\PhpParser\Node $node, int $precedence, int $lhsPrecedence) : string { - return $this->{'p' . $node->getType()}($node); + return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence); } /** * Pretty prints a node. @@ -492,20 +562,22 @@ protected function pFallback(\PhpParser\Node $node) * This method also handles formatting preservation for nodes. * * @param Node $node Node to be pretty printed + * @param int $precedence Precedence of parent operator + * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator * @param bool $parentFormatPreserved Whether parent node has preserved formatting * * @return string Pretty printed node */ - protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : string + protected function p(\PhpParser\Node $node, int $precedence = self::MAX_PRECEDENCE, int $lhsPrecedence = self::MAX_PRECEDENCE, bool $parentFormatPreserved = \false) : string { // No orig tokens means this is a normal pretty print without preservation of formatting if (!$this->origTokens) { - return $this->{'p' . $node->getType()}($node); + return $this->{'p' . $node->getType()}($node, $precedence, $lhsPrecedence); } - /** @var Node $origNode */ + /** @var Node|null $origNode */ $origNode = $node->getAttribute('origNode'); if (null === $origNode) { - return $this->pFallback($node); + return $this->pFallback($node, $precedence, $lhsPrecedence); } $class = \get_class($node); \assert($class === \get_class($origNode)); @@ -515,14 +587,16 @@ protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : s $fallbackNode = $node; if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { // Normalize node structure of anonymous classes + \assert($origNode instanceof Expr\New_); $node = PrintableNewAnonClassNode::fromNewNode($node); $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); + $class = PrintableNewAnonClassNode::class; } // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting // is not preserved, then we need to use the fallback code to make sure the tags are // printed. if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); $type = $node->getType(); @@ -539,28 +613,22 @@ protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : s } if (\is_array($subNode) && \is_array($origSubNode)) { // Array subnode changed, we might be able to reconstruct it - $listResult = $this->pArray($subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, $fixupInfo[$subNodeName] ?? null); + $listResult = $this->pArray($subNode, $origSubNode, $pos, $indentAdjustment, $class, $subNodeName, $fixupInfo[$subNodeName] ?? null); if (null === $listResult) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } $result .= $listResult; continue; } - if (\is_int($subNode) && \is_int($origSubNode)) { - // Check if this is a modifier change - $key = $type . '->' . $subNodeName; - if (!isset($this->modifierChangeMap[$key])) { - return $this->pFallback($fallbackNode); - } - $findToken = $this->modifierChangeMap[$key]; - $result .= $this->pModifiers($subNode); - $pos = $this->origTokens->findRight($pos, $findToken); - continue; + // Check if this is a modifier change + $key = $class . '->' . $subNodeName; + if (!isset($this->modifierChangeMap[$key])) { + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } - // If a non-node, non-array subnode changed, we don't be able to do a partial - // reconstructions, as we don't have enough offset information. Pretty print the - // whole node instead. - return $this->pFallback($fallbackNode); + [$printFn, $findToken] = $this->modifierChangeMap[$key]; + $result .= $this->{$printFn}($subNode); + $pos = $this->origTokens->findRight($pos, $findToken); + continue; } $extraLeft = ''; $extraRight = ''; @@ -576,7 +644,7 @@ protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : s // A node has been inserted, check if we have insertion information for it $key = $type . '->' . $subNodeName; if (!isset($this->insertionMap[$key])) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; if (null !== $findToken) { @@ -594,7 +662,7 @@ protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : s // A node has been removed, check if we have removal information for it $key = $type . '->' . $subNodeName; if (!isset($this->removalMap[$key])) { - return $this->pFallback($fallbackNode); + return $this->pFallback($fallbackNode, $precedence, $lhsPrecedence); } // Adjust positions to account for additional tokens that must be skipped $removalInfo = $this->removalMap[$key]; @@ -617,7 +685,7 @@ protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : s $fixup = $fixupInfo[$subNodeName]; $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); } else { - $res = $this->p($subNode, \true); + $res = $this->p($subNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, \true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); @@ -631,20 +699,20 @@ protected function p(\PhpParser\Node $node, $parentFormatPreserved = \false) : s /** * Perform a format-preserving pretty print of an array. * - * @param array $nodes New nodes - * @param array $origNodes Original nodes - * @param int $pos Current token position (updated by reference) - * @param int $indentAdjustment Adjustment for indentation - * @param string $parentNodeType Type of the containing node. - * @param string $subNodeName Name of array subnode. - * @param null|int $fixup Fixup information for array item nodes + * @param Node[] $nodes New nodes + * @param Node[] $origNodes Original nodes + * @param int $pos Current token position (updated by reference) + * @param int $indentAdjustment Adjustment for indentation + * @param string $parentNodeClass Class of the containing node. + * @param string $subNodeName Name of array subnode. + * @param null|int $fixup Fixup information for array item nodes * * @return null|string Result of pretty print or null if cannot preserve formatting */ - protected function pArray(array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeType, string $subNodeName, $fixup) + protected function pArray(array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeClass, string $subNodeName, ?int $fixup) : ?string { $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); - $mapKey = $parentNodeType . '->' . $subNodeName; + $mapKey = $parentNodeClass . '->' . $subNodeName; $insertStr = $this->listInsertionMap[$mapKey] ?? null; $isStmtList = $subNodeName === 'stmts'; $beforeFirstKeepOrReplace = \true; @@ -671,9 +739,9 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent $result = ''; foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; - /** @var Node|null $arrItem */ + /** @var Node|string|null $arrItem */ $arrItem = $diffElem->new; - /** @var Node|null $origArrItem */ + /** @var Node|string|null $origArrItem */ $origArrItem = $diffElem->old; if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { $beforeFirstKeepOrReplace = \false; @@ -704,8 +772,8 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent $commentStartPos = $itemStartPos; } if ($skipRemovedNode) { - if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || $this->origTokens->haveTagInRange($pos, $itemStartPos))) { - // We'd remove the brace of a code block. + if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) { + // We'd remove an opening/closing PHP tag. // TODO: Preserve formatting. $this->setIndentLevel($origIndentLevel); return null; @@ -722,7 +790,7 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent $result .= $this->pComments($delayedAddComments) . $this->nl; } } - $this->safeAppend($result, $this->p($delayedAddNode, \true)); + $this->safeAppend($result, $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, \true)); if ($insertNewline) { $result .= $insertStr . $this->nl; } else { @@ -745,9 +813,14 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent // We don't have insertion information for this list type return null; } + if (!$arrItem instanceof \PhpParser\Node) { + // We only support list insertion of nodes. + return null; + } // We go multiline if the original code was multiline, // or if it's an array item with a comment above it. - if ($insertStr === ', ' && ($this->isMultiline($origNodes) || $arrItem->getComments())) { + // Match always uses multiline formatting. + if ($insertStr === ', ' && ($this->isMultiline($origNodes) || $arrItem->getComments() || $parentNodeClass === Expr\Match_::class)) { $insertStr = ','; $insertNewline = \true; } @@ -788,8 +861,8 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent $result .= $this->origTokens->getTokenCode($pos, $itemStartPos, $indentAdjustment); $skipRemovedNode = \true; } else { - if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || $this->origTokens->haveTagInRange($pos, $itemStartPos))) { - // We'd remove the brace of a code block. + if ($isStmtList && $this->origTokens->haveTagInRange($pos, $itemStartPos)) { + // We'd remove an opening/closing PHP tag. // TODO: Preserve formatting. return null; } @@ -802,7 +875,7 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); } else { - $res = $this->p($arrItem, \true); + $res = $this->p($arrItem, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, \true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); @@ -831,7 +904,7 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent $result .= $this->nl; } } - $result .= $this->p($delayedAddNode, \true); + $result .= $this->p($delayedAddNode, self::MAX_PRECEDENCE, self::MAX_PRECEDENCE, \true); $first = \false; } $result .= $extraRight === "\n" ? $this->nl : $extraRight; @@ -845,22 +918,34 @@ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indent * are required to preserve program semantics in a certain context (e.g. to maintain precedence * or because only certain expressions are allowed in certain places). * - * @param int $fixup Fixup type - * @param Node $subNode Subnode to print + * @param int $fixup Fixup type + * @param Node $subNode Subnode to print * @param string|null $parentClass Class of parent node - * @param int $subStartPos Original start pos of subnode - * @param int $subEndPos Original end pos of subnode + * @param int $subStartPos Original start pos of subnode + * @param int $subEndPos Original end pos of subnode * * @return string Result of fixed-up print of subnode */ - protected function pFixup(int $fixup, \PhpParser\Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string + protected function pFixup(int $fixup, \PhpParser\Node $subNode, ?string $parentClass, int $subStartPos, int $subEndPos) : string { switch ($fixup) { case self::FIXUP_PREC_LEFT: + // We use a conservative approximation where lhsPrecedence == precedence. + if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { + $precedence = $this->precedenceMap[$parentClass][1]; + return $this->p($subNode, $precedence, $precedence); + } + break; case self::FIXUP_PREC_RIGHT: if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { - list($precedence, $associativity) = $this->precedenceMap[$parentClass]; - return $this->pPrec($subNode, $precedence, $associativity, $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); + $precedence = $this->precedenceMap[$parentClass][2]; + return $this->p($subNode, $precedence, $precedence); + } + break; + case self::FIXUP_PREC_UNARY: + if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { + $precedence = $this->precedenceMap[$parentClass][0]; + return $this->p($subNode, $precedence, $precedence); } break; case self::FIXUP_CALL_LHS: @@ -890,7 +975,7 @@ protected function pFixup(int $fixup, \PhpParser\Node $subNode, $parentClass, in } break; case self::FIXUP_ENCAPSED: - if (!$subNode instanceof Scalar\EncapsedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { + if (!$subNode instanceof \PhpParser\Node\InterpolatedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { return '{' . $this->p($subNode) . '}'; } break; @@ -905,11 +990,8 @@ protected function pFixup(int $fixup, \PhpParser\Node $subNode, $parentClass, in * * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". * Without safeAppend the result would be "echox", which does not preserve semantics. - * - * @param string $str - * @param string $append */ - protected function safeAppend(string &$str, string $append) + protected function safeAppend(string &$str, string $append) : void { if ($str === "") { $str = $append; @@ -985,9 +1067,13 @@ protected function newOperandRequiresParens(\PhpParser\Node $node) : bool * * @return string Printed modifiers */ - protected function pModifiers(int $modifiers) + protected function pModifiers(int $modifiers) : string + { + return ($modifiers & \PhpParser\Modifiers::FINAL ? 'final ' : '') . ($modifiers & \PhpParser\Modifiers::ABSTRACT ? 'abstract ' : '') . ($modifiers & \PhpParser\Modifiers::PUBLIC ? 'public ' : '') . ($modifiers & \PhpParser\Modifiers::PROTECTED ? 'protected ' : '') . ($modifiers & \PhpParser\Modifiers::PRIVATE ? 'private ' : '') . ($modifiers & \PhpParser\Modifiers::PUBLIC_SET ? 'public(set) ' : '') . ($modifiers & \PhpParser\Modifiers::PROTECTED_SET ? 'protected(set) ' : '') . ($modifiers & \PhpParser\Modifiers::PRIVATE_SET ? 'private(set) ' : '') . ($modifiers & \PhpParser\Modifiers::STATIC ? 'static ' : '') . ($modifiers & \PhpParser\Modifiers::READONLY ? 'readonly ' : ''); + } + protected function pStatic(bool $static) : string { - return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); + return $static ? 'static ' : ''; } /** * Determine whether a list of nodes uses multiline formatting. @@ -1025,17 +1111,18 @@ protected function isMultiline(array $nodes) : bool * * The label char map determines whether a certain character may occur in a label. */ - protected function initializeLabelCharMap() + protected function initializeLabelCharMap() : void { - if ($this->labelCharMap) { + if (isset($this->labelCharMap)) { return; } $this->labelCharMap = []; for ($i = 0; $i < 256; $i++) { - // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for - // older versions. $chr = \chr($i); - $this->labelCharMap[$chr] = $i >= 0x7f || \ctype_alnum($chr); + $this->labelCharMap[$chr] = $i >= 0x80 || \ctype_alnum($chr); + } + if ($this->phpVersion->allowsDelInIdentifiers()) { + $this->labelCharMap[""] = \true; } } /** @@ -1043,9 +1130,9 @@ protected function initializeLabelCharMap() * * The node list differ is used to determine differences between two array subnodes. */ - protected function initializeNodeListDiffer() + protected function initializeNodeListDiffer() : void { - if ($this->nodeListDiffer) { + if (isset($this->nodeListDiffer)) { return; } $this->nodeListDiffer = new \PhpParser\Internal\Differ(function ($a, $b) { @@ -1062,23 +1149,19 @@ protected function initializeNodeListDiffer() * The fixup map is used to determine whether a certain subnode of a certain node may require * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. */ - protected function initializeFixupMap() + protected function initializeFixupMap() : void { - if ($this->fixupMap) { + if (isset($this->fixupMap)) { return; } - $this->fixupMap = [Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], Expr\Instanceof_::class => ['expr' => self::FIXUP_PREC_LEFT, 'class' => self::FIXUP_NEW], Expr\Ternary::class => ['cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT], Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS], Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], Expr\ClassConstFetch::class => ['class' => self::FIXUP_STATIC_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\New_::class => ['class' => self::FIXUP_NEW], Expr\MethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\NullsafeMethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\StaticPropertyFetch::class => ['class' => self::FIXUP_STATIC_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME], Expr\PropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\NullsafePropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Scalar\Encapsed::class => ['parts' => self::FIXUP_ENCAPSED]]; + $this->fixupMap = [Expr\Instanceof_::class => ['expr' => self::FIXUP_PREC_UNARY, 'class' => self::FIXUP_NEW], Expr\Ternary::class => ['cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT], Expr\Yield_::class => ['value' => self::FIXUP_PREC_UNARY], Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS], Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], Expr\ClassConstFetch::class => ['class' => self::FIXUP_STATIC_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\New_::class => ['class' => self::FIXUP_NEW], Expr\MethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\NullsafeMethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\StaticPropertyFetch::class => ['class' => self::FIXUP_STATIC_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME], Expr\PropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\NullsafePropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Scalar\InterpolatedString::class => ['parts' => self::FIXUP_ENCAPSED]]; $binaryOps = [BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class]; foreach ($binaryOps as $binaryOp) { $this->fixupMap[$binaryOp] = ['left' => self::FIXUP_PREC_LEFT, 'right' => self::FIXUP_PREC_RIGHT]; } - $assignOps = [Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class]; - foreach ($assignOps as $assignOp) { - $this->fixupMap[$assignOp] = ['var' => self::FIXUP_PREC_LEFT, 'expr' => self::FIXUP_PREC_RIGHT]; - } - $prefixOps = [Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class]; + $prefixOps = [Expr\Clone_::class, Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class, Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class, Expr\ArrowFunction::class, Expr\Throw_::class]; foreach ($prefixOps as $prefixOp) { - $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; + $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_UNARY]; } } /** @@ -1087,9 +1170,9 @@ protected function initializeFixupMap() * The removal map is used to determine which additional tokens should be removed when a * certain node is replaced by null. */ - protected function initializeRemovalMap() + protected function initializeRemovalMap() : void { - if ($this->removalMap) { + if (isset($this->removalMap)) { return; } $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; @@ -1098,20 +1181,20 @@ protected function initializeRemovalMap() $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; $stripColon = ['left' => ':']; $stripEquals = ['left' => '=']; - $this->removalMap = ['Expr_ArrayDimFetch->dim' => $stripBoth, 'Expr_ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, 'Stmt_ClassConst->type' => $stripRight, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, 'Stmt_EnumCase->expr' => $stripEquals, 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'Stmt_PropertyProperty->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft]; + $this->removalMap = ['Expr_ArrayDimFetch->dim' => $stripBoth, 'ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, 'Stmt_ClassConst->type' => $stripRight, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, 'Stmt_EnumCase->expr' => $stripEquals, 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'PropertyItem->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft]; } - protected function initializeInsertionMap() + protected function initializeInsertionMap() : void { - if ($this->insertionMap) { + if (isset($this->insertionMap)) { return; } // TODO: "yield" where both key and value are inserted doesn't work // [$find, $beforeToken, $extraLeft, $extraRight] $this->insertionMap = [ 'Expr_ArrayDimFetch->dim' => ['[', \false, null, null], - 'Expr_ArrayItem->key' => [null, \false, null, ' => '], - 'Expr_ArrowFunction->returnType' => [')', \false, ' : ', null], - 'Expr_Closure->returnType' => [')', \false, ' : ', null], + 'ArrayItem->key' => [null, \false, null, ' => '], + 'Expr_ArrowFunction->returnType' => [')', \false, ': ', null], + 'Expr_Closure->returnType' => [')', \false, ': ', null], 'Expr_Ternary->if' => ['?', \false, ' ', ' '], 'Expr_Yield->key' => [\T_YIELD, \false, null, ' => '], 'Expr_Yield->value' => [\T_YIELD, \false, ' ', null], @@ -1119,136 +1202,143 @@ protected function initializeInsertionMap() 'Param->default' => [null, \false, ' = ', null], 'Stmt_Break->num' => [\T_BREAK, \false, ' ', null], 'Stmt_Catch->var' => [null, \false, ' ', null], - 'Stmt_ClassMethod->returnType' => [')', \false, ' : ', null], + 'Stmt_ClassMethod->returnType' => [')', \false, ': ', null], 'Stmt_ClassConst->type' => [\T_CONST, \false, ' ', null], 'Stmt_Class->extends' => [null, \false, ' extends ', null], 'Stmt_Enum->scalarType' => [null, \false, ' : ', null], 'Stmt_EnumCase->expr' => [null, \false, ' = ', null], - 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], + 'Expr_PrintableNewAnonClass->extends' => [null, \false, ' extends ', null], 'Stmt_Continue->num' => [\T_CONTINUE, \false, ' ', null], 'Stmt_Foreach->keyVar' => [\T_AS, \false, null, ' => '], - 'Stmt_Function->returnType' => [')', \false, ' : ', null], + 'Stmt_Function->returnType' => [')', \false, ': ', null], 'Stmt_If->else' => [null, \false, ' ', null], 'Stmt_Namespace->name' => [\T_NAMESPACE, \false, ' ', null], 'Stmt_Property->type' => [\T_VARIABLE, \true, null, ' '], - 'Stmt_PropertyProperty->default' => [null, \false, ' = ', null], + 'PropertyItem->default' => [null, \false, ' = ', null], 'Stmt_Return->expr' => [\T_RETURN, \false, ' ', null], 'Stmt_StaticVar->default' => [null, \false, ' = ', null], //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO 'Stmt_TryCatch->finally' => [null, \false, ' ', null], ]; } - protected function initializeListInsertionMap() + protected function initializeListInsertionMap() : void { - if ($this->listInsertionMap) { + if (isset($this->listInsertionMap)) { return; } $this->listInsertionMap = [ // special //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully - //'Scalar_Encapsed->parts' => '', - 'Stmt_Catch->types' => '|', - 'UnionType->types' => '|', - 'IntersectionType->types' => '&', - 'Stmt_If->elseifs' => ' ', - 'Stmt_TryCatch->catches' => ' ', + //'Scalar_InterpolatedString->parts' => '', + Stmt\Catch_::class . '->types' => '|', + UnionType::class . '->types' => '|', + IntersectionType::class . '->types' => '&', + Stmt\If_::class . '->elseifs' => ' ', + Stmt\TryCatch::class . '->catches' => ' ', // comma-separated lists - 'Expr_Array->items' => ', ', - 'Expr_ArrowFunction->params' => ', ', - 'Expr_Closure->params' => ', ', - 'Expr_Closure->uses' => ', ', - 'Expr_FuncCall->args' => ', ', - 'Expr_Isset->vars' => ', ', - 'Expr_List->items' => ', ', - 'Expr_MethodCall->args' => ', ', - 'Expr_NullsafeMethodCall->args' => ', ', - 'Expr_New->args' => ', ', - 'Expr_PrintableNewAnonClass->args' => ', ', - 'Expr_StaticCall->args' => ', ', - 'Stmt_ClassConst->consts' => ', ', - 'Stmt_ClassMethod->params' => ', ', - 'Stmt_Class->implements' => ', ', - 'Stmt_Enum->implements' => ', ', - 'Expr_PrintableNewAnonClass->implements' => ', ', - 'Stmt_Const->consts' => ', ', - 'Stmt_Declare->declares' => ', ', - 'Stmt_Echo->exprs' => ', ', - 'Stmt_For->init' => ', ', - 'Stmt_For->cond' => ', ', - 'Stmt_For->loop' => ', ', - 'Stmt_Function->params' => ', ', - 'Stmt_Global->vars' => ', ', - 'Stmt_GroupUse->uses' => ', ', - 'Stmt_Interface->extends' => ', ', - 'Stmt_Match->arms' => ', ', - 'Stmt_Property->props' => ', ', - 'Stmt_StaticVar->vars' => ', ', - 'Stmt_TraitUse->traits' => ', ', - 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', - 'Stmt_Unset->vars' => ', ', - 'Stmt_Use->uses' => ', ', - 'MatchArm->conds' => ', ', - 'AttributeGroup->attrs' => ', ', + Expr\Array_::class . '->items' => ', ', + Expr\ArrowFunction::class . '->params' => ', ', + Expr\Closure::class . '->params' => ', ', + Expr\Closure::class . '->uses' => ', ', + Expr\FuncCall::class . '->args' => ', ', + Expr\Isset_::class . '->vars' => ', ', + Expr\List_::class . '->items' => ', ', + Expr\MethodCall::class . '->args' => ', ', + Expr\NullsafeMethodCall::class . '->args' => ', ', + Expr\New_::class . '->args' => ', ', + PrintableNewAnonClassNode::class . '->args' => ', ', + Expr\StaticCall::class . '->args' => ', ', + Stmt\ClassConst::class . '->consts' => ', ', + Stmt\ClassMethod::class . '->params' => ', ', + Stmt\Class_::class . '->implements' => ', ', + Stmt\Enum_::class . '->implements' => ', ', + PrintableNewAnonClassNode::class . '->implements' => ', ', + Stmt\Const_::class . '->consts' => ', ', + Stmt\Declare_::class . '->declares' => ', ', + Stmt\Echo_::class . '->exprs' => ', ', + Stmt\For_::class . '->init' => ', ', + Stmt\For_::class . '->cond' => ', ', + Stmt\For_::class . '->loop' => ', ', + Stmt\Function_::class . '->params' => ', ', + Stmt\Global_::class . '->vars' => ', ', + Stmt\GroupUse::class . '->uses' => ', ', + Stmt\Interface_::class . '->extends' => ', ', + Expr\Match_::class . '->arms' => ', ', + Stmt\Property::class . '->props' => ', ', + Stmt\StaticVar::class . '->vars' => ', ', + Stmt\TraitUse::class . '->traits' => ', ', + Stmt\TraitUseAdaptation\Precedence::class . '->insteadof' => ', ', + Stmt\Unset_::class . '->vars' => ', ', + Stmt\UseUse::class . '->uses' => ', ', + MatchArm::class . '->conds' => ', ', + AttributeGroup::class . '->attrs' => ', ', + PropertyHook::class . '->params' => ', ', // statement lists - 'Expr_Closure->stmts' => "\n", - 'Stmt_Case->stmts' => "\n", - 'Stmt_Catch->stmts' => "\n", - 'Stmt_Class->stmts' => "\n", - 'Stmt_Enum->stmts' => "\n", - 'Expr_PrintableNewAnonClass->stmts' => "\n", - 'Stmt_Interface->stmts' => "\n", - 'Stmt_Trait->stmts' => "\n", - 'Stmt_ClassMethod->stmts' => "\n", - 'Stmt_Declare->stmts' => "\n", - 'Stmt_Do->stmts' => "\n", - 'Stmt_ElseIf->stmts' => "\n", - 'Stmt_Else->stmts' => "\n", - 'Stmt_Finally->stmts' => "\n", - 'Stmt_Foreach->stmts' => "\n", - 'Stmt_For->stmts' => "\n", - 'Stmt_Function->stmts' => "\n", - 'Stmt_If->stmts' => "\n", - 'Stmt_Namespace->stmts' => "\n", - 'Stmt_Class->attrGroups' => "\n", - 'Stmt_Enum->attrGroups' => "\n", - 'Stmt_EnumCase->attrGroups' => "\n", - 'Stmt_Interface->attrGroups' => "\n", - 'Stmt_Trait->attrGroups' => "\n", - 'Stmt_Function->attrGroups' => "\n", - 'Stmt_ClassMethod->attrGroups' => "\n", - 'Stmt_ClassConst->attrGroups' => "\n", - 'Stmt_Property->attrGroups' => "\n", - 'Expr_PrintableNewAnonClass->attrGroups' => ' ', - 'Expr_Closure->attrGroups' => ' ', - 'Expr_ArrowFunction->attrGroups' => ' ', - 'Param->attrGroups' => ' ', - 'Stmt_Switch->cases' => "\n", - 'Stmt_TraitUse->adaptations' => "\n", - 'Stmt_TryCatch->stmts' => "\n", - 'Stmt_While->stmts' => "\n", + Expr\Closure::class . '->stmts' => "\n", + Stmt\Case_::class . '->stmts' => "\n", + Stmt\Catch_::class . '->stmts' => "\n", + Stmt\Class_::class . '->stmts' => "\n", + Stmt\Enum_::class . '->stmts' => "\n", + PrintableNewAnonClassNode::class . '->stmts' => "\n", + Stmt\Interface_::class . '->stmts' => "\n", + Stmt\Trait_::class . '->stmts' => "\n", + Stmt\ClassMethod::class . '->stmts' => "\n", + Stmt\Declare_::class . '->stmts' => "\n", + Stmt\Do_::class . '->stmts' => "\n", + Stmt\ElseIf_::class . '->stmts' => "\n", + Stmt\Else_::class . '->stmts' => "\n", + Stmt\Finally_::class . '->stmts' => "\n", + Stmt\Foreach_::class . '->stmts' => "\n", + Stmt\For_::class . '->stmts' => "\n", + Stmt\Function_::class . '->stmts' => "\n", + Stmt\If_::class . '->stmts' => "\n", + Stmt\Namespace_::class . '->stmts' => "\n", + Stmt\Block::class . '->stmts' => "\n", + // Attribute groups + Stmt\Class_::class . '->attrGroups' => "\n", + Stmt\Enum_::class . '->attrGroups' => "\n", + Stmt\EnumCase::class . '->attrGroups' => "\n", + Stmt\Interface_::class . '->attrGroups' => "\n", + Stmt\Trait_::class . '->attrGroups' => "\n", + Stmt\Function_::class . '->attrGroups' => "\n", + Stmt\ClassMethod::class . '->attrGroups' => "\n", + Stmt\ClassConst::class . '->attrGroups' => "\n", + Stmt\Property::class . '->attrGroups' => "\n", + PrintableNewAnonClassNode::class . '->attrGroups' => ' ', + Expr\Closure::class . '->attrGroups' => ' ', + Expr\ArrowFunction::class . '->attrGroups' => ' ', + Param::class . '->attrGroups' => ' ', + PropertyHook::class . '->attrGroups' => ' ', + Stmt\Switch_::class . '->cases' => "\n", + Stmt\TraitUse::class . '->adaptations' => "\n", + Stmt\TryCatch::class . '->stmts' => "\n", + Stmt\While_::class . '->stmts' => "\n", + PropertyHook::class . '->body' => "\n", + Stmt\Property::class . '->hooks' => "\n", + Param::class . '->hooks' => "\n", // dummy for top-level context 'File->stmts' => "\n", ]; } - protected function initializeEmptyListInsertionMap() + protected function initializeEmptyListInsertionMap() : void { - if ($this->emptyListInsertionMap) { + if (isset($this->emptyListInsertionMap)) { return; } // TODO Insertion into empty statement lists. // [$find, $extraLeft, $extraRight] - $this->emptyListInsertionMap = ['Expr_ArrowFunction->params' => ['(', '', ''], 'Expr_Closure->uses' => [')', ' use(', ')'], 'Expr_Closure->params' => ['(', '', ''], 'Expr_FuncCall->args' => ['(', '', ''], 'Expr_MethodCall->args' => ['(', '', ''], 'Expr_NullsafeMethodCall->args' => ['(', '', ''], 'Expr_New->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], 'Expr_StaticCall->args' => ['(', '', ''], 'Stmt_Class->implements' => [null, ' implements ', ''], 'Stmt_Enum->implements' => [null, ' implements ', ''], 'Stmt_ClassMethod->params' => ['(', '', ''], 'Stmt_Interface->extends' => [null, ' extends ', ''], 'Stmt_Function->params' => ['(', '', ''], 'Stmt_Interface->attrGroups' => [null, '', "\n"], 'Stmt_Class->attrGroups' => [null, '', "\n"], 'Stmt_ClassConst->attrGroups' => [null, '', "\n"], 'Stmt_ClassMethod->attrGroups' => [null, '', "\n"], 'Stmt_Function->attrGroups' => [null, '', "\n"], 'Stmt_Property->attrGroups' => [null, '', "\n"], 'Stmt_Trait->attrGroups' => [null, '', "\n"], 'Expr_ArrowFunction->attrGroups' => [null, '', ' '], 'Expr_Closure->attrGroups' => [null, '', ' '], 'Expr_PrintableNewAnonClass->attrGroups' => [\T_NEW, ' ', '']]; + $this->emptyListInsertionMap = [Expr\ArrowFunction::class . '->params' => ['(', '', ''], Expr\Closure::class . '->uses' => [')', ' use (', ')'], Expr\Closure::class . '->params' => ['(', '', ''], Expr\FuncCall::class . '->args' => ['(', '', ''], Expr\MethodCall::class . '->args' => ['(', '', ''], Expr\NullsafeMethodCall::class . '->args' => ['(', '', ''], Expr\New_::class . '->args' => ['(', '', ''], PrintableNewAnonClassNode::class . '->args' => ['(', '', ''], PrintableNewAnonClassNode::class . '->implements' => [null, ' implements ', ''], Expr\StaticCall::class . '->args' => ['(', '', ''], Stmt\Class_::class . '->implements' => [null, ' implements ', ''], Stmt\Enum_::class . '->implements' => [null, ' implements ', ''], Stmt\ClassMethod::class . '->params' => ['(', '', ''], Stmt\Interface_::class . '->extends' => [null, ' extends ', ''], Stmt\Function_::class . '->params' => ['(', '', ''], Stmt\Interface_::class . '->attrGroups' => [null, '', "\n"], Stmt\Class_::class . '->attrGroups' => [null, '', "\n"], Stmt\ClassConst::class . '->attrGroups' => [null, '', "\n"], Stmt\ClassMethod::class . '->attrGroups' => [null, '', "\n"], Stmt\Function_::class . '->attrGroups' => [null, '', "\n"], Stmt\Property::class . '->attrGroups' => [null, '', "\n"], Stmt\Trait_::class . '->attrGroups' => [null, '', "\n"], Expr\ArrowFunction::class . '->attrGroups' => [null, '', ' '], Expr\Closure::class . '->attrGroups' => [null, '', ' '], Stmt\Const_::class . '->attrGroups' => [null, '', "\n"], PrintableNewAnonClassNode::class . '->attrGroups' => [\T_NEW, ' ', '']]; } - protected function initializeModifierChangeMap() + protected function initializeModifierChangeMap() : void { - if ($this->modifierChangeMap) { + if (isset($this->modifierChangeMap)) { return; } - $this->modifierChangeMap = ['Stmt_ClassConst->flags' => \T_CONST, 'Stmt_ClassMethod->flags' => \T_FUNCTION, 'Stmt_Class->flags' => \T_CLASS, 'Stmt_Property->flags' => \T_VARIABLE, 'Expr_PrintableNewAnonClass->flags' => \T_CLASS, 'Param->flags' => \T_VARIABLE]; + $this->modifierChangeMap = [Stmt\ClassConst::class . '->flags' => ['pModifiers', \T_CONST], Stmt\ClassMethod::class . '->flags' => ['pModifiers', \T_FUNCTION], Stmt\Class_::class . '->flags' => ['pModifiers', \T_CLASS], Stmt\Property::class . '->flags' => ['pModifiers', \T_VARIABLE], PrintableNewAnonClassNode::class . '->flags' => ['pModifiers', \T_CLASS], Param::class . '->flags' => ['pModifiers', \T_VARIABLE], PropertyHook::class . '->flags' => ['pModifiers', \T_STRING], Expr\Closure::class . '->static' => ['pStatic', \T_FUNCTION], Expr\ArrowFunction::class . '->static' => ['pStatic', \T_FN]]; // List of integer subnodes that are not modifiers: // Expr_Include->type // Stmt_GroupUse->type // Stmt_Use->type - // Stmt_UseUse->type + // UseItem->type } } diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Token.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Token.php new file mode 100644 index 000000000..7a3144965 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Token.php @@ -0,0 +1,21 @@ +pos + \strlen($this->text); + } + /** Get 1-based end line number of the token. */ + public function getEndLine() : int + { + return $this->line + \substr_count($this->text, "\n"); + } +} diff --git a/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php new file mode 100644 index 000000000..629a14dc5 --- /dev/null +++ b/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php @@ -0,0 +1,59 @@ +parameters(); $parameters->set(Option::SKIP, [__DIR__ . '/tests/PropertiesPrinterHelper.php']); diff --git a/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php b/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php index 3e58603a4..3246030b7 100644 --- a/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php +++ b/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AbstractCi.php @@ -1,18 +1,15 @@ env = $env; diff --git a/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AppVeyor.php b/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AppVeyor.php index 0b1937424..d7a259555 100644 --- a/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AppVeyor.php +++ b/vendor/rector/rector/vendor/ondram/ci-detector/src/Ci/AppVeyor.php @@ -1,11 +1,11 @@ environment = new Env(); diff --git a/vendor/rector/rector/vendor/ondram/ci-detector/src/CiDetectorInterface.php b/vendor/rector/rector/vendor/ondram/ci-detector/src/CiDetectorInterface.php index 27ec03aaf..87b9a701e 100644 --- a/vendor/rector/rector/vendor/ondram/ci-detector/src/CiDetectorInterface.php +++ b/vendor/rector/rector/vendor/ondram/ci-detector/src/CiDetectorInterface.php @@ -1,10 +1,10 @@ value = $value; @@ -65,6 +62,6 @@ public function describe() : string } private static function create(int $value) : self { - return self::$registry[$value] = self::$registry[$value] ?? new self($value); + return self::$registry[$value] ??= new self($value); } } diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/LICENSE b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/LICENSE index 98a854e4f..e5f34e607 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/LICENSE +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/LICENSE @@ -1,6 +1,7 @@ MIT License Copyright (c) 2016 Ondřej Mirtes +Copyright (c) 2025 PHPStan s.r.o. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +19,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/README.md b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/README.md index 706b2a3c5..15ac9a97b 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/README.md +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/README.md @@ -13,9 +13,9 @@ For the complete list of supported PHPDoc features check out PHPStan documentati * [PHPDoc Basics](https://phpstan.org/writing-php-code/phpdocs-basics) (list of PHPDoc tags) * [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) (list of PHPDoc types) -* [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/1.23.x/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc. +* [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/2.1.x/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc. -This parser also supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/1.23.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). The support needs to be turned on by setting `bool $parseDoctrineAnnotations` to `true` in `Lexer` and `PhpDocParser` class constructors. +This parser also supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/2.1.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). ## Installation @@ -34,6 +34,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\ParserConfig; use PHPStan\PhpDocParser\Parser\ConstExprParser; use PHPStan\PhpDocParser\Parser\PhpDocParser; use PHPStan\PhpDocParser\Parser\TokenIterator; @@ -41,10 +42,11 @@ use PHPStan\PhpDocParser\Parser\TypeParser; // basic setup -$lexer = new Lexer(); -$constExprParser = new ConstExprParser(); -$typeParser = new TypeParser($constExprParser); -$phpDocParser = new PhpDocParser($typeParser, $constExprParser); +$config = new ParserConfig(usedAttributes: []); +$lexer = new Lexer($config); +$constExprParser = new ConstExprParser($config); +$typeParser = new TypeParser($config, $constExprParser); +$phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); // parsing and reading a PHPDoc string @@ -72,6 +74,7 @@ use PHPStan\PhpDocParser\Ast\NodeVisitor\CloningVisitor; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\ParserConfig; use PHPStan\PhpDocParser\Parser\ConstExprParser; use PHPStan\PhpDocParser\Parser\PhpDocParser; use PHPStan\PhpDocParser\Parser\TokenIterator; @@ -80,12 +83,11 @@ use PHPStan\PhpDocParser\Printer\Printer; // basic setup with enabled required lexer attributes -$usedAttributes = ['lines' => true, 'indexes' => true]; - -$lexer = new Lexer(); -$constExprParser = new ConstExprParser(true, true, $usedAttributes); -$typeParser = new TypeParser($constExprParser, true, $usedAttributes); -$phpDocParser = new PhpDocParser($typeParser, $constExprParser, true, true, $usedAttributes); +$config = new ParserConfig(usedAttributes: ['lines' => true, 'indexes' => true, 'comments' => true]); +$lexer = new Lexer($config); +$constExprParser = new ConstExprParser($config); +$typeParser = new TypeParser($config, $constExprParser); +$phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); $tokens = new TokenIterator($lexer->tokenize('/** @param Lorem $a */')); $phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/UPGRADING.md b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/UPGRADING.md new file mode 100644 index 000000000..b673bccfb --- /dev/null +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/UPGRADING.md @@ -0,0 +1,129 @@ +Upgrading from phpstan/phpdoc-parser 1.x to 2.0 +================================= + +### PHP version requirements + +phpstan/phpdoc-parser now requires PHP 7.4 or newer to run. + +### Changed constructors of parser classes + +Instead of different arrays and boolean values passed into class constructors during setup, parser classes now share a common ParserConfig object. + +Before: + +```php +use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\Parser\ConstExprParser; +use PHPStan\PhpDocParser\Parser\TypeParser; +use PHPStan\PhpDocParser\Parser\PhpDocParser; + +$usedAttributes = ['lines' => true, 'indexes' => true]; + +$lexer = new Lexer(); +$constExprParser = new ConstExprParser(true, true, $usedAttributes); +$typeParser = new TypeParser($constExprParser, true, $usedAttributes); +$phpDocParser = new PhpDocParser($typeParser, $constExprParser, true, true, $usedAttributes); +``` + +After: + +```php +use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\ParserConfig; +use PHPStan\PhpDocParser\Parser\ConstExprParser; +use PHPStan\PhpDocParser\Parser\TypeParser; +use PHPStan\PhpDocParser\Parser\PhpDocParser; + +$config = new ParserConfig(usedAttributes: ['lines' => true, 'indexes' => true]); +$lexer = new Lexer($config); +$constExprParser = new ConstExprParser($config); +$typeParser = new TypeParser($config, $constExprParser); +$phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); +``` + +The point of ParserConfig is that over the course of phpstan/phpdoc-parser 2.x development series it's most likely going to gain new optional parameters akin to PHPStan's [bleeding edge](https://phpstan.org/blog/what-is-bleeding-edge). These parameters will allow opting in to new behaviour which will become the default in 3.0. + +With ParserConfig object, it's now going to be impossible to configure parser classes inconsistently. Which [happened to users](https://github.com/phpstan/phpdoc-parser/issues/251#issuecomment-2333927959) when they were separate boolean values. + +### Support for parsing Doctrine annotations + +This parser now supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes representing Doctrine Annotations live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/2.0.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). + +### Whitespace before description is required + +phpdoc-parser 1.x sometimes silently consumed invalid part of a PHPDoc type as description: + +```php +/** @return \Closure(...int, string): string */ +``` + +This became `IdentifierTypeNode` of `\Closure` and with `(...int, string): string` as description. (Valid callable syntax is: `\Closure(int ...$u, string): string`.) + +Another example: + +```php +/** @return array{foo: int}} */ +``` + +The extra `}` also became description. + +Both of these examples are now InvalidTagValueNode. + +If these parts are supposed to be PHPDoc descriptions, you need to put whitespace between the type and the description text: + +```php +/** @return \Closure (...int, string): string */ +/** @return array{foo: int} } */ +``` + +### Type aliases with invalid types are preserved + +In phpdoc-parser 1.x, invalid type alias syntax was represented as [`InvalidTagValueNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.InvalidTagValueNode.html), losing information about a type alias being present. + +```php +/** + * @phpstan-type TypeAlias + */ +``` + +This `@phpstan-type` is missing the actual type to alias. In phpdoc-parser 2.0 this is now represented as [`TypeAliasTagValueNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.TypeAliasTagValueNode.html) (instead of `InvalidTagValueNode`) with [`InvalidTypeNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.Type.InvalidTypeNode.html) in place of the type. + +### Removal of QuoteAwareConstExprStringNode + +The class [QuoteAwareConstExprStringNode](https://phpstan.github.io/phpdoc-parser/1.23.x/PHPStan.PhpDocParser.Ast.ConstExpr.QuoteAwareConstExprStringNode.html) has been removed. + +Instead, [ConstExprStringNode](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.ConstExpr.ConstExprStringNode.html) gained information about the kind of quotes being used. + +### Removed 2nd parameter of `ConstExprParser::parse()` (`$trimStrings`) + +`ConstExprStringNode::$value` now contains unescaped values without surrounding `''` or `""` quotes. + +Use `ConstExprStringNode::__toString()` or [`Printer`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Printer.Printer.html) to get the escaped value along with surrounding quotes. + +### Text between tags always belongs to description + +Multi-line descriptions between tags were previously represented as separate [PhpDocTextNode](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.PhpDocTextNode.html): + +```php +/** + * @param Foo $foo 1st multi world description + * some text in the middle + * @param Bar $bar 2nd multi world description + */ +``` + +The line with `some text in the middle` in phpdoc-parser 2.0 is now part of the description of the first `@param` tag. + +### `ArrayShapeNode` construction changes + +`ArrayShapeNode` constructor made private, added public static methods `createSealed()` and `createUnsealed()`. + +### Minor BC breaks + +* Constructor parameter `$isEquality` in `AssertTag*ValueNode` made required +* Constructor parameter `$templateTypes` in `MethodTagValueNode` made required +* Constructor parameter `$isReference` in `ParamTagValueNode` made required +* Constructor parameter `$isReference` in `TypelessParamTagValueNode` made required +* Constructor parameter `$templateTypes` in `CallableTypeNode` made required +* Constructor parameters `$expectedTokenValue` and `$currentTokenLine` in `ParserException` made required +* `ArrayShapeItemNode` and `ObjectShapeItemNode` are not standalone TypeNode, just Node diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/composer.json b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/composer.json index 3a2cce65c..131e0c4f1 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/composer.json +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/composer.json @@ -3,17 +3,17 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "license": "MIT", "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine\/annotations": "^2.0", - "nikic\/php-parser": "^4.15", + "nikic\/php-parser": "^5.3.0", "php-parallel-lint\/php-parallel-lint": "^1.2", "phpstan\/extension-installer": "^1.0", - "phpstan\/phpstan": "^1.5", - "phpstan\/phpstan-phpunit": "^1.1", - "phpstan\/phpstan-strict-rules": "^1.0", - "phpunit\/phpunit": "^9.5", + "phpstan\/phpstan": "^2.0", + "phpstan\/phpstan-phpunit": "^2.0", + "phpstan\/phpstan-strict-rules": "^2.0", + "phpunit\/phpunit": "^9.6", "symfony\/process": "^5.2" }, "config": { diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Attribute.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Attribute.php index 9736d8082..794a2b7fc 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Attribute.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Attribute.php @@ -10,4 +10,5 @@ final class Attribute public const START_INDEX = 'startIndex'; public const END_INDEX = 'endIndex'; public const ORIGINAL_NODE = 'originalNode'; + public const COMMENTS = 'comments'; } diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Comment.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Comment.php new file mode 100644 index 000000000..a719c45e8 --- /dev/null +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Comment.php @@ -0,0 +1,22 @@ +text = $text; + $this->startLine = $startLine; + $this->startIndex = $startIndex; + } + public function getReformattedText() : string + { + return trim($this->text); + } +} diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php index 0a4d8eacf..8908722ae 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php @@ -8,10 +8,8 @@ class ConstExprArrayItemNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode { use NodeAttributes; - /** @var ConstExprNode|null */ - public $key; - /** @var ConstExprNode */ - public $value; + public ?\PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $key = null; + public \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $value; public function __construct(?\PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $key, \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $value) { $this->key = $key; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php index 7b463fe78..7fa5f4829 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php @@ -9,7 +9,7 @@ class ConstExprArrayNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExp { use NodeAttributes; /** @var ConstExprArrayItemNode[] */ - public $items; + public array $items; /** * @param ConstExprArrayItemNode[] $items */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php index 2e616d04a..307181ade 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php @@ -7,8 +7,7 @@ class ConstExprFloatNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode { use NodeAttributes; - /** @var string */ - public $value; + public string $value; public function __construct(string $value) { $this->value = $value; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php index ce4baee64..c4a2317e3 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php @@ -7,8 +7,7 @@ class ConstExprIntegerNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode { use NodeAttributes; - /** @var string */ - public $value; + public string $value; public function __construct(string $value) { $this->value = $value; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php index 95ac80c6f..3b11b6941 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php @@ -4,17 +4,65 @@ namespace PHPStan\PhpDocParser\Ast\ConstExpr; use PHPStan\PhpDocParser\Ast\NodeAttributes; +use function addcslashes; +use function assert; +use function dechex; +use function ord; +use function preg_replace_callback; +use function sprintf; +use function str_pad; +use function strlen; +use const STR_PAD_LEFT; class ConstExprStringNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode { + public const SINGLE_QUOTED = 1; + public const DOUBLE_QUOTED = 2; use NodeAttributes; - /** @var string */ - public $value; - public function __construct(string $value) + public string $value; + /** @var self::SINGLE_QUOTED|self::DOUBLE_QUOTED */ + public $quoteType; + /** + * @param self::SINGLE_QUOTED|self::DOUBLE_QUOTED $quoteType + */ + public function __construct(string $value, int $quoteType) { $this->value = $value; + $this->quoteType = $quoteType; } public function __toString() : string { - return $this->value; + if ($this->quoteType === self::SINGLE_QUOTED) { + // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007 + return sprintf("'%s'", addcslashes($this->value, '\'\\')); + } + // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040 + return sprintf('"%s"', $this->escapeDoubleQuotedString()); + } + private function escapeDoubleQuotedString() : string + { + $quote = '"'; + $escaped = addcslashes($this->value, "\n\r\t\f\v\$" . $quote . '\\'); + // Escape control characters and non-UTF-8 characters. + // Regex based on https://stackoverflow.com/a/11709412/385378. + $regex = '/( + [\\x00-\\x08\\x0E-\\x1F] # Control characters + | [\\xC0-\\xC1] # Invalid UTF-8 Bytes + | [\\xF5-\\xFF] # Invalid UTF-8 Bytes + | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point + | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point + | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start + | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start + | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start + | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle + | (?className = $className; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php index a6675a284..059683724 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php @@ -11,11 +11,10 @@ class DoctrineConstExprStringNode extends \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode { use NodeAttributes; - /** @var string */ - public $value; + public string $value; public function __construct(string $value) { - parent::__construct($value); + parent::__construct($value, self::DOUBLE_QUOTED); $this->value = $value; } public function __toString() : string diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php deleted file mode 100644 index 9bcb9b14f..000000000 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php +++ /dev/null @@ -1,67 +0,0 @@ -quoteType = $quoteType; - } - public function __toString() : string - { - if ($this->quoteType === self::SINGLE_QUOTED) { - // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007 - return sprintf("'%s'", addcslashes($this->value, '\'\\')); - } - // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040 - return sprintf('"%s"', $this->escapeDoubleQuotedString()); - } - private function escapeDoubleQuotedString() : string - { - $quote = '"'; - $escaped = addcslashes($this->value, "\n\r\t\f\v\$" . $quote . '\\'); - // Escape control characters and non-UTF-8 characters. - // Regex based on https://stackoverflow.com/a/11709412/385378. - $regex = '/( - [\\x00-\\x08\\x0E-\\x1F] # Control characters - | [\\xC0-\\xC1] # Invalid UTF-8 Bytes - | [\\xF5-\\xFF] # Invalid UTF-8 Bytes - | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point - | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point - | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start - | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start - | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start - | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle - | (? */ - private $attributes = []; + private array $attributes = []; /** * @param mixed $value */ public function setAttribute(string $key, $value) : void { + if ($value === null) { + unset($this->attributes[$key]); + return; + } $this->attributes[$key] = $value; } public function hasAttribute(string $key) : bool diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php index 296071d4f..c7e0a5f2c 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php @@ -57,9 +57,9 @@ final class NodeTraverser */ public const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4; /** @var list Visitors */ - private $visitors = []; + private array $visitors = []; /** @var bool Whether traversal should be stopped */ - private $stopTraversal; + private bool $stopTraversal; /** * @param list $visitors */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php index 29e0b619e..26a24e038 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php @@ -8,7 +8,7 @@ use PHPStan\PhpDocParser\Ast\Node; final class CloningVisitor extends AbstractNodeVisitor { - public function enterNode(Node $originalNode) + public function enterNode(Node $originalNode) : Node { $node = clone $originalNode; $node->setAttribute(Attribute::ORIGINAL_NODE, $originalNode); diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php index e534c5326..773093677 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php @@ -9,19 +9,14 @@ class AssertTagMethodValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var string */ - public $parameter; - /** @var string */ - public $method; - /** @var bool */ - public $isNegated; - /** @var bool */ - public $isEquality; + public TypeNode $type; + public string $parameter; + public string $method; + public bool $isNegated; + public bool $isEquality; /** @var string (may be empty) */ - public $description; - public function __construct(TypeNode $type, string $parameter, string $method, bool $isNegated, string $description, bool $isEquality = \false) + public string $description; + public function __construct(TypeNode $type, string $parameter, string $method, bool $isNegated, string $description, bool $isEquality) { $this->type = $type; $this->parameter = $parameter; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php index ef67e62a4..a263b5266 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php @@ -9,19 +9,14 @@ class AssertTagPropertyValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var string */ - public $parameter; - /** @var string */ - public $property; - /** @var bool */ - public $isNegated; - /** @var bool */ - public $isEquality; + public TypeNode $type; + public string $parameter; + public string $property; + public bool $isNegated; + public bool $isEquality; /** @var string (may be empty) */ - public $description; - public function __construct(TypeNode $type, string $parameter, string $property, bool $isNegated, string $description, bool $isEquality = \false) + public string $description; + public function __construct(TypeNode $type, string $parameter, string $property, bool $isNegated, string $description, bool $isEquality) { $this->type = $type; $this->parameter = $parameter; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php index 33f01627a..f719ad3dc 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php @@ -9,17 +9,13 @@ class AssertTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var string */ - public $parameter; - /** @var bool */ - public $isNegated; - /** @var bool */ - public $isEquality; + public TypeNode $type; + public string $parameter; + public bool $isNegated; + public bool $isEquality; /** @var string (may be empty) */ - public $description; - public function __construct(TypeNode $type, string $parameter, bool $isNegated, string $description, bool $isEquality = \false) + public string $description; + public function __construct(TypeNode $type, string $parameter, bool $isNegated, string $description, bool $isEquality) { $this->type = $type; $this->parameter = $parameter; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php index 8199bef6a..23ca785c1 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php @@ -9,7 +9,7 @@ class DeprecatedTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocT { use NodeAttributes; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(string $description) { $this->description = $description; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php index 3dde2312f..e8e518033 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php @@ -9,10 +9,9 @@ class DoctrineAnnotation implements Node { use NodeAttributes; - /** @var string */ - public $name; + public string $name; /** @var list */ - public $arguments; + public array $arguments; /** * @param list $arguments */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php index 20b77483b..9ddba2118 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php @@ -13,8 +13,7 @@ class DoctrineArgument implements Node { use NodeAttributes; - /** @var IdentifierTypeNode|null */ - public $key; + public ?IdentifierTypeNode $key = null; /** @var ValueType */ public $value; /** diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php index fb0a087c7..d283b25e2 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php @@ -10,7 +10,7 @@ class DoctrineArray implements Node { use NodeAttributes; /** @var list */ - public $items; + public array $items; /** * @param list $items */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php index cebd4075e..9fee2996a 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php @@ -9,10 +9,9 @@ class DoctrineTagValueNode implements PhpDocTagValueNode { use NodeAttributes; - /** @var DoctrineAnnotation */ - public $annotation; + public \PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine\DoctrineAnnotation $annotation; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(\PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine\DoctrineAnnotation $annotation, string $description) { $this->annotation = $annotation; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php index 31eeaaa59..b65e79f82 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php @@ -9,10 +9,9 @@ class ExtendsTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var GenericTypeNode */ - public $type; + public GenericTypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(GenericTypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php index 1773022b1..70ea40241 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php @@ -8,7 +8,7 @@ class GenericTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagV { use NodeAttributes; /** @var string (may be empty) */ - public $value; + public string $value; public function __construct(string $value) { $this->value = $value; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php index 1f4d6afc2..b85912f9f 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php @@ -9,10 +9,9 @@ class ImplementsTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var GenericTypeNode */ - public $type; + public GenericTypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(GenericTypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php index 9d8f8b9e8..09d1166ca 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php @@ -15,9 +15,9 @@ class InvalidTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagV { use NodeAttributes; /** @var string (may be empty) */ - public $value; + public string $value; /** @var mixed[] */ - private $exceptionArgs; + private array $exceptionArgs; public function __construct(string $value, ParserException $exception) { $this->value = $value; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php index 62a3f4158..2b11fcbf5 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php @@ -10,23 +10,20 @@ class MethodTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var bool */ - public $isStatic; - /** @var TypeNode|null */ - public $returnType; - /** @var string */ - public $methodName; + public bool $isStatic; + public ?TypeNode $returnType = null; + public string $methodName; /** @var TemplateTagValueNode[] */ - public $templateTypes; + public array $templateTypes; /** @var MethodTagValueParameterNode[] */ - public $parameters; + public array $parameters; /** @var string (may be empty) */ - public $description; + public string $description; /** * @param MethodTagValueParameterNode[] $parameters * @param TemplateTagValueNode[] $templateTypes */ - public function __construct(bool $isStatic, ?TypeNode $returnType, string $methodName, array $parameters, string $description, array $templateTypes = []) + public function __construct(bool $isStatic, ?TypeNode $returnType, string $methodName, array $parameters, string $description, array $templateTypes) { $this->isStatic = $isStatic; $this->returnType = $returnType; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php index 3d45e70b7..31560fac9 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php @@ -10,16 +10,11 @@ class MethodTagValueParameterNode implements Node { use NodeAttributes; - /** @var TypeNode|null */ - public $type; - /** @var bool */ - public $isReference; - /** @var bool */ - public $isVariadic; - /** @var string */ - public $parameterName; - /** @var ConstExprNode|null */ - public $defaultValue; + public ?TypeNode $type = null; + public bool $isReference; + public bool $isVariadic; + public string $parameterName; + public ?ConstExprNode $defaultValue = null; public function __construct(?TypeNode $type, bool $isReference, bool $isVariadic, string $parameterName, ?ConstExprNode $defaultValue) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php index e7138d59a..17e2dbdb6 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php @@ -9,10 +9,9 @@ class MixinTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public TypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php index 2b5b928e7..0dbf7c470 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php @@ -9,12 +9,10 @@ class ParamClosureThisTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var string */ - public $parameterName; + public TypeNode $type; + public string $parameterName; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $parameterName, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php index bcd97e41a..3941b7e7f 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php @@ -8,10 +8,9 @@ class ParamImmediatelyInvokedCallableTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var string */ - public $parameterName; + public string $parameterName; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(string $parameterName, string $description) { $this->parameterName = $parameterName; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php index 511e6c53e..46cb8ba4f 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php @@ -8,10 +8,9 @@ class ParamLaterInvokedCallableTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var string */ - public $parameterName; + public string $parameterName; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(string $parameterName, string $description) { $this->parameterName = $parameterName; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php index 0d4a2e79e..fbbda7938 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php @@ -9,12 +9,10 @@ class ParamOutTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var string */ - public $parameterName; + public TypeNode $type; + public string $parameterName; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $parameterName, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php index b7e799105..2e90bbab6 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php @@ -9,17 +9,13 @@ class ParamTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var bool */ - public $isReference; - /** @var bool */ - public $isVariadic; - /** @var string */ - public $parameterName; + public TypeNode $type; + public bool $isReference; + public bool $isVariadic; + public string $parameterName; /** @var string (may be empty) */ - public $description; - public function __construct(TypeNode $type, bool $isVariadic, string $parameterName, string $description, bool $isReference = \false) + public string $description; + public function __construct(TypeNode $type, bool $isVariadic, string $parameterName, string $description, bool $isReference) { $this->type = $type; $this->isReference = $isReference; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php index 49246a361..16a489bdd 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php @@ -13,7 +13,7 @@ class PhpDocNode implements Node { use NodeAttributes; /** @var PhpDocChildNode[] */ - public $children; + public array $children; /** * @param PhpDocChildNode[] $children */ @@ -26,270 +26,210 @@ public function __construct(array $children) */ public function getTags() : array { - return array_filter($this->children, static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode $child) : bool { - return $child instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; - }); + return array_filter($this->children, static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode $child): bool => $child instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode); } /** * @return PhpDocTagNode[] */ public function getTagsByName(string $tagName) : array { - return array_filter($this->getTags(), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag) use($tagName) : bool { - return $tag->name === $tagName; - }); + return array_filter($this->getTags(), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $tag): bool => $tag->name === $tagName); } /** * @return VarTagValueNode[] */ public function getVarTagValues(string $tagName = '@var') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode); } /** * @return ParamTagValueNode[] */ public function getParamTagValues(string $tagName = '@param') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode); } /** * @return TypelessParamTagValueNode[] */ public function getTypelessParamTagValues(string $tagName = '@param') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TypelessParamTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TypelessParamTagValueNode); } /** * @return ParamImmediatelyInvokedCallableTagValueNode[] */ public function getParamImmediatelyInvokedCallableTagValues(string $tagName = '@param-immediately-invoked-callable') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode); } /** * @return ParamLaterInvokedCallableTagValueNode[] */ public function getParamLaterInvokedCallableTagValues(string $tagName = '@param-later-invoked-callable') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode); } /** * @return ParamClosureThisTagValueNode[] */ public function getParamClosureThisTagValues(string $tagName = '@param-closure-this') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamClosureThisTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamClosureThisTagValueNode); } /** * @return PureUnlessCallableIsImpureTagValueNode[] */ public function getPureUnlessCallableIsImpureTagValues(string $tagName = '@pure-unless-callable-is-impure') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode); } /** * @return TemplateTagValueNode[] */ public function getTemplateTagValues(string $tagName = '@template') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode); } /** * @return ExtendsTagValueNode[] */ public function getExtendsTagValues(string $tagName = '@extends') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ExtendsTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ExtendsTagValueNode); } /** * @return ImplementsTagValueNode[] */ public function getImplementsTagValues(string $tagName = '@implements') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ImplementsTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ImplementsTagValueNode); } /** * @return UsesTagValueNode[] */ public function getUsesTagValues(string $tagName = '@use') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\UsesTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\UsesTagValueNode); } /** * @return ReturnTagValueNode[] */ public function getReturnTagValues(string $tagName = '@return') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode); } /** * @return ThrowsTagValueNode[] */ public function getThrowsTagValues(string $tagName = '@throws') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode); } /** * @return MixinTagValueNode[] */ public function getMixinTagValues(string $tagName = '@mixin') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\MixinTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\MixinTagValueNode); } /** * @return RequireExtendsTagValueNode[] */ public function getRequireExtendsTagValues(string $tagName = '@phpstan-require-extends') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\RequireExtendsTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\RequireExtendsTagValueNode); } /** * @return RequireImplementsTagValueNode[] */ public function getRequireImplementsTagValues(string $tagName = '@phpstan-require-implements') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\RequireImplementsTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\RequireImplementsTagValueNode); } /** * @return DeprecatedTagValueNode[] */ public function getDeprecatedTagValues() : array { - return array_filter(array_column($this->getTagsByName('@deprecated'), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode; - }); + return array_filter(array_column($this->getTagsByName('@deprecated'), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode); } /** * @return PropertyTagValueNode[] */ public function getPropertyTagValues(string $tagName = '@property') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode); } /** * @return PropertyTagValueNode[] */ public function getPropertyReadTagValues(string $tagName = '@property-read') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode); } /** * @return PropertyTagValueNode[] */ public function getPropertyWriteTagValues(string $tagName = '@property-write') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode); } /** * @return MethodTagValueNode[] */ public function getMethodTagValues(string $tagName = '@method') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueNode); } /** * @return TypeAliasTagValueNode[] */ public function getTypeAliasTagValues(string $tagName = '@phpstan-type') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TypeAliasTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TypeAliasTagValueNode); } /** * @return TypeAliasImportTagValueNode[] */ public function getTypeAliasImportTagValues(string $tagName = '@phpstan-import-type') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TypeAliasImportTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\TypeAliasImportTagValueNode); } /** * @return AssertTagValueNode[] */ public function getAssertTagValues(string $tagName = '@phpstan-assert') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\AssertTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\AssertTagValueNode); } /** * @return AssertTagPropertyValueNode[] */ public function getAssertPropertyTagValues(string $tagName = '@phpstan-assert') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\AssertTagPropertyValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\AssertTagPropertyValueNode); } /** * @return AssertTagMethodValueNode[] */ public function getAssertMethodTagValues(string $tagName = '@phpstan-assert') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\AssertTagMethodValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\AssertTagMethodValueNode); } /** * @return SelfOutTagValueNode[] */ public function getSelfOutTypeTagValues(string $tagName = '@phpstan-this-out') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\SelfOutTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\SelfOutTagValueNode); } /** * @return ParamOutTagValueNode[] */ public function getParamOutTypeTagValues(string $tagName = '@param-out') : array { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) : bool { - return $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamOutTagValueNode; - }); + return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value): bool => $value instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamOutTagValueNode); } public function __toString() : string { diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php index 36a48a0dc..e4a60970b 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php @@ -9,10 +9,8 @@ class PhpDocTagNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode { use NodeAttributes; - /** @var string */ - public $name; - /** @var PhpDocTagValueNode */ - public $value; + public string $name; + public \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value; public function __construct(string $name, \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode $value) { $this->name = $name; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php index 388143ca3..87422d1b2 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php @@ -7,8 +7,7 @@ class PhpDocTextNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode { use NodeAttributes; - /** @var string */ - public $text; + public string $text; public function __construct(string $text) { $this->text = $text; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php index 4cadbeec1..caf991576 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php @@ -9,12 +9,10 @@ class PropertyTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var string */ - public $propertyName; + public TypeNode $type; + public string $propertyName; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $propertyName, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php index 19c20cc68..b022484fe 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php @@ -8,10 +8,9 @@ class PureUnlessCallableIsImpureTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var string */ - public $parameterName; + public string $parameterName; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(string $parameterName, string $description) { $this->parameterName = $parameterName; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php index 584ca231b..5bd33937a 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php @@ -9,10 +9,9 @@ class RequireExtendsTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public TypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php index 72576e3ea..7091894ba 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php @@ -9,10 +9,9 @@ class RequireImplementsTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public TypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php index e3fb544ee..5ce1be391 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php @@ -9,10 +9,9 @@ class ReturnTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public TypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php index 45aedad56..465b9dc9d 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php @@ -9,10 +9,9 @@ class SelfOutTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public TypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php index 23f393285..5f8a915ea 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php @@ -10,15 +10,12 @@ class TemplateTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTag { use NodeAttributes; /** @var non-empty-string */ - public $name; - /** @var TypeNode|null */ - public $bound; - /** @var TypeNode|null */ - public $lowerBound; - /** @var TypeNode|null */ - public $default; + public string $name; + public ?TypeNode $bound; + public ?TypeNode $default; + public ?TypeNode $lowerBound; /** @var string (may be empty) */ - public $description; + public string $description; /** * @param non-empty-string $name */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php index 02bf48f8c..0d069915b 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php @@ -9,10 +9,9 @@ class ThrowsTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public TypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php index 2a1f39088..6ad5b347e 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php @@ -9,12 +9,9 @@ class TypeAliasImportTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var string */ - public $importedAlias; - /** @var IdentifierTypeNode */ - public $importedFrom; - /** @var string|null */ - public $importedAs; + public string $importedAlias; + public IdentifierTypeNode $importedFrom; + public ?string $importedAs = null; public function __construct(string $importedAlias, IdentifierTypeNode $importedFrom, ?string $importedAs) { $this->importedAlias = $importedAlias; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php index 3b41363c1..f36789ee9 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php @@ -9,10 +9,8 @@ class TypeAliasTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var string */ - public $alias; - /** @var TypeNode */ - public $type; + public string $alias; + public TypeNode $type; public function __construct(string $alias, TypeNode $type) { $this->alias = $alias; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php index a1d712f23..12bc0b926 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php @@ -8,15 +8,12 @@ class TypelessParamTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var bool */ - public $isReference; - /** @var bool */ - public $isVariadic; - /** @var string */ - public $parameterName; + public bool $isReference; + public bool $isVariadic; + public string $parameterName; /** @var string (may be empty) */ - public $description; - public function __construct(bool $isVariadic, string $parameterName, string $description, bool $isReference = \false) + public string $description; + public function __construct(bool $isVariadic, string $parameterName, string $description, bool $isReference) { $this->isReference = $isReference; $this->isVariadic = $isVariadic; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php index 98ab9c66c..00370d492 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php @@ -9,10 +9,9 @@ class UsesTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var GenericTypeNode */ - public $type; + public GenericTypeNode $type; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(GenericTypeNode $type, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php index 345f27c2c..30d50be5a 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php @@ -9,12 +9,11 @@ class VarTagValueNode implements \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public TypeNode $type; /** @var string (may be empty) */ - public $variableName; + public string $variableName; /** @var string (may be empty) */ - public $description; + public string $description; public function __construct(TypeNode $type, string $variableName, string $description) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php index d421a1ce0..156b21f34 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php @@ -5,17 +5,16 @@ use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; +use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\NodeAttributes; use function sprintf; -class ArrayShapeItemNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode +class ArrayShapeItemNode implements Node { use NodeAttributes; /** @var ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|null */ public $keyName; - /** @var bool */ - public $optional; - /** @var TypeNode */ - public $valueType; + public bool $optional; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $valueType; /** * @param ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|null $keyName */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php index 993e873a5..4ba456bf2 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php @@ -13,23 +13,37 @@ class ArrayShapeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode public const KIND_NON_EMPTY_LIST = 'non-empty-list'; use NodeAttributes; /** @var ArrayShapeItemNode[] */ - public $items; - /** @var bool */ - public $sealed; + public array $items; + public bool $sealed; /** @var self::KIND_* */ public $kind; - /** @var ArrayShapeUnsealedTypeNode|null */ - public $unsealedType; + public ?\PHPStan\PhpDocParser\Ast\Type\ArrayShapeUnsealedTypeNode $unsealedType = null; /** * @param ArrayShapeItemNode[] $items * @param self::KIND_* $kind */ - public function __construct(array $items, bool $sealed = \true, string $kind = self::KIND_ARRAY, ?\PHPStan\PhpDocParser\Ast\Type\ArrayShapeUnsealedTypeNode $unsealedType = null) + private function __construct(array $items, bool $sealed = \true, ?\PHPStan\PhpDocParser\Ast\Type\ArrayShapeUnsealedTypeNode $unsealedType = null, string $kind = self::KIND_ARRAY) { $this->items = $items; $this->sealed = $sealed; - $this->kind = $kind; $this->unsealedType = $unsealedType; + $this->kind = $kind; + } + /** + * @param ArrayShapeItemNode[] $items + * @param self::KIND_* $kind + */ + public static function createSealed(array $items, string $kind = self::KIND_ARRAY) : self + { + return new self($items, \true, null, $kind); + } + /** + * @param ArrayShapeItemNode[] $items + * @param self::KIND_* $kind + */ + public static function createUnsealed(array $items, ?\PHPStan\PhpDocParser\Ast\Type\ArrayShapeUnsealedTypeNode $unsealedType, string $kind = self::KIND_ARRAY) : self + { + return new self($items, \false, $unsealedType, $kind); } public function __toString() : string { diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php index 5d3c314b2..1e74c0c7a 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php @@ -9,10 +9,8 @@ class ArrayShapeUnsealedTypeNode implements Node { use NodeAttributes; - /** @var TypeNode */ - public $valueType; - /** @var TypeNode|null */ - public $keyType; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $valueType; + public ?\PHPStan\PhpDocParser\Ast\Type\TypeNode $keyType = null; public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $valueType, ?\PHPStan\PhpDocParser\Ast\Type\TypeNode $keyType) { $this->valueType = $valueType; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php index 61ec14ddf..0987e2f89 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php @@ -7,8 +7,7 @@ class ArrayTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $type; public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php index b648a09f3..d49f9a8a1 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php @@ -9,19 +9,17 @@ class CallableTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var IdentifierTypeNode */ - public $identifier; + public \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $identifier; /** @var TemplateTagValueNode[] */ - public $templateTypes; + public array $templateTypes; /** @var CallableTypeParameterNode[] */ - public $parameters; - /** @var TypeNode */ - public $returnType; + public array $parameters; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $returnType; /** * @param CallableTypeParameterNode[] $parameters * @param TemplateTagValueNode[] $templateTypes */ - public function __construct(\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $identifier, array $parameters, \PHPStan\PhpDocParser\Ast\Type\TypeNode $returnType, array $templateTypes = []) + public function __construct(\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $identifier, array $parameters, \PHPStan\PhpDocParser\Ast\Type\TypeNode $returnType, array $templateTypes) { $this->identifier = $identifier; $this->parameters = $parameters; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php index ba9f18ab2..1f624f2fb 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php @@ -9,16 +9,12 @@ class CallableTypeParameterNode implements Node { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var bool */ - public $isReference; - /** @var bool */ - public $isVariadic; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $type; + public bool $isReference; + public bool $isVariadic; /** @var string (may be empty) */ - public $parameterName; - /** @var bool */ - public $isOptional; + public string $parameterName; + public bool $isOptional; public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, bool $isReference, bool $isVariadic, string $parameterName, bool $isOptional) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php index 0f4065dc2..02d1d124b 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php @@ -8,16 +8,11 @@ class ConditionalTypeForParameterNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var string */ - public $parameterName; - /** @var TypeNode */ - public $targetType; - /** @var TypeNode */ - public $if; - /** @var TypeNode */ - public $else; - /** @var bool */ - public $negated; + public string $parameterName; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $targetType; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $if; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $else; + public bool $negated; public function __construct(string $parameterName, \PHPStan\PhpDocParser\Ast\Type\TypeNode $targetType, \PHPStan\PhpDocParser\Ast\Type\TypeNode $if, \PHPStan\PhpDocParser\Ast\Type\TypeNode $else, bool $negated) { $this->parameterName = $parameterName; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php index fcd5b1b5a..05d177f6a 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php @@ -8,16 +8,11 @@ class ConditionalTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var TypeNode */ - public $subjectType; - /** @var TypeNode */ - public $targetType; - /** @var TypeNode */ - public $if; - /** @var TypeNode */ - public $else; - /** @var bool */ - public $negated; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $subjectType; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $targetType; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $if; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $else; + public bool $negated; public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $subjectType, \PHPStan\PhpDocParser\Ast\Type\TypeNode $targetType, \PHPStan\PhpDocParser\Ast\Type\TypeNode $if, \PHPStan\PhpDocParser\Ast\Type\TypeNode $else, bool $negated) { $this->subjectType = $subjectType; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php index 45d03a3bc..792085db1 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php @@ -8,8 +8,7 @@ class ConstTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var ConstExprNode */ - public $constExpr; + public ConstExprNode $constExpr; public function __construct(ConstExprNode $constExpr) { $this->constExpr = $constExpr; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php index d9634ff99..62e21f8df 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php @@ -13,12 +13,11 @@ class GenericTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode public const VARIANCE_CONTRAVARIANT = 'contravariant'; public const VARIANCE_BIVARIANT = 'bivariant'; use NodeAttributes; - /** @var IdentifierTypeNode */ - public $type; + public \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $type; /** @var TypeNode[] */ - public $genericTypes; + public array $genericTypes; /** @var (self::VARIANCE_*)[] */ - public $variances; + public array $variances; /** * @param TypeNode[] $genericTypes * @param (self::VARIANCE_*)[] $variances diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php index 722998674..d8e898b82 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php @@ -7,8 +7,7 @@ class IdentifierTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var string */ - public $name; + public string $name; public function __construct(string $name) { $this->name = $name; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php index 142631884..5ef207cea 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php @@ -10,7 +10,7 @@ class IntersectionTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; /** @var TypeNode[] */ - public $types; + public array $types; /** * @param TypeNode[] $types */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php index bc4969981..f1353e02b 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php @@ -9,7 +9,7 @@ class InvalidTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; /** @var mixed[] */ - private $exceptionArgs; + private array $exceptionArgs; public function __construct(ParserException $exception) { $this->exceptionArgs = [$exception->getCurrentTokenValue(), $exception->getCurrentTokenType(), $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), $exception->getCurrentTokenLine()]; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php index b65549190..f4a0c318d 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php @@ -7,8 +7,7 @@ class NullableTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var TypeNode */ - public $type; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $type; public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php index b0273f885..2a8d63379 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php @@ -4,17 +4,16 @@ namespace PHPStan\PhpDocParser\Ast\Type; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; +use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\NodeAttributes; use function sprintf; -class ObjectShapeItemNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode +class ObjectShapeItemNode implements Node { use NodeAttributes; /** @var ConstExprStringNode|IdentifierTypeNode */ public $keyName; - /** @var bool */ - public $optional; - /** @var TypeNode */ - public $valueType; + public bool $optional; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $valueType; /** * @param ConstExprStringNode|IdentifierTypeNode $keyName */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php index 16954f516..17b78c34e 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php @@ -9,7 +9,7 @@ class ObjectShapeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; /** @var ObjectShapeItemNode[] */ - public $items; + public array $items; /** * @param ObjectShapeItemNode[] $items */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php index ced475e9e..c247fe73a 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php @@ -7,10 +7,8 @@ class OffsetAccessTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; - /** @var TypeNode */ - public $type; - /** @var TypeNode */ - public $offset; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $type; + public \PHPStan\PhpDocParser\Ast\Type\TypeNode $offset; public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, \PHPStan\PhpDocParser\Ast\Type\TypeNode $offset) { $this->type = $type; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php index 98f305841..5e8e321ca 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php @@ -10,7 +10,7 @@ class UnionTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode { use NodeAttributes; /** @var TypeNode[] */ - public $types; + public array $types; /** * @param TypeNode[] $types */ diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php index bf5676279..f77e6b490 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace PHPStan\PhpDocParser\Lexer; +use PHPStan\PhpDocParser\ParserConfig; use function implode; use function preg_match_all; use const PREG_SET_ORDER; @@ -48,17 +49,17 @@ class Lexer public const TOKEN_CLOSE_CURLY_BRACKET = 34; public const TOKEN_NEGATED = 35; public const TOKEN_ARROW = 36; - public const TOKEN_LABELS = [self::TOKEN_REFERENCE => '\'&\'', self::TOKEN_UNION => '\'|\'', self::TOKEN_INTERSECTION => '\'&\'', self::TOKEN_NULLABLE => '\'?\'', self::TOKEN_NEGATED => '\'!\'', self::TOKEN_OPEN_PARENTHESES => '\'(\'', self::TOKEN_CLOSE_PARENTHESES => '\')\'', self::TOKEN_OPEN_ANGLE_BRACKET => '\'<\'', self::TOKEN_CLOSE_ANGLE_BRACKET => '\'>\'', self::TOKEN_OPEN_SQUARE_BRACKET => '\'[\'', self::TOKEN_CLOSE_SQUARE_BRACKET => '\']\'', self::TOKEN_OPEN_CURLY_BRACKET => '\'{\'', self::TOKEN_CLOSE_CURLY_BRACKET => '\'}\'', self::TOKEN_COMMA => '\',\'', self::TOKEN_COLON => '\':\'', self::TOKEN_VARIADIC => '\'...\'', self::TOKEN_DOUBLE_COLON => '\'::\'', self::TOKEN_DOUBLE_ARROW => '\'=>\'', self::TOKEN_ARROW => '\'->\'', self::TOKEN_EQUAL => '\'=\'', self::TOKEN_OPEN_PHPDOC => '\'/**\'', self::TOKEN_CLOSE_PHPDOC => '\'*/\'', self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', self::TOKEN_DOCTRINE_TAG => 'TOKEN_DOCTRINE_TAG', self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', self::TOKEN_FLOAT => 'TOKEN_FLOAT', self::TOKEN_INTEGER => 'TOKEN_INTEGER', self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', self::TOKEN_DOCTRINE_ANNOTATION_STRING => 'TOKEN_DOCTRINE_ANNOTATION_STRING', self::TOKEN_IDENTIFIER => 'type', self::TOKEN_THIS_VARIABLE => '\'$this\'', self::TOKEN_VARIABLE => 'variable', self::TOKEN_HORIZONTAL_WS => 'TOKEN_HORIZONTAL_WS', self::TOKEN_OTHER => 'TOKEN_OTHER', self::TOKEN_END => 'TOKEN_END', self::TOKEN_WILDCARD => '*']; + public const TOKEN_COMMENT = 37; + public const TOKEN_LABELS = [self::TOKEN_REFERENCE => '\'&\'', self::TOKEN_UNION => '\'|\'', self::TOKEN_INTERSECTION => '\'&\'', self::TOKEN_NULLABLE => '\'?\'', self::TOKEN_NEGATED => '\'!\'', self::TOKEN_OPEN_PARENTHESES => '\'(\'', self::TOKEN_CLOSE_PARENTHESES => '\')\'', self::TOKEN_OPEN_ANGLE_BRACKET => '\'<\'', self::TOKEN_CLOSE_ANGLE_BRACKET => '\'>\'', self::TOKEN_OPEN_SQUARE_BRACKET => '\'[\'', self::TOKEN_CLOSE_SQUARE_BRACKET => '\']\'', self::TOKEN_OPEN_CURLY_BRACKET => '\'{\'', self::TOKEN_CLOSE_CURLY_BRACKET => '\'}\'', self::TOKEN_COMMA => '\',\'', self::TOKEN_COMMENT => '\'//\'', self::TOKEN_COLON => '\':\'', self::TOKEN_VARIADIC => '\'...\'', self::TOKEN_DOUBLE_COLON => '\'::\'', self::TOKEN_DOUBLE_ARROW => '\'=>\'', self::TOKEN_ARROW => '\'->\'', self::TOKEN_EQUAL => '\'=\'', self::TOKEN_OPEN_PHPDOC => '\'/**\'', self::TOKEN_CLOSE_PHPDOC => '\'*/\'', self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', self::TOKEN_DOCTRINE_TAG => 'TOKEN_DOCTRINE_TAG', self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', self::TOKEN_FLOAT => 'TOKEN_FLOAT', self::TOKEN_INTEGER => 'TOKEN_INTEGER', self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', self::TOKEN_DOCTRINE_ANNOTATION_STRING => 'TOKEN_DOCTRINE_ANNOTATION_STRING', self::TOKEN_IDENTIFIER => 'type', self::TOKEN_THIS_VARIABLE => '\'$this\'', self::TOKEN_VARIABLE => 'variable', self::TOKEN_HORIZONTAL_WS => 'TOKEN_HORIZONTAL_WS', self::TOKEN_OTHER => 'TOKEN_OTHER', self::TOKEN_END => 'TOKEN_END', self::TOKEN_WILDCARD => '*']; public const VALUE_OFFSET = 0; public const TYPE_OFFSET = 1; public const LINE_OFFSET = 2; - /** @var bool */ - private $parseDoctrineAnnotations; - /** @var string|null */ - private $regexp; - public function __construct(bool $parseDoctrineAnnotations = \false) + private ParserConfig $config; + // @phpstan-ignore property.onlyWritten + private ?string $regexp = null; + public function __construct(ParserConfig $config) { - $this->parseDoctrineAnnotations = $parseDoctrineAnnotations; + $this->config = $config; } /** * @return list @@ -104,6 +105,7 @@ private function generateRegexp() : string self::TOKEN_OPEN_CURLY_BRACKET => '\\{', self::TOKEN_CLOSE_CURLY_BRACKET => '\\}', self::TOKEN_COMMA => ',', + self::TOKEN_COMMENT => '\\/\\/[^\\r\\n]*(?=\\n|\\r|\\*/)', self::TOKEN_VARIADIC => '\\.\\.\\.', self::TOKEN_DOUBLE_COLON => '::', self::TOKEN_DOUBLE_ARROW => '=>', @@ -113,19 +115,17 @@ private function generateRegexp() : string self::TOKEN_OPEN_PHPDOC => '/\\*\\*(?=\\s)\\x20?+', self::TOKEN_CLOSE_PHPDOC => '\\*/', self::TOKEN_PHPDOC_TAG => '@(?:[a-z][a-z0-9-\\\\]+:)?[a-z][a-z0-9-\\\\]*+', + self::TOKEN_DOCTRINE_TAG => '@[a-z_\\\\][a-z0-9_\\:\\\\]*[a-z_][a-z0-9_]*', self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/)\\x20?+)?', self::TOKEN_FLOAT => '[+\\-]?(?:(?:[0-9]++(_[0-9]++)*\\.[0-9]*+(_[0-9]++)*(?:e[+\\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e[+\\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]++(_[0-9]++)*e[+\\-]?[0-9]++(_[0-9]++)*))', self::TOKEN_INTEGER => '[+\\-]?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))', self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'', self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"', + self::TOKEN_DOCTRINE_ANNOTATION_STRING => '"(?:""|[^"])*+"', self::TOKEN_WILDCARD => '\\*', + // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL + self::TOKEN_OTHER => '(?:(?!\\*/)[^\\s])++', ]; - if ($this->parseDoctrineAnnotations) { - $patterns[self::TOKEN_DOCTRINE_TAG] = '@[a-z_\\\\][a-z0-9_\\:\\\\]*[a-z_][a-z0-9_]*'; - $patterns[self::TOKEN_DOCTRINE_ANNOTATION_STRING] = '"(?:""|[^"])*+"'; - } - // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL - $patterns[self::TOKEN_OTHER] = '(?:(?!\\*/)[^\\s])++'; foreach ($patterns as $type => &$pattern) { $pattern = '(?:' . $pattern . ')(*MARK:' . $type . ')'; } diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php index 9530fded6..8e25bb488 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php @@ -5,30 +5,16 @@ use PHPStan\PhpDocParser\Ast; use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\ParserConfig; use function str_replace; use function strtolower; -use function substr; class ConstExprParser { - /** @var bool */ - private $unescapeStrings; - /** @var bool */ - private $quoteAwareConstExprString; - /** @var bool */ - private $useLinesAttributes; - /** @var bool */ - private $useIndexAttributes; - /** @var bool */ - private $parseDoctrineStrings; - /** - * @param array{lines?: bool, indexes?: bool} $usedAttributes - */ - public function __construct(bool $unescapeStrings = \false, bool $quoteAwareConstExprString = \false, array $usedAttributes = []) + private ParserConfig $config; + private bool $parseDoctrineStrings; + public function __construct(ParserConfig $config) { - $this->unescapeStrings = $unescapeStrings; - $this->quoteAwareConstExprString = $quoteAwareConstExprString; - $this->useLinesAttributes = $usedAttributes['lines'] ?? \false; - $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; + $this->config = $config; $this->parseDoctrineStrings = \false; } /** @@ -36,11 +22,11 @@ public function __construct(bool $unescapeStrings = \false, bool $quoteAwareCons */ public function toDoctrine() : self { - $self = new self($this->unescapeStrings, $this->quoteAwareConstExprString, ['lines' => $this->useLinesAttributes, 'indexes' => $this->useIndexAttributes]); + $self = new self($this->config); $self->parseDoctrineStrings = \true; return $self; } - public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, bool $trimStrings = \false) : Ast\ConstExpr\ConstExprNode + public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\ConstExpr\ConstExprNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); @@ -68,20 +54,10 @@ public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, bool $ $tokens->next(); return $this->enrichWithAttributes($tokens, $this->parseDoctrineString($value, $tokens), $startLine, $startIndex); } - $value = $tokens->currentTokenValue(); + $value = \PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()); $type = $tokens->currentTokenType(); - if ($trimStrings) { - if ($this->unescapeStrings) { - $value = \PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($value); - } else { - $value = substr($value, 1, -1); - } - } $tokens->next(); - if ($this->quoteAwareConstExprString) { - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\QuoteAwareConstExprStringNode($value, $type === Lexer::TOKEN_SINGLE_QUOTED_STRING ? Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED : Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED), $startLine, $startIndex); - } - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprStringNode($value), $startLine, $startIndex); + return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprStringNode($value, $type === Lexer::TOKEN_SINGLE_QUOTED_STRING ? Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED : Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED), $startLine, $startIndex); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $identifier = $tokens->currentTokenValue(); $tokens->next(); @@ -175,11 +151,11 @@ private function parseArrayItem(\PHPStan\PhpDocParser\Parser\TokenIterator $toke */ private function enrichWithAttributes(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, Ast\ConstExpr\ConstExprNode $node, int $startLine, int $startIndex) : Ast\ConstExpr\ConstExprNode { - if ($this->useLinesAttributes) { + if ($this->config->useLinesAttributes) { $node->setAttribute(Ast\Attribute::START_LINE, $startLine); $node->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } - if ($this->useIndexAttributes) { + if ($this->config->useIndexAttributes) { $node->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $node->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php index e09bc15da..b256800ff 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php @@ -13,19 +13,13 @@ use const JSON_UNESCAPED_UNICODE; class ParserException extends Exception { - /** @var string */ - private $currentTokenValue; - /** @var int */ - private $currentTokenType; - /** @var int */ - private $currentOffset; - /** @var int */ - private $expectedTokenType; - /** @var string|null */ - private $expectedTokenValue; - /** @var int|null */ - private $currentTokenLine; - public function __construct(string $currentTokenValue, int $currentTokenType, int $currentOffset, int $expectedTokenType, ?string $expectedTokenValue = null, ?int $currentTokenLine = null) + private string $currentTokenValue; + private int $currentTokenType; + private int $currentOffset; + private int $expectedTokenType; + private ?string $expectedTokenValue; + private ?int $currentTokenLine; + public function __construct(string $currentTokenValue, int $currentTokenType, int $currentOffset, int $expectedTokenType, ?string $expectedTokenValue, ?int $currentTokenLine) { $this->currentTokenValue = $currentTokenValue; $this->currentTokenType = $currentTokenType; diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php index dd3a45026..07ef845b2 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php @@ -11,9 +11,9 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\ParserConfig; use PHPStan\ShouldNotHappenException; use function array_key_exists; -use function array_values; use function count; use function rtrim; use function str_replace; @@ -24,74 +24,43 @@ class PhpDocParser { private const DISALLOWED_DESCRIPTION_START_TOKENS = [Lexer::TOKEN_UNION, Lexer::TOKEN_INTERSECTION]; - /** @var TypeParser */ - private $typeParser; - /** @var ConstExprParser */ - private $constantExprParser; - /** @var ConstExprParser */ - private $doctrineConstantExprParser; - /** @var bool */ - private $requireWhitespaceBeforeDescription; - /** @var bool */ - private $preserveTypeAliasesWithInvalidTypes; - /** @var bool */ - private $parseDoctrineAnnotations; - /** @var bool */ - private $useLinesAttributes; - /** @var bool */ - private $useIndexAttributes; - /** @var bool */ - private $textBetweenTagsBelongsToDescription; - /** - * @param array{lines?: bool, indexes?: bool} $usedAttributes - */ - public function __construct(\PHPStan\PhpDocParser\Parser\TypeParser $typeParser, \PHPStan\PhpDocParser\Parser\ConstExprParser $constantExprParser, bool $requireWhitespaceBeforeDescription = \false, bool $preserveTypeAliasesWithInvalidTypes = \false, array $usedAttributes = [], bool $parseDoctrineAnnotations = \false, bool $textBetweenTagsBelongsToDescription = \false) + private ParserConfig $config; + private \PHPStan\PhpDocParser\Parser\TypeParser $typeParser; + private \PHPStan\PhpDocParser\Parser\ConstExprParser $constantExprParser; + private \PHPStan\PhpDocParser\Parser\ConstExprParser $doctrineConstantExprParser; + public function __construct(ParserConfig $config, \PHPStan\PhpDocParser\Parser\TypeParser $typeParser, \PHPStan\PhpDocParser\Parser\ConstExprParser $constantExprParser) { + $this->config = $config; $this->typeParser = $typeParser; $this->constantExprParser = $constantExprParser; $this->doctrineConstantExprParser = $constantExprParser->toDoctrine(); - $this->requireWhitespaceBeforeDescription = $requireWhitespaceBeforeDescription; - $this->preserveTypeAliasesWithInvalidTypes = $preserveTypeAliasesWithInvalidTypes; - $this->parseDoctrineAnnotations = $parseDoctrineAnnotations; - $this->useLinesAttributes = $usedAttributes['lines'] ?? \false; - $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; - $this->textBetweenTagsBelongsToDescription = $textBetweenTagsBelongsToDescription; } public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\PhpDocNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PHPDOC); $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); $children = []; - if ($this->parseDoctrineAnnotations) { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - $lastChild = $this->parseChild($tokens); - $children[] = $lastChild; - while (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode && ($lastChild->value instanceof Doctrine\DoctrineTagValueNode || $lastChild->value instanceof Ast\PhpDoc\GenericTagValueNode)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - break; - } - $lastChild = $this->parseChild($tokens); - $children[] = $lastChild; - continue; - } - if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - break; - } + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + $lastChild = $this->parseChild($tokens); + $children[] = $lastChild; + while (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode && ($lastChild->value instanceof Doctrine\DoctrineTagValueNode || $lastChild->value instanceof Ast\PhpDoc\GenericTagValueNode)) { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { break; } $lastChild = $this->parseChild($tokens); $children[] = $lastChild; + continue; } - } - } else { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - $children[] = $this->parseChild($tokens); - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL) && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - $children[] = $this->parseChild($tokens); + if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + break; } + if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + break; + } + $lastChild = $this->parseChild($tokens); + $children[] = $lastChild; } } try { @@ -110,9 +79,17 @@ public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\ } $tag = new Ast\PhpDoc\PhpDocTagNode($name, $this->enrichWithAttributes($tokens, new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e), $startLine, $startIndex)); $tokens->forwardToTheEnd(); + $comments = $tokens->flushComments(); + if ($comments !== []) { + throw new LogicException('Comments should already be flushed'); + } return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode([$this->enrichWithAttributes($tokens, $tag, $startLine, $startIndex)]), 1, 0); } - return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode(array_values($children)), 1, 0); + $comments = $tokens->flushComments(); + if ($comments !== []) { + throw new LogicException('Comments should already be flushed'); + } + return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode($children), 1, 0); } /** @phpstan-impure */ private function parseChild(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\PhpDocChildNode @@ -143,11 +120,11 @@ private function parseChild(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) */ private function enrichWithAttributes(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, Ast\Node $tag, int $startLine, int $startIndex) : Ast\Node { - if ($this->useLinesAttributes) { + if ($this->config->useLinesAttributes) { $tag->setAttribute(Ast\Attribute::START_LINE, $startLine); $tag->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } - if ($this->useIndexAttributes) { + if ($this->config->useIndexAttributes) { $tag->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $tag->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } @@ -156,27 +133,22 @@ private function enrichWithAttributes(\PHPStan\PhpDocParser\Parser\TokenIterator private function parseText(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\PhpDocTextNode { $text = ''; - $endTokens = [Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - if ($this->textBetweenTagsBelongsToDescription) { - $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - } + $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; $savepoint = \false; // if the next token is EOL, everything below is skipped and empty string is returned - while ($this->textBetweenTagsBelongsToDescription || !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + while (\true) { $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); $text .= $tmpText; // stop if we're not at EOL - meaning it's the end of PHPDoc if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC)) { break; } - if ($this->textBetweenTagsBelongsToDescription) { - if (!$savepoint) { - $tokens->pushSavePoint(); - $savepoint = \true; - } elseif ($tmpText !== '') { - $tokens->dropSavePoint(); - $tokens->pushSavePoint(); - } + if (!$savepoint) { + $tokens->pushSavePoint(); + $savepoint = \true; + } elseif ($tmpText !== '') { + $tokens->dropSavePoint(); + $tokens->pushSavePoint(); } $tokens->pushSavePoint(); $tokens->next(); @@ -199,13 +171,10 @@ private function parseText(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : private function parseOptionalDescriptionAfterDoctrineTag(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : string { $text = ''; - $endTokens = [Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - if ($this->textBetweenTagsBelongsToDescription) { - $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - } + $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; $savepoint = \false; // if the next token is EOL, everything below is skipped and empty string is returned - while ($this->textBetweenTagsBelongsToDescription || !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + while (\true) { $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); $text .= $tmpText; // stop if we're not at EOL - meaning it's the end of PHPDoc @@ -238,14 +207,12 @@ private function parseOptionalDescriptionAfterDoctrineTag(\PHPStan\PhpDocParser\ } break; } - if ($this->textBetweenTagsBelongsToDescription) { - if (!$savepoint) { - $tokens->pushSavePoint(); - $savepoint = \true; - } elseif ($tmpText !== '') { - $tokens->dropSavePoint(); - $tokens->pushSavePoint(); - } + if (!$savepoint) { + $tokens->pushSavePoint(); + $savepoint = \true; + } elseif ($tmpText !== '') { + $tokens->dropSavePoint(); + $tokens->pushSavePoint(); } $tokens->pushSavePoint(); $tokens->next(); @@ -363,9 +330,7 @@ public function parseTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens case '@template-contravariant': case '@phpstan-template-contravariant': case '@psalm-template-contravariant': - $tagValue = $this->typeParser->parseTemplateTagValue($tokens, function ($tokens) { - return $this->parseOptionalDescription($tokens); - }); + $tagValue = $this->typeParser->parseTemplateTagValue($tokens, fn($tokens) => $this->parseOptionalDescription($tokens, \true)); break; case '@extends': case '@phpstan-extends': @@ -416,21 +381,17 @@ public function parseTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens $tagValue = $this->parseParamOutTagValue($tokens); break; default: - if ($this->parseDoctrineAnnotations) { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $tagValue = $this->parseDoctrineTagValue($tokens, $tag); - } else { - $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescriptionAfterDoctrineTag($tokens)); - } - break; + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $tagValue = $this->parseDoctrineTagValue($tokens, $tag); + } else { + $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescriptionAfterDoctrineTag($tokens)); } - $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescription($tokens)); break; } $tokens->dropSavePoint(); } catch (\PHPStan\PhpDocParser\Parser\ParserException $e) { $tokens->rollback(); - $tagValue = new Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens), $e); + $tagValue = new Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens, \false), $e); } return $this->enrichWithAttributes($tokens, $tagValue, $startLine, $startIndex); } @@ -534,7 +495,7 @@ private function parseDoctrineArgumentValue(\PHPStan\PhpDocParser\Parser\TokenIt $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); try { - $constExpr = $this->doctrineConstantExprParser->parse($tokens, \true); + $constExpr = $this->doctrineConstantExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new \PHPStan\PhpDocParser\Parser\ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } @@ -575,7 +536,10 @@ private function parseDoctrineArrayKey(\PHPStan\PhpDocParser\Parser\TokenIterato $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { - $key = new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($tokens->currentTokenValue())); + $key = $this->doctrineConstantExprParser->parseDoctrineString($tokens->currentTokenValue(), $tokens); + $tokens->next(); + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { + $key = new Ast\ConstExpr\ConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { $value = $tokens->currentTokenValue(); @@ -594,7 +558,7 @@ private function parseDoctrineArrayKey(\PHPStan\PhpDocParser\Parser\TokenIterato return $this->enrichWithAttributes($tokens, new IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); } $tokens->rollback(); - $constExpr = $this->doctrineConstantExprParser->parse($tokens, \true); + $constExpr = $this->doctrineConstantExprParser->parse($tokens); if (!$constExpr instanceof Ast\ConstExpr\ConstFetchNode) { throw new \PHPStan\PhpDocParser\Parser\ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine()); } @@ -615,7 +579,7 @@ private function parseParamTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $ $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); if ($type !== null) { return new Ast\PhpDoc\ParamTagValueNode($type, $isVariadic, $parameterName, $description, $isReference); } @@ -624,26 +588,26 @@ private function parseParamTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $ private function parseParamImmediatelyInvokedCallableTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode($parameterName, $description); } private function parseParamLaterInvokedCallableTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode($parameterName, $description); } private function parseParamClosureThisTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\ParamClosureThisTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamClosureThisTagValueNode($type, $parameterName, $description); } private function parsePureUnlessCallableIsImpureTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode($parameterName, $description); } private function parseVarTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\VarTagValueNode @@ -685,14 +649,14 @@ private function parseRequireImplementsTagValue(\PHPStan\PhpDocParser\Parser\Tok } private function parseDeprecatedTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\DeprecatedTagValueNode { - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\DeprecatedTagValueNode($description); } private function parsePropertyTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\PropertyTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\PropertyTagValueNode($type, $parameterName, $description); } private function parseMethodTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\MethodTagValueNode @@ -736,7 +700,7 @@ private function parseMethodTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\MethodTagValueNode($isStatic, $returnType, $methodName, $parameters, $description, $templateTypes); } private function parseMethodTagValueParameter(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\MethodTagValueParameterNode @@ -770,7 +734,7 @@ private function parseExtendsTagValue(string $tagName, \PHPStan\PhpDocParser\Par $baseType = new IdentifierTypeNode($tokens->currentTokenValue()); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $type = $this->typeParser->parseGeneric($tokens, $this->typeParser->enrichWithAttributes($tokens, $baseType, $startLine, $startIndex)); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \true); switch ($tagName) { case '@extends': return new Ast\PhpDoc\ExtendsTagValueNode($type, $description); @@ -787,24 +751,20 @@ private function parseTypeAliasTagValue(\PHPStan\PhpDocParser\Parser\TokenIterat $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); // support phan-type/psalm-type syntax $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); - if ($this->preserveTypeAliasesWithInvalidTypes) { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - try { - $type = $this->typeParser->parse($tokens); - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - throw new \PHPStan\PhpDocParser\Parser\ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_PHPDOC_EOL, null, $tokens->currentTokenLine()); - } + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + try { + $type = $this->typeParser->parse($tokens); + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + throw new \PHPStan\PhpDocParser\Parser\ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_PHPDOC_EOL, null, $tokens->currentTokenLine()); } - return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); - } catch (\PHPStan\PhpDocParser\Parser\ParserException $e) { - $this->parseOptionalDescription($tokens); - return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $this->enrichWithAttributes($tokens, new Ast\Type\InvalidTypeNode($e), $startLine, $startIndex)); } + return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); + } catch (\PHPStan\PhpDocParser\Parser\ParserException $e) { + $this->parseOptionalDescription($tokens, \false); + return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $this->enrichWithAttributes($tokens, new Ast\Type\InvalidTypeNode($e), $startLine, $startIndex)); } - $type = $this->typeParser->parse($tokens); - return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); } private function parseTypeAliasImportTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\TypeAliasImportTagValueNode { @@ -832,7 +792,7 @@ private function parseAssertTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $isEquality = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); $type = $this->typeParser->parse($tokens); $parameter = $this->parseAssertParameter($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); if (array_key_exists('method', $parameter)) { return new Ast\PhpDoc\AssertTagMethodValueNode($type, $parameter['parameter'], $parameter['method'], $isNegated, $description, $isEquality); } elseif (array_key_exists('property', $parameter)) { @@ -867,14 +827,14 @@ private function parseAssertParameter(\PHPStan\PhpDocParser\Parser\TokenIterator private function parseSelfOutTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\SelfOutTagValueNode { $type = $this->typeParser->parse($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \true); return new Ast\PhpDoc\SelfOutTagValueNode($type, $description); } private function parseParamOutTagValue(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\PhpDoc\ParamOutTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); + $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamOutTagValueNode($type, $parameterName, $description); } private function parseOptionalVariableName(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : string @@ -896,7 +856,10 @@ private function parseRequiredVariableName(\PHPStan\PhpDocParser\Parser\TokenIte $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); return $parameterName; } - private function parseOptionalDescription(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, bool $limitStartToken = \false) : string + /** + * @param bool $limitStartToken true should be used when the description immediately follows a parsed type + */ + private function parseOptionalDescription(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, bool $limitStartToken) : string { if ($limitStartToken) { foreach (self::DISALLOWED_DESCRIPTION_START_TOKENS as $disallowedStartToken) { @@ -906,7 +869,7 @@ private function parseOptionalDescription(\PHPStan\PhpDocParser\Parser\TokenIter $tokens->consumeTokenType(Lexer::TOKEN_OTHER); // will throw exception } - if ($this->requireWhitespaceBeforeDescription && !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END) && !$tokens->isPrecededByHorizontalWhitespace()) { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END) && !$tokens->isPrecededByHorizontalWhitespace()) { $tokens->consumeTokenType(Lexer::TOKEN_HORIZONTAL_WS); // will throw exception } diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php index ecc64b37e..f036a6e77 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php @@ -4,6 +4,7 @@ namespace PHPStan\PhpDocParser\Parser; use LogicException; +use PHPStan\PhpDocParser\Ast\Comment; use PHPStan\PhpDocParser\Lexer\Lexer; use function array_pop; use function assert; @@ -14,15 +15,15 @@ class TokenIterator { /** @var list */ - private $tokens; - /** @var int */ - private $index; - /** @var int[] */ - private $savePoints = []; + private array $tokens; + private int $index; + /** @var list */ + private array $comments = []; + /** @var list}> */ + private array $savePoints = []; /** @var list */ - private $skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; - /** @var string|null */ - private $newline = null; + private array $skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; + private ?string $newline = null; /** * @param list $tokens */ @@ -115,8 +116,7 @@ public function consumeTokenType(int $tokenType) : void $this->detectNewline(); } } - $this->index++; - $this->skipIrrelevantTokens(); + $this->next(); } /** * @throws ParserException @@ -126,8 +126,7 @@ public function consumeTokenValue(int $tokenType, string $tokenValue) : void if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType || $this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { $this->throwError($tokenType, $tokenValue); } - $this->index++; - $this->skipIrrelevantTokens(); + $this->next(); } /** @phpstan-impure */ public function tryConsumeTokenValue(string $tokenValue) : bool @@ -135,10 +134,18 @@ public function tryConsumeTokenValue(string $tokenValue) : bool if ($this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { return \false; } - $this->index++; - $this->skipIrrelevantTokens(); + $this->next(); return \true; } + /** + * @return list + */ + public function flushComments() : array + { + $res = $this->comments; + $this->comments = []; + return $res; + } /** @phpstan-impure */ public function tryConsumeTokenType(int $tokenType) : bool { @@ -150,10 +157,39 @@ public function tryConsumeTokenType(int $tokenType) : bool $this->detectNewline(); } } - $this->index++; - $this->skipIrrelevantTokens(); + $this->next(); return \true; } + /** + * @deprecated Use skipNewLineTokensAndConsumeComments instead (when parsing a type) + */ + public function skipNewLineTokens() : void + { + if (!$this->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + return; + } + do { + $foundNewLine = $this->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } while ($foundNewLine === \true); + } + public function skipNewLineTokensAndConsumeComments() : void + { + if ($this->currentTokenType() === Lexer::TOKEN_COMMENT) { + $this->comments[] = new Comment($this->currentTokenValue(), $this->currentTokenLine(), $this->currentTokenIndex()); + $this->next(); + } + if (!$this->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + return; + } + do { + $foundNewLine = $this->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + if ($this->currentTokenType() !== Lexer::TOKEN_COMMENT) { + continue; + } + $this->comments[] = new Comment($this->currentTokenValue(), $this->currentTokenLine(), $this->currentTokenIndex()); + $this->next(); + } while ($foundNewLine === \true); + } private function detectNewline() : void { $value = $this->currentTokenValue(); @@ -212,7 +248,7 @@ public function forwardToTheEnd() : void } public function pushSavePoint() : void { - $this->savePoints[] = $this->index; + $this->savePoints[] = [$this->index, $this->comments]; } public function dropSavePoint() : void { @@ -220,9 +256,9 @@ public function dropSavePoint() : void } public function rollback() : void { - $index = array_pop($this->savePoints); - assert($index !== null); - $this->index = $index; + $savepoint = array_pop($this->savePoints); + assert($savepoint !== null); + [$this->index, $this->comments] = $savepoint; } /** * @throws ParserException 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 622e5c2ce..69eca8a59 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 @@ -7,31 +7,20 @@ use PHPStan\PhpDocParser\Ast; use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\ParserConfig; use function in_array; use function str_replace; use function strlen; use function strpos; use function substr_compare; -use function trim; class TypeParser { - /** @var ConstExprParser|null */ - private $constExprParser; - /** @var bool */ - private $quoteAwareConstExprString; - /** @var bool */ - private $useLinesAttributes; - /** @var bool */ - private $useIndexAttributes; - /** - * @param array{lines?: bool, indexes?: bool} $usedAttributes - */ - public function __construct(?\PHPStan\PhpDocParser\Parser\ConstExprParser $constExprParser = null, bool $quoteAwareConstExprString = \false, array $usedAttributes = []) + private ParserConfig $config; + private \PHPStan\PhpDocParser\Parser\ConstExprParser $constExprParser; + public function __construct(ParserConfig $config, \PHPStan\PhpDocParser\Parser\ConstExprParser $constExprParser) { + $this->config = $config; $this->constExprParser = $constExprParser; - $this->quoteAwareConstExprString = $quoteAwareConstExprString; - $this->useLinesAttributes = $usedAttributes['lines'] ?? \false; - $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; } /** @phpstan-impure */ public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\Type\TypeNode @@ -42,14 +31,34 @@ public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\ $type = $this->parseNullable($tokens); } else { $type = $this->parseAtomic($tokens); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { - $type = $this->parseUnion($tokens, $type); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { - $type = $this->parseIntersection($tokens, $type); + $tokens->pushSavePoint(); + $tokens->skipNewLineTokensAndConsumeComments(); + try { + $enrichedType = $this->enrichTypeOnUnionOrIntersection($tokens, $type); + } catch (\PHPStan\PhpDocParser\Parser\ParserException $parserException) { + $enrichedType = null; + } + if ($enrichedType !== null) { + $type = $enrichedType; + $tokens->dropSavePoint(); + } else { + $tokens->rollback(); + $type = $this->enrichTypeOnUnionOrIntersection($tokens, $type) ?? $type; } } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } + /** @phpstan-impure */ + private function enrichTypeOnUnionOrIntersection(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, Ast\Type\TypeNode $type) : ?Ast\Type\TypeNode + { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { + return $this->parseUnion($tokens, $type); + } + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { + return $this->parseIntersection($tokens, $type); + } + return null; + } /** * @internal * @template T of Ast\Node @@ -58,11 +67,15 @@ public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\ */ public function enrichWithAttributes(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, Ast\Node $type, int $startLine, int $startIndex) : Ast\Node { - if ($this->useLinesAttributes) { + if ($this->config->useLinesAttributes) { $type->setAttribute(Ast\Attribute::START_LINE, $startLine); $type->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } - if ($this->useIndexAttributes) { + $comments = $tokens->flushComments(); + if ($this->config->useCommentsAttributes) { + $type->setAttribute(Ast\Attribute::COMMENTS, $comments); + } + if ($this->config->useIndexAttributes) { $type->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $type->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } @@ -82,7 +95,7 @@ private function subParse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : if ($tokens->isCurrentTokenValue('is')) { $type = $this->parseConditional($tokens, $type); } else { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { $type = $this->subParseUnion($tokens, $type); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { @@ -98,9 +111,9 @@ private function parseAtomic(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $type = $this->subParse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); @@ -164,11 +177,8 @@ private function parseAtomic(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); - if ($this->constExprParser === null) { - throw new \PHPStan\PhpDocParser\Parser\ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } try { - $constExpr = $this->constExprParser->parse($tokens, \true); + $constExpr = $this->constExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new \PHPStan\PhpDocParser\Parser\ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } @@ -187,6 +197,13 @@ private function parseUnion(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { $types[] = $this->parseAtomic($tokens); + $tokens->pushSavePoint(); + $tokens->skipNewLineTokensAndConsumeComments(); + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { + $tokens->rollback(); + break; + } + $tokens->dropSavePoint(); } return new Ast\Type\UnionTypeNode($types); } @@ -195,9 +212,9 @@ private function subParseUnion(\PHPStan\PhpDocParser\Parser\TokenIterator $token { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $types[] = $this->parseAtomic($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); } return new Ast\Type\UnionTypeNode($types); } @@ -207,6 +224,13 @@ private function parseIntersection(\PHPStan\PhpDocParser\Parser\TokenIterator $t $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { $types[] = $this->parseAtomic($tokens); + $tokens->pushSavePoint(); + $tokens->skipNewLineTokensAndConsumeComments(); + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { + $tokens->rollback(); + break; + } + $tokens->dropSavePoint(); } return new Ast\Type\IntersectionTypeNode($types); } @@ -215,9 +239,9 @@ private function subParseIntersection(\PHPStan\PhpDocParser\Parser\TokenIterator { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $types[] = $this->parseAtomic($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); } return new Ast\Type\IntersectionTypeNode($types); } @@ -231,13 +255,13 @@ private function parseConditional(\PHPStan\PhpDocParser\Parser\TokenIterator $to $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } $targetType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $ifType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $elseType = $this->subParse($tokens); return new Ast\Type\ConditionalTypeNode($subjectType, $targetType, $ifType, $elseType, $negated); } @@ -252,13 +276,13 @@ private function parseConditionalForParameter(\PHPStan\PhpDocParser\Parser\Token $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } $targetType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $ifType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $elseType = $this->subParse($tokens); return new Ast\Type\ConditionalTypeForParameterNode($parameterName, $targetType, $ifType, $elseType, $negated); } @@ -295,20 +319,21 @@ 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->skipNewLineTokensAndConsumeComments(); $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); $genericTypes = []; $variances = []; $isFirst = \true; while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); // 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->skipNewLineTokensAndConsumeComments(); } $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); if ($startLine !== null && $startIndex !== null) { @@ -373,18 +398,18 @@ private function parseCallable(\PHPStan\PhpDocParser\Parser\TokenIterator $token { $templates = $hasTemplate ? $this->parseCallableTemplates($tokens) : []; $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $parameters = []; if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { $parameters[] = $this->parseCallableParameter($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { break; } $parameters[] = $this->parseCallableParameter($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); @@ -405,14 +430,14 @@ private function parseCallableTemplates(\PHPStan\PhpDocParser\Parser\TokenIterat $templates = []; $isFirst = \true; while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); // trailing comma case if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { break; } $isFirst = \false; $templates[] = $this->parseCallableTemplateArgument($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $templates; @@ -498,11 +523,8 @@ private function parseCallableReturnType(\PHPStan\PhpDocParser\Parser\TokenItera $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); - if ($this->constExprParser === null) { - throw new \PHPStan\PhpDocParser\Parser\ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } try { - $constExpr = $this->constExprParser->parse($tokens, \true); + $constExpr = $this->constExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new \PHPStan\PhpDocParser\Parser\ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } @@ -570,37 +592,50 @@ private function parseArrayShape(\PHPStan\PhpDocParser\Parser\TokenIterator $tok $items = []; $sealed = \true; $unsealedType = null; + $done = \false; do { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { - return new Ast\Type\ArrayShapeNode($items, \true, $kind); + return Ast\Type\ArrayShapeNode::createSealed($items, $kind); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC)) { $sealed = \false; - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { if ($kind === Ast\Type\ArrayShapeNode::KIND_ARRAY) { $unsealedType = $this->parseArrayShapeUnsealedType($tokens); } else { $unsealedType = $this->parseListShapeUnsealedType($tokens); } - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA); break; } $items[] = $this->parseArrayShapeItem($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); + if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { + $done = \true; + } + if ($tokens->currentTokenType() !== Lexer::TOKEN_COMMENT) { + continue; + } + $tokens->next(); + } while (!$done); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); - return new Ast\Type\ArrayShapeNode($items, $sealed, $kind, $unsealedType); + if ($sealed) { + return Ast\Type\ArrayShapeNode::createSealed($items, $kind); + } + return Ast\Type\ArrayShapeNode::createUnsealed($items, $unsealedType, $kind); } /** @phpstan-impure */ private function parseArrayShapeItem(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : Ast\Type\ArrayShapeItemNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); + // parse any comments above the item + $tokens->skipNewLineTokensAndConsumeComments(); try { $tokens->pushSavePoint(); $key = $this->parseArrayShapeKey($tokens); @@ -627,18 +662,10 @@ private function parseArrayShapeKey(\PHPStan\PhpDocParser\Parser\TokenIterator $ $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); - } + $key = new Ast\ConstExpr\ConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); - } + $key = new Ast\ConstExpr\ConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED); $tokens->next(); } else { $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); @@ -654,15 +681,15 @@ private function parseArrayShapeUnsealedType(\PHPStan\PhpDocParser\Parser\TokenI $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $valueType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $keyType = null; if ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $keyType = $valueType; $valueType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeUnsealedTypeNode($valueType, $keyType), $startLine, $startIndex); @@ -675,9 +702,9 @@ private function parseListShapeUnsealedType(\PHPStan\PhpDocParser\Parser\TokenIt $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $valueType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeUnsealedTypeNode($valueType, null), $startLine, $startIndex); } @@ -689,14 +716,14 @@ private function parseObjectShape(\PHPStan\PhpDocParser\Parser\TokenIterator $to $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); $items = []; do { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { return new Ast\Type\ObjectShapeNode($items); } $items[] = $this->parseObjectShapeItem($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); return new Ast\Type\ObjectShapeNode($items); } @@ -705,6 +732,7 @@ private function parseObjectShapeItem(\PHPStan\PhpDocParser\Parser\TokenIterator { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); + $tokens->skipNewLineTokensAndConsumeComments(); $key = $this->parseObjectShapeKey($tokens); $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->consumeTokenType(Lexer::TOKEN_COLON); @@ -720,18 +748,10 @@ private function parseObjectShapeKey(\PHPStan\PhpDocParser\Parser\TokenIterator $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); - } + $key = new Ast\ConstExpr\ConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); - } + $key = new Ast\ConstExpr\ConstExprStringNode(\PHPStan\PhpDocParser\Parser\StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED); $tokens->next(); } else { $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/ParserConfig.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/ParserConfig.php new file mode 100644 index 000000000..66a9cc8fc --- /dev/null +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/ParserConfig.php @@ -0,0 +1,20 @@ +useLinesAttributes = $usedAttributes['lines'] ?? \false; + $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; + $this->useCommentsAttributes = $usedAttributes['comments'] ?? \false; + } +} diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php index a47383342..829ad5ea7 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php @@ -5,6 +5,7 @@ use LogicException; use PHPStan\PhpDocParser\Ast\Attribute; +use PHPStan\PhpDocParser\Ast\Comment; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprArrayNode; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode; use PHPStan\PhpDocParser\Ast\Node; @@ -67,6 +68,7 @@ use PHPStan\PhpDocParser\Parser\TokenIterator; use function array_keys; use function array_map; +use function assert; use function count; use function get_class; use function get_object_vars; @@ -75,6 +77,7 @@ use function is_array; use function preg_match_all; use function sprintf; +use function str_replace; use function strlen; use function strpos; use function trim; @@ -88,24 +91,24 @@ final class Printer { /** @var Differ */ - private $differ; + private \PHPStan\PhpDocParser\Printer\Differ $differ; /** * Map From "{$class}->{$subNode}" to string that should be inserted * between elements of this list subnode * * @var array */ - private $listInsertionMap = [PhpDocNode::class . '->children' => "\n * ", UnionTypeNode::class . '->types' => '|', IntersectionTypeNode::class . '->types' => '&', ArrayShapeNode::class . '->items' => ', ', ObjectShapeNode::class . '->items' => ', ', CallableTypeNode::class . '->parameters' => ', ', CallableTypeNode::class . '->templateTypes' => ', ', GenericTypeNode::class . '->genericTypes' => ', ', ConstExprArrayNode::class . '->items' => ', ', MethodTagValueNode::class . '->parameters' => ', ', DoctrineArray::class . '->items' => ', ', DoctrineAnnotation::class . '->arguments' => ', ']; + private array $listInsertionMap = [PhpDocNode::class . '->children' => "\n * ", UnionTypeNode::class . '->types' => '|', IntersectionTypeNode::class . '->types' => '&', ArrayShapeNode::class . '->items' => ', ', ObjectShapeNode::class . '->items' => ', ', CallableTypeNode::class . '->parameters' => ', ', CallableTypeNode::class . '->templateTypes' => ', ', GenericTypeNode::class . '->genericTypes' => ', ', ConstExprArrayNode::class . '->items' => ', ', MethodTagValueNode::class . '->parameters' => ', ', DoctrineArray::class . '->items' => ', ', DoctrineAnnotation::class . '->arguments' => ', ']; /** * [$find, $extraLeft, $extraRight] * * @var array */ - private $emptyListInsertionMap = [CallableTypeNode::class . '->parameters' => ['(', '', ''], ArrayShapeNode::class . '->items' => ['{', '', ''], ObjectShapeNode::class . '->items' => ['{', '', ''], DoctrineArray::class . '->items' => ['{', '', ''], DoctrineAnnotation::class . '->arguments' => ['(', '', '']]; + private array $emptyListInsertionMap = [CallableTypeNode::class . '->parameters' => ['(', '', ''], ArrayShapeNode::class . '->items' => ['{', '', ''], ObjectShapeNode::class . '->items' => ['{', '', ''], DoctrineArray::class . '->items' => ['{', '', ''], DoctrineAnnotation::class . '->arguments' => ['(', '', '']]; /** @var array>> */ - private $parenthesesMap = [CallableTypeNode::class . '->returnType' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class], ArrayTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, ConstTypeNode::class, NullableTypeNode::class], OffsetAccessTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, NullableTypeNode::class]]; + private array $parenthesesMap = [CallableTypeNode::class . '->returnType' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class], ArrayTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, ConstTypeNode::class, NullableTypeNode::class], OffsetAccessTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, NullableTypeNode::class]]; /** @var array>> */ - private $parenthesesListMap = [IntersectionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class], UnionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class]]; + private array $parenthesesListMap = [IntersectionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class], UnionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class]]; public function printFormatPreserving(PhpDocNode $node, PhpDocNode $originalNode, TokenIterator $originalTokens) : string { $this->differ = new \PHPStan\PhpDocParser\Printer\Differ(static function ($a, $b) { @@ -179,6 +182,18 @@ public function print(Node $node) : string if ($node instanceof DoctrineArrayItem) { return (string) $node; } + if ($node instanceof ArrayShapeItemNode) { + if ($node->keyName !== null) { + return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); + } + return $this->printType($node->valueType); + } + if ($node instanceof ObjectShapeItemNode) { + if ($node->keyName !== null) { + return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); + } + return $this->printType($node->valueType); + } throw new LogicException(sprintf('Unknown node type %s', get_class($node))); } private function printTagValue(PhpDocTagValueNode $node) : string @@ -210,13 +225,9 @@ private function printTagValue(PhpDocTagValueNode $node) : string if ($node instanceof MethodTagValueNode) { $static = $node->isStatic ? 'static ' : ''; $returnType = $node->returnType !== null ? $this->printType($node->returnType) . ' ' : ''; - $parameters = implode(', ', array_map(function (MethodTagValueParameterNode $parameter) : string { - return $this->print($parameter); - }, $node->parameters)); + $parameters = implode(', ', array_map(fn(MethodTagValueParameterNode $parameter): string => $this->print($parameter), $node->parameters)); $description = $node->description !== '' ? " {$node->description}" : ''; - $templateTypes = count($node->templateTypes) > 0 ? '<' . implode(', ', array_map(function (TemplateTagValueNode $templateTag) : string { - return $this->print($templateTag); - }, $node->templateTypes)) . '>' : ''; + $templateTypes = count($node->templateTypes) > 0 ? '<' . implode(', ', array_map(fn(TemplateTagValueNode $templateTag): string => $this->print($templateTag), $node->templateTypes)) . '>' : ''; return "{$static}{$returnType}{$node->methodName}{$templateTypes}({$parameters}){$description}"; } if ($node instanceof MixinTagValueNode) { @@ -295,20 +306,12 @@ private function printTagValue(PhpDocTagValueNode $node) : string private function printType(TypeNode $node) : string { if ($node instanceof ArrayShapeNode) { - $items = array_map(function (ArrayShapeItemNode $item) : string { - return $this->printType($item); - }, $node->items); + $items = array_map(fn(ArrayShapeItemNode $item): string => $this->print($item), $node->items); if (!$node->sealed) { $items[] = '...' . ($node->unsealedType === null ? '' : $this->print($node->unsealedType)); } return $node->kind . '{' . implode(', ', $items) . '}'; } - if ($node instanceof ArrayShapeItemNode) { - if ($node->keyName !== null) { - return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); - } - return $this->printType($node->valueType); - } if ($node instanceof ArrayTypeNode) { return $this->printOffsetAccessType($node->type) . '[]'; } @@ -318,12 +321,8 @@ private function printType(TypeNode $node) : string } else { $returnType = $this->printType($node->returnType); } - $template = $node->templateTypes !== [] ? '<' . implode(', ', array_map(function (TemplateTagValueNode $templateNode) : string { - return $this->print($templateNode); - }, $node->templateTypes)) . '>' : ''; - $parameters = implode(', ', array_map(function (CallableTypeParameterNode $parameterNode) : string { - return $this->print($parameterNode); - }, $node->parameters)); + $template = $node->templateTypes !== [] ? '<' . implode(', ', array_map(fn(TemplateTagValueNode $templateNode): string => $this->print($templateNode), $node->templateTypes)) . '>' : ''; + $parameters = implode(', ', array_map(fn(CallableTypeParameterNode $parameterNode): string => $this->print($parameterNode), $node->parameters)); return "{$node->identifier}{$template}({$parameters}): {$returnType}"; } if ($node instanceof ConditionalTypeForParameterNode) { @@ -373,17 +372,9 @@ private function printType(TypeNode $node) : string return '?' . $this->printType($node->type); } if ($node instanceof ObjectShapeNode) { - $items = array_map(function (ObjectShapeItemNode $item) : string { - return $this->printType($item); - }, $node->items); + $items = array_map(fn(ObjectShapeItemNode $item): string => $this->print($item), $node->items); return 'object{' . implode(', ', $items) . '}'; } - if ($node instanceof ObjectShapeItemNode) { - if ($node->keyName !== null) { - return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); - } - return $this->printType($node->valueType); - } if ($node instanceof OffsetAccessTypeNode) { return $this->printOffsetAccessType($node->type) . '[' . $this->printType($node->offset) . ']'; } @@ -427,18 +418,24 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes, } foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; - $newNode = $diffElem->new; - $originalNode = $diffElem->old; + $arrItem = $diffElem->new; + $origArrayItem = $diffElem->old; if ($diffType === \PHPStan\PhpDocParser\Printer\DiffElem::TYPE_KEEP || $diffType === \PHPStan\PhpDocParser\Printer\DiffElem::TYPE_REPLACE) { $beforeFirstKeepOrReplace = \false; - if (!$newNode instanceof Node || !$originalNode instanceof Node) { + if (!$arrItem instanceof Node || !$origArrayItem instanceof Node) { return null; } - $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); - $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); + /** @var int $itemStartPos */ + $itemStartPos = $origArrayItem->getAttribute(Attribute::START_INDEX); + /** @var int $itemEndPos */ + $itemEndPos = $origArrayItem->getAttribute(Attribute::END_INDEX); if ($itemStartPos < 0 || $itemEndPos < 0 || $itemStartPos < $tokenIndex) { throw new LogicException(); } + $comments = $arrItem->getAttribute(Attribute::COMMENTS) ?? []; + $origComments = $origArrayItem->getAttribute(Attribute::COMMENTS) ?? []; + $commentStartPos = count($origComments) > 0 ? $origComments[0]->startIndex : $itemStartPos; + assert($commentStartPos >= 0); $result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos); if (count($delayedAdd) > 0) { foreach ($delayedAdd as $delayedAddNode) { @@ -446,6 +443,13 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes, if ($parenthesesNeeded) { $result .= '('; } + if ($insertNewline) { + $delayedAddComments = $delayedAddNode->getAttribute(Attribute::COMMENTS) ?? []; + if (count($delayedAddComments) > 0) { + $result .= $this->printComments($delayedAddComments, $beforeAsteriskIndent, $afterAsteriskIndent); + $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + } + } $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); if ($parenthesesNeeded) { $result .= ')'; @@ -458,12 +462,18 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes, } $delayedAdd = []; } - $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], \true) && !in_array(get_class($originalNode), $this->parenthesesListMap[$mapKey], \true); + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($arrItem), $this->parenthesesListMap[$mapKey], \true) && !in_array(get_class($origArrayItem), $this->parenthesesListMap[$mapKey], \true); $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($itemStartPos, $itemEndPos); if ($addParentheses) { $result .= '('; } - $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); + if ($comments !== $origComments) { + if (count($comments) > 0) { + $result .= $this->printComments($comments, $beforeAsteriskIndent, $afterAsteriskIndent); + $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + } + } + $result .= $this->printNodeFormatPreserving($arrItem, $originalTokens); if ($addParentheses) { $result .= ')'; } @@ -472,39 +482,48 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes, if ($insertStr === null) { return null; } - if (!$newNode instanceof Node) { + if (!$arrItem instanceof Node) { return null; } - if ($insertStr === ', ' && $isMultiline) { + if ($insertStr === ', ' && $isMultiline || count($arrItem->getAttribute(Attribute::COMMENTS) ?? []) > 0) { $insertStr = ','; $insertNewline = \true; } if ($beforeFirstKeepOrReplace) { // Will be inserted at the next "replace" or "keep" element - $delayedAdd[] = $newNode; + $delayedAdd[] = $arrItem; continue; } + /** @var int $itemEndPos */ $itemEndPos = $tokenIndex - 1; if ($insertNewline) { - $result .= $insertStr . sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + $comments = $arrItem->getAttribute(Attribute::COMMENTS) ?? []; + $result .= $insertStr; + if (count($comments) > 0) { + $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + $result .= $this->printComments($comments, $beforeAsteriskIndent, $afterAsteriskIndent); + } + $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } else { $result .= $insertStr; } - $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], \true); + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($arrItem), $this->parenthesesListMap[$mapKey], \true); if ($parenthesesNeeded) { $result .= '('; } - $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); + $result .= $this->printNodeFormatPreserving($arrItem, $originalTokens); if ($parenthesesNeeded) { $result .= ')'; } $tokenIndex = $itemEndPos + 1; } elseif ($diffType === \PHPStan\PhpDocParser\Printer\DiffElem::TYPE_REMOVE) { - if (!$originalNode instanceof Node) { + if (!$origArrayItem instanceof Node) { return null; } - $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); - $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); + /** @var int $itemStartPos */ + $itemStartPos = $origArrayItem->getAttribute(Attribute::START_INDEX); + /** @var int $itemEndPos */ + $itemEndPos = $origArrayItem->getAttribute(Attribute::END_INDEX); if ($itemStartPos < 0 || $itemEndPos < 0) { throw new LogicException(); } @@ -555,7 +574,18 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes, return $result; } /** - * @param Node[] $nodes + * @param list $comments + */ + private function printComments(array $comments, string $beforeAsteriskIndent, string $afterAsteriskIndent) : string + { + $formattedComments = []; + foreach ($comments as $comment) { + $formattedComments[] = str_replace("\n", "\n" . $beforeAsteriskIndent . '*' . $afterAsteriskIndent, $comment->getReformattedText()); + } + return implode("\n{$beforeAsteriskIndent}*{$afterAsteriskIndent}", $formattedComments); + } + /** + * @param array $nodes * @return array{bool, string, string} */ private function isMultiline(int $initialIndex, array $nodes, TokenIterator $originalTokens) : array @@ -581,7 +611,7 @@ private function isMultiline(int $initialIndex, array $nodes, TokenIterator $ori } $c = preg_match_all('~\\n(?[\\x09\\x20]*)\\*(?\\x20*)~', $allText, $matches, PREG_SET_ORDER); if ($c === 0) { - return [$isMultiline, '', '']; + return [$isMultiline, ' ', ' ']; } $before = ''; $after = ''; @@ -594,6 +624,8 @@ private function isMultiline(int $initialIndex, array $nodes, TokenIterator $ori } $after = $match['after']; } + $before = strlen($before) === 0 ? ' ' : $before; + $after = strlen($after) === 0 ? ' ' : $after; return [$isMultiline, $before, $after]; } private function printNodeFormatPreserving(Node $node, TokenIterator $originalTokens) : string diff --git a/vendor/rector/rector/vendor/psr/container/composer.json b/vendor/rector/rector/vendor/psr/container/composer.json index 43736592e..a3f483027 100644 --- a/vendor/rector/rector/vendor/psr/container/composer.json +++ b/vendor/rector/rector/vendor/psr/container/composer.json @@ -22,7 +22,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Psr\\Container\\": "src\/" + "RectorPrefix202506\\Psr\\Container\\": "src\/" } }, "extra": { diff --git a/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php b/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php index 1d8d4a574..91c411c05 100644 --- a/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php +++ b/vendor/rector/rector/vendor/psr/container/src/ContainerExceptionInterface.php @@ -1,6 +1,6 @@ =5.3.0", "evenement\/evenement": "^3.0 || ^2.0 || ^1.0", "react\/event-loop": "^1.2", - "react\/stream": "^1.2" + "react\/stream": "^1.4" }, "require-dev": { - "phpunit\/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react\/socket": "^1.8", + "phpunit\/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react\/socket": "^1.16", "sebastian\/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" }, "autoload": { "psr-4": { - "RectorPrefix202411\\React\\ChildProcess\\": "src" + "RectorPrefix202506\\React\\ChildProcess\\": "src\/" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\React\\Tests\\ChildProcess\\": "tests" + "RectorPrefix202506\\React\\Tests\\ChildProcess\\": "tests\/" } } } \ No newline at end of file diff --git a/vendor/rector/rector/vendor/react/child-process/src/Process.php b/vendor/rector/rector/vendor/react/child-process/src/Process.php index 933f80441..44a96a581 100644 --- a/vendor/rector/rector/vendor/react/child-process/src/Process.php +++ b/vendor/rector/rector/vendor/react/child-process/src/Process.php @@ -1,16 +1,16 @@ isRunning()) { throw new \RuntimeException('Process is already running'); } diff --git a/vendor/rector/rector/vendor/react/dns/composer.json b/vendor/rector/rector/vendor/react/dns/composer.json index d2d188c87..0e16d935d 100644 --- a/vendor/rector/rector/vendor/react/dns/composer.json +++ b/vendor/rector/rector/vendor/react/dns/composer.json @@ -43,12 +43,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\React\\Dns\\": "src\/" + "RectorPrefix202506\\React\\Dns\\": "src\/" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\React\\Tests\\Dns\\": "tests\/" + "RectorPrefix202506\\React\\Tests\\Dns\\": "tests\/" } } } \ No newline at end of file diff --git a/vendor/rector/rector/vendor/react/dns/src/BadServerException.php b/vendor/rector/rector/vendor/react/dns/src/BadServerException.php index 768913778..689f55f79 100644 --- a/vendor/rector/rector/vendor/react/dns/src/BadServerException.php +++ b/vendor/rector/rector/vendor/react/dns/src/BadServerException.php @@ -1,6 +1,6 @@ class !== Message::CLASS_IN ? 'CLASS' . $this->class . ' ' : ''; $type = 'TYPE' . $this->type; - $ref = new \ReflectionClass('RectorPrefix202411\\React\\Dns\\Model\\Message'); + $ref = new \ReflectionClass('RectorPrefix202506\\React\\Dns\\Model\\Message'); foreach ($ref->getConstants() as $name => $value) { if ($value === $this->type && \strpos($name, 'TYPE_') === 0) { $type = \substr($name, 5); diff --git a/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php b/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php index 5c828836f..d15d8657e 100644 --- a/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php +++ b/vendor/rector/rector/vendor/react/dns/src/Query/RetryExecutor.php @@ -1,9 +1,9 @@ dumper->toBinary($request); $length = \strlen($queryData); if ($length > 0xffff) { - return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for TCP transport')); + return \RectorPrefix202506\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for TCP transport')); } $queryData = \pack('n', $length) . $queryData; if ($this->socket === null) { // create async TCP/IP connection (may take a while) $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT); if ($socket === \false) { - return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); + return \RectorPrefix202506\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); } // set socket to non-blocking and wait for it to become writable (connection success/rejected) \stream_set_blocking($socket, \false); diff --git a/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php b/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php index c1373141e..fc0ced66b 100644 --- a/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php +++ b/vendor/rector/rector/vendor/react/dns/src/Query/TimeoutException.php @@ -1,6 +1,6 @@ dumper->toBinary($request); if (isset($queryData[$this->maxPacketSize])) { - return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for UDP transport', \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90)); + return \RectorPrefix202506\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Query too large for UDP transport', \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90)); } // UDP connections are instant, so try connection without a loop or timeout $errno = 0; $errstr = ''; $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0); if ($socket === \false) { - return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); + return \RectorPrefix202506\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); } // set socket to non-blocking and immediately try to send (fill write buffer) \stream_set_blocking($socket, \false); @@ -142,7 +142,7 @@ public function query(Query $query) $written = \fwrite($socket, $queryData); \restore_error_handler(); if ($written !== \strlen($queryData)) { - return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); + return \RectorPrefix202506\React\Promise\reject(new \RuntimeException('DNS query for ' . $query->describe() . ' failed: Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno)); } $loop = $this->loop; $deferred = new Deferred(function () use($loop, $socket, $query) { diff --git a/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php b/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php index 035144c2c..32194ebc0 100644 --- a/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php +++ b/vendor/rector/rector/vendor/react/dns/src/RecordNotFoundException.php @@ -1,6 +1,6 @@ loop = new EventLoop(); diff --git a/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php b/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php index 5769d23c3..4d00f42ab 100644 --- a/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php +++ b/vendor/rector/rector/vendor/react/event-loop/src/ExtLibeventLoop.php @@ -1,12 +1,12 @@ streamEvents[(int) $stream])) { - $this->streamEvents[(int) $stream] = \RectorPrefix202411\uv_poll_init_socket($this->uv, $stream); + $this->streamEvents[(int) $stream] = \RectorPrefix202506\uv_poll_init_socket($this->uv, $stream); } if ($this->streamEvents[(int) $stream] !== \false) { $this->pollStream($stream); diff --git a/vendor/rector/rector/vendor/react/event-loop/src/Factory.php b/vendor/rector/rector/vendor/react/event-loop/src/Factory.php index 0694191b7..466bc8bb6 100644 --- a/vendor/rector/rector/vendor/react/event-loop/src/Factory.php +++ b/vendor/rector/rector/vendor/react/event-loop/src/Factory.php @@ -1,6 +1,6 @@ diff --git a/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php b/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php index 366bd0c64..afa060e70 100644 --- a/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php +++ b/vendor/rector/rector/vendor/react/promise/src/PromiseInterface.php @@ -1,6 +1,6 @@ connectors[$scheme])) { - return \RectorPrefix202411\React\Promise\reject(new \RuntimeException('No connector available for URI scheme "' . $scheme . '" (EINVAL)', \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22))); + return \RectorPrefix202506\React\Promise\reject(new \RuntimeException('No connector available for URI scheme "' . $scheme . '" (EINVAL)', \defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22))); } return $this->connectors[$scheme]->connect($uri); } diff --git a/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php b/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php index 830253ab1..b5cd5ed48 100644 --- a/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php +++ b/vendor/rector/rector/vendor/react/socket/src/ConnectorInterface.php @@ -1,6 +1,6 @@ then($resolve, $reject); }, function ($_, $reject) use(&$promise, $uri, &$connected) { if ($connected) { diff --git a/vendor/rector/rector/vendor/react/socket/src/SecureServer.php b/vendor/rector/rector/vendor/react/socket/src/SecureServer.php index 1bb281268..6de6b3235 100644 --- a/vendor/rector/rector/vendor/react/socket/src/SecureServer.php +++ b/vendor/rector/rector/vendor/react/socket/src/SecureServer.php @@ -1,10 +1,10 @@ services(); $services->set(TypedPropertyRector::class); diff --git a/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php b/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php index 9a605e7f4..1848af429 100644 --- a/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php +++ b/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php @@ -9,7 +9,7 @@ */ final class GeneratedConfig { - public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main e75008c'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main d9cef57'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 38bdce4'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 799b454')); + public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main cea5e66'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main 1454a52'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 3bc079d'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 1a199fc')); private function __construct() { } diff --git a/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php b/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php index 1d778b426..93bc6bb64 100644 --- a/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php +++ b/vendor/rector/rector/vendor/rector/extension-installer/src/PluginInstaller.php @@ -3,40 +3,22 @@ declare (strict_types=1); namespace Rector\RectorInstaller; -use RectorPrefix202411\Composer\Installer\InstallationManager; -use RectorPrefix202411\Composer\IO\IOInterface; -use RectorPrefix202411\Composer\Package\PackageInterface; -use RectorPrefix202411\Composer\Repository\InstalledRepositoryInterface; -use RectorPrefix202411\Composer\Util\Filesystem as ComposerFilesystem; +use RectorPrefix202506\Composer\Installer\InstallationManager; +use RectorPrefix202506\Composer\IO\IOInterface; +use RectorPrefix202506\Composer\Package\PackageInterface; +use RectorPrefix202506\Composer\Repository\InstalledRepositoryInterface; +use RectorPrefix202506\Composer\Util\Filesystem as ComposerFilesystem; /** * @see \Rector\RectorInstaller\Tests\PluginInstallerTest */ final class PluginInstaller { - /** - * @var \Rector\RectorInstaller\Filesystem - */ - private $filesystem; - /** - * @var \Composer\Repository\InstalledRepositoryInterface - */ - private $localRepository; - /** - * @var \Composer\IO\IOInterface - */ - private $io; - /** - * @var \Composer\Installer\InstallationManager - */ - private $installationManager; - /** - * @var ComposerFilesystem - */ - private $composerFilesystem; - /** - * @var string - */ - private $configurationFile; + private \Rector\RectorInstaller\Filesystem $filesystem; + private InstalledRepositoryInterface $localRepository; + private IOInterface $io; + private InstallationManager $installationManager; + private ComposerFilesystem $composerFilesystem; + private string $configurationFile; /** * @var string */ @@ -45,10 +27,7 @@ final class PluginInstaller * @var string */ public const RECTOR_EXTRA_KEY = 'rector'; - /** - * @var string - */ - private static $generatedFileTemplate = <<<'CODE_SAMPLE' + private static string $generatedFileTemplate = <<<'CODE_SAMPLE' withPreparedSets` method, and pick one of co use Rector\Config\RectorConfig; return RectorConfig::configure() - ->withPreparedSets(doctrineCodeQuality: true); + ->withPreparedSets(doctrineCodeQuality: true) + ->withComposerBased(doctrine: true); ``` If you're on PHP 7.x, you can use withSets() instead, for `doctrineCodeQuality` set, so you can define: @@ -34,7 +35,8 @@ return RectorConfig::configure() DoctrineSetList::DOCTRINE_CODE_QUALITY, ]); ``` -See [documentation](https://getrector.com/documentation) + +See [documentation](https://getrector.com/documentation) for more.
diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json b/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json index d18c67f92..1c8c7d934 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json @@ -5,24 +5,22 @@ "description": "Rector upgrades rules for Doctrine", "require": { "php": ">=8.2", - "symfony\/yaml": "^7.1" + "symfony\/yaml": "^7.2" }, "require-dev": { - "doctrine\/doctrine-bundle": "^2.12", - "doctrine\/orm": "^2.19", + "doctrine\/doctrine-bundle": "^2.14", + "doctrine\/orm": "^2.20", "phpstan\/extension-installer": "^1.4", - "phpstan\/phpstan": "^1.11", - "phpstan\/phpstan-deprecation-rules": "^1.2", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "phpunit\/phpunit": "^10.5", + "phpstan\/phpstan": "^2.1.14", + "phpstan\/phpstan-deprecation-rules": "^2.0", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.5", "rector\/rector-src": "dev-main", - "rector\/type-perfect": "^0.2", - "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/phpstan-rules": "^13.0", + "rector\/type-perfect": "^2.1", + "phpecs\/phpecs": "^2.1", + "symplify\/phpstan-rules": "^14.6.9", "symplify\/vendor-patches": "^11.3", - "tomasvotruba\/class-leak": "^0.2.15", - "tomasvotruba\/unused-public": "^0.4", + "tomasvotruba\/class-leak": "^2.0", "tracy\/tracy": "^2.10" }, "autoload": { @@ -48,7 +46,7 @@ ] }, "scripts": { - "phpstan": "vendor\/bin\/phpstan analyse --ansi --error-format symplify", + "phpstan": "vendor\/bin\/phpstan analyse --ansi", "rector": "vendor\/bin\/rector --ansi", "check-cs": "vendor\/bin\/ecs check --ansi", "fix-cs": "vendor\/bin\/ecs check --fix --ansi" diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php index 4e0170b99..f71b06f70 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/attributes/doctrine.php @@ -1,7 +1,7 @@ rules([AddGetReferenceTypeRector::class]); +}; 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 index c4afc40d3..fb86adcdd 100644 --- 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 @@ -1,10 +1,9 @@ rule(EventSubscriberInterfaceToAttributeRector::class); + // only for BC }; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-23.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-23.php new file mode 100644 index 000000000..77d392e98 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-23.php @@ -0,0 +1,10 @@ +rule(AddAnnotationToRepositoryRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-28.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-28.php new file mode 100644 index 000000000..6eae43640 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-28.php @@ -0,0 +1,11 @@ +rule(EventSubscriberInterfaceToAttributeRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-code-quality.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-code-quality.php index 5c7896d65..c66f84b12 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-code-quality.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-code-quality.php @@ -1,32 +1,27 @@ rules([ - MakeEntityDateTimePropertyDateTimeInterfaceRector::class, MoveCurrentDateTimeDefaultInEntityToConstructorRector::class, CorrectDefaultTypesOnEntityPropertyRector::class, - ExplicitRelationCollectionRector::class, - ImproveDoctrineCollectionDocTypeInEntityRector::class, RemoveEmptyTableAttributeRector::class, // typed properties in entities from annotations/attributes TypedPropertyFromColumnTypeRector::class, TypedPropertyFromToOneRelationTypeRector::class, - TypedPropertyFromToManyRelationTypeRector::class, + // annotations generics + AddAnnotationToRepositoryRector::class, ]); $rectorConfig->ruleWithConfiguration(AttributeKeyToClassConstFetchRector::class, [new AttributeKeyToClassConstFetch('Doctrine\\ORM\\Mapping\\Column', 'type', 'Doctrine\\DBAL\\Types\\Types', ['array' => 'ARRAY', 'ascii_string' => 'ASCII_STRING', 'bigint' => 'BIGINT', 'binary' => 'BINARY', 'blob' => 'BLOB', 'boolean' => 'BOOLEAN', 'date' => 'DATE_MUTABLE', 'date_immutable' => 'DATE_IMMUTABLE', 'dateinterval' => 'DATEINTERVAL', 'datetime' => 'DATETIME_MUTABLE', 'datetime_immutable' => 'DATETIME_IMMUTABLE', 'datetimetz' => 'DATETIMETZ_MUTABLE', 'datetimetz_immutable' => 'DATETIMETZ_IMMUTABLE', 'decimal' => 'DECIMAL', 'float' => 'FLOAT', 'guid' => 'GUID', 'integer' => 'INTEGER', 'json' => 'JSON', 'object' => 'OBJECT', 'simple_array' => 'SIMPLE_ARRAY', 'smallint' => 'SMALLINT', 'string' => 'STRING', 'text' => 'TEXT', 'time' => 'TIME_MUTABLE', 'time_immutable' => 'TIME_IMMUTABLE'])]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-collection-22.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-collection-22.php index 89f78b78c..dcafcd076 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-collection-22.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-collection-22.php @@ -1,9 +1,10 @@ rules([\Rector\Doctrine\Collection22\Rector\CriteriaOrderingConstantsDeprecationRector::class]); + $rectorConfig->rules([CriteriaOrderingConstantsDeprecationRector::class]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-common-20.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-common-20.php index fb4646a63..814474a86 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-common-20.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-common-20.php @@ -1,7 +1,7 @@ rule(ChangeCompositeExpressionAddMultipleWithWithRector::class); + $rectorConfig->rules([ + // @see https://github.com/doctrine/dbal/blob/4.0.x/UPGRADE.md#bc-break-removed-compositeexpression-methods + ChangeCompositeExpressionAddMultipleWithWithRector::class, + // @see https://github.com/doctrine/dbal/pull/5556 + ExecuteQueryParamsToBindValueRector::class, + ]); $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ // @see https://github.com/doctrine/dbal/blob/4.0.x/UPGRADE.md#bc-break-removed-misspelled-isfullfilledby-method new MethodCallRename('Doctrine\\DBAL\\Schema\\Index', 'isFullfilledBy', 'isFulfilledBy'), @@ -40,6 +45,13 @@ // @see https://github.com/doctrine/dbal/blob/4.0.x/UPGRADE.md#bc-break-removed-connectionparam__array-constants new RenameClassAndConstFetch('Doctrine\\DBAL\\Connection', 'PARAM_INT_ARRAY', 'Doctrine\\DBAL\\ArrayParameterType', 'INTEGER'), ]); + $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [ + // @see https://github.com/doctrine/dbal/pull/5554 + new RenameClassAndConstFetch('PDO', 'PARAM_INT', 'Doctrine\\DBAL\\ParameterType', 'INTEGER'), + new RenameClassAndConstFetch('PDO', 'PARAM_BOOL', 'Doctrine\\DBAL\\ParameterType', 'BOOLEAN'), + new RenameClassAndConstFetch('PDO', 'PARAM_STR', 'Doctrine\\DBAL\\ParameterType', 'STRING'), + new RenameClassAndConstFetch('PDO', 'PARAM_NULL', 'Doctrine\\DBAL\\ParameterType', 'NULL'), + ]); $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ // @see https://github.com/doctrine/dbal/blob/4.0.x/UPGRADE.md#bc-break-removed-connection_schemamanager-and-connectiongetschemamanager new MethodCallRename('Doctrine\\DBAL\\Connection', 'getSchemaManager', 'createSchemaManager'), diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-dbal-42.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-dbal-42.php new file mode 100644 index 000000000..9233ae1b4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-dbal-42.php @@ -0,0 +1,13 @@ +rules([ + // @see https://github.com/doctrine/dbal/pull/6504/files + AddArrayResultColumnNamesRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-213.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-213.php index ca4a244a8..27d2cdebf 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-213.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-213.php @@ -1,7 +1,7 @@ ruleWithConfiguration(RenameClassRector::class, [ // @see https://github.com/doctrine/orm/pull/9906 diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-214.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-214.php index e8520b137..55f1e5e20 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-214.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-214.php @@ -1,7 +1,7 @@ rule(IterateToToIterableRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-300.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-300.php new file mode 100644 index 000000000..07fe78ffb --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-orm-300.php @@ -0,0 +1,13 @@ +rules([SetParametersArrayToCollectionRector::class, CastDoctrineExprToStringRector::class]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Doctrine\\ORM\\ORMException' => 'Doctrine\\ORM\\Exception\\ORMException']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/typed-collections.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/typed-collections.php index 02ce54a6c..7505929ca 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/typed-collections.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/typed-collections.php @@ -1,11 +1,84 @@ withRules([ExplicitRelationCollectionRector::class, AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector::class, TypedPropertyFromToManyRelationTypeRector::class, ImproveDoctrineCollectionDocTypeInEntityRector::class]); +use Rector\Doctrine\TypedCollections\Rector\Assign\ArrayDimFetchAssignToAddCollectionCallRector; +use Rector\Doctrine\TypedCollections\Rector\Assign\ArrayOffsetSetToSetCollectionCallRector; +use Rector\Doctrine\TypedCollections\Rector\Class_\CompleteParamDocblockFromSetterToCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector; +use Rector\Doctrine\TypedCollections\Rector\Class_\CompleteReturnDocblockFromToManyRector; +use Rector\Doctrine\TypedCollections\Rector\Class_\InitializeCollectionInConstructorRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionGetterNativeTypeRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionParamTypeSetterToCollectionPropertyRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionSetterParamNativeTypeRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\DefaultCollectionKeyRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowArrayCollectionToCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowParamUnionToCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowReturnUnionToCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\RemoveNewArrayCollectionOutsideConstructorRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\RemoveNullFromNullableCollectionTypeRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\ReturnArrayToNewArrayCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\ClassMethod\ReturnCollectionDocblockRector; +use Rector\Doctrine\TypedCollections\Rector\Empty_\EmptyOnCollectionToIsEmptyCallRector; +use Rector\Doctrine\TypedCollections\Rector\Expression\RemoveAssertNotNullOnCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\Expression\RemoveCoalesceAssignOnCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\FuncCall\ArrayMapOnCollectionToArrayRector; +use Rector\Doctrine\TypedCollections\Rector\FuncCall\ArrayMergeOnCollectionToArrayRector; +use Rector\Doctrine\TypedCollections\Rector\FuncCall\InArrayOnCollectionToContainsCallRector; +use Rector\Doctrine\TypedCollections\Rector\If_\RemoveIfInstanceofCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\If_\RemoveIsArrayOnCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\MethodCall\AssertNullOnCollectionToAssertEmptyRector; +use Rector\Doctrine\TypedCollections\Rector\MethodCall\AssertSameCountOnCollectionToAssertCountRector; +use Rector\Doctrine\TypedCollections\Rector\MethodCall\SetArrayToNewCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\New_\RemoveNewArrayCollectionWrapRector; +use Rector\Doctrine\TypedCollections\Rector\NullsafeMethodCall\RemoveNullsafeOnCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\Property\NarrowPropertyUnionToCollectionRector; +use Rector\Doctrine\TypedCollections\Rector\Property\TypedPropertyFromToManyRelationTypeRector; +return static function (RectorConfig $rectorConfig) : void { + $rectorConfig->rules([ + // init + InitializeCollectionInConstructorRector::class, + RemoveNewArrayCollectionOutsideConstructorRector::class, + RemoveCoalesceAssignOnCollectionRector::class, + RemoveIfInstanceofCollectionRector::class, + RemoveIsArrayOnCollectionRector::class, + // collection method calls + ArrayDimFetchAssignToAddCollectionCallRector::class, + ArrayOffsetSetToSetCollectionCallRector::class, + ArrayMapOnCollectionToArrayRector::class, + ArrayMergeOnCollectionToArrayRector::class, + EmptyOnCollectionToIsEmptyCallRector::class, + InArrayOnCollectionToContainsCallRector::class, + // native type declarations + CollectionGetterNativeTypeRector::class, + CollectionSetterParamNativeTypeRector::class, + CollectionParamTypeSetterToCollectionPropertyRector::class, + TypedPropertyFromToManyRelationTypeRector::class, + RemoveNullFromNullableCollectionTypeRector::class, + // docblocks + DefaultCollectionKeyRector::class, + NarrowArrayCollectionToCollectionRector::class, + // @param docblock + CompleteParamDocblockFromSetterToCollectionRector::class, + NarrowParamUnionToCollectionRector::class, + // @var docblock + CompletePropertyDocblockFromToManyRector::class, + NarrowPropertyUnionToCollectionRector::class, + // @return docblock + NarrowReturnUnionToCollectionRector::class, + CompleteReturnDocblockFromToManyRector::class, + ReturnCollectionDocblockRector::class, + // new ArrayCollection() wraps + ReturnArrayToNewArrayCollectionRector::class, + SetArrayToNewCollectionRector::class, + RemoveNewArrayCollectionWrapRector::class, + // cleanup + RemoveNullsafeOnCollectionRector::class, + // test assertions + RemoveAssertNotNullOnCollectionRector::class, + AssertNullOnCollectionToAssertEmptyRector::class, + AssertSameCountOnCollectionToAssertCountRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/yaml-to-annotations.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/yaml-to-annotations.php index cf24782f9..a9e97ff35 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/yaml-to-annotations.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/yaml-to-annotations.php @@ -1,7 +1,7 @@ reflectionProvider = $reflectionProvider; + } public function provideMinPhpVersion() : int { return PhpVersionFeature::ATTRIBUTES; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Replace EventSubscriberInterface with AsDoctrineListener attribute(s)', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Replace EventSubscriberInterface with #[AsDoctrineListener] attribute', [new CodeSample(<<<'CODE_SAMPLE' use Doctrine\ORM\Event\PrePersistEventArgs; use Doctrine\ORM\Event\PostUpdateEventArgs; use Doctrine\Common\EventSubscriberInterface; @@ -100,10 +106,13 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if (!$this->hasImplements($node, 'Doctrine\\Common\\EventSubscriber') && !$this->hasImplements($node, 'Doctrine\\Bundle\\DoctrineBundle\\EventSubscriber\\EventSubscriberInterface')) { + if (!$this->reflectionProvider->hasClass(DoctrineClass::AS_DOCTRINE_LISTENER_ATTRIBUTE)) { + return null; + } + if (!$this->hasImplements($node, DoctrineClass::EVENT_SUBSCRIBER) && !$this->hasImplements($node, DoctrineClass::EVENT_SUBSCRIBER_INTERFACE)) { return null; } - $this->subscriberClass = $node; + // $this->subscriberClass = $class; $getSubscribedEventsClassMethod = $node->getMethod('getSubscribedEvents'); if (!$getSubscribedEventsClassMethod instanceof ClassMethod) { return null; @@ -113,23 +122,23 @@ public function refactor(Node $node) : ?Node return null; } if ($stmts[0] instanceof Return_ && $stmts[0]->expr instanceof Array_) { - $this->handleArray($stmts); + $this->handleArray($node, $stmts); } - $this->removeImplements($node, ['Doctrine\\Common\\EventSubscriber', 'Doctrine\\Bundle\\DoctrineBundle\\EventSubscriber\\EventSubscriberInterface']); + $this->removeImplements($node, [DoctrineClass::EVENT_SUBSCRIBER, DoctrineClass::EVENT_SUBSCRIBER_INTERFACE]); unset($node->stmts[$getSubscribedEventsClassMethod->getAttribute(AttributeKey::STMT_KEY)]); return $node; } /** * @param array $expressions */ - private function handleArray(array $expressions) : void + private function handleArray(Class_ $class, array $expressions) : void { foreach ($expressions as $expression) { if (!$expression instanceof Return_ || !$expression->expr instanceof Array_) { continue; } $arguments = $this->parseArguments($expression->expr); - $this->addAttribute($arguments); + $this->addAttribute($class, $arguments); } } /** @@ -148,16 +157,16 @@ private function parseArguments(Array_ $array) : array /** * @param array $arguments */ - private function addAttribute(array $arguments) : void + private function addAttribute(Class_ $class, 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'))])]); + $class->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified(DoctrineClass::AS_DOCTRINE_LISTENER_ATTRIBUTE), [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)) { + if ($this->isName($implement, $interfaceFQN)) { return \true; } } @@ -169,7 +178,7 @@ private function hasImplements(Class_ $class, string $interfaceFQN) : bool private function removeImplements(Class_ $class, array $interfaceFQNS) : void { foreach ($class->implements as $key => $implement) { - if (!$this->nodeNameResolver->isNames($implement, $interfaceFQNS)) { + if (!$this->isNames($implement, $interfaceFQNS)) { continue; } unset($class->implements[$key]); diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle230/Rector/Class_/AddAnnotationToRepositoryRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle230/Rector/Class_/AddAnnotationToRepositoryRector.php new file mode 100644 index 000000000..875c4e393 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle230/Rector/Class_/AddAnnotationToRepositoryRector.php @@ -0,0 +1,142 @@ +docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add @extends ServiceEntityRepository annotation to repository classes', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; + +final class SomeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, SomeEntity::class); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; + +/** + * @extends ServiceEntityRepository<\SomeEntity> + */ +final class SomeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, SomeEntity::class); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->isRepositoryClass($node)) { + return null; + } + $entityClass = $this->getEntityClassFromConstructor($node); + if ($entityClass === null || $this->hasExtendsAnnotation($node)) { + return null; + } + $this->addAnnotationToNode($node, $entityClass); + return $node; + } + private function isRepositoryClass(Class_ $class) : bool + { + if (!$class->extends instanceof Name) { + return \false; + } + return $this->isName($class->extends, DoctrineClass::SERVICE_ENTITY_REPOSITORY); + } + private function getEntityClassFromConstructor(Class_ $class) : ?string + { + $classMethod = $class->getMethod(MethodName::CONSTRUCT); + if (!$classMethod instanceof ClassMethod || $classMethod->stmts === null) { + return null; + } + foreach ($classMethod->stmts as $stmt) { + if (!$stmt instanceof Expression) { + continue; + } + $expr = $stmt->expr; + if (!$expr instanceof StaticCall) { + continue; + } + if (!$this->isParentConstructorCall($expr)) { + continue; + } + $entityClassNode = $expr->args[1]->value ?? null; + if (!$entityClassNode instanceof ClassConstFetch) { + continue; + } + $entityClass = $entityClassNode->class; + return $entityClass instanceof Name ? $entityClass->toString() : null; + } + return null; + } + private function addAnnotationToNode(Class_ $class, string $entityClass) : void + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($class); + $genericsAnnotation = \sprintf('\\%s<\\%s>', DoctrineClass::SERVICE_ENTITY_REPOSITORY, $entityClass); + $phpDocInfo->addPhpDocTagNode(new PhpDocTagNode('@extends', new GenericTagValueNode($genericsAnnotation))); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($class); + } + private function hasExtendsAnnotation(Class_ $class) : bool + { + return $this->phpDocInfoFactory->createFromNodeOrEmpty($class)->hasByName('@extends'); + } + private function isParentConstructorCall(StaticCall $staticCall) : bool + { + return $this->isName($staticCall->class, 'parent') && $this->isName($staticCall->name, '__construct') && isset($staticCall->args[1]) && $staticCall->args[1] instanceof Arg && $staticCall->args[1]->value instanceof ClassConstFetch; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EmbeddableClassAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EmbeddableClassAttributeTransformer.php index f96d5907d..473b7c9f2 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EmbeddableClassAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EmbeddableClassAttributeTransformer.php @@ -10,14 +10,15 @@ use Rector\Doctrine\Enum\MappingClass; final class EmbeddableClassAttributeTransformer implements ClassAttributeTransformerInterface { - public function transform(EntityMapping $entityMapping, Class_ $class) : void + public function transform(EntityMapping $entityMapping, Class_ $class) : bool { $classMapping = $entityMapping->getClassMapping(); $type = $classMapping['type'] ?? null; if ($type !== 'embeddable') { - return; + return \false; } $class->attrGroups[] = AttributeFactory::createGroup($this->getClassName()); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EntityClassAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EntityClassAttributeTransformer.php index 7cc5a191e..fe56412d6 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EntityClassAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/EntityClassAttributeTransformer.php @@ -16,12 +16,12 @@ final class EntityClassAttributeTransformer implements ClassAttributeTransformer * @var string */ private const REPOSITORY_CLASS_KEY = 'repositoryClass'; - public function transform(EntityMapping $entityMapping, Class_ $class) : void + public function transform(EntityMapping $entityMapping, Class_ $class) : bool { $classMapping = $entityMapping->getClassMapping(); $type = $classMapping['type'] ?? null; if ($type !== 'entity') { - return; + return \false; } $args = []; $repositoryClass = $classMapping[self::REPOSITORY_CLASS_KEY] ?? null; @@ -30,6 +30,7 @@ public function transform(EntityMapping $entityMapping, Class_ $class) : void $args[] = AttributeFactory::createNamedArg($repositoryClassConstFetch, self::REPOSITORY_CLASS_KEY); } $class->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/InheritanceClassAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/InheritanceClassAttributeTransformer.php index fd2a5beb2..d15d38496 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/InheritanceClassAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/InheritanceClassAttributeTransformer.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Doctrine\CodeQuality\AttributeTransformer\ClassAttributeTransformer; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; @@ -19,19 +19,18 @@ final class InheritanceClassAttributeTransformer implements ClassAttributeTransf { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; } - public function transform(EntityMapping $entityMapping, Class_ $class) : void + public function transform(EntityMapping $entityMapping, Class_ $class) : bool { $classMapping = $entityMapping->getClassMapping(); $inheritanceType = $classMapping['inheritanceType'] ?? null; if ($inheritanceType === null) { - return; + return \false; } $class->attrGroups[] = AttributeFactory::createGroup(MappingClass::INHERITANCE_TYPE, [$inheritanceType]); if (isset($classMapping['discriminatorColumn'])) { @@ -40,6 +39,7 @@ public function transform(EntityMapping $entityMapping, Class_ $class) : void if (isset($classMapping['discriminatorMap'])) { $this->addDiscriminatorMap($classMapping['discriminatorMap'], $class); } + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/SoftDeletableClassAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/SoftDeletableClassAttributeTransformer.php index c8c9f20d3..77637716e 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/SoftDeletableClassAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/SoftDeletableClassAttributeTransformer.php @@ -15,19 +15,18 @@ final class SoftDeletableClassAttributeTransformer implements ClassAttributeTran { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; } - public function transform(EntityMapping $entityMapping, Class_ $class) : void + public function transform(EntityMapping $entityMapping, Class_ $class) : bool { $classMapping = $entityMapping->getClassMapping(); $softDeletableMapping = $classMapping['gedmo']['soft_deleteable'] ?? null; if (!\is_array($softDeletableMapping)) { - return; + return \false; } $args = $this->nodeFactory->createArgs($softDeletableMapping); foreach ($args as $arg) { @@ -37,6 +36,7 @@ public function transform(EntityMapping $entityMapping, Class_ $class) : void $arg->name = new Identifier(CaseStringHelper::camelCase($arg->name->toString())); } $class->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/TableClassAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/TableClassAttributeTransformer.php index ba543359c..7f8a7694c 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/TableClassAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/ClassAttributeTransformer/TableClassAttributeTransformer.php @@ -14,9 +14,8 @@ final class TableClassAttributeTransformer implements ClassAttributeTransformerI { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @var string */ @@ -25,12 +24,12 @@ public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; } - public function transform(EntityMapping $entityMapping, Class_ $class) : void + public function transform(EntityMapping $entityMapping, Class_ $class) : bool { $classMapping = $entityMapping->getClassMapping(); $table = $classMapping[self::TABLE_KEY] ?? null; if (isset($classMapping['type']) && $classMapping['type'] !== 'entity') { - return; + return \false; } $args = []; if (\is_string($table)) { @@ -39,6 +38,7 @@ public function transform(EntityMapping $entityMapping, Class_ $class) : void $class->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); $this->addIndexes($classMapping['indexes'] ?? [], $class, MappingClass::INDEX); $this->addIndexes($classMapping['uniqueConstraints'] ?? [], $class, MappingClass::UNIQUE_CONSTRAINT); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ColumnAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ColumnAttributeTransformer.php index 2f207b2c1..8bb7bd036 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ColumnAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ColumnAttributeTransformer.php @@ -15,9 +15,8 @@ final class ColumnAttributeTransformer implements PropertyAttributeTransformerIn { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -25,11 +24,11 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $propertyMapping = $entityMapping->matchFieldPropertyMapping($property); if ($propertyMapping === null) { - return; + return \false; } // handled in another mapper unset($propertyMapping['gedmo']); @@ -42,6 +41,7 @@ public function transform(EntityMapping $entityMapping, $property) : void } $args = \array_merge($args, $this->nodeFactory->createArgs($propertyMapping)); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/EmbeddedPropertyAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/EmbeddedPropertyAttributeTransformer.php index 2e2351478..bfe22c9d7 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/EmbeddedPropertyAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/EmbeddedPropertyAttributeTransformer.php @@ -15,9 +15,8 @@ final class EmbeddedPropertyAttributeTransformer implements PropertyAttributeTra { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -25,17 +24,18 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $propertyMapping = $entityMapping->matchEmbeddedPropertyMapping($property); if ($propertyMapping === null) { - return; + return \false; } // handled in another attribute unset($propertyMapping['nullable']); $args = $this->nodeFactory->createArgs($propertyMapping); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); NodeValueNormalizer::ensureKeyIsClassConstFetch($args, 'class'); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/GedmoTimestampableAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/GedmoTimestampableAttributeTransformer.php index f5b2ca28d..0fe65db1e 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/GedmoTimestampableAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/GedmoTimestampableAttributeTransformer.php @@ -14,9 +14,8 @@ final class GedmoTimestampableAttributeTransformer implements PropertyAttributeT { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -24,15 +23,16 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $fieldPropertyMapping = $entityMapping->matchFieldPropertyMapping($property); $timestampableMapping = $fieldPropertyMapping['gedmo']['timestampable'] ?? null; if (!\is_array($timestampableMapping)) { - return; + return \false; } $args = $this->nodeFactory->createArgs($timestampableMapping); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdAttributeTransformer.php index 4b814fcda..05c6caf9c 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdAttributeTransformer.php @@ -14,13 +14,14 @@ final class IdAttributeTransformer implements PropertyAttributeTransformerInterf /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $idMapping = $entityMapping->matchIdPropertyMapping($property); if (!\is_array($idMapping)) { - return; + return \false; } $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName()); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdColumnAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdColumnAttributeTransformer.php index 2209b7905..29f808be6 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdColumnAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdColumnAttributeTransformer.php @@ -14,11 +14,11 @@ final class IdColumnAttributeTransformer implements PropertyAttributeTransformer /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $idMapping = $entityMapping->matchIdPropertyMapping($property); if (!\is_array($idMapping)) { - return; + return \false; } $args = []; $type = $idMapping['type'] ?? null; @@ -26,6 +26,7 @@ public function transform(EntityMapping $entityMapping, $property) : void $args[] = AttributeFactory::createNamedArg($type, 'type'); } $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdGeneratorAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdGeneratorAttributeTransformer.php index bde1fb073..ec18a30e6 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdGeneratorAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/IdGeneratorAttributeTransformer.php @@ -15,9 +15,8 @@ final class IdGeneratorAttributeTransformer implements PropertyAttributeTransfor { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @see https://www.doctrine-project.org/projects/doctrine-orm/en/3.0/reference/basic-mapping.html#identifier-generation-strategies * @var string[] @@ -31,20 +30,21 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $idMapping = $entityMapping->matchIdPropertyMapping($property); if (!\is_array($idMapping)) { - return; + return \false; } $generator = $idMapping[EntityMappingKey::GENERATOR] ?? null; if (!\is_array($generator)) { - return; + return \false; } // make sure strategy is uppercase as constant value $generator = $this->normalizeStrategy($generator); $args = $this->nodeFactory->createArgs($generator); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/InverseJoinColumnAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/InverseJoinColumnAttributeTransformer.php index 400ee48c7..3b2fc8582 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/InverseJoinColumnAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/InverseJoinColumnAttributeTransformer.php @@ -15,9 +15,8 @@ final class InverseJoinColumnAttributeTransformer implements PropertyAttributeTr { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -25,19 +24,20 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $joinTableMapping = $entityMapping->matchManyToManyPropertyMapping($property)['joinTable'] ?? null; if (!\is_array($joinTableMapping)) { - return; + return \false; } $joinColumns = $joinTableMapping['inverseJoinColumns'] ?? null; if (!\is_array($joinColumns)) { - return; + return \false; } foreach ($joinColumns as $columnName => $joinColumn) { $property->attrGroups[] = $this->createInverseJoinColumnAttrGroup($columnName, $joinColumn); } + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinColumnAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinColumnAttributeTransformer.php index f9a17748f..98f34a066 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinColumnAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinColumnAttributeTransformer.php @@ -15,9 +15,8 @@ final class JoinColumnAttributeTransformer implements PropertyAttributeTransform { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -25,10 +24,11 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { - $this->transformMapping($property, $entityMapping->matchManyToManyPropertyMapping($property)['joinTable'] ?? null); - $this->transformMapping($property, $entityMapping->matchManyToOnePropertyMapping($property)); + $hasChangedManyToMany = $this->transformMapping($property, $entityMapping->matchManyToManyPropertyMapping($property)['joinTable'] ?? null); + $hasChangedManyToOne = $this->transformMapping($property, $entityMapping->matchManyToOnePropertyMapping($property)); + return $hasChangedManyToMany || $hasChangedManyToOne; } public function getClassName() : string { @@ -38,10 +38,10 @@ public function getClassName() : string * @param array>|null $mapping * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - private function transformMapping($property, ?array $mapping) : void + private function transformMapping($property, ?array $mapping) : bool { if (!\is_array($mapping)) { - return; + return \false; } $singleJoinColumn = $mapping['joinColumn'] ?? null; if (\is_array($singleJoinColumn)) { @@ -51,11 +51,14 @@ private function transformMapping($property, ?array $mapping) : void } $joinColumns = $mapping['joinColumns'] ?? null; if (!\is_array($joinColumns)) { - return; + return \false; } + $hasChanged = \false; foreach ($joinColumns as $columnName => $joinColumn) { + $hasChanged = \true; $property->attrGroups[] = $this->createJoinColumnAttrGroup($columnName, $joinColumn); } + return $hasChanged; } /** * @param int|string $columnName diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinTableAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinTableAttributeTransformer.php index b5b7be298..d68725220 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinTableAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/JoinTableAttributeTransformer.php @@ -16,9 +16,8 @@ final class JoinTableAttributeTransformer implements PropertyAttributeTransforme { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -26,17 +25,18 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $joinTableMapping = $entityMapping->matchManyToManyPropertyMapping($property)['joinTable'] ?? null; if (!\is_array($joinTableMapping)) { - return; + return \false; } // handled by another mapper unset($joinTableMapping['joinColumns'], $joinTableMapping['inverseJoinColumns']); $args = $this->nodeFactory->createArgs($joinTableMapping); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); NodeValueNormalizer::ensureKeyIsClassConstFetch($args, EntityMappingKey::TARGET_ENTITY); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToManyAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToManyAttributeTransformer.php index 7bff4a36e..04054ced2 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToManyAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToManyAttributeTransformer.php @@ -16,9 +16,8 @@ final class ManyToManyAttributeTransformer implements PropertyAttributeTransform { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -26,17 +25,18 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $manyToManyMapping = $entityMapping->matchManyToManyPropertyMapping($property); if (!\is_array($manyToManyMapping)) { - return; + return \false; } // handled by another mapper unset($manyToManyMapping['joinTable']); $args = $this->nodeFactory->createArgs($manyToManyMapping); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); NodeValueNormalizer::ensureKeyIsClassConstFetch($args, EntityMappingKey::TARGET_ENTITY); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToOneAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToOneAttributeTransformer.php index b094c311d..afee5f5ba 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToOneAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/ManyToOneAttributeTransformer.php @@ -16,9 +16,8 @@ final class ManyToOneAttributeTransformer implements PropertyAttributeTransforme { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -26,11 +25,11 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $manyToOneMapping = $entityMapping->matchManyToOnePropertyMapping($property); if (!\is_array($manyToOneMapping)) { - return; + return \false; } // handled by another mapper unset($manyToOneMapping['joinColumn'], $manyToOneMapping['joinColumns']); @@ -39,6 +38,7 @@ public function transform(EntityMapping $entityMapping, $property) : void $args = $this->nodeFactory->createArgs($manyToOneMapping); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); NodeValueNormalizer::ensureKeyIsClassConstFetch($args, EntityMappingKey::TARGET_ENTITY); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OneToManyAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OneToManyAttributeTransformer.php index 2dadda1a4..b4b530f82 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OneToManyAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OneToManyAttributeTransformer.php @@ -16,9 +16,8 @@ final class OneToManyAttributeTransformer implements PropertyAttributeTransforme { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -26,17 +25,18 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $oneToManyMapping = $entityMapping->matchOneToManyPropertyMapping($property); if (!\is_array($oneToManyMapping)) { - return; + return \false; } // handled by OrderBy mapping rule as standalone entity class unset($oneToManyMapping[EntityMappingKey::ORDER_BY]); $args = $this->nodeFactory->createArgs($oneToManyMapping); NodeValueNormalizer::ensureKeyIsClassConstFetch($args, EntityMappingKey::TARGET_ENTITY); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OrderByAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OrderByAttributeTransformer.php index 3b3f1da03..d6452dfb1 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OrderByAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/PropertyAttributeTransformer/OrderByAttributeTransformer.php @@ -15,9 +15,8 @@ final class OrderByAttributeTransformer implements PropertyAttributeTransformerI { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -25,19 +24,20 @@ public function __construct(NodeFactory $nodeFactory) /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void + public function transform(EntityMapping $entityMapping, $property) : bool { $oneToManyMapping = $entityMapping->matchOneToManyPropertyMapping($property); if (!\is_array($oneToManyMapping)) { - return; + return \false; } // we handle OrderBy here only if (!isset($oneToManyMapping[EntityMappingKey::ORDER_BY])) { - return; + return \false; } $orderBy = $oneToManyMapping[EntityMappingKey::ORDER_BY]; $args = $this->nodeFactory->createArgs([$orderBy]); $property->attrGroups[] = AttributeFactory::createGroup($this->getClassName(), $args); + return \true; } public function getClassName() : string { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/YamlToAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/YamlToAttributeTransformer.php index 52bd4c234..9b892b6dc 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/YamlToAttributeTransformer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/AttributeTransformer/YamlToAttributeTransformer.php @@ -17,12 +17,12 @@ final class YamlToAttributeTransformer * @var ClassAttributeTransformerInterface[] * @readonly */ - private $classAttributeTransformers; + private iterable $classAttributeTransformers; /** * @var PropertyAttributeTransformerInterface[] * @readonly */ - private $propertyAttributeTransformers; + private iterable $propertyAttributeTransformers; /** * @param ClassAttributeTransformerInterface[] $classAttributeTransformers * @param PropertyAttributeTransformerInterface[] $propertyAttributeTransformers @@ -32,34 +32,44 @@ public function __construct(iterable $classAttributeTransformers, iterable $prop $this->classAttributeTransformers = $classAttributeTransformers; $this->propertyAttributeTransformers = $propertyAttributeTransformers; } - public function transform(Class_ $class, EntityMapping $entityMapping) : void + public function transform(Class_ $class, EntityMapping $entityMapping) : bool { - $this->transformClass($class, $entityMapping); - $this->transformProperties($class, $entityMapping); + $hasTrasnformedClass = $this->transformClass($class, $entityMapping); + $hasTrasnformedProperties = $this->transformProperties($class, $entityMapping); + return $hasTrasnformedClass || $hasTrasnformedProperties; } - private function transformClass(Class_ $class, EntityMapping $entityMapping) : void + private function transformClass(Class_ $class, EntityMapping $entityMapping) : bool { + $hasChanged = \false; foreach ($this->classAttributeTransformers as $classAttributeTransformer) { if ($this->hasAttribute($class, $classAttributeTransformer->getClassName())) { continue; } - $classAttributeTransformer->transform($entityMapping, $class); + $hasTransformedAttribute = $classAttributeTransformer->transform($entityMapping, $class); + if ($hasTransformedAttribute) { + $hasChanged = \true; + } } + return $hasChanged; } - private function transformProperties(Class_ $class, EntityMapping $entityMapping) : void + private function transformProperties(Class_ $class, EntityMapping $entityMapping) : bool { + $hasChanged = \false; foreach ($class->getProperties() as $property) { foreach ($this->propertyAttributeTransformers as $propertyAttributeTransformer) { if ($this->hasAttribute($property, $propertyAttributeTransformer->getClassName())) { continue; } - $propertyAttributeTransformer->transform($entityMapping, $property); + $hasTransformedAttribute = $propertyAttributeTransformer->transform($entityMapping, $property); + if ($hasTransformedAttribute) { + $hasChanged = \true; + } } } // handle promoted properties $constructorClassMethod = $class->getMethod(MethodName::CONSTRUCT); if (!$constructorClassMethod instanceof ClassMethod) { - return; + return $hasChanged; } foreach ($constructorClassMethod->getParams() as $param) { // is promoted property? @@ -70,9 +80,13 @@ private function transformProperties(Class_ $class, EntityMapping $entityMapping if ($this->hasAttribute($param, $propertyAttributeTransformer->getClassName())) { continue; } - $propertyAttributeTransformer->transform($entityMapping, $param); + $hasTransformedAttribute = $propertyAttributeTransformer->transform($entityMapping, $param); + if ($hasTransformedAttribute) { + $hasChanged = \true; + } } } + return $hasChanged; } /** * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $stmt diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/ClassAttributeTransformerInterface.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/ClassAttributeTransformerInterface.php index 5ba6b68e5..3a817271d 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/ClassAttributeTransformerInterface.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/ClassAttributeTransformerInterface.php @@ -12,5 +12,5 @@ interface ClassAttributeTransformerInterface * @return MappingClass::* */ public function getClassName() : string; - public function transform(EntityMapping $entityMapping, Class_ $class) : void; + public function transform(EntityMapping $entityMapping, Class_ $class) : bool; } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/PropertyAttributeTransformerInterface.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/PropertyAttributeTransformerInterface.php index a8a4315b2..e6cb3100e 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/PropertyAttributeTransformerInterface.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Contract/PropertyAttributeTransformerInterface.php @@ -15,5 +15,5 @@ public function getClassName() : string; /** * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property */ - public function transform(EntityMapping $entityMapping, $property) : void; + public function transform(EntityMapping $entityMapping, $property) : bool; } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/EntityMappingResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/EntityMappingResolver.php index d10d5c8a8..e9896f88c 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/EntityMappingResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/EntityMappingResolver.php @@ -5,21 +5,20 @@ use PHPStan\Reflection\ReflectionProvider; use Rector\Doctrine\CodeQuality\ValueObject\EntityMapping; -use RectorPrefix202411\Symfony\Component\Finder\Finder; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; -use RectorPrefix202411\Symfony\Component\Yaml\Yaml; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Finder\Finder; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Yaml\Yaml; +use RectorPrefix202506\Webmozart\Assert\Assert; final class EntityMappingResolver { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var EntityMapping[] */ - private $entityMappings = []; + private array $entityMappings = []; public function __construct(ReflectionProvider $reflectionProvider) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/CollectionMapping.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/CollectionMapping.php index ae202187d..8fc2a5bfc 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/CollectionMapping.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/CollectionMapping.php @@ -10,7 +10,7 @@ final class CollectionMapping /** * @var string[] */ - public const TO_MANY_CLASSES = [MappingClass::ONE_TO_MANY, MappingClass::MANY_TO_MANY, OdmMappingClass::REFERENCE_MANY]; + public const TO_MANY_CLASSES = [MappingClass::ONE_TO_MANY, MappingClass::MANY_TO_MANY, OdmMappingClass::REFERENCE_MANY, OdmMappingClass::EMBED_MANY]; /** * @var string[] */ diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/DoctrineClass.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/DoctrineClass.php index c2797f0fb..c08b8da7a 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/DoctrineClass.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Enum/DoctrineClass.php @@ -3,10 +3,14 @@ declare (strict_types=1); namespace Rector\Doctrine\CodeQuality\Enum; +/** + * @deprecated Switch to @see \Rector\Doctrine\Enum\DoctrineClass instead + * @api + */ final class DoctrineClass { /** - * @var string + * @deprecated BC only */ - public const COLLECTION = 'Doctrine\\Common\\Collections\\Collection'; + public const COLLECTION = \Rector\Doctrine\Enum\DoctrineClass::COLLECTION; } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector.php deleted file mode 100644 index 35a0bb367..000000000 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAttributeRector.php +++ /dev/null @@ -1,64 +0,0 @@ -trainings; - } -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -#[ORM\Entity] -final class Trainer -{ - #[ORM\OneToMany(targetEntity:Training::class, mappedBy:"trainer")] - private $trainings; - - /** - * @return \Doctrine\Common\Collections\Collection - */ - public function getTrainings() - { - return $this->trainings; - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Class_::class]; - } - /** - * @param Class_ $node - */ - public function refactor(Node $node) : ?Node - { - return null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector.php new file mode 100644 index 000000000..1528cdf37 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector.php @@ -0,0 +1,185 @@ +valueResolver = $valueResolver; + $this->propertyNaming = $propertyNaming; + $this->repositoryClassResolver = $repositoryClassResolver; + $this->classDependencyManipulator = $classDependencyManipulator; + $this->reflectionProvider = $reflectionProvider; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Turns $this->entityManager->getRepository(...) on entity that suppors service repository, to constructor injection', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity(repositoryClass="SomeRepository") + */ +class SomeEntity +{ +} + +use Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepository; + +final class SomeRepository extends ServiceDocumentRepository +{ +} + +final class SomeClass +{ + public function run() + { + return $this->getRepository(SomeEntity::class)->find(1); + } +} + +CODE_SAMPLE +, <<<'CODE_SAMPLE' +final class SomeClass +{ + public function __construct( + private ServiceDocumentRepository $someEntityRepository + ) { + } + + public function run() + { + return $this->someEntityRepository->find(1); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if ($this->shouldSkipClass($node)) { + return null; + } + $repositoryPropertyMetadatas = []; + $this->traverseNodesWithCallable($node->stmts, function (Node $node) use(&$repositoryPropertyMetadatas) { + if ($node instanceof Class_ || $node instanceof Function_) { + // avoid nested anonymous class or function + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if (!$node instanceof MethodCall) { + return null; + } + if (!$this->isName($node->name, self::GET_REPOSITORY_METHOD)) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + if (\count($node->getArgs()) !== 1) { + return null; + } + $fetchedEntityValue = $node->getArgs()[0]->value; + // must be constant value, not dynamic method call or variable + $entityClassName = $this->valueResolver->getValue($fetchedEntityValue); + if ($entityClassName === null) { + return null; + } + $repositoryVariableName = $this->propertyNaming->fqnToVariableName($entityClassName) . 'Repository'; + $repositoryClass = $this->repositoryClassResolver->resolveFromEntityClass($entityClassName); + // unable to resolve + if (!\is_string($repositoryClass)) { + return null; + } + $repositoryClassReflection = $this->reflectionProvider->getClass($repositoryClass); + if (!$repositoryClassReflection->is(DoctrineClass::SERVICE_DOCUMENT_REPOSITORY) && !$repositoryClassReflection->is(DoctrineClass::SERVICE_ENTITY_REPOSITORY)) { + return null; + } + $repositoryPropertyMetadatas[] = new PropertyMetadata($repositoryVariableName, new FullyQualifiedObjectType($repositoryClass)); + return new PropertyFetch(new Variable('this'), new Identifier($repositoryVariableName)); + }); + if ($repositoryPropertyMetadatas === []) { + return null; + } + foreach ($repositoryPropertyMetadatas as $repositoryPropertyMetadata) { + $this->classDependencyManipulator->addConstructorDependency($node, $repositoryPropertyMetadata); + } + return $node; + } + private function shouldSkipClass(Class_ $class) : bool + { + // keep it safe + if (!$class->isFinal() || $class->isAnonymous()) { + return \true; + } + $classScope = ScopeFetcher::fetch($class); + $classReflection = $classScope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \true; + } + // skip repositories themselves to avoid circular dependencies + if ($classReflection->is(DoctrineClass::OBJECT_REPOSITORY)) { + return \true; + } + if ($classReflection->is(DoctrineClass::ENTITY_REPOSITORY)) { + return \true; + } + return $classReflection->is(TestClass::BEHAT_CONTEXT); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php deleted file mode 100644 index e7a060e3c..000000000 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php +++ /dev/null @@ -1,80 +0,0 @@ -marketingEvents = new ArrayCollection(); - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Class_::class]; - } - /** - * @param Class_ $node - */ - public function refactor(Node $node) : ?Node - { - if ($this->hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated, as its functionality caused bugs. Without knowing the full dependency tree, its risky to change. Use "%s" instead', self::class, 'https://github.com/rectorphp/swiss-knife#4-finalize-classes-without-children')); - \sleep(3); - $this->hasWarned = \true; - return null; - } -} 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 0f19aa8fc..50e739dd6 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 @@ -33,38 +33,29 @@ final class MoveCurrentDateTimeDefaultInEntityToConstructorRector extends Abstra { /** * @readonly - * @var \Rector\Doctrine\NodeManipulator\ConstructorManipulator */ - private $constructorManipulator; + private ConstructorManipulator $constructorManipulator; /** * @readonly - * @var \Rector\Doctrine\NodeFactory\ValueAssignFactory */ - private $valueAssignFactory; + private ValueAssignFactory $valueAssignFactory; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\ConstructorAssignPropertyAnalyzer */ - private $constructorAssignPropertyAnalyzer; + private ConstructorAssignPropertyAnalyzer $constructorAssignPropertyAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - /** - * @var bool - */ - private $hasChanged = \false; + private ValueResolver $valueResolver; + private bool $hasChanged = \false; public function __construct(ConstructorManipulator $constructorManipulator, ValueAssignFactory $valueAssignFactory, ConstructorAssignPropertyAnalyzer $constructorAssignPropertyAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver) { $this->constructorManipulator = $constructorManipulator; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php index bee506cd4..e36e79b30 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php @@ -20,9 +20,9 @@ public function getRuleDefinition() : RuleDefinition return new RuleDefinition("Remove empty Table attribute on entities because it's useless", [new CodeSample(<<<'CODE_SAMPLE' attrGroups as $attrGroupKey => $attrGroup) { foreach ($attrGroup->attrs as $key => $attribute) { - if (!$this->nodeNameResolver->isName($attribute, 'Doctrine\\ORM\\Mapping\\Table')) { + if (!$this->isName($attribute, 'Doctrine\\ORM\\Mapping\\Table')) { continue; } if ($attribute->args !== []) { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/YamlToAttributeDoctrineMappingRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/YamlToAttributeDoctrineMappingRector.php index e553452d9..db011f5a9 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/YamlToAttributeDoctrineMappingRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/YamlToAttributeDoctrineMappingRector.php @@ -17,7 +17,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Doctrine\Tests\CodeQuality\Rector\Class_\YamlToAttributeDoctrineMappingRector\YamlToAttributeDoctrineMappingRectorTest */ @@ -25,18 +25,16 @@ final class YamlToAttributeDoctrineMappingRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\Doctrine\CodeQuality\EntityMappingResolver */ - private $entityMappingResolver; + private EntityMappingResolver $entityMappingResolver; /** * @readonly - * @var \Rector\Doctrine\CodeQuality\AttributeTransformer\YamlToAttributeTransformer */ - private $yamlToAttributeTransformer; + private YamlToAttributeTransformer $yamlToAttributeTransformer; /** * @var string[] */ - private $yamlMappingDirectories = []; + private array $yamlMappingDirectories = []; public function __construct(EntityMappingResolver $entityMappingResolver, YamlToAttributeTransformer $yamlToAttributeTransformer) { $this->entityMappingResolver = $entityMappingResolver; @@ -86,7 +84,10 @@ public function refactor(Node $node) : ?Class_ if (!$entityMapping instanceof EntityMapping) { return null; } - $this->yamlToAttributeTransformer->transform($node, $entityMapping); + $hasChanged = $this->yamlToAttributeTransformer->transform($node, $entityMapping); + if (!$hasChanged) { + return null; + } return $node; } /** 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 51651f0f4..5a6d34aac 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 @@ -9,10 +9,10 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Expr\UnaryPlus; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\PropertyItem; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\StringNode; @@ -30,14 +30,12 @@ final class CorrectDefaultTypesOnEntityPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver) { $this->phpDocInfoFactory = $phpDocInfoFactory; @@ -116,14 +114,14 @@ public function refactor(Node $node) : ?Node } return null; } - private function refactorToBoolType(PropertyProperty $propertyProperty, Property $property) : ?Property + private function refactorToBoolType(PropertyItem $propertyItem, Property $property) : ?Property { - if (!$propertyProperty->default instanceof Expr) { + if (!$propertyItem->default instanceof Expr) { return null; } - $defaultExpr = $propertyProperty->default; + $defaultExpr = $propertyItem->default; if ($defaultExpr instanceof String_) { - $propertyProperty->default = (bool) $defaultExpr->value ? $this->nodeFactory->createTrue() : $this->nodeFactory->createFalse(); + $propertyItem->default = (bool) $defaultExpr->value ? $this->nodeFactory->createTrue() : $this->nodeFactory->createFalse(); return $property; } if ($defaultExpr instanceof ConstFetch || $defaultExpr instanceof ClassConstFetch) { @@ -132,17 +130,17 @@ private function refactorToBoolType(PropertyProperty $propertyProperty, Property } throw new NotImplementedYetException(); } - private function refactorToIntType(PropertyProperty $propertyProperty, Property $property) : ?Property + private function refactorToIntType(PropertyItem $propertyItem, Property $property) : ?Property { - if (!$propertyProperty->default instanceof Expr) { + if (!$propertyItem->default instanceof Expr) { return null; } - $defaultExpr = $propertyProperty->default; + $defaultExpr = $propertyItem->default; if ($defaultExpr instanceof String_) { - $propertyProperty->default = new LNumber((int) $defaultExpr->value); + $propertyItem->default = new Int_((int) $defaultExpr->value); return $property; } - if ($defaultExpr instanceof LNumber) { + if ($defaultExpr instanceof Int_) { // already correct return null; } 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 deleted file mode 100644 index 034e5fffc..000000000 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php +++ /dev/null @@ -1,242 +0,0 @@ -collectionTypeFactory = $collectionTypeFactory; - $this->collectionTypeResolver = $collectionTypeResolver; - $this->collectionVarTagValueNodeResolver = $collectionVarTagValueNodeResolver; - $this->phpDocTypeChanger = $phpDocTypeChanger; - $this->doctrineDocBlockResolver = $doctrineDocBlockResolver; - $this->attributeFinder = $attributeFinder; - $this->targetEntityResolver = $targetEntityResolver; - $this->phpDocInfoFactory = $phpDocInfoFactory; - $this->setterCollectionResolver = $setterCollectionResolver; - } - public function getRuleDefinition() : RuleDefinition - { - return new RuleDefinition('Improve @var, @param and @return types for Doctrine collections to make them useful both for PHPStan and PHPStorm', [new CodeSample(<<<'CODE_SAMPLE' -use Doctrine\Common\Collections\Collection; -use Doctrine\ORM\Mapping as ORM; - -/** - * @ORM\Entity - */ -class SomeClass -{ - /** - * @ORM\OneToMany(targetEntity=Trainer::class, mappedBy="trainer") - * @var Collection|Trainer[] - */ - private $trainings = []; - - public function setTrainings($trainings) - { - $this->trainings = $trainings; - } -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use Doctrine\Common\Collections\Collection; -use Doctrine\ORM\Mapping as ORM; - -/** - * @ORM\Entity - */ -class SomeClass -{ - /** - * @ORM\OneToMany(targetEntity=Trainer::class, mappedBy="trainer") - * @var Collection - */ - private $trainings = []; - - /** - * @param Collection $trainings - */ - public function setTrainings($trainings) - { - $this->trainings = $trainings; - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Property::class, Class_::class]; - } - /** - * @param Property|Class_ $node - */ - public function refactor(Node $node) : ?Node - { - if ($node instanceof Property) { - return $this->refactorProperty($node); - } - return $this->refactorClassMethod($node); - } - private function refactorProperty(Property $property) : ?Property - { - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); - if ($phpDocInfo->hasByAnnotationClasses(CollectionMapping::TO_MANY_CLASSES)) { - return $this->refactorPropertyPhpDocInfo($property, $phpDocInfo); - } - $targetEntityExpr = $this->attributeFinder->findAttributeByClassesArgByName($property, CollectionMapping::TO_MANY_CLASSES, EntityMappingKey::TARGET_ENTITY); - if (!$targetEntityExpr instanceof Expr) { - return null; - } - return $this->refactorAttribute($targetEntityExpr, $phpDocInfo, $property); - } - private function refactorClassMethod(Class_ $class) : ?Class_ - { - if (!$this->doctrineDocBlockResolver->isDoctrineEntityClass($class)) { - return null; - } - $hasChanged = \false; - foreach ($class->getMethods() as $classMethod) { - if (!$classMethod->isPublic()) { - continue; - } - $collectionObjectType = $this->setterCollectionResolver->resolveAssignedGenericCollectionType($class, $classMethod); - if (!$collectionObjectType instanceof GenericObjectType) { - continue; - } - if (\count($classMethod->params) !== 1) { - continue; - } - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); - $param = $classMethod->params[0]; - if ($param->type instanceof Node) { - continue; - } - /** @var string $parameterName */ - $parameterName = $this->getName($param); - $this->phpDocTypeChanger->changeParamType($classMethod, $phpDocInfo, $collectionObjectType, $param, $parameterName); - $hasChanged = \true; - } - if ($hasChanged) { - return $class; - } - return null; - } - private function refactorPropertyPhpDocInfo(Property $property, PhpDocInfo $phpDocInfo) : ?Property - { - $varTagValueNode = $this->collectionVarTagValueNodeResolver->resolve($property); - if ($varTagValueNode instanceof VarTagValueNode) { - $collectionObjectType = $this->collectionTypeResolver->resolveFromTypeNode($varTagValueNode->type, $property); - if (!$collectionObjectType instanceof FullyQualifiedObjectType) { - return null; - } - $newVarType = $this->collectionTypeFactory->createType($collectionObjectType); - $this->phpDocTypeChanger->changeVarType($property, $phpDocInfo, $newVarType); - } else { - $collectionObjectType = $this->collectionTypeResolver->resolveFromToManyProperty($property); - if (!$collectionObjectType instanceof FullyQualifiedObjectType) { - return null; - } - $newVarType = $this->collectionTypeFactory->createType($collectionObjectType); - $this->phpDocTypeChanger->changeVarType($property, $phpDocInfo, $newVarType); - } - return $property; - } - private function refactorAttribute(Expr $expr, PhpDocInfo $phpDocInfo, Property $property) : ?Property - { - $toManyAttribute = $this->attributeFinder->findAttributeByClasses($property, CollectionMapping::TO_MANY_CLASSES); - if ($toManyAttribute instanceof Attribute) { - $targetEntityClassName = $this->targetEntityResolver->resolveFromAttribute($toManyAttribute); - } else { - $phpDocVarTagValueNode = $phpDocInfo->getVarTagValueNode(); - $phpDocCollectionVarTagValueNode = $this->collectionVarTagValueNodeResolver->resolve($property); - if ($phpDocVarTagValueNode instanceof VarTagValueNode && !$phpDocCollectionVarTagValueNode instanceof VarTagValueNode) { - return null; - } - $targetEntityClassName = $this->targetEntityResolver->resolveFromExpr($expr); - } - if ($targetEntityClassName === null) { - return null; - } - $fullyQualifiedObjectType = new FullyQualifiedObjectType($targetEntityClassName); - $genericObjectType = $this->collectionTypeFactory->createType($fullyQualifiedObjectType); - $this->phpDocTypeChanger->changeVarType($property, $phpDocInfo, $genericObjectType); - return $property; - } -} 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 deleted file mode 100644 index 1c12fed9b..000000000 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php +++ /dev/null @@ -1,144 +0,0 @@ -docBlockClassRenamer = $docBlockClassRenamer; - $this->docBlockUpdater = $docBlockUpdater; - $this->phpDocInfoFactory = $phpDocInfoFactory; - $this->doctrineEntityDetector = $doctrineEntityDetector; - } - public function getRuleDefinition() : RuleDefinition - { - return new RuleDefinition('Make maker bundle generate DateTime property accept DateTimeInterface too', [new CodeSample(<<<'CODE_SAMPLE' -use Doctrine\ORM\Mapping as ORM; - -/** - * @ORM\Entity() - */ -class User -{ - /** - * @var DateTime|null - */ - private $bornAt; - - public function setBornAt(DateTimeInterface $bornAt) - { - $this->bornAt = $bornAt; - } -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use Doctrine\ORM\Mapping as ORM; - -/** - * @ORM\Entity() - */ -class User -{ - /** - * @var DateTimeInterface|null - */ - private $bornAt; - - public function setBornAt(DateTimeInterface $bornAt) - { - $this->bornAt = $bornAt; - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Class_::class]; - } - /** - * @param Class_ $node - */ - public function refactor(Node $node) : ?Node - { - if (!$this->doctrineEntityDetector->detect($node)) { - return null; - } - $hasChanged = \false; - foreach ($node->getProperties() as $property) { - $phpDocInfo = $this->phpDocInfoFactory->createFromNode($property); - if (!$phpDocInfo instanceof PhpDocInfo) { - continue; - } - $varType = $phpDocInfo->getVarType(); - if ($varType instanceof UnionType) { - $varType = TypeCombinator::removeNull($varType); - } - if (!$varType->equals(new ObjectType('DateTime'))) { - continue; - } - $this->changePropertyType($property, 'DateTime', 'DateTimeInterface'); - $hasChanged = \true; - } - if ($hasChanged) { - return $node; - } - return null; - } - private function changePropertyType(Property $property, string $oldClass, string $newClass) : void - { - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); - $oldToNewTypes = [new OldToNewType(new FullyQualifiedObjectType($oldClass), new FullyQualifiedObjectType($newClass))]; - $hasChanged = $this->docBlockClassRenamer->renamePhpDocType($phpDocInfo, $oldToNewTypes, $property); - if (!$hasChanged) { - return; - } - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($property); - } -} 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 2f4ebe3f4..7091f22d3 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 @@ -27,29 +27,24 @@ final class TypedPropertyFromColumnTypeRector extends AbstractRector implements { /** * @readonly - * @var \Rector\TypeDeclaration\NodeTypeAnalyzer\PropertyTypeDecorator */ - private $propertyTypeDecorator; + private PropertyTypeDecorator $propertyTypeDecorator; /** * @readonly - * @var \Rector\Doctrine\NodeManipulator\ColumnPropertyTypeResolver */ - private $columnPropertyTypeResolver; + private ColumnPropertyTypeResolver $columnPropertyTypeResolver; /** * @readonly - * @var \Rector\Doctrine\NodeManipulator\NullabilityColumnPropertyTypeResolver */ - private $nullabilityColumnPropertyTypeResolver; + private NullabilityColumnPropertyTypeResolver $nullabilityColumnPropertyTypeResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(PropertyTypeDecorator $propertyTypeDecorator, ColumnPropertyTypeResolver $columnPropertyTypeResolver, NullabilityColumnPropertyTypeResolver $nullabilityColumnPropertyTypeResolver, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper) { $this->propertyTypeDecorator = $propertyTypeDecorator; 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 deleted file mode 100644 index 098fb245b..000000000 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php +++ /dev/null @@ -1,83 +0,0 @@ -> - */ - public function getNodeTypes() : array - { - return [Property::class]; - } - /** - * @param Property $node - */ - public function refactor(Node $node) : ?Node - { - if ($this->hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated, as its functionality caused bugs. Without knowing the full dependency tree, its risky to change. Use "%s" instead', self::class, 'https://github.com/rectorphp/swiss-knife#4-finalize-classes-without-children')); - \sleep(3); - $this->hasWarned = \true; - return null; - } - public function provideMinPhpVersion() : int - { - return PhpVersion::PHP_74; - } -} 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 deleted file mode 100644 index 24afe733a..000000000 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php +++ /dev/null @@ -1,135 +0,0 @@ -propertyTypeDecorator = $propertyTypeDecorator; - $this->phpDocTypeChanger = $phpDocTypeChanger; - $this->toManyRelationPropertyTypeResolver = $toManyRelationPropertyTypeResolver; - $this->phpVersionProvider = $phpVersionProvider; - $this->phpDocInfoFactory = $phpDocInfoFactory; - $this->staticTypeMapper = $staticTypeMapper; - } - public function getRuleDefinition() : RuleDefinition - { - return new RuleDefinition('Complete @var annotations or types based on @ORM\\*toMany annotations or attributes', [new CodeSample(<<<'CODE_SAMPLE' -use Doctrine\ORM\Mapping as ORM; - -class SimpleColumn -{ - /** - * @ORM\OneToMany(targetEntity="App\Product") - */ - private $products; -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use Doctrine\ORM\Mapping as ORM; - -class SimpleColumn -{ - /** - * @ORM\OneToMany(targetEntity="App\Product") - * @var \Doctrine\Common\Collections\Collection - */ - private \Doctrine\Common\Collections\Collection $products; -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Property::class]; - } - /** - * @param Property $node - */ - public function refactor(Node $node) : ?\PhpParser\Node\Stmt\Property - { - if ($node->type !== null) { - return null; - } - $propertyType = $this->toManyRelationPropertyTypeResolver->resolve($node); - if (!$propertyType instanceof Type || $propertyType instanceof MixedType) { - return null; - } - $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); - if (!$typeNode instanceof Node) { - return null; - } - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); - // always decorate with collection generic type - $this->phpDocTypeChanger->changeVarType($node, $phpDocInfo, $propertyType); - if ($this->phpVersionProvider->isAtLeastPhpVersion(PhpVersion::PHP_74)) { - if ($propertyType instanceof UnionType) { - $this->propertyTypeDecorator->decoratePropertyUnionType($propertyType, $typeNode, $node, $phpDocInfo); - return $node; - } - $node->type = $typeNode; - return $node; - } - return $node; - } - public function provideMinPhpVersion() : int - { - return PhpVersionFeature::TYPED_PROPERTIES; - } -} 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 61d01afa6..7ffefdca1 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 @@ -25,7 +25,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Doctrine\Tests\CodeQuality\Rector\Property\TypedPropertyFromToOneRelationTypeRector\TypedPropertyFromToOneRelationTypeRectorTest */ @@ -33,39 +33,30 @@ final class TypedPropertyFromToOneRelationTypeRector extends AbstractRector impl { /** * @readonly - * @var \Rector\TypeDeclaration\NodeTypeAnalyzer\PropertyTypeDecorator */ - private $propertyTypeDecorator; + private PropertyTypeDecorator $propertyTypeDecorator; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\Doctrine\NodeManipulator\ToOneRelationPropertyTypeResolver */ - private $toOneRelationPropertyTypeResolver; + private ToOneRelationPropertyTypeResolver $toOneRelationPropertyTypeResolver; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public const FORCE_NULLABLE = 'force_nullable'; - /** - * @var bool - */ - private $forceNullable = \true; + private bool $forceNullable = \true; public function __construct(PropertyTypeDecorator $propertyTypeDecorator, PhpDocTypeChanger $phpDocTypeChanger, ToOneRelationPropertyTypeResolver $toOneRelationPropertyTypeResolver, PhpVersionProvider $phpVersionProvider, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper) { $this->propertyTypeDecorator = $propertyTypeDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/SetterCollectionResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/SetterCollectionResolver.php index e2b53ad0d..ee8e42908 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/SetterCollectionResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/SetterCollectionResolver.php @@ -13,8 +13,9 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; -use Rector\Doctrine\CodeQuality\Enum\DoctrineClass; +use Rector\Doctrine\Enum\DoctrineClass; use Rector\Doctrine\TypeAnalyzer\CollectionTypeFactory; +use Rector\Doctrine\TypeAnalyzer\CollectionTypeResolver; use Rector\Doctrine\TypeAnalyzer\CollectionVarTagValueNodeResolver; use Rector\NodeManipulator\AssignManipulator; use Rector\NodeNameResolver\NodeNameResolver; @@ -25,35 +26,33 @@ final class SetterCollectionResolver { /** * @readonly - * @var \Rector\NodeManipulator\AssignManipulator */ - private $assignManipulator; + private AssignManipulator $assignManipulator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Doctrine\TypeAnalyzer\CollectionVarTagValueNodeResolver */ - private $collectionVarTagValueNodeResolver; + private CollectionVarTagValueNodeResolver $collectionVarTagValueNodeResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\Doctrine\TypeAnalyzer\CollectionTypeFactory */ - private $collectionTypeFactory; - public function __construct(AssignManipulator $assignManipulator, ReflectionResolver $reflectionResolver, NodeNameResolver $nodeNameResolver, CollectionVarTagValueNodeResolver $collectionVarTagValueNodeResolver, StaticTypeMapper $staticTypeMapper, CollectionTypeFactory $collectionTypeFactory) + private CollectionTypeFactory $collectionTypeFactory; + /** + * @readonly + */ + private CollectionTypeResolver $collectionTypeResolver; + public function __construct(AssignManipulator $assignManipulator, ReflectionResolver $reflectionResolver, NodeNameResolver $nodeNameResolver, CollectionVarTagValueNodeResolver $collectionVarTagValueNodeResolver, StaticTypeMapper $staticTypeMapper, CollectionTypeFactory $collectionTypeFactory, CollectionTypeResolver $collectionTypeResolver) { $this->assignManipulator = $assignManipulator; $this->reflectionResolver = $reflectionResolver; @@ -61,6 +60,7 @@ public function __construct(AssignManipulator $assignManipulator, ReflectionReso $this->collectionVarTagValueNodeResolver = $collectionVarTagValueNodeResolver; $this->staticTypeMapper = $staticTypeMapper; $this->collectionTypeFactory = $collectionTypeFactory; + $this->collectionTypeResolver = $collectionTypeResolver; } public function resolveAssignedGenericCollectionType(Class_ $class, ClassMethod $classMethod) : ?GenericObjectType { @@ -94,7 +94,7 @@ public function resolveAssignedGenericCollectionType(Class_ $class, ClassMethod if (\count($nonCollectionTypes) === 1) { $soleType = $nonCollectionTypes[0]; if ($soleType instanceof ArrayType && $soleType->getItemType() instanceof ObjectType) { - return $this->collectionTypeFactory->createType($soleType->getItemType()); + return $this->collectionTypeFactory->createType($soleType->getItemType(), $this->collectionTypeResolver->hasIndexBy($property), $property); } } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Utils/CaseStringHelper.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Utils/CaseStringHelper.php index c2c7b97c3..cfd1f4fab 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Utils/CaseStringHelper.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Utils/CaseStringHelper.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Doctrine\CodeQuality\Utils; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; final class CaseStringHelper { public static function camelCase(string $value) : string diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/ValueObject/EntityMapping.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/ValueObject/EntityMapping.php index c12ba0779..6e8038352 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/ValueObject/EntityMapping.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/ValueObject/EntityMapping.php @@ -7,18 +7,17 @@ use PhpParser\Node\Param; use PhpParser\Node\Stmt\Property; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class EntityMapping { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @var array */ - private $entityMapping; + private array $entityMapping; /** * @param array $propertyMapping */ diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Collection22/Rector/CriteriaOrderingConstantsDeprecationRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Collection22/Rector/CriteriaOrderingConstantsDeprecationRector.php index 14ceb8558..64d8c8582 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Collection22/Rector/CriteriaOrderingConstantsDeprecationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Collection22/Rector/CriteriaOrderingConstantsDeprecationRector.php @@ -5,9 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; @@ -24,9 +24,8 @@ final class CriteriaOrderingConstantsDeprecationRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $criteriaObjectType; + private ObjectType $criteriaObjectType; public function __construct() { $this->criteriaObjectType = new ObjectType('Doctrine\\Common\\Collections\\Criteria'); diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ExtractArrayArgOnQueryBuilderSelectRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ExtractArrayArgOnQueryBuilderSelectRector.php index 970f08bb1..f4c007bc3 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ExtractArrayArgOnQueryBuilderSelectRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal211/Rector/MethodCall/ExtractArrayArgOnQueryBuilderSelectRector.php @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; @@ -74,7 +74,7 @@ public function refactor(Node $node) : ?MethodCall if (!$value instanceof ArrayItem) { return null; } - $newArgs[] = new Arg($value); + $newArgs[] = new Arg($value->value); } $node->args = $newArgs; return $node; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/MethodCall/ChangeCompositeExpressionAddMultipleWithWithRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/MethodCall/ChangeCompositeExpressionAddMultipleWithWithRector.php index 0a5babe9a..80b4ecf12 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/MethodCall/ChangeCompositeExpressionAddMultipleWithWithRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/MethodCall/ChangeCompositeExpressionAddMultipleWithWithRector.php @@ -4,7 +4,6 @@ namespace Rector\Doctrine\Dbal40\Rector\MethodCall; use PhpParser\Node; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; use PHPStan\Type\ObjectType; @@ -70,7 +69,7 @@ public function refactor(Node $node) : ?Node } $node->name = new Identifier('with'); $firstArg = $node->getArgs()[0]; - $firstArg->value = new ArrayItem($firstArg->value, null, \false, [], \true); + $firstArg->unpack = \true; return $node; } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/StmtsAwareInterface/ExecuteQueryParamsToBindValueRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/StmtsAwareInterface/ExecuteQueryParamsToBindValueRector.php new file mode 100644 index 000000000..53847e5b6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal40/Rector/StmtsAwareInterface/ExecuteQueryParamsToBindValueRector.php @@ -0,0 +1,108 @@ +executeQuery($params) + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\DBAL\Statement; + +class SomeClass +{ + public function run(Statement $statement, array $params): void + { + foreach ($params as $key=> $value) { + $statement->bindValue($key + 1, $value); + } + + $result = $statement->executeQuery(); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [StmtsAwareInterface::class]; + } + /** + * @param StmtsAwareInterface $node + */ + public function refactor(Node $node) : ?StmtsAwareInterface + { + $nodeFinder = new NodeFinder(); + $hasChanged = \false; + $objectType = new ObjectType('Doctrine\\DBAL\\Statement'); + foreach ((array) $node->stmts as $key => $stmt) { + if (!$stmt instanceof Expression) { + continue; + } + $executeQueryMethodCall = $nodeFinder->findFirst($stmt, function (Node $node) use($objectType) : bool { + if (!$node instanceof MethodCall) { + return \false; + } + if (!$this->isObjectType($node->var, $objectType)) { + return \false; + } + if (!$this->isName($node->name, 'executeQuery')) { + return \false; + } + return \count($node->getArgs()) === 1; + }); + if (!$executeQueryMethodCall instanceof MethodCall) { + continue; + } + // remove args + $stmtsExpr = $executeQueryMethodCall->getArgs()[0]->value; + $executeQueryMethodCall->args = []; + $hasChanged = \true; + $bindValueForeach = $this->createBindValueForeach($executeQueryMethodCall->var, $stmtsExpr); + \array_splice($node->stmts, $key, 1, [$bindValueForeach, $stmt]); + } + if ($hasChanged) { + return $node; + } + return null; + } + private function createBindValueForeach(Expr $statementExpr, Expr $stmtsExpr) : Foreach_ + { + $positionVariable = new Variable('position'); + $parameterVariable = new Variable('parameter'); + $foreach = new Foreach_($stmtsExpr, $parameterVariable, ['keyVar' => $positionVariable]); + $bindValueMethodCall = new MethodCall($statementExpr, 'bindValue', [new Arg(new Plus($positionVariable, new LNumber(1))), new Arg($parameterVariable)]); + $foreach->stmts[] = new Expression($bindValueMethodCall); + return $foreach; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal42/Rector/New_/AddArrayResultColumnNamesRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal42/Rector/New_/AddArrayResultColumnNamesRector.php new file mode 100644 index 000000000..abf28e260 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Dbal42/Rector/New_/AddArrayResultColumnNamesRector.php @@ -0,0 +1,86 @@ +> + */ + public function getNodeTypes() : array + { + return [New_::class]; + } + /** + * @param New_ $node + */ + public function refactor(Node $node) : ?New_ + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node->class, DoctrineClass::ARRAY_RESULT)) { + return null; + } + if (\count($node->getArgs()) !== 1) { + return null; + } + $itemsExpr = $node->getArgs()[0]->value; + // pass column names as 1st argument + $arrayDimFetch = new ArrayDimFetch($itemsExpr, new LNumber(0)); + $arrayCoalesce = new Coalesce($arrayDimFetch, new Array_()); + $arrayKeysFuncCall = new FuncCall(new Name('array_keys'), [new Arg($arrayCoalesce)]); + $node->args[0] = new Arg($arrayKeysFuncCall); + $node->args[] = new Arg($itemsExpr); + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Rector/MethodCall/AddGetReferenceTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Rector/MethodCall/AddGetReferenceTypeRector.php new file mode 100644 index 000000000..a22423dcc --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Rector/MethodCall/AddGetReferenceTypeRector.php @@ -0,0 +1,109 @@ +parameterTypeResolver = $parameterTypeResolver; + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change $this->getReference() in data fixtures to fill reference class directly', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\DataFixtures\AbstractDataFixture; + +final class SomeFixture extends AbstractDataFixture +{ + public function run(SomeEntity $someEntity) + { + $someEntity->setSomePassedEntity($this->getReference('some-key')); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\DataFixtures\AbstractDataFixture; + +final class SomeFixture extends AbstractDataFixture +{ + public function run(SomeEntity $someEntity) + { + $someEntity->setSomePassedEntity($this->getReference('some-key'), SomeReference::class); + } +} +CODE_SAMPLE +)]); + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?\PhpParser\Node\Expr\MethodCall + { + if (!$this->isInAbstractFixture($node)) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + if (\count($node->getArgs()) !== 1) { + return null; + } + $soleArg = $node->getArgs()[0]; + if (!$soleArg->value instanceof MethodCall) { + return null; + } + $nestedMethodCall = $soleArg->value; + if (!$this->isName($nestedMethodCall->name, 'getReference')) { + return null; + } + // already filled type + if (\count($nestedMethodCall->getArgs()) === 2) { + return null; + } + $callerParameterObjetType = $this->parameterTypeResolver->resolveCallerFirstParameterObjectType($node); + if (!$callerParameterObjetType instanceof ObjectType) { + return null; + } + $nestedMethodCall->args[] = new Arg(new ClassConstFetch(new FullyQualified($callerParameterObjetType->getClassName()), 'class')); + return $node; + } + private function isInAbstractFixture(MethodCall $methodCall) : bool + { + $scope = ScopeFetcher::fetch($methodCall); + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \false; + } + return $classReflection->is(DoctrineClass::ABSTRACT_FIXTURE); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Reflection/ParameterTypeResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Reflection/ParameterTypeResolver.php new file mode 100644 index 000000000..39b3622c3 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/DoctrineFixture/Reflection/ParameterTypeResolver.php @@ -0,0 +1,59 @@ +reflectionProvider = $reflectionProvider; + $this->nodeNameResolver = $nodeNameResolver; + $this->nodeTypeResolver = $nodeTypeResolver; + } + public function resolveCallerFirstParameterObjectType(MethodCall $methodCall) : ?ObjectType + { + $callerType = $this->nodeTypeResolver->getType($methodCall->var); + if (!$callerType instanceof ObjectType) { + return null; + } + if (!$this->reflectionProvider->hasClass($callerType->getClassName())) { + return null; + } + $callerClassReflection = $this->reflectionProvider->getClass($callerType->getClassName()); + $callerMethodName = $this->nodeNameResolver->getName($methodCall->name); + if (!\is_string($callerMethodName)) { + return null; + } + $scope = ScopeFetcher::fetch($methodCall); + $extendedMethodReflection = $callerClassReflection->getMethod($callerMethodName, $scope); + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + $firstParameter = $extendedParametersAcceptor->getParameters()[0]; + $parameterType = $firstParameter->getType(); + $parameterType = TypeCombinator::removeNull($parameterType); + if (!$parameterType instanceof ObjectType) { + return null; + } + return $parameterType; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm28/Rector/MethodCall/IterateToToIterableRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm28/Rector/MethodCall/IterateToToIterableRector.php index 1c40f858d..2c50e7b0a 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm28/Rector/MethodCall/IterateToToIterableRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm28/Rector/MethodCall/IterateToToIterableRector.php @@ -119,9 +119,6 @@ private function refactorForeach(Foreach_ $foreach) : ?Foreach_ if (!$node instanceof ArrayDimFetch) { return null; } - if (!$node->var instanceof Expr) { - return null; - } if (!$this->isName($node->var, $itemName)) { return null; } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/CastDoctrineExprToStringRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/CastDoctrineExprToStringRector.php new file mode 100644 index 000000000..332defb2a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/CastDoctrineExprToStringRector.php @@ -0,0 +1,75 @@ + + */ + private array $targetMethods = ['like', 'notLike', 'eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'between', 'in', 'notIn', 'isMemberOf', 'isInstanceOf']; + /** + * @var array + */ + private array $exprFuncMethods = ['lower', 'upper', 'length', 'trim', 'avg', 'max', 'min', 'count', 'countDistinct', 'exists', 'all', 'some', 'any', 'not', 'abs', 'sqrt']; + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Casts Doctrine Expr\\x to string where necessary.', [new CodeSample(<<<'CODE_SAMPLE' +$statements->add( + $builder->expr()->like( + $builder->expr()->lower($column), + $builder->expr()->lower($builder->expr()->literal('%'.$like.'%')) + ) +); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +$statements->add( + $builder->expr()->like( + (string) $builder->expr()->lower($column), + (string) $builder->expr()->lower($builder->expr()->literal('%'.$like.'%')) + ) +); +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + public function refactor(Node $node) : ?Node + { + if (!$node instanceof MethodCall) { + return null; + } + if (!$this->isObjectType($node->var, new ObjectType('Doctrine\\ORM\\Query\\Expr'))) { + return null; + } + if (!\in_array($this->getName($node->name), $this->targetMethods, \true)) { + return null; + } + // Iterate through method arguments and cast `Expr\Func` calls to string + $hasChanged = \false; + foreach ($node->args as $arg) { + if (!$arg instanceof Arg) { + return null; + } + if ($arg->value instanceof MethodCall && $this->isObjectType($arg->value->var, new ObjectType('Doctrine\\ORM\\Query\\Expr')) && \in_array($this->getName($arg->value->name), $this->exprFuncMethods, \true)) { + $arg->value = new String_($arg->value); + $hasChanged = \true; + } + } + return $hasChanged ? $node : null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/SetParametersArrayToCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/SetParametersArrayToCollectionRector.php new file mode 100644 index 000000000..1f5085a60 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Orm30/Rector/MethodCall/SetParametersArrayToCollectionRector.php @@ -0,0 +1,181 @@ +createQueryBuilder()->setParameters([ + 'foo' => 'bar' +]); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +$entityManager->createQueryBuilder()->setParameters(new \Doctrine\Common\Collections\ArrayCollection([ + new \Doctrine\ORM\Query\Parameter('foo', 'bar') +])); +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [ClassMethod::class, MethodCall::class]; + } + /** + * @param ClassMethod|MethodCall $node + */ + public function refactor(Node $node) : ?\PhpParser\Node + { + if ($node instanceof ClassMethod) { + $variables = $this->getAffectedVariables($node); + $hasChanges = \false; + foreach ($variables as $variable) { + $nodeStatements = $node->getStmts(); + if ($nodeStatements !== null && $this->changeArrayToCollection($nodeStatements, $variable)) { + $hasChanges = \true; + } + } + if ($hasChanges) { + return $node; + } + return null; + } + return $this->refactorMethodCall($node); + } + /** + * @param array $stmts + */ + public function changeArrayToCollection(array $stmts, Variable $variable) : bool + { + $hasChanges = \false; + foreach ($stmts as $stmt) { + if ($stmt instanceof StmtsAwareInterface) { + if ($this->changeArrayToCollection($stmt->stmts ?? [], $variable)) { + $hasChanges = \true; + } + continue; + } + if (!$stmt instanceof Expression) { + continue; + } + if ($stmt->expr instanceof Assign && $stmt->expr->expr instanceof Array_ && $stmt->expr->var instanceof Variable && $stmt->expr->var->name === $variable->name) { + $newCollection = new New_(new FullyQualified('Doctrine\\Common\\Collections\\ArrayCollection')); + $newCollection->args = [new Arg(new Array_($this->convertArrayToParameters($stmt->expr->expr)['parameters']))]; + $stmt->expr->expr = $newCollection; + $hasChanges = \true; + } + if ($stmt->expr instanceof Assign && $stmt->expr->var instanceof ArrayDimFetch && $stmt->expr->var->dim instanceof Expr && $stmt->expr->var->var instanceof Variable && $stmt->expr->var->var->name === $variable->name) { + $newParameter = new New_(new FullyQualified('Doctrine\\ORM\\Query\\Parameter')); + $newParameter->args = [new Arg($stmt->expr->var->dim), new Arg($stmt->expr->expr)]; + $stmt->expr = new MethodCall($stmt->expr->var->var, 'add', [new Arg($newParameter)]); + $hasChanges = \true; + } + } + return $hasChanges; + } + /** + * @return iterable + */ + private function getAffectedVariables(ClassMethod $classMethod) : iterable + { + $statements = $classMethod->getStmts() ?? []; + foreach ($statements as $statement) { + if ($statement instanceof Expression && $statement->expr instanceof MethodCall && $statement->expr->args[0] instanceof Arg && $statement->expr->args[0]->value instanceof Variable && $statement->expr->name instanceof Identifier && $statement->expr->name->name === 'setParameters') { + $varType = $this->nodeTypeResolver->getType($statement->expr->var); + if (!$varType instanceof ObjectType || !$varType->isInstanceOf('Doctrine\\ORM\\QueryBuilder')->yes()) { + continue; + } + (yield $statement->expr->args[0]->value); + } + } + } + private function refactorMethodCall(MethodCall $methodCall) : ?\PhpParser\Node + { + $varType = $this->nodeTypeResolver->getType($methodCall->var); + if (!$varType instanceof ObjectType) { + return null; + } + if (!$varType->isInstanceOf('Doctrine\\ORM\\QueryBuilder')->yes()) { + return null; + } + if ($methodCall->isFirstClassCallable()) { + return null; + } + if (!$this->isNames($methodCall->name, ['setParameters'])) { + return null; + } + $args = $methodCall->getArgs(); + if (\count($args) !== 1) { + return null; + } + $currentArg = $args[0]->value; + $isAlreadyAnArrayCollection = \false; + $currentArgType = $this->nodeTypeResolver->getType($currentArg); + if ($currentArgType instanceof ObjectType && $currentArgType->isInstanceOf('Doctrine\\Common\\Collections\\ArrayCollection')->yes() && $currentArg instanceof New_ && \count($currentArg->args) === 1 && $currentArg->args[0] instanceof Arg) { + $currentArg = $currentArg->args[0]->value; + $isAlreadyAnArrayCollection = \true; + } + if (!$currentArg instanceof Array_) { + return null; + } + ['parameters' => $parameters, 'changedParameterType' => $changedParameterType] = $this->convertArrayToParameters($currentArg); + if ($changedParameterType === \false && $isAlreadyAnArrayCollection) { + return null; + } + $new = new New_(new FullyQualified('Doctrine\\Common\\Collections\\ArrayCollection')); + $new->args = [new Arg(new Array_($parameters))]; + $methodCall->args = [new Arg($new)]; + return $methodCall; + } + /** + * @return array{parameters: list, changedParameterType: bool} + */ + private function convertArrayToParameters(Array_ $array) : array + { + $changedParameterType = \false; + $parameters = []; + foreach ($array->items as $index => $value) { + if (!$value instanceof ArrayItem) { + continue; + } + $arrayValueType = $this->nodeTypeResolver->getType($value->value); + if (!$arrayValueType instanceof ObjectType || !$arrayValueType->isInstanceOf('Doctrine\\ORM\\Query\\Parameter')->yes()) { + $newParameter = new New_(new FullyQualified('Doctrine\\ORM\\Query\\Parameter')); + $newParameter->args = [new Arg($value->key ?? new LNumber($index)), new Arg($value->value)]; + $value->value = $newParameter; + $changedParameterType = \true; + } + $parameters[] = new ArrayItem($value->value); + } + return ['parameters' => $parameters, 'changedParameterType' => $changedParameterType]; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php new file mode 100644 index 000000000..44db65a2a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php @@ -0,0 +1,26 @@ +type instanceof GenericTypeNode) { + return \false; + } + $genericTypeNode = $tagValueNode->type; + if ($genericTypeNode->type->name === 'Collection') { + return \true; + } + return $genericTypeNode->type->name === DoctrineClass::COLLECTION; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php new file mode 100644 index 000000000..be3deb55f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php @@ -0,0 +1,131 @@ +type instanceof GenericTypeNode && $hasNativeCollectionType) { + $identifierTypeNode = $tagValueNode->type->type; + if ($identifierTypeNode->name === 'iterable') { + $tagValueNode->type->type = new FullyQualifiedIdentifierTypeNode(DoctrineClass::COLLECTION); + $this->addIntKeyIfMissing($tagValueNode->type); + return \true; + } + } + if ($tagValueNode->type instanceof NullableTypeNode) { + if ($hasNativeCollectionType) { + $tagValueNode->type = $tagValueNode->type->type; + $tagValueNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null); + $collectionType = $tagValueNode->type; + $this->addIntKeyIfMissing($collectionType); + if ($collectionType->type instanceof IdentifierTypeNode && \substr_compare($collectionType->type->name, 'Collection', -\strlen('Collection')) !== 0) { + $collectionType->type = new FullyQualifiedIdentifierTypeNode(DoctrineClass::COLLECTION); + } + return \true; + } + return \false; + } + if (!$tagValueNode->type instanceof UnionTypeNode && !$tagValueNode->type instanceof IntersectionTypeNode) { + return \false; + } + $hasChanged = \false; + $hasCollectionType = \false; + $hasArrayType = \false; + $arrayTypeNode = null; + $arrayKeyTypeNode = null; + foreach ($tagValueNode->type->types as $key => $unionedTypeNode) { + // possibly array + if ($unionedTypeNode instanceof GenericTypeNode && $unionedTypeNode->type->name === 'array') { + $hasArrayType = \true; + // both key and value are known + if (\count($unionedTypeNode->genericTypes) === 2) { + $arrayTypeNode = $unionedTypeNode->genericTypes[1]; + $arrayKeyTypeNode = $unionedTypeNode->genericTypes[0]; + } elseif (\count($unionedTypeNode->genericTypes) === 1) { + $arrayTypeNode = $unionedTypeNode->genericTypes[0]; + } + continue; + } + if ($unionedTypeNode instanceof ArrayTypeNode) { + $hasArrayType = \true; + $arrayTypeNode = $unionedTypeNode->type; + continue; + } + // remove |null, if property type is present as Collection + if ($unionedTypeNode instanceof IdentifierTypeNode && $unionedTypeNode->name === 'null' && $hasNativeCollectionType) { + $hasChanged = \true; + unset($tagValueNode->type->types[$key]); + continue; + } + if ($unionedTypeNode instanceof IdentifierTypeNode && \in_array($unionedTypeNode->name, ['Collection', 'ArrayCollection'])) { + if ($unionedTypeNode->name === 'ArrayCollection') { + $tagValueNode->type->types[$key] = new IdentifierTypeNode('\\' . DoctrineClass::COLLECTION); + $hasChanged = \true; + } + $hasCollectionType = \true; + } + // narrow array collection to more generic collection + if ($unionedTypeNode instanceof GenericTypeNode && $unionedTypeNode->type->name === 'ArrayCollection') { + $unionedTypeNode->type = new IdentifierTypeNode('\\' . DoctrineClass::COLLECTION); + $hasChanged = \true; + } + } + if (($hasArrayType === \false || $hasCollectionType === \false) && $hasChanged === \false) { + return \false; + } + if ($arrayTypeNode instanceof TypeNode) { + $tagValueNode->type = new GenericTypeNode(new IdentifierTypeNode('\\' . DoctrineClass::COLLECTION), [$arrayKeyTypeNode ?? new IdentifierTypeNode('int'), $arrayTypeNode]); + } else { + foreach ($tagValueNode->type->types as $key => $type) { + if (!$type instanceof IdentifierTypeNode) { + continue; + } + if ($hasNativeCollectionType && $type->name === 'null') { + unset($tagValueNode->type->types[$key]); + continue; + } + if ($type->name !== 'array') { + continue; + } + unset($tagValueNode->type->types[$key]); + } + } + if ($tagValueNode->type instanceof UnionTypeNode && \count($tagValueNode->type->types) === 1) { + // sole type + $unionTypeNode = $tagValueNode->type; + $tagValueNode->type = \array_pop($unionTypeNode->types); + // refresh reprint + $tagValueNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null); + } + return \true; + } + /** + * @param \PHPStan\PhpDocParser\Ast\Type\TypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode $collectionType + */ + private function addIntKeyIfMissing($collectionType) : void + { + if ($collectionType instanceof GenericTypeNode && \count($collectionType->genericTypes) === 1) { + // add default key type + $collectionType->genericTypes = \array_merge([new IdentifierTypeNode('int')], $collectionType->genericTypes); + } + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php new file mode 100644 index 000000000..00e931c47 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php @@ -0,0 +1,84 @@ +nodeNameResolver = $nodeNameResolver; + $this->nodeTypeResolver = $nodeTypeResolver; + $this->reflectionProvider = $reflectionProvider; + } + /** + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\New_ $callLike + */ + public function detect($callLike, int $position) : bool + { + if ($callLike instanceof StaticCall) { + $callerType = $this->nodeTypeResolver->getType($callLike->class); + $methodName = $this->nodeNameResolver->getName($callLike->name); + } elseif ($callLike instanceof MethodCall) { + // does setter method require a collection? + $callerType = $this->nodeTypeResolver->getType($callLike->var); + $methodName = $this->nodeNameResolver->getName($callLike->name); + } else { + $callerType = $this->nodeTypeResolver->getType($callLike->class); + $methodName = MethodName::CONSTRUCT; + } + $callerType = TypeCombinator::removeNull($callerType); + if (!$callerType instanceof ObjectType) { + return \false; + } + if (!$this->reflectionProvider->hasClass($callerType->getClassName())) { + return \false; + } + $classReflection = $this->reflectionProvider->getClass($callerType->getClassName()); + if ($methodName === null) { + return \false; + } + $scope = ScopeFetcher::fetch($callLike); + if (!$classReflection->hasMethod($methodName)) { + return \false; + } + $extendedMethodReflection = $classReflection->getMethod($methodName, $scope); + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + $activeParameterReflection = $extendedParametersAcceptor->getParameters()[$position] ?? null; + if (!$activeParameterReflection instanceof PhpParameterReflection) { + return \false; + } + $parameterType = $activeParameterReflection->getType(); + // to include nullables + $parameterType = TypeCombinator::removeNull($parameterType); + if (!$parameterType instanceof ObjectType) { + return \false; + } + return $parameterType->isInstanceOf(DoctrineClass::COLLECTION)->yes(); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php new file mode 100644 index 000000000..90348f315 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php @@ -0,0 +1,29 @@ +attrinationFinder = $attrinationFinder; + } + public function detect(Class_ $class) : bool + { + return $this->attrinationFinder->hasByMany($class, [MappingClass::ENTITY, MappingClass::EMBEDDABLE, OdmMappingClass::DOCUMENT]); + } + public function isToMany(Property $property) : bool + { + return $this->attrinationFinder->hasByMany($property, [MappingClass::ONE_TO_MANY, MappingClass::MANY_TO_MANY, OdmMappingClass::REFERENCE_MANY, OdmMappingClass::EMBED_MANY]); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php new file mode 100644 index 000000000..d40e47193 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php @@ -0,0 +1,87 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change add dim assign on collection to an->add() call', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SetFirstParameterArray +{ + /** + * @var Collection + */ + public $items; + + public function setItems($item) + { + $this->items[] = $item; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SetFirstParameterArray +{ + /** + * @var Collection + */ + public $items; + + public function setItems($item) + { + $this->items->add($item); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Assign::class]; + } + /** + * @param Assign $node + */ + public function refactor(Node $node) : ?MethodCall + { + if (!$node->var instanceof ArrayDimFetch) { + return null; + } + $arrayDimFetch = $node->var; + if ($arrayDimFetch->dim instanceof Expr) { + return null; + } + $assignedExpr = $arrayDimFetch->var; + if (!$this->collectionTypeDetector->isCollectionType($assignedExpr)) { + return null; + } + return new MethodCall($assignedExpr, 'add', [new Arg($node->expr)]); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayOffsetSetToSetCollectionCallRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayOffsetSetToSetCollectionCallRector.php new file mode 100644 index 000000000..1882c58aa --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayOffsetSetToSetCollectionCallRector.php @@ -0,0 +1,88 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change dim assign on a Collection to clear ->set() call', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + /** + * @var Collection + */ + public $items; + + public function setItem() + { + $this->items['key'] = 'value'; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + /** + * @var Collection + */ + public $items; + + public function setItem() + { + $this->items->set('key', 'value'); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Assign::class]; + } + /** + * @param Assign $node + */ + public function refactor(Node $node) : ?MethodCall + { + if (!$node->var instanceof ArrayDimFetch) { + return null; + } + $arrayDimFetch = $node->var; + if (!$arrayDimFetch->dim instanceof Expr) { + return null; + } + $assignedExpr = $arrayDimFetch->var; + if (!$this->collectionTypeDetector->isCollectionType($assignedExpr)) { + return null; + } + $args = [new Arg($arrayDimFetch->dim), new Arg($node->expr)]; + return new MethodCall($assignedExpr, 'set', $args); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php new file mode 100644 index 000000000..b63c2cf2f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php @@ -0,0 +1,97 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add native return type to a Collection getter', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class ReturnPropertyCollectionWithArrayTypeDeclaration +{ + /** + * @var Collection + */ + public $items; + + public function getItems(): array + { + return $this->items; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class ReturnPropertyCollectionWithArrayTypeDeclaration +{ + /** + * @var Collection + */ + public $items; + + public function getItems(): Collection + { + return $this->items; + } +} + +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + if ($node->stmts === null) { + return null; + } + if ($node->returnType !== null && $this->isName($node->returnType, DoctrineClass::COLLECTION)) { + return null; + } + if (\count($node->stmts) !== 1) { + return null; + } + $soleStmt = $node->stmts[0]; + if (!$soleStmt instanceof Return_) { + return null; + } + if (!$soleStmt->expr instanceof PropertyFetch) { + return null; + } + if (!$this->collectionTypeDetector->isCollectionType($soleStmt->expr)) { + return null; + } + $node->returnType = new FullyQualified(DoctrineClass::COLLECTION); + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php new file mode 100644 index 000000000..1c1abc23f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php @@ -0,0 +1,122 @@ + + */ + public $items; + + public function setItems(array $items) + { + $this->items = $items; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SetFirstParameterArray +{ + /** + * @var Collection + */ + public $items; + + public function setItems(\Doctrine\Common\Collections\Collection $items) + { + $this->items = $items; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + if ($node->isAbstract()) { + return null; + } + if (\count($node->getParams()) !== 1) { + return null; + } + // has first stmts assign to a property? + $firstStmt = $node->stmts[0] ?? null; + if (!$firstStmt instanceof Stmt) { + return null; + } + if (!$firstStmt instanceof Expression) { + return null; + } + if (!$firstStmt->expr instanceof Assign) { + return null; + } + if (!$this->isAssignToPropertyFetchCollection($firstStmt->expr)) { + return null; + } + // skip correct type + $firstParam = $node->getParams()[0]; + if ($firstParam->type instanceof Name && $this->isName($firstParam->type, DoctrineClass::COLLECTION)) { + // remove default param, as no longer needed + if ($firstParam->default instanceof Expr) { + $firstParam->default = null; + return $node; + } + return null; + } + $firstParam->type = new FullyQualified(DoctrineClass::COLLECTION); + // remove default param, as no longer needed + if ($firstParam->default instanceof Expr) { + $firstParam->default = null; + } + return $node; + } + private function isAssignToPropertyFetchCollection(Assign $assign) : bool + { + if (!$assign->var instanceof PropertyFetch) { + return \false; + } + if ($assign->expr instanceof New_) { + return \false; + } + $propertyFetchType = $this->getType($assign->var); + if (!$propertyFetchType instanceof ObjectType) { + return \false; + } + return $propertyFetchType->getClassName() === DoctrineClass::COLLECTION; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php new file mode 100644 index 000000000..16221da2f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php @@ -0,0 +1,136 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->collectionTagValueNodeAnalyzer = $collectionTagValueNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add native param type to a Collection setter', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + private $items; + + /** + * @param Collection $items + */ + public function setItems($items): void + { + $this->items = $items; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + private $items; + + /** + * @param Collection $items + */ + public function setItems(Collection $items): void + { + $this->items = $items; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + if ($node->isAbstract()) { + return null; + } + $isInTests = $this->testsNodeAnalyzer->isInTestClass($node); + $hasChanged = \false; + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + if (!$classMethodPhpDocInfo instanceof PhpDocInfo) { + return null; + } + if ($classMethodPhpDocInfo->getParamTagValueNodes() === []) { + return null; + } + foreach ($node->params as $param) { + if ($param->type instanceof Node) { + continue; + } + $paramTagValueNode = $classMethodPhpDocInfo->getParamTagValueByName($this->getName($param)); + if (!$paramTagValueNode instanceof ParamTagValueNode) { + continue; + } + if (!$this->collectionTagValueNodeAnalyzer->detect($paramTagValueNode)) { + continue; + } + $hasChanged = \true; + $param->type = new FullyQualified(DoctrineClass::COLLECTION); + // fix reprint position of type + $param->setAttribute(AttributeKey::ORIGINAL_NODE, null); + // make nullable only 1st param, as others might require a null + if ($param->default instanceof Expr) { + if ($isInTests === \false) { + // remove default param, as no longer needed; empty collection should be passed instead + $param->default = null; + } else { + // make type explicitly nullable + $collectionFullyQualified = new FullyQualified(DoctrineClass::COLLECTION); + $param->type = new NullableType($collectionFullyQualified); + $param->default = new ConstFetch(new Name('null')); + } + } + } + if ($hasChanged) { + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php new file mode 100644 index 000000000..428271404 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php @@ -0,0 +1,117 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->docBlockUpdater = $docBlockUpdater; + $this->collectionTagValueNodeAnalyzer = $collectionTagValueNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add default key to Collection generic type if missing in @param or @return of class method', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class ReturnSimpleCollection +{ + /** + * @return Collection + */ + public function someMethod() + { + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class ReturnSimpleCollection +{ + /** + * @return Collection + */ + public function someMethod() + { + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + if ($node->isAbstract()) { + return null; + } + $hasChanged = \false; + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + foreach ($classMethodPhpDocInfo->getParamTagValueNodes() as $paramTagValueNode) { + if ($this->processTagValueNode($paramTagValueNode)) { + $hasChanged = \true; + } + } + $returnTagValueNode = $classMethodPhpDocInfo->getReturnTagValue(); + if ($returnTagValueNode instanceof ReturnTagValueNode && $this->processTagValueNode($returnTagValueNode)) { + $hasChanged = \true; + } + if (!$hasChanged) { + return null; + } + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; + } + /** + * @param \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode|\PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode $tagValueNode + */ + private function processTagValueNode($tagValueNode) : bool + { + if (!$this->collectionTagValueNodeAnalyzer->detect($tagValueNode)) { + return \false; + } + /** @var GenericTypeNode $genericTypeNode */ + $genericTypeNode = $tagValueNode->type; + if (\count($genericTypeNode->genericTypes) !== 1) { + return \false; + } + $valueGenericType = $genericTypeNode->genericTypes[0]; + $genericTypeNode->genericTypes = [new IdentifierTypeNode('int'), $valueGenericType]; + return \true; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php new file mode 100644 index 000000000..c82ad3d55 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php @@ -0,0 +1,231 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->docBlockUpdater = $docBlockUpdater; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Narrow ArrayCollection to Collection in class method and property', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\ArrayCollection; + +final class ArrayCollectionGeneric +{ + /** + * @return ArrayCollection + */ + public function someMethod() + { + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\ArrayCollection; + +final class ArrayCollectionGeneric +{ + /** + * @return \Doctrine\Common\Collections\Collection + */ + public function someMethod() + { + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class, Property::class]; + } + /** + * @param ClassMethod|Property $node + * @return \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|null + */ + public function refactor(Node $node) + { + if ($node instanceof ClassMethod) { + return $this->refactorClassMethod($node); + } + $hasChanged = \false; + if ($this->processNativeType($node)) { + $hasChanged = \true; + } + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $varTagValueNode = $phpDocInfo->getVarTagValueNode(); + if ($varTagValueNode instanceof VarTagValueNode && $this->processTagValueNode($varTagValueNode)) { + $hasChanged = \true; + } + if ($hasChanged) { + return $node; + } + return null; + } + /** + * @param \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode|\PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode|\PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode $tagValueNode + */ + private function processTagValueNode($tagValueNode) : bool + { + if ($tagValueNode->type instanceof GenericTypeNode) { + $genericTypeNode = $tagValueNode->type; + if ($genericTypeNode->type->name === 'ArrayCollection') { + $genericTypeNode->type = new IdentifierTypeNode('\\' . DoctrineClass::COLLECTION); + return \true; + } + } + if (!$tagValueNode->type instanceof IdentifierTypeNode) { + return \false; + } + if ($tagValueNode->type->name !== 'ArrayCollection') { + return \false; + } + $tagValueNode->type = new IdentifierTypeNode('\\' . DoctrineClass::COLLECTION); + return \true; + } + private function refactorClassMethodNativeTypes(ClassMethod $classMethod) : bool + { + $hasChanged = \false; + foreach ($classMethod->params as $param) { + if ($this->processNativeType($param)) { + $hasChanged = \true; + } + } + if (!$classMethod->returnType instanceof Node) { + return $hasChanged; + } + $hasReturnCollectionType = $this->hasCollectionName($classMethod); + $this->traverseNodesWithCallable($classMethod->returnType, function (Node $node) use($hasReturnCollectionType, &$hasChanged) { + if ($node instanceof Identifier && $this->isName($node, 'array')) { + $hasChanged = \true; + if ($hasReturnCollectionType) { + return NodeVisitorAbstract::REMOVE_NODE; + } + } + if ($node instanceof Name && $this->isName($node, DoctrineClass::ARRAY_COLLECTION)) { + $hasChanged = \true; + if ($hasReturnCollectionType) { + // we already have Collection, and can remove it + return NodeVisitorAbstract::REMOVE_NODE; + } + return new FullyQualified(DoctrineClass::COLLECTION); + } + return null; + }); + if ($this->isName($classMethod->returnType, DoctrineClass::ARRAY_COLLECTION)) { + $classMethod->returnType = new FullyQualified(DoctrineClass::COLLECTION); + $hasChanged = \true; + } + return $hasChanged; + } + private function refactorClassMethod(ClassMethod $classMethod) : ?ClassMethod + { + $hasChanged = $this->refactorClassMethodNativeTypes($classMethod); + // docblocks + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod); + if (!$classMethodPhpDocInfo instanceof PhpDocInfo) { + return null; + } + // return tag + $returnTagValueNode = $classMethodPhpDocInfo->getReturnTagValue(); + if ($returnTagValueNode instanceof ReturnTagValueNode && $this->processTagValueNode($returnTagValueNode)) { + $hasChanged = \true; + } + // param tags + foreach ($classMethodPhpDocInfo->getParamTagValueNodes() as $paramTagValueNode) { + if ($this->processTagValueNode($paramTagValueNode)) { + $hasChanged = \true; + } + } + if (!$hasChanged) { + return null; + } + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); + return $classMethod; + } + /** + * @param \PhpParser\Node\Param|\PhpParser\Node\Stmt\Property $paramOrProperty + */ + private function processNativeType($paramOrProperty) : bool + { + if (!$paramOrProperty->type instanceof Node) { + return \false; + } + $hasCollectionName = $this->hasCollectionName($paramOrProperty); + $hasChanged = \false; + if ($this->isName($paramOrProperty->type, DoctrineClass::ARRAY_COLLECTION)) { + $paramOrProperty->type = new FullyQualified(DoctrineClass::COLLECTION); + return \true; + } + $this->traverseNodesWithCallable($paramOrProperty->type, function (Node $node) use($hasCollectionName, &$hasChanged) { + if (!$node instanceof Name) { + return null; + } + if (!$this->isName($node, DoctrineClass::ARRAY_COLLECTION)) { + return null; + } + $hasChanged = \true; + if ($hasCollectionName) { + // we already have Collection, and can remove it + return NodeVisitorAbstract::REMOVE_NODE; + } + return new FullyQualified(DoctrineClass::COLLECTION); + }); + return $hasChanged; + } + /** + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param|\PhpParser\Node\Stmt\ClassMethod $stmts + */ + private function hasCollectionName($stmts) : bool + { + $typeNode = $stmts instanceof ClassMethod ? $stmts->returnType : $stmts->type; + if (!$typeNode instanceof Node) { + return \false; + } + $nodeFinder = new NodeFinder(); + $collectionName = $nodeFinder->findFirst($typeNode, function (Node $node) : bool { + if (!$node instanceof Name) { + return \false; + } + return $node->toString() === DoctrineClass::COLLECTION; + }); + return $collectionName instanceof Name; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php new file mode 100644 index 000000000..b0b3cac6a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php @@ -0,0 +1,114 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->docBlockUpdater = $docBlockUpdater; + $this->unionCollectionTagValueNodeNarrower = $unionCollectionTagValueNodeNarrower; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Narrow union param docblock type to Collection type in class method', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + /** + * @param Collection|array $items + */ + public function run($items) + { + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + /** + * @param Collection $items + */ + public function run($items) + { + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + $hasChanged = \false; + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + if (!$classMethodPhpDocInfo instanceof PhpDocInfo) { + return null; + } + foreach ($classMethodPhpDocInfo->getParamTagValueNodes() as $paramTagValueNode) { + $hasNativeCollectionType = $this->isParameterNameNativeCollectionType($node, $paramTagValueNode->parameterName); + $paramHasChanged = $this->unionCollectionTagValueNodeNarrower->narrow($paramTagValueNode, $hasNativeCollectionType); + if ($paramHasChanged) { + $hasChanged = \true; + } + } + if ($hasChanged) { + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; + } + return null; + } + private function isParameterNameNativeCollectionType(ClassMethod $classMethod, string $parameterName) : bool + { + foreach ($classMethod->getParams() as $param) { + if (!$param->var instanceof Variable) { + continue; + } + if (!$this->isName($param->var, \ltrim($parameterName, '$'))) { + continue; + } + if (!$param->type instanceof Name) { + continue; + } + return $this->isName($param->type, DoctrineClass::COLLECTION); + } + return \false; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowReturnUnionToCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowReturnUnionToCollectionRector.php new file mode 100644 index 000000000..8483f8027 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowReturnUnionToCollectionRector.php @@ -0,0 +1,98 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->docBlockUpdater = $docBlockUpdater; + $this->unionCollectionTagValueNodeNarrower = $unionCollectionTagValueNodeNarrower; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Narrow union type to Collection type in method docblock', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + /** + * @return Collection|array + */ + public function getItems() + { + return []; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\ArrayCollection; + +final class SomeClass +{ + /** + * @return Collection + */ + public function getItems() + { + return []; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $returnTagValueNode = $classMethodPhpDocInfo->getReturnTagValue(); + if (!$returnTagValueNode instanceof ReturnTagValueNode) { + return null; + } + if ($node->returnType !== null && $this->isName($node->returnType, DoctrineClass::COLLECTION)) { + $hasNativeCollectionType = \true; + } else { + $hasNativeCollectionType = \false; + } + $hasChanged = $this->unionCollectionTagValueNodeNarrower->narrow($returnTagValueNode, $hasNativeCollectionType); + if ($hasChanged === \false) { + return null; + } + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNewArrayCollectionOutsideConstructorRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNewArrayCollectionOutsideConstructorRector.php new file mode 100644 index 000000000..ac7660a7f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNewArrayCollectionOutsideConstructorRector.php @@ -0,0 +1,120 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove new ArrayCollection() assigns outside constructor', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +final class NoAssignOutsideConstructor +{ + public Collection $items; + + public function anotherMethod() + { + $this->items = new ArrayCollection(); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +namespace Rector\Doctrine\Tests\TypedCollections\Rector\ClassMethod\RemoveNewArrayCollectionOutsideConstructorRector\Fixture; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +final class NoAssignOutsideConstructor +{ + public Collection $items; + + public function anotherMethod() + { + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + if ($node->isAbstract()) { + return null; + } + if ($this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $hasChanged = \false; + if ($this->isName($node, MethodName::CONSTRUCT)) { + return null; + } + $methodName = $this->getName($node); + if (\strpos($methodName, 'remove') !== \false || \strpos($methodName, 'clear') !== \false) { + return null; + } + foreach ((array) $node->stmts as $key => $stmt) { + if (!$stmt instanceof Expression) { + continue; + } + // only assign of new ArrayCollection + if (!$stmt->expr instanceof Assign) { + continue; + } + /** @var Assign $assign */ + $assign = $stmt->expr; + // we only care about initialization + if (!$assign->var instanceof PropertyFetch) { + continue; + } + if (!$assign->expr instanceof New_) { + continue; + } + // skip if has some values + if ($assign->expr->getArgs() !== []) { + continue; + } + $new = $assign->expr; + if (!$this->isName($new->class, DoctrineClass::ARRAY_COLLECTION)) { + continue; + } + unset($node->stmts[$key]); + $hasChanged = \true; + } + if ($hasChanged) { + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php new file mode 100644 index 000000000..49f53f9cd --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php @@ -0,0 +1,145 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->docBlockUpdater = $docBlockUpdater; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove null from a nullable Collection, as empty ArrayCollection is preferred instead to keep property type strict and always a collection', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + private $items; + + public function setItems(?Collection $items): void + { + $this->items = $items; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + private $items; + + public function setItems(Collection $items): void + { + $this->items = $items; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class, Property::class]; + } + /** + * @param ClassMethod|Property $node + * @return \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|null + */ + public function refactor(Node $node) + { + if ($node instanceof Property) { + return $this->refactorProperty($node); + } + return $this->refactorClassMethod($node); + } + private function refactorClassMethod(ClassMethod $classMethod) : ?\PhpParser\Node\Stmt\ClassMethod + { + if (\count($classMethod->params) !== 1) { + return null; + } + if ($this->testsNodeAnalyzer->isInTestClass($classMethod)) { + return null; + } + $hasChanged = \false; + foreach ($classMethod->params as $param) { + if (!$param->type instanceof NullableType) { + continue; + } + $realType = $param->type->type; + if (!$this->isName($realType, DoctrineClass::COLLECTION)) { + continue; + } + $param->type = $realType; + $hasChanged = \true; + } + if ($hasChanged) { + return $classMethod; + } + return null; + } + private function refactorProperty(Property $property) : ?Property + { + if (!$this->hasNativeCollectionType($property)) { + return null; + } + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($property); + if (!$phpDocInfo instanceof PhpDocInfo) { + return null; + } + $varTagValueNode = $phpDocInfo->getVarTagValueNode(); + if (!$varTagValueNode instanceof VarTagValueNode) { + return null; + } + // remove nullable if has one + if (!$varTagValueNode->type instanceof NullableTypeNode) { + return null; + } + // unwrap nullable type + $varTagValueNode->type = $varTagValueNode->type->type; + $phpDocInfo->removeByType(VarTagValueNode::class); + $phpDocInfo->addTagValueNode($varTagValueNode); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($property); + return $property; + } + private function hasNativeCollectionType(Property $property) : bool + { + if (!$property->type instanceof Name) { + return \false; + } + return $this->isName($property->type, DoctrineClass::COLLECTION); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnArrayToNewArrayCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnArrayToNewArrayCollectionRector.php new file mode 100644 index 000000000..c5110d317 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnArrayToNewArrayCollectionRector.php @@ -0,0 +1,93 @@ +returnType instanceof Name) { + return null; + } + if (!$this->isName($node->returnType, DoctrineClass::COLLECTION)) { + return null; + } + // update all return [] to return new ArrayCollection([]) + $hasChanged = \false; + $this->traverseNodesWithCallable((array) $node->stmts, function (Node $node) use(&$hasChanged) : ?Node { + if (!$node instanceof Return_) { + return null; + } + if (!$node->expr instanceof Expr) { + return null; + } + $exprType = $this->getType($node->expr); + if (!$exprType->isArray()->yes()) { + return null; + } + $node->expr = new New_(new FullyQualified(DoctrineClass::ARRAY_COLLECTION), [new Arg($node->expr)]); + $hasChanged = \true; + return $node; + }); + if ($hasChanged) { + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnCollectionDocblockRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnCollectionDocblockRector.php new file mode 100644 index 000000000..508433bb7 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/ReturnCollectionDocblockRector.php @@ -0,0 +1,141 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->staticTypeMapper = $staticTypeMapper; + $this->docBlockUpdater = $docBlockUpdater; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add return Collection docblock to method that returns a collection property', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class OverrideMix +{ + /** + * @var Collection + */ + public $items; + + /** + * @return Collection|string[] + */ + public function getItems() + { + return $this->items; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class OverrideMix +{ + /** + * @var Collection + */ + public $items; + + /** + * @return Collection + */ + public function getItems() + { + return $this->items; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?ClassMethod + { + if (!$node->isPublic() || $node->isAbstract()) { + return null; + } + $scope = ScopeFetcher::fetch($node); + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return null; + } + if ($classReflection->isInterface()) { + return null; + } + if ($node->stmts === null || \count($node->stmts) !== 1) { + return null; + } + $soleStmt = $node->stmts[0] ?? null; + // must be return property + if (!$soleStmt instanceof Return_) { + return null; + } + if (!$soleStmt->expr instanceof PropertyFetch) { + return null; + } + $propertyFetch = $soleStmt->expr; + $scope = ScopeFetcher::fetch($propertyFetch); + $propertyFetchType = $scope->getType($propertyFetch); + if (!$propertyFetchType instanceof GenericObjectType) { + return null; + } + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $returnTagValueNode = $classMethodPhpDocInfo->getReturnTagValue(); + if ($returnTagValueNode instanceof ReturnTagValueNode) { + // already set the correct type + if ($returnTagValueNode->type instanceof GenericTypeNode) { + return null; + } + $genericTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($propertyFetchType); + $returnTagValueNode->type = $genericTypeNode; + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + } else { + $genericTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($propertyFetchType); + $returnTagValueNode = new ReturnTagValueNode($genericTypeNode, ''); + $classMethodPhpDocInfo->addTagValueNode($returnTagValueNode); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + } + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteParamDocblockFromSetterToCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteParamDocblockFromSetterToCollectionRector.php new file mode 100644 index 000000000..fe18e5e05 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteParamDocblockFromSetterToCollectionRector.php @@ -0,0 +1,133 @@ +phpDocTypeChanger = $phpDocTypeChanger; + $this->entityLikeClassDetector = $entityLikeClassDetector; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->setterCollectionResolver = $setterCollectionResolver; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Improve @param Doctrine collection types to make them useful both for PHPStan and PHPStorm', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity + */ +class SomeClass +{ + /** + * @ORM\OneToMany(targetEntity=Trainer::class, mappedBy="trainer") + * @var Collection|Trainer[] + */ + private $trainings = []; + + public function setTrainings($trainings) + { + $this->trainings = $trainings; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity + */ +class SomeClass +{ + /** + * @ORM\OneToMany(targetEntity=Trainer::class, mappedBy="trainer") + * @var Collection|Trainer[] + */ + private $trainings = []; + + /** + * @param Collection $trainings + */ + public function setTrainings($trainings) + { + $this->trainings = $trainings; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->entityLikeClassDetector->detect($node)) { + return null; + } + $hasChanged = \false; + foreach ($node->getMethods() as $classMethod) { + $collectionObjectType = $this->setterCollectionResolver->resolveAssignedGenericCollectionType($node, $classMethod); + if (!$collectionObjectType instanceof GenericObjectType) { + continue; + } + if (\count($classMethod->params) !== 1) { + continue; + } + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); + $param = $classMethod->params[0]; + if ($param->type instanceof Node) { + continue; + } + $parameterName = $this->getName($param); + $hasChangedParamType = $this->phpDocTypeChanger->changeParamType($classMethod, $phpDocInfo, $collectionObjectType, $param, $parameterName); + if ($hasChangedParamType) { + $hasChanged = \true; + } + } + if ($hasChanged) { + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompletePropertyDocblockFromToManyRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompletePropertyDocblockFromToManyRector.php new file mode 100644 index 000000000..649ad76c0 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompletePropertyDocblockFromToManyRector.php @@ -0,0 +1,194 @@ +collectionTypeFactory = $collectionTypeFactory; + $this->collectionTypeResolver = $collectionTypeResolver; + $this->collectionVarTagValueNodeResolver = $collectionVarTagValueNodeResolver; + $this->phpDocTypeChanger = $phpDocTypeChanger; + $this->entityLikeClassDetector = $entityLikeClassDetector; + $this->attributeFinder = $attributeFinder; + $this->targetEntityResolver = $targetEntityResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Improve Doctrine property @var collections type to make them useful both for PHPStan and PHPStorm', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity + */ +class SomeClass +{ + /** + * @ORM\OneToMany(targetEntity=Trainer::class, mappedBy="trainer") + * @var Collection|Trainer[] + */ + private $trainings = []; + + public function setTrainings($trainings) + { + $this->trainings = $trainings; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity + */ +class SomeClass +{ + /** + * @ORM\OneToMany(targetEntity=Trainer::class, mappedBy="trainer") + * @var Collection + */ + private $trainings = []; + + public function setTrainings($trainings) + { + $this->trainings = $trainings; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->entityLikeClassDetector->detect($node)) { + return null; + } + $hasChanged = \false; + foreach ($node->getProperties() as $property) { + if ($this->refactorProperty($property)) { + $hasChanged = \true; + } + } + if ($hasChanged) { + return $node; + } + return null; + } + private function refactorProperty(Property $property) : bool + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); + if ($phpDocInfo->hasByAnnotationClasses(CollectionMapping::TO_MANY_CLASSES)) { + return (bool) $this->refactorPropertyPhpDocInfo($property, $phpDocInfo); + } + return (bool) $this->refactorPropertyAttribute($property, $phpDocInfo); + } + private function refactorPropertyPhpDocInfo(Property $property, PhpDocInfo $phpDocInfo) : ?Property + { + $varTagValueNode = $this->collectionVarTagValueNodeResolver->resolve($property); + if ($varTagValueNode instanceof VarTagValueNode) { + $collectionObjectType = $this->collectionTypeResolver->resolveFromTypeNode($varTagValueNode->type, $property); + if (!$collectionObjectType instanceof FullyQualifiedObjectType) { + return null; + } + $newVarType = $this->collectionTypeFactory->createType($collectionObjectType, $this->collectionTypeResolver->hasIndexBy($property), $property); + $hasChanged = $this->phpDocTypeChanger->changeVarType($property, $phpDocInfo, $newVarType); + } else { + $collectionObjectType = $this->collectionTypeResolver->resolveFromToManyProperty($property); + if (!$collectionObjectType instanceof FullyQualifiedObjectType) { + return null; + } + $newVarType = $this->collectionTypeFactory->createType($collectionObjectType, $this->collectionTypeResolver->hasIndexBy($property), $property); + $hasChanged = $this->phpDocTypeChanger->changeVarType($property, $phpDocInfo, $newVarType); + } + if (!$hasChanged) { + return null; + } + return $property; + } + private function refactorPropertyAttribute(Property $property, PhpDocInfo $phpDocInfo) : ?Property + { + $toManyAttribute = $this->attributeFinder->findAttributeByClasses($property, CollectionMapping::TO_MANY_CLASSES); + if (!$toManyAttribute instanceof Attribute) { + return null; + } + $targetEntityClassName = $this->targetEntityResolver->resolveFromAttribute($toManyAttribute); + if ($targetEntityClassName === null) { + return null; + } + $fullyQualifiedObjectType = new FullyQualifiedObjectType($targetEntityClassName); + $genericObjectType = $this->collectionTypeFactory->createType($fullyQualifiedObjectType, $this->collectionTypeResolver->hasIndexBy($property), $property); + $hasChanged = $this->phpDocTypeChanger->changeVarType($property, $phpDocInfo, $genericObjectType); + if (!$hasChanged) { + return null; + } + return $property; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteReturnDocblockFromToManyRector.php similarity index 66% rename from vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector.php rename to vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteReturnDocblockFromToManyRector.php index 4148fa3db..69d069482 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/AddReturnDocBlockToCollectionPropertyGetterByToManyAnnotationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/CompleteReturnDocblockFromToManyRector.php @@ -1,68 +1,61 @@ classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; $this->phpDocInfoFactory = $phpDocInfoFactory; - $this->doctrineDocBlockResolver = $doctrineDocBlockResolver; + $this->entityLikeClassDetector = $entityLikeClassDetector; $this->phpDocTypeChanger = $phpDocTypeChanger; $this->collectionTypeResolver = $collectionTypeResolver; $this->collectionTypeFactory = $collectionTypeFactory; @@ -72,6 +65,7 @@ public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Adds @return PHPDoc type to Collection property getter by *ToMany annotation/attribute', [new CodeSample(<<<'CODE_SAMPLE' use App\Entity\Training; +use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity @@ -90,6 +84,8 @@ public function getTrainings() } CODE_SAMPLE , <<<'CODE_SAMPLE' +use Doctrine\ORM\Mapping as ORM; + /** * @ORM\Entity */ @@ -121,12 +117,13 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { - if (!$this->doctrineDocBlockResolver->isDoctrineEntityClass($node)) { + if (!$this->entityLikeClassDetector->detect($node)) { return null; } $hasChanged = \false; + $scope = ScopeFetcher::fetch($node); foreach ($node->getMethods() as $classMethod) { if ($this->classMethodReturnTypeOverrideGuard->shouldSkipClassMethod($classMethod, $scope)) { continue; @@ -141,7 +138,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node } // update docblock with known collection type $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); - $newVarType = $this->collectionTypeFactory->createType($collectionObjectType); + $newVarType = $this->collectionTypeFactory->createType($collectionObjectType, $this->collectionTypeResolver->hasIndexBy($property), $property); $this->phpDocTypeChanger->changeReturnType($classMethod, $phpDocInfo, $newVarType); $hasChanged = \true; } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/InitializeCollectionInConstructorRector.php similarity index 55% rename from vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php rename to vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/InitializeCollectionInConstructorRector.php index 72e71846e..d5ae1e16b 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Class_/InitializeCollectionInConstructorRector.php @@ -1,60 +1,57 @@ attrinationFinder = $attrinationFinder; + $this->entityLikeClassDetector = $entityLikeClassDetector; $this->constructorAssignDetector = $constructorAssignDetector; $this->arrayCollectionAssignFactory = $arrayCollectionAssignFactory; $this->classDependencyManipulator = $classDependencyManipulator; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Use Collection object type for one-to-many relations of Doctrine entity/ODM document', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Initialize Collection property in entity/ODM __construct()', [new CodeSample(<<<'CODE_SAMPLE' use Doctrine\ORM\Mapping\OneToMany; use Doctrine\ORM\Mapping\Entity; @@ -62,7 +59,7 @@ public function getRuleDefinition() : RuleDefinition class SomeClass { #[OneToMany(targetEntity: 'SomeClass')] - private $items = []; + private $items; } CODE_SAMPLE , <<<'CODE_SAMPLE' @@ -75,7 +72,7 @@ class SomeClass class SomeClass { #[OneToMany(targetEntity: 'SomeClass')] - private Collection $items; + private $items; public function __construct() { @@ -97,18 +94,20 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if (!$this->attrinationFinder->hasByMany($node, [MappingClass::ENTITY, MappingClass::EMBEDDABLE, OdmMappingClass::DOCUMENT])) { + if (!$this->entityLikeClassDetector->detect($node)) { + return null; + } + if ($this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + if ($node->isAbstract()) { return null; } $arrayCollectionAssigns = []; foreach ($node->getProperties() as $property) { - if (!$this->attrinationFinder->hasByMany($property, [MappingClass::ONE_TO_MANY, MappingClass::MANY_TO_MANY, OdmMappingClass::REFERENCE_MANY])) { + if (!$this->entityLikeClassDetector->isToMany($property)) { continue; } - // make sure has collection - if (!$property->type instanceof Node) { - $property->type = new FullyQualified('Doctrine\\Common\\Collections\\Collection'); - } // make sure is null if ($property->props[0]->default instanceof Expr) { $property->props[0]->default = null; @@ -119,7 +118,6 @@ public function refactor(Node $node) : ?Node continue; } $arrayCollectionAssigns[] = $this->arrayCollectionAssignFactory->createFromPropertyName($propertyName); - // make sure it is initialized in constructor } if ($arrayCollectionAssigns === []) { return null; @@ -127,8 +125,4 @@ public function refactor(Node $node) : ?Node $this->classDependencyManipulator->addStmtsToConstructorIfNotThereYet($node, $arrayCollectionAssigns); return $node; } - public function provideMinPhpVersion() : int - { - return PhpVersionFeature::TYPED_PROPERTIES; - } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Empty_/EmptyOnCollectionToIsEmptyCallRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Empty_/EmptyOnCollectionToIsEmptyCallRector.php new file mode 100644 index 000000000..cc55adf6e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Empty_/EmptyOnCollectionToIsEmptyCallRector.php @@ -0,0 +1,74 @@ +getType($node->expr); + if (!$emptyExprType instanceof ObjectType) { + return null; + } + if (!$emptyExprType->isInstanceOf(DoctrineClass::COLLECTION)->yes()) { + return null; + } + return new MethodCall($node->expr, 'isEmpty'); + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Convert empty() on a Collection to ->isEmpty() call', [new CodeSample(<<<'CODE_SAMPLE' +class SomeClass +{ + /** + * @var Collection + */ + private $collection; + + public function someMethod() + { + if (empty($this->collection)) { + // ... + } + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' + +class SomeClass +{ + /** + * @var Collection + */ + private $collection; + + public function someMethod() + { + if ($this->collection->isEmpty()) { + // ... + } + } +} +CODE_SAMPLE +)]); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php new file mode 100644 index 000000000..170928f69 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php @@ -0,0 +1,79 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove ' . Assert::class . '::assertNotNull() on a Collection type', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + public function run(Collection $collection): void + { + Assert::assertNotNull($collection); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + public function run(Collection $collection): void + { + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Expression::class]; + } + /** + * @param Expression $node + */ + public function refactor(Node $node) : ?int + { + if (!$node->expr instanceof StaticCall) { + return null; + } + $staticCall = $node->expr; + if (!$this->isName($staticCall->name, 'assertNotNull')) { + return null; + } + if (!$this->isName($staticCall->class, PHPUnitClassName::ASSERT)) { + return null; + } + $firstArg = $staticCall->getArgs()[0]; + if (!$this->collectionTypeDetector->isCollectionType($firstArg->value)) { + return null; + } + return NodeVisitor::REMOVE_NODE; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveCoalesceAssignOnCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveCoalesceAssignOnCollectionRector.php new file mode 100644 index 000000000..b4025032f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Expression/RemoveCoalesceAssignOnCollectionRector.php @@ -0,0 +1,81 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove coalesce assign on collection typed property, as it is always assigned in the constructor', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * @ORM\Entity + */ +class SomeEntity +{ + private $collection; + + public function run() + { + $items = $this->collection ?? new ArrayCollection(); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +/** + * @ORM\Entity + */ +class SomeEntity +{ + private $collection; + + public function run() + { + $items = $this->collection; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Expression::class]; + } + /** + * @param Expression $node + */ + public function refactor(Node $node) : ?int + { + if (!$node->expr instanceof Coalesce) { + return null; + } + if (!$this->collectionTypeDetector->isCollectionType($node->expr)) { + return null; + } + return NodeVisitorAbstract::REMOVE_NODE; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMapOnCollectionToArrayRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMapOnCollectionToArrayRector.php new file mode 100644 index 000000000..9a1331617 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMapOnCollectionToArrayRector.php @@ -0,0 +1,88 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change array_map on Collection typed property to ->toArray() call, to always provide an array', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class ArrayMapOnAssignedVariable +{ + /** + * @var Collection + */ + public $items; + + public function merge() + { + $items = $this->items; + + return array_map(fn ($item) => $item, $items); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class ArrayMapOnAssignedVariable +{ + /** + * @var Collection + */ + public $items; + + public function merge() + { + $items = $this->items; + + return array_map(fn ($item) => $item, $items->toArray()); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?FuncCall + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node->name, 'array_map')) { + return null; + } + $secondArg = $node->getArgs()[1]; + if (!$this->collectionTypeDetector->isCollectionType($secondArg->value)) { + return null; + } + $secondArg->value = new MethodCall($secondArg->value, 'toArray'); + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMergeOnCollectionToArrayRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMergeOnCollectionToArrayRector.php new file mode 100644 index 000000000..8cb89c39b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/ArrayMergeOnCollectionToArrayRector.php @@ -0,0 +1,87 @@ +toArray()', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SetFirstParameterArray +{ + /** + * @var Collection + */ + public $items; + + public function merge() + { + return array_merge([], $this->items); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SetFirstParameterArray +{ + /** + * @var Collection + */ + public $items; + + public function merge() + { + return array_merge([], $this->items->toArray()); + } +} +CODE_SAMPLE +)]); + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?FuncCall + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node->name, 'array_merge')) { + return null; + } + $hasChanged = \false; + foreach ($node->getArgs() as $arg) { + $argType = $this->getType($arg->value); + if (!$argType instanceof FullyQualifiedObjectType) { + continue; + } + if ($argType->getClassName() !== DoctrineClass::COLLECTION) { + continue; + } + $arg->value = new MethodCall($arg->value, 'toArray'); + $hasChanged = \true; + } + if (!$hasChanged) { + return null; + } + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/InArrayOnCollectionToContainsCallRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/InArrayOnCollectionToContainsCallRector.php new file mode 100644 index 000000000..296202225 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/FuncCall/InArrayOnCollectionToContainsCallRector.php @@ -0,0 +1,84 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change in_array() on Collection typed property to ->contains() call', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class InArrayOnAssignedVariable +{ + /** + * @var Collection + */ + public $items; + + public function run() + { + return in_array('item', $this->items); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class InArrayOnAssignedVariable +{ + /** + * @var Collection + */ + public $items; + + public function run() + { + return $this->items->contains('item'); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?MethodCall + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node, 'in_array')) { + return null; + } + $firstArg = $node->getArgs()[0]; + $secondArg = $node->getArgs()[1]; + if (!$this->collectionTypeDetector->isCollectionType($secondArg->value)) { + return null; + } + return new MethodCall($secondArg->value, 'contains', [$firstArg]); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIfInstanceofCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIfInstanceofCollectionRector.php new file mode 100644 index 000000000..a9cd2ff39 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIfInstanceofCollectionRector.php @@ -0,0 +1,188 @@ +collectionTypeDetector = $collectionTypeDetector; + $this->valueResolver = $valueResolver; + } + public function getNodeTypes() : array + { + return [If_::class, Ternary::class, Coalesce::class, BooleanAnd::class, BooleanNot::class]; + } + /** + * @param If_|Ternary|Coalesce|BooleanAnd|BooleanNot $node + * @return Node|Node[]|int|null + */ + public function refactor(Node $node) + { + if ($node instanceof BooleanNot) { + if ($this->collectionTypeDetector->isCollectionType($node->expr)) { + return new MethodCall($node->expr, 'isEmpty'); + } + return null; + } + if ($node instanceof BooleanAnd) { + if ($this->isInstanceofCollectionType($node->left)) { + return $node->right; + } + if ($this->isInstanceofCollectionType($node->right)) { + return $node->left; + } + return null; + } + if ($node instanceof Coalesce) { + if ($this->collectionTypeDetector->isCollectionType($node->left)) { + return $node->left; + } + return null; + } + if ($node instanceof If_) { + return $this->refactorIf($node); + } + return $this->refactorTernary($node); + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove if instance of collection on already known Collection type', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + public ?Collection $items; + + public function someMethod() + { + if ($this->items instanceof Collection) { + $values = $this->items; + } + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + public ?Collection $items; + + public function someMethod() + { + $values = $this->items; + } +} +CODE_SAMPLE +)]); + } + /** + * @return Node[]|int|Node|null + */ + private function refactorIf(If_ $if) + { + if ($if->cond instanceof BooleanNot) { + $condition = $if->cond->expr; + if (!$condition instanceof Instanceof_) { + return null; + } + if (!$this->collectionTypeDetector->isCollectionType($condition->expr)) { + return null; + } + return NodeVisitorAbstract::REMOVE_NODE; + } + if ($if->cond instanceof Identical) { + $identical = $if->cond; + if ($this->valueResolver->isValue($identical->right, \false)) { + if (!$this->isInstanceofCollectionType($identical->left)) { + return null; + } + return NodeVisitorAbstract::REMOVE_NODE; + } + if ($this->isName($identical->right, 'null')) { + if ($this->collectionTypeDetector->isCollectionType($identical->left)) { + $if->cond = new MethodCall($if->cond->left, 'isEmpty'); + return $if; + } + return null; + } + } + // implicit instance of + if ($if->cond instanceof PropertyFetch && $this->collectionTypeDetector->isCollectionType($if->cond)) { + return $if->stmts; + } + if (!$this->isInstanceofCollectionType($if->cond)) { + return null; + } + return $if->stmts; + } + private function refactorTernary(Ternary $ternary) : ?Expr + { + $isNegated = \false; + if ($this->isInstanceofCollectionType($ternary->cond)) { + return $ternary->if; + } + if ($ternary->cond instanceof Identical && $this->isName($ternary->cond->right, 'false')) { + $isNegated = \true; + $condition = $ternary->cond->left; + } else { + $condition = $ternary->cond; + } + if ($this->isIsObjectFuncCallOnCollection($condition)) { + return $ternary->if; + } + return null; + } + private function isInstanceofCollectionType(Expr $expr) : bool + { + if (!$expr instanceof Instanceof_) { + return \false; + } + return $this->collectionTypeDetector->isCollectionType($expr->expr); + } + private function isIsObjectFuncCallOnCollection(Expr $expr) : bool + { + if (!$expr instanceof FuncCall) { + return \false; + } + if ($expr->isFirstClassCallable()) { + return \false; + } + if (!$this->isName($expr->name, 'is_object')) { + return \false; + } + $firstArg = $expr->getArgs()[0]; + return $this->collectionTypeDetector->isCollectionType($firstArg->value); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIsArrayOnCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIsArrayOnCollectionRector.php new file mode 100644 index 000000000..3ad926623 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/If_/RemoveIsArrayOnCollectionRector.php @@ -0,0 +1,122 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getNodeTypes() : array + { + return [If_::class, Ternary::class]; + } + /** + * @param If_|Ternary $node + * @return Node|Node[]|int|null + */ + public function refactor(Node $node) + { + if ($node instanceof If_) { + return $this->refactorIf($node); + } + return $this->refactorTernary($node); + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove if instance of collection on already known Collection type', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + public ?Collection $items; + + public function someMethod() + { + $items = is_array($this->items) ? $this->items : $this->items->toArray(); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + public ?Collection $items; + + public function someMethod() + { + $items = $this->items->toArray(); + } +} +CODE_SAMPLE +)]); + } + /** + * @return Node[]|int|null + */ + private function refactorIf(If_ $if) + { + if ($if->cond instanceof BooleanNot) { + $condition = $if->cond->expr; + if ($condition instanceof FuncCall && $this->isName($condition, 'is_array') && $this->collectionTypeDetector->isCollectionType($condition->getArgs()[0]->value)) { + return $if->stmts; + } + return null; + } + if ($if->cond instanceof FuncCall && $this->isName($if->cond, 'is_array')) { + $firstArg = $if->cond->getArgs()[0]; + if (!$this->collectionTypeDetector->isCollectionType($firstArg->value)) { + return null; + } + return NodeVisitorAbstract::REMOVE_NODE; + } + return null; + } + private function refactorTernary(Ternary $ternary) : ?Expr + { + $isNegated = \false; + if ($ternary->cond instanceof Identical && $this->isName($ternary->cond->right, 'false')) { + $isNegated = \true; + $condition = $ternary->cond->left; + } else { + $condition = $ternary->cond; + } + if (!$condition instanceof FuncCall) { + return null; + } + $funcCall = $condition; + if ($this->isName($funcCall, 'is_array')) { + $firstArg = $funcCall->getArgs()[0]; + if (!$this->collectionTypeDetector->isCollectionType($firstArg->value)) { + return null; + } + if ($isNegated) { + return $ternary->if; + } + return $ternary->else; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertNullOnCollectionToAssertEmptyRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertNullOnCollectionToAssertEmptyRector.php new file mode 100644 index 000000000..0420b54ab --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertNullOnCollectionToAssertEmptyRector.php @@ -0,0 +1,88 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change $this->assertNull() on Collection object to $this->assertEmpty() in tests', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass extends \PHPUnit\Framework\TestCase +{ + private Collection $items; + + public function test(): void + { + $this->assertNull($this->items); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass extends \PHPUnit\Framework\TestCase +{ + private Collection $items; + + public function test(): void + { + $this->assertEmpty($this->items); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?\PhpParser\Node\Expr\MethodCall + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node->name, 'assertNull')) { + return null; + } + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $firstArg = $node->getArgs()[0]; + if (!$this->collectionTypeDetector->isCollectionType($firstArg->value)) { + return null; + } + // rename + $node->name = new Identifier('assertEmpty'); + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php new file mode 100644 index 000000000..b48fab548 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php @@ -0,0 +1,91 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change $this->assertSame(5, $collection->count()) to $this->assertCount(5, $collection) in tests', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass extends \PHPUnit\Framework\TestCase +{ + private Collection $items; + + public function test(): void + { + $this->assertSame(5, $this->items->count()); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass extends \PHPUnit\Framework\TestCase +{ + private Collection $items; + + public function test(): void + { + $this->assertCount(5, $this->items); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [MethodCall::class, StaticCall::class]; + } + /** + * @param MethodCall|StaticCall $node + * @return \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|null + */ + public function refactor(Node $node) + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node->name, 'assertSame')) { + return null; + } + if ($node instanceof MethodCall && !$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $comparedArg = $node->getArgs()[1]->value; + if ($comparedArg instanceof MethodCall && $this->isName($comparedArg->name, 'count') && $this->collectionTypeDetector->isCollectionType($comparedArg->var)) { + $node->name = new Identifier('assertCount'); + $node->args[1] = new Arg($comparedArg->var); + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/SetArrayToNewCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/SetArrayToNewCollectionRector.php new file mode 100644 index 000000000..ac8fee5c4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/MethodCall/SetArrayToNewCollectionRector.php @@ -0,0 +1,102 @@ +collectionParamCallDetector = $collectionParamCallDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change array to new ArrayCollection() on collection typed property', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\ArrayCollection; + +final class SomeClass +{ + /** + * @var ArrayCollection + */ + public $items; + + public function someMethod() + { + $this->items = []; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + /** + * @var Collection + */ + public $items; + + public function someMethod() + { + $this->items = new ArrayCollection([]); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [MethodCall::class, New_::class, StaticCall::class]; + } + /** + * @param MethodCall|New_|StaticCall $node + * @return \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\New_|\PhpParser\Node\Expr\StaticCall|null + */ + public function refactor(Node $node) + { + if ($node->isFirstClassCallable()) { + return null; + } + $hasChanged = \false; + foreach ($node->getArgs() as $position => $arg) { + $soleArgType = $this->getType($arg->value); + if ($soleArgType instanceof ObjectType) { + continue; + } + if (!$this->collectionParamCallDetector->detect($node, $position)) { + continue; + } + $oldArgValue = $arg->value; + // wrap argument with a collection instance + $defaultExpr = $this->isName($oldArgValue, 'null') ? new Array_() : $oldArgValue; + $arg->value = new New_(new FullyQualified(DoctrineClass::ARRAY_COLLECTION), [new Arg($defaultExpr)]); + $hasChanged = \true; + } + if (!$hasChanged) { + return null; + } + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/New_/RemoveNewArrayCollectionWrapRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/New_/RemoveNewArrayCollectionWrapRector.php new file mode 100644 index 000000000..4506bd161 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/New_/RemoveNewArrayCollectionWrapRector.php @@ -0,0 +1,82 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove new ArrayCollection wrap on collection typed property, as it is always assigned in the constructor', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + public ?Collection $items; + + public function someMethod() + { + $values = new ArrayCollection($this->items); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass +{ + public ?Collection $items; + + public function someMethod() + { + $values = $this->items; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [New_::class]; + } + /** + * @param New_ $node + */ + public function refactor(Node $node) : ?Expr + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node->class, DoctrineClass::ARRAY_COLLECTION)) { + return null; + } + if ($node->getArgs() === []) { + return null; + } + $firstArg = $node->getArgs()[0]; + if (!$this->collectionTypeDetector->isCollectionType($firstArg->value)) { + return null; + } + return $firstArg->value; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/NullsafeMethodCall/RemoveNullsafeOnCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/NullsafeMethodCall/RemoveNullsafeOnCollectionRector.php new file mode 100644 index 000000000..a9650d3c9 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/NullsafeMethodCall/RemoveNullsafeOnCollectionRector.php @@ -0,0 +1,70 @@ +collectionTypeDetector = $collectionTypeDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove nullsafe check on method call on a Collection type', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + private Collection $collection; + + public function run() + { + return $this->collection?->empty(); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + private Collection $collection; + + public function run() + { + return $this->collection->empty(); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [NullsafeMethodCall::class]; + } + /** + * @param NullsafeMethodCall $node + */ + public function refactor(Node $node) : ?MethodCall + { + if (!$this->collectionTypeDetector->isCollectionNonNullableType($node->var)) { + return null; + } + return new MethodCall($node->var, $node->name, $node->args); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/NarrowPropertyUnionToCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/NarrowPropertyUnionToCollectionRector.php new file mode 100644 index 000000000..3fab8b5bf --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/NarrowPropertyUnionToCollectionRector.php @@ -0,0 +1,104 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->docBlockUpdater = $docBlockUpdater; + $this->unionCollectionTagValueNodeNarrower = $unionCollectionTagValueNodeNarrower; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Narrow union type to Collection type in property docblock', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + /** + * @var Collection|array + */ + private $property; +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +class SomeClass +{ + /** + * @var Collection + */ + private $property; +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Property::class]; + } + /** + * @param Property $node + */ + public function refactor(Node $node) : ?Property + { + if ($node->isAbstract()) { + return null; + } + $scope = ScopeFetcher::fetch($node); + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return null; + } + if ($classReflection->isInterface()) { + return null; + } + $propertyPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $varTagValueNode = $propertyPhpDocInfo->getVarTagValueNode(); + if (!$varTagValueNode instanceof VarTagValueNode) { + return null; + } + $hasNativeCollectionType = \false; + if ($node->type instanceof Name && $this->isName($node->type, Collection::class)) { + $hasNativeCollectionType = \true; + } + $hasChanged = $this->unionCollectionTagValueNodeNarrower->narrow($varTagValueNode, $hasNativeCollectionType); + if ($hasChanged === \false) { + return null; + } + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php new file mode 100644 index 000000000..154765113 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php @@ -0,0 +1,109 @@ +toManyRelationPropertyTypeResolver = $toManyRelationPropertyTypeResolver; + $this->staticTypeMapper = $staticTypeMapper; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add "Doctrine\\Common\\Collections\\Collection" type declaration, based on @ORM\\*toMany and @ODM\\*toMany annotations/attributes', [new CodeSample(<<<'CODE_SAMPLE' +use Doctrine\ORM\Mapping as ORM; +use Doctrine\ORM\Mapping\ManyToMany; + +class SimpleColumn +{ + /** + * @ORM\OneToMany(targetEntity="App\Product") + */ + private $products; + + #[ManyToMany(targetEntity: 'App\Car')] + private $cars; +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Doctrine\ORM\Mapping as ORM; +use Doctrine\ORM\Mapping\ManyToMany; +use Doctrine\Common\Collections\Collection; + +class SimpleColumn +{ + /** + * @ORM\OneToMany(targetEntity="App\Product") + */ + private Collection $products; + + #[ManyToMany(targetEntity: 'App\Car')] + private Collection $cars; +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Property::class]; + } + /** + * @param Property $node + */ + public function refactor(Node $node) : ?Property + { + if ($node->type !== null && $this->isName($node->type, DoctrineClass::COLLECTION)) { + return null; + } + $propertyType = $this->toManyRelationPropertyTypeResolver->resolve($node); + if (!$propertyType instanceof Type || $propertyType instanceof MixedType) { + return null; + } + $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); + if (!$typeNode instanceof Node) { + return null; + } + // remove default null value if any + if ($node->props[0]->default !== null) { + $node->props[0]->default = null; + } + if (!$propertyType instanceof UnionType) { + $node->type = $typeNode; + } + return $node; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::TYPED_PROPERTIES; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/TypeAnalyzer/CollectionTypeDetector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/TypeAnalyzer/CollectionTypeDetector.php new file mode 100644 index 000000000..b93496ce8 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/TypedCollections/TypeAnalyzer/CollectionTypeDetector.php @@ -0,0 +1,52 @@ +nodeTypeResolver = $nodeTypeResolver; + } + public function isCollectionNonNullableType(Expr $expr) : bool + { + $exprType = $this->nodeTypeResolver->getType($expr); + return $this->isCollectionObjectType($exprType); + } + public function isCollectionType(Expr $expr) : bool + { + $exprType = $this->nodeTypeResolver->getType($expr); + if ($exprType instanceof IntersectionType) { + foreach ($exprType->getTypes() as $intersectionedType) { + if ($this->isCollectionObjectType($intersectionedType)) { + return \true; + } + } + } + if ($exprType instanceof UnionType) { + $bareExprType = TypeCombinator::removeNull($exprType); + return $this->isCollectionObjectType($bareExprType); + } + return $this->isCollectionObjectType($exprType); + } + private function isCollectionObjectType(Type $exprType) : bool + { + if (!$exprType instanceof ObjectType) { + return \false; + } + return $exprType->isInstanceOf(DoctrineClass::COLLECTION)->yes(); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/Enum/DoctrineClass.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/Enum/DoctrineClass.php new file mode 100644 index 000000000..730cdf92e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/Enum/DoctrineClass.php @@ -0,0 +1,49 @@ +nodeNameResolver = $nodeNameResolver; @@ -85,6 +85,26 @@ public function findAttributeByClass($node, string $attributeClass) : ?Attribute } return null; } + /** + * @return Attribute[] + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node + */ + public function findManyByClass($node, string $attributeClass) : array + { + $attributes = []; + /** @var AttributeGroup $attrGroup */ + foreach ($node->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attribute) { + if (!$attribute->name instanceof FullyQualified) { + continue; + } + if ($this->nodeNameResolver->isName($attribute->name, $attributeClass)) { + $attributes[] = $attribute; + } + } + } + return $attributes; + } /** * @param string[] $attributeClasses * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node @@ -105,7 +125,21 @@ public function findAttributeByClasses($node, array $attributeClasses) : ?Attrib */ public function hasAttributeByClasses($node, array $attributeClasses) : bool { - return $this->findAttributeByClasses($node, $attributeClasses) !== []; + return $this->findAttributeByClasses($node, $attributeClasses) instanceof Attribute; + } + /** + * @param string[] $names + * @return Attribute[] + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Param $node + */ + public function findManyByClasses($node, array $names) : array + { + $attributes = []; + foreach ($names as $name) { + $justFoundAttributes = $this->findManyByClass($node, $name); + $attributes = \array_merge($attributes, $justFoundAttributes); + } + return $attributes; } private function findArgByName(Attribute $attribute, string $argName) : ?\PhpParser\Node\Expr { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/AttrinationFinder.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/AttrinationFinder.php index 9961bf5bc..0842c7fbc 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/AttrinationFinder.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/AttrinationFinder.php @@ -18,14 +18,12 @@ final class AttrinationFinder { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttributeFinder */ - private $attributeFinder; + private \Rector\Doctrine\NodeAnalyzer\AttributeFinder $attributeFinder; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, \Rector\Doctrine\NodeAnalyzer\AttributeFinder $attributeFinder) { $this->phpDocInfoFactory = $phpDocInfoFactory; @@ -55,6 +53,37 @@ public function hasByOne($node, string $name) : bool $attribute = $this->attributeFinder->findAttributeByClass($node, $name); return $attribute instanceof Attribute; } + /** + * @return array + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Param $node + */ + public function findManyBy($node, string $name) : array + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + $doctrineAnnotationTagValueNodes = []; + if ($phpDocInfo instanceof PhpDocInfo) { + $doctrineAnnotationTagValueNodes = $phpDocInfo->findByAnnotationClass($name); + } + return \array_merge($doctrineAnnotationTagValueNodes, $this->attributeFinder->findManyByClass($node, $name)); + } + /** + * @param string[] $names + * @return array + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Param $node + */ + public function findManyByMany($node, array $names) : array + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + $doctrineAnnotationTagValueNodes = []; + if ($phpDocInfo instanceof PhpDocInfo) { + foreach ($names as $name) { + foreach ($phpDocInfo->findByAnnotationClass($name) as $annotationTagValueNode) { + $doctrineAnnotationTagValueNodes[] = $annotationTagValueNode; + } + } + } + return \array_merge($doctrineAnnotationTagValueNodes, $this->attributeFinder->findManyByClasses($node, $names)); + } /** * @param string[] $classNames * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Property $property diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/ConstructorAssignPropertyAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/ConstructorAssignPropertyAnalyzer.php index dcdf7aa29..b11f6869f 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/ConstructorAssignPropertyAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/ConstructorAssignPropertyAnalyzer.php @@ -16,19 +16,16 @@ final class ConstructorAssignPropertyAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ - private $propertyFetchAnalyzer; + private PropertyFetchAnalyzer $propertyFetchAnalyzer; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/DoctrineEntityDetector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/DoctrineEntityDetector.php index 4dd262e4d..3f28172da 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/DoctrineEntityDetector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/DoctrineEntityDetector.php @@ -7,18 +7,19 @@ use PhpParser\Node\Stmt\Class_; use PHPStan\Reflection\ReflectionProvider; use Rector\NodeAnalyzer\DoctrineEntityAnalyzer; +/** + * @api Part of external API + */ final class DoctrineEntityDetector { /** * @readonly - * @var \Rector\NodeAnalyzer\DoctrineEntityAnalyzer */ - private $doctrineEntityAnalyzer; + private DoctrineEntityAnalyzer $doctrineEntityAnalyzer; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(DoctrineEntityAnalyzer $doctrineEntityAnalyzer, ReflectionProvider $reflectionProvider) { $this->doctrineEntityAnalyzer = $doctrineEntityAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/MethodUniqueReturnedPropertyResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/MethodUniqueReturnedPropertyResolver.php index 94676afe6..03f90b595 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/MethodUniqueReturnedPropertyResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/MethodUniqueReturnedPropertyResolver.php @@ -14,14 +14,12 @@ final class MethodUniqueReturnedPropertyResolver { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/RepositoryClassResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/RepositoryClassResolver.php new file mode 100644 index 000000000..8c486b438 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/RepositoryClassResolver.php @@ -0,0 +1,59 @@ +.*?)\\"#'; + /** + * @var string + */ + private const USE_REPOSITORY_REGEX = '#use (?.*?Repository);#'; + public function __construct(ReflectionProvider $reflectionProvider) + { + $this->reflectionProvider = $reflectionProvider; + } + public function resolveFromEntityClass(string $entityClassName) : ?string + { + if (!$this->reflectionProvider->hasClass($entityClassName)) { + throw new ShouldNotHappenException(); + } + $classReflection = $this->reflectionProvider->getClass($entityClassName); + $entityClassFileName = $classReflection->getFileName(); + if ($entityClassFileName === null) { + return null; + } + $entityFileContents = FileSystem::read($entityClassFileName); + $repositoryClass = null; + // match repositoryClass="..." in entity + $match = Strings::match($entityFileContents, self::QUOTED_REPOSITORY_CLASS_REGEX); + if (!isset($match['repositoryClass'])) { + // try fallback to repository ::class + use import + $repositoryUseMatch = Strings::match($entityFileContents, self::USE_REPOSITORY_REGEX); + if (isset($repositoryUseMatch['repositoryClass'])) { + $repositoryClass = $repositoryUseMatch['repositoryClass']; + } + } else { + $repositoryClass = $match['repositoryClass']; + } + if ($repositoryClass === null) { + return null; + } + if (!$this->reflectionProvider->hasClass($repositoryClass)) { + throw new ShouldNotHappenException(\sprintf('Repository class "%s" for entity "%s" does not exist', $repositoryClass, $entityClassName)); + } + return $repositoryClass; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/TargetEntityResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/TargetEntityResolver.php index f507d43fb..2c3b8d18c 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/TargetEntityResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeAnalyzer/TargetEntityResolver.php @@ -16,14 +16,12 @@ final class TargetEntityResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeFactory/ArrayCollectionAssignFactory.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeFactory/ArrayCollectionAssignFactory.php index 1691f9906..3354e8f34 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeFactory/ArrayCollectionAssignFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeFactory/ArrayCollectionAssignFactory.php @@ -12,9 +12,8 @@ final class ArrayCollectionAssignFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ColumnPropertyTypeResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ColumnPropertyTypeResolver.php index 33d813cc9..10f3c398e 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ColumnPropertyTypeResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ColumnPropertyTypeResolver.php @@ -25,24 +25,21 @@ final class ColumnPropertyTypeResolver { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttributeFinder */ - private $attributeFinder; + private AttributeFinder $attributeFinder; /** * @var array * @readonly */ - private $doctrineTypeToScalarType; + private array $doctrineTypeToScalarType; /** * @var string */ @@ -51,9 +48,9 @@ final class ColumnPropertyTypeResolver * @param array $doctrineTypeToScalarType * @see https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/basic-mapping.html#doctrine-mapping-types */ - public function __construct(PhpDocInfoFactory $phpDocInfoFactory, TypeFactory $typeFactory, AttributeFinder $attributeFinder, array $doctrineTypeToScalarType = null) + public function __construct(PhpDocInfoFactory $phpDocInfoFactory, TypeFactory $typeFactory, AttributeFinder $attributeFinder, ?array $doctrineTypeToScalarType = null) { - $doctrineTypeToScalarType = $doctrineTypeToScalarType ?? [ + $doctrineTypeToScalarType ??= [ 'tinyint' => new BooleanType(), 'boolean' => new BooleanType(), // integers diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ConstructorManipulator.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ConstructorManipulator.php index 162805a86..be4c4fb3b 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ConstructorManipulator.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ConstructorManipulator.php @@ -7,21 +7,18 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use Rector\NodeManipulator\ClassInsertManipulator; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\NodeFactory; use Rector\ValueObject\MethodName; final class ConstructorManipulator { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\NodeManipulator\ClassInsertManipulator */ - private $classInsertManipulator; + private ClassInsertManipulator $classInsertManipulator; public function __construct(NodeFactory $nodeFactory, ClassInsertManipulator $classInsertManipulator) { $this->nodeFactory = $nodeFactory; @@ -36,7 +33,6 @@ public function addStmtToConstructor(Class_ $class, Expression $newExpression) : $constructClassMethod = $this->nodeFactory->createPublicMethod(MethodName::CONSTRUCT); $constructClassMethod->stmts[] = $newExpression; $this->classInsertManipulator->addAsFirstMethod($class, $constructClassMethod); - $class->setAttribute(AttributeKey::ORIGINAL_NODE, null); } } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/NullabilityColumnPropertyTypeResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/NullabilityColumnPropertyTypeResolver.php index b839fcdb5..9e6d2c195 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/NullabilityColumnPropertyTypeResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/NullabilityColumnPropertyTypeResolver.php @@ -17,19 +17,16 @@ final class NullabilityColumnPropertyTypeResolver { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttributeFinder */ - private $attributeFinder; + private AttributeFinder $attributeFinder; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToManyRelationPropertyTypeResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToManyRelationPropertyTypeResolver.php index 968d9ed38..593f7dc79 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToManyRelationPropertyTypeResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToManyRelationPropertyTypeResolver.php @@ -6,54 +6,56 @@ use PhpParser\Node\Expr; use PhpParser\Node\Param; use PhpParser\Node\Stmt\Property; +use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\StringNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Doctrine\CodeQuality\Enum\CollectionMapping; -use Rector\Doctrine\CodeQuality\Enum\DoctrineClass; use Rector\Doctrine\CodeQuality\Enum\EntityMappingKey; use Rector\Doctrine\CodeQuality\Enum\OdmMappingKey; +use Rector\Doctrine\Enum\DoctrineClass; use Rector\Doctrine\NodeAnalyzer\AttributeFinder; use Rector\Doctrine\PhpDoc\ShortClassExpander; use Rector\Doctrine\TypeAnalyzer\CollectionTypeFactory; +use Rector\Doctrine\TypeAnalyzer\CollectionTypeResolver; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; final class ToManyRelationPropertyTypeResolver { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Doctrine\PhpDoc\ShortClassExpander */ - private $shortClassExpander; + private ShortClassExpander $shortClassExpander; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttributeFinder */ - private $attributeFinder; + private AttributeFinder $attributeFinder; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Doctrine\TypeAnalyzer\CollectionTypeFactory */ - private $collectionTypeFactory; - public function __construct(PhpDocInfoFactory $phpDocInfoFactory, ShortClassExpander $shortClassExpander, AttributeFinder $attributeFinder, ValueResolver $valueResolver, CollectionTypeFactory $collectionTypeFactory) + private CollectionTypeFactory $collectionTypeFactory; + /** + * @readonly + */ + private CollectionTypeResolver $collectionTypeResolver; + public function __construct(PhpDocInfoFactory $phpDocInfoFactory, ShortClassExpander $shortClassExpander, AttributeFinder $attributeFinder, ValueResolver $valueResolver, CollectionTypeFactory $collectionTypeFactory, CollectionTypeResolver $collectionTypeResolver) { $this->phpDocInfoFactory = $phpDocInfoFactory; $this->shortClassExpander = $shortClassExpander; $this->attributeFinder = $attributeFinder; $this->valueResolver = $valueResolver; $this->collectionTypeFactory = $collectionTypeFactory; + $this->collectionTypeResolver = $collectionTypeResolver; } public function resolve(Property $property) : ?Type { @@ -72,7 +74,8 @@ private function processToManyRelation(Property $property, DoctrineAnnotationTag { $targetEntityArrayItemNode = $doctrineAnnotationTagValueNode->getValue(EntityMappingKey::TARGET_ENTITY) ?: $doctrineAnnotationTagValueNode->getValue(OdmMappingKey::TARGET_DOCUMENT); if (!$targetEntityArrayItemNode instanceof ArrayItemNode) { - return null; + // most likely mapped superclass + return new ObjectType(DoctrineClass::COLLECTION); } $targetEntityClass = $targetEntityArrayItemNode->value; if ($targetEntityClass instanceof StringNode) { @@ -97,6 +100,6 @@ private function resolveTypeFromTargetEntity($targetEntity, $property) : Type } $entityFullyQualifiedClass = $this->shortClassExpander->resolveFqnTargetEntity($targetEntity, $property); $fullyQualifiedObjectType = new FullyQualifiedObjectType($entityFullyQualifiedClass); - return $this->collectionTypeFactory->createType($fullyQualifiedObjectType); + return $this->collectionTypeFactory->createType($fullyQualifiedObjectType, $this->collectionTypeResolver->hasIndexBy($property), $property); } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToOneRelationPropertyTypeResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToOneRelationPropertyTypeResolver.php index a91e06892..4956ba047 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToOneRelationPropertyTypeResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/NodeManipulator/ToOneRelationPropertyTypeResolver.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Doctrine\NodeManipulator; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Stmt\Property; @@ -27,29 +27,24 @@ final class ToOneRelationPropertyTypeResolver { /** * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ - private $typeFactory; + private TypeFactory $typeFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher */ - private $classAnnotationMatcher; + private ClassAnnotationMatcher $classAnnotationMatcher; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttributeFinder */ - private $attributeFinder; + private AttributeFinder $attributeFinder; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\TargetEntityResolver */ - private $targetEntityResolver; + private TargetEntityResolver $targetEntityResolver; private const JOIN_COLUMN = ['Doctrine\\ORM\\Mapping\\JoinColumn', 'Doctrine\\ORM\\Mapping\\Column']; public function __construct(TypeFactory $typeFactory, PhpDocInfoFactory $phpDocInfoFactory, ClassAnnotationMatcher $classAnnotationMatcher, AttributeFinder $attributeFinder, TargetEntityResolver $targetEntityResolver) { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDoc/ShortClassExpander.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDoc/ShortClassExpander.php index e34a3ea2f..868da2643 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDoc/ShortClassExpander.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDoc/ShortClassExpander.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Doctrine\PhpDoc; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ReflectionProvider; @@ -15,14 +15,12 @@ final class ShortClassExpander { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\TypeDeclaration\PHPStan\ObjectTypeSpecifier */ - private $objectTypeSpecifier; + private ObjectTypeSpecifier $objectTypeSpecifier; /** * @var string * @see https://regex101.com/r/548EJJ/1 diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDocParser/DoctrineDocBlockResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDocParser/DoctrineDocBlockResolver.php index 70ee5c86e..40feeef4b 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDocParser/DoctrineDocBlockResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/PhpDocParser/DoctrineDocBlockResolver.php @@ -7,17 +7,23 @@ use Rector\Doctrine\Enum\MappingClass; use Rector\Doctrine\Enum\OdmMappingClass; use Rector\Doctrine\NodeAnalyzer\AttrinationFinder; +/** + * @api + * @deprecated Use \Rector\Doctrine\TypedCollections\NodeAnalyzer\EntityLikeClassDetector instead + */ final class DoctrineDocBlockResolver { /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttrinationFinder */ - private $attrinationFinder; + private AttrinationFinder $attrinationFinder; public function __construct(AttrinationFinder $attrinationFinder) { $this->attrinationFinder = $attrinationFinder; } + /** + * @deprecated Use \Rector\Doctrine\TypedCollections\NodeAnalyzer\EntityLikeClassDetector::detect() instead + */ public function isDoctrineEntityClass(Class_ $class) : bool { return $this->attrinationFinder->hasByMany($class, [MappingClass::ENTITY, MappingClass::EMBEDDABLE, OdmMappingClass::DOCUMENT]); 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 0b8bb4a9d..a6e484177 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 @@ -21,45 +21,70 @@ final class DoctrineSetList */ public const YAML_TO_ANNOTATIONS = __DIR__ . '/../../config/yaml-to-annotations.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_COMMON_20 = __DIR__ . '/../../config/sets/doctrine-common-20.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_COLLECTION_22 = __DIR__ . '/../../config/sets/doctrine-collection-22.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_DBAL_211 = __DIR__ . '/../../config/sets/doctrine-dbal-211.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_DBAL_30 = __DIR__ . '/../../config/sets/doctrine-dbal-30.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_DBAL_40 = __DIR__ . '/../../config/sets/doctrine-dbal-40.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_ORM_25 = __DIR__ . '/../../config/sets/doctrine-orm-25.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ - public const DOCTRINE_ORM_29 = __DIR__ . '/../../config/sets/doctrine-orm-29.php'; + public const DOCTRINE_ORM_28 = __DIR__ . '/../../config/sets/doctrine-orm-28.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_ORM_213 = __DIR__ . '/../../config/sets/doctrine-orm-213.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_ORM_214 = __DIR__ . '/../../config/sets/doctrine-orm-214.php'; /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets + * @var string + */ + public const DOCTRINE_ORM_219 = __DIR__ . '/../../config/sets/doctrine-orm-219.php'; + /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets + * @var string + */ + public const DOCTRINE_ORM_300 = __DIR__ . '/../../config/sets/doctrine-orm-300.php'; + /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets * @var string */ public const DOCTRINE_BUNDLE_210 = __DIR__ . '/../../config/sets/doctrine-bundle-210.php'; + /** + * @deprecated Use withComposerBased() instead, see https://getrector.com/blog/introducing-composer-version-based-sets + * @var string + */ + public const DOCTRINE_BUNDLE_230 = __DIR__ . '/../../config/sets/doctrine-bundle-23.php'; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/SetProvider/DoctrineSetProvider.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/SetProvider/DoctrineSetProvider.php index 2c2a34783..c2b0b9a4a 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/SetProvider/DoctrineSetProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/SetProvider/DoctrineSetProvider.php @@ -18,6 +18,26 @@ final class DoctrineSetProvider implements SetProviderInterface */ public function provide() : array { - return [new Set(SetGroup::DOCTRINE, 'Code Quality', __DIR__ . '/../../../config/sets/doctrine-code-quality.php'), new Set(SetGroup::DOCTRINE, 'Typed Collections', __DIR__ . '/../../../config/sets/typed-collections.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/common', '2.0', __DIR__ . '/../../../config/sets/doctrine-common-20.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/collection', '2.2', __DIR__ . '/../../../config/sets/doctrine-collection-22.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/doctrine-bundle', '2.10', __DIR__ . '/../../../config/sets/doctrine-bundle-210.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '3.0', __DIR__ . '/../../../config/sets/doctrine-dbal-30.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '4.0', __DIR__ . '/../../../config/sets/doctrine-dbal-40.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '2.10', __DIR__ . '/../../../config/sets/doctrine-dbal-210.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '2.11', __DIR__ . '/../../../config/sets/doctrine-dbal-211.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/orm', '2.5', __DIR__ . '/../../../config/sets/doctrine-orm-25.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/orm', '2.13', __DIR__ . '/../../../config/sets/doctrine-orm-213.php'), new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/orm', '2.14', __DIR__ . '/../../../config/sets/doctrine-orm-214.php'), new Set(SetGroup::ATTRIBUTES, 'Doctrine ORM', __DIR__ . '/../../../config/sets/attributes/doctrine.php'), new Set(SetGroup::ATTRIBUTES, 'Gedmo', __DIR__ . '/../../../config/sets/attributes/gedmo.php'), new Set(SetGroup::ATTRIBUTES, 'MongoDB', __DIR__ . '/../../../config/sets/attributes/mongodb.php')]; + return [ + new Set(SetGroup::DOCTRINE, 'Code Quality', __DIR__ . '/../../../config/sets/doctrine-code-quality.php'), + new Set(SetGroup::DOCTRINE, 'Typed Collections', __DIR__ . '/../../../config/sets/typed-collections.php'), + // @see https://github.com/rectorphp/getrector-com/pull/2672 + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/common', '2.0', __DIR__ . '/../../../config/sets/doctrine-common-20.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/collection', '2.2', __DIR__ . '/../../../config/sets/doctrine-collection-22.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/doctrine-bundle', '2.3', __DIR__ . '/../../../config/sets/doctrine-bundle-23.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/doctrine-bundle', '2.8', __DIR__ . '/../../../config/sets/doctrine-bundle-28.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '3.0', __DIR__ . '/../../../config/sets/doctrine-dbal-30.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '4.0', __DIR__ . '/../../../config/sets/doctrine-dbal-40.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '4.2', __DIR__ . '/../../../config/sets/doctrine-dbal-42.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/dbal', '2.11', __DIR__ . '/../../../config/sets/doctrine-dbal-211.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/orm', '2.5', __DIR__ . '/../../../config/sets/doctrine-orm-25.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/orm', '2.13', __DIR__ . '/../../../config/sets/doctrine-orm-213.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/orm', '2.14', __DIR__ . '/../../../config/sets/doctrine-orm-214.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/orm', '3.0', __DIR__ . '/../../../config/sets/doctrine-orm-300.php'), + new Set(SetGroup::ATTRIBUTES, 'Doctrine ORM', __DIR__ . '/../../../config/sets/attributes/doctrine.php'), + new Set(SetGroup::ATTRIBUTES, 'Gedmo', __DIR__ . '/../../../config/sets/attributes/gedmo.php'), + new Set(SetGroup::ATTRIBUTES, 'MongoDB', __DIR__ . '/../../../config/sets/attributes/mongodb.php'), + new ComposerTriggeredSet(SetGroup::DOCTRINE, 'doctrine/data-fixtures', '1.6', __DIR__ . '/../../../config/sets/data-fixtures-16.php'), + ]; } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php index 53230b304..a00f2aeb4 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php @@ -3,14 +3,159 @@ declare (strict_types=1); namespace Rector\Doctrine\TypeAnalyzer; +use PhpParser\Node\Identifier; +use PhpParser\Node\Param; +use PhpParser\Node\Scalar\String_; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Property; use PHPStan\Type\Generic\GenericObjectType; use PHPStan\Type\IntegerType; use PHPStan\Type\ObjectType; +use PHPStan\Type\StringType; +use PHPStan\Type\Type; +use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; +use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; +use Rector\BetterPhpDocParser\PhpDoc\StringNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; +use Rector\PhpParser\AstResolver; +use Rector\PhpParser\Node\Value\ValueResolver; final class CollectionTypeFactory { - public function createType(ObjectType $objectType) : GenericObjectType + /** + * @readonly + */ + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private AstResolver $astResolver; + /** + * @readonly + */ + private ValueResolver $valueResolver; + public function __construct(PhpDocInfoFactory $phpDocInfoFactory, AstResolver $astResolver, ValueResolver $valueResolver) { - $genericTypes = [new IntegerType(), $objectType]; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->astResolver = $astResolver; + $this->valueResolver = $valueResolver; + } + /** + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property + */ + public function createType(ObjectType $objectType, bool $withIndexBy, $property) : GenericObjectType + { + $keyType = new IntegerType(); + if ($withIndexBy) { + $keyType = $this->resolveKeyType($property, $objectType->getClassName()); + } + $genericTypes = [$keyType, $objectType]; return new GenericObjectType('Doctrine\\Common\\Collections\\Collection', $genericTypes); } + /** + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property + * @return \PHPStan\Type\IntegerType|\PHPStan\Type\StringType + */ + private function resolveKeyType($property, string $className) + { + $class = $this->astResolver->resolveClassFromName($className); + if (!$class instanceof Class_) { + return new IntegerType(); + } + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($property); + // key need to be initialized here + // so it can be checked in target class annotation or attribute + $key = null; + if ($phpDocInfo instanceof PhpDocInfo) { + // only on OneToMany and ManyToMany + // https://www.doctrine-project.org/projects/doctrine-orm/en/3.3/tutorials/working-with-indexed-associations.html#mapping-indexed-associations + $annotations = $phpDocInfo->findByAnnotationClass('Doctrine\\ORM\\Mapping\\OneToMany') !== [] ? $phpDocInfo->findByAnnotationClass('Doctrine\\ORM\\Mapping\\OneToMany') : $phpDocInfo->findByAnnotationClass('Doctrine\\ORM\\Mapping\\ManyToMany'); + if (\count($annotations) === 1 && $annotations[0] instanceof DoctrineAnnotationTagValueNode) { + foreach ($annotations[0]->getValues() as $arrayItemNode) { + if ($arrayItemNode instanceof ArrayItemNode && $arrayItemNode->key instanceof StringNode && $arrayItemNode->key->value === 'indexBy' && $arrayItemNode->value instanceof StringNode) { + $key = $arrayItemNode->value->value; + break; + } + } + if ($key !== null) { + $type = $this->resolveKeyFromAnnotation($class, $key); + if ($type instanceof Type) { + return $type; + } + } + } + } + $attrGroups = $property->attrGroups; + foreach ($attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + if (\in_array($attr->name->toString(), ['Doctrine\\ORM\\Mapping\\OneToMany', 'Doctrine\\ORM\\Mapping\\ManyToMany'], \true)) { + foreach ($attr->args as $arg) { + if ($arg->name instanceof Identifier && $arg->name->name === 'indexBy' && $arg->value instanceof String_) { + $key = $arg->value->value; + $type = $this->resolveKeyFromAnnotation($class, $key); + if ($type instanceof Type) { + return $type; + } + break; + } + } + } + } + } + if ($key !== null) { + return $this->resolveKeyFromAttribute($class, $key); + } + return new IntegerType(); + } + /** + * @return null|\PHPStan\Type\IntegerType|\PHPStan\Type\StringType + */ + private function resolveKeyFromAnnotation(Class_ $class, string $key) + { + // get property from class + $targetProperty = $class->getProperty($key); + if (!$targetProperty instanceof Property) { + return new IntegerType(); + } + $phpDocInfoTargetClass = $this->phpDocInfoFactory->createFromNode($targetProperty); + if ($phpDocInfoTargetClass instanceof PhpDocInfo) { + $columns = $phpDocInfoTargetClass->findByAnnotationClass('Doctrine\\ORM\\Mapping\\Column'); + if (\count($columns) === 1 && $columns[0] instanceof DoctrineAnnotationTagValueNode) { + $type = null; + foreach ($columns[0]->getValues() as $arrayItemNode) { + if ($arrayItemNode instanceof ArrayItemNode && $arrayItemNode->key === 'type' && $arrayItemNode->value instanceof StringNode) { + $type = $arrayItemNode->value->value; + break; + } + } + return $type === null ? new IntegerType() : ($type === 'string' ? new StringType() : new IntegerType()); + } + } + return null; + } + /** + * @return \PHPStan\Type\IntegerType|\PHPStan\Type\StringType + */ + private function resolveKeyFromAttribute(Class_ $class, string $key) + { + // get property from class + $targetProperty = $class->getProperty($key); + if (!$targetProperty instanceof Property) { + return new IntegerType(); + } + $attrGroups = $targetProperty->attrGroups; + foreach ($attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + if ($attr->name->toString() === 'Doctrine\\ORM\\Mapping\\Column') { + foreach ($attr->args as $arg) { + if ($arg->name instanceof Identifier && $arg->name->name === 'type') { + $type = $this->valueResolver->getValue($arg->value); + return $type === 'string' ? new StringType() : new IntegerType(); + } + } + } + } + } + return new IntegerType(); + } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php index 42c1df161..01693a12f 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php @@ -9,7 +9,9 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Identifier; +use PhpParser\Node\Param; use PhpParser\Node\Stmt\Property; +use PHPStan\PhpDocParser\Ast\NodeTraverser; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; @@ -17,46 +19,55 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\StringNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Doctrine\CodeQuality\Enum\CollectionMapping; use Rector\Doctrine\CodeQuality\Enum\EntityMappingKey; use Rector\Doctrine\CodeQuality\Enum\OdmMappingKey; use Rector\Doctrine\NodeAnalyzer\AttrinationFinder; use Rector\Doctrine\NodeAnalyzer\TargetEntityResolver; use Rector\Doctrine\PhpDoc\ShortClassExpander; +use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\StaticTypeMapper\Naming\NameScopeFactory; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; final class CollectionTypeResolver { /** * @readonly - * @var \Rector\StaticTypeMapper\Naming\NameScopeFactory */ - private $nameScopeFactory; + private NameScopeFactory $nameScopeFactory; /** * @readonly - * @var \Rector\Doctrine\PhpDoc\ShortClassExpander */ - private $shortClassExpander; + private ShortClassExpander $shortClassExpander; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttrinationFinder */ - private $attrinationFinder; + private AttrinationFinder $attrinationFinder; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\TargetEntityResolver */ - private $targetEntityResolver; + private TargetEntityResolver $targetEntityResolver; + /** + * @readonly + */ + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @var string */ private const TARGET_DOCUMENT = 'targetDocument'; - public function __construct(NameScopeFactory $nameScopeFactory, ShortClassExpander $shortClassExpander, AttrinationFinder $attrinationFinder, TargetEntityResolver $targetEntityResolver) + public function __construct(NameScopeFactory $nameScopeFactory, ShortClassExpander $shortClassExpander, AttrinationFinder $attrinationFinder, TargetEntityResolver $targetEntityResolver, PhpDocInfoFactory $phpDocInfoFactory, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->nameScopeFactory = $nameScopeFactory; $this->shortClassExpander = $shortClassExpander; $this->attrinationFinder = $attrinationFinder; $this->targetEntityResolver = $targetEntityResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; } public function resolveFromTypeNode(TypeNode $typeNode, Node $node) : ?FullyQualifiedObjectType { @@ -75,6 +86,26 @@ public function resolveFromTypeNode(TypeNode $typeNode, Node $node) : ?FullyQual } return null; } + /** + * @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Param $property + */ + public function hasIndexBy($property) : bool + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($property); + if ($phpDocInfo instanceof PhpDocInfo && \strpos((string) $phpDocInfo->getPhpDocNode(), 'indexBy') !== \false) { + return \true; + } + $attrGroups = $property->attrGroups; + $hasIndexBy = \false; + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($attrGroups, function (Node $node) use(&$hasIndexBy) : ?int { + if ($node instanceof Arg && $node->name instanceof Identifier && $node->name->toString() === 'indexBy') { + $hasIndexBy = \true; + return NodeTraverser::STOP_TRAVERSAL; + } + return null; + }); + return $hasIndexBy; + } public function resolveFromToManyProperty(Property $property) : ?FullyQualifiedObjectType { $doctrineAnnotationTagValueNodeOrAttribute = $this->attrinationFinder->getByMany($property, CollectionMapping::TO_MANY_CLASSES); diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php index b9fe2a97d..9ec8ec5e6 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php @@ -13,14 +13,12 @@ final class CollectionVarTagValueNodeResolver { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttributeFinder */ - private $attributeFinder; + private AttributeFinder $attributeFinder; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, AttributeFinder $attributeFinder) { $this->phpDocInfoFactory = $phpDocInfoFactory; 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 e1f47a3aa..9f5be7d32 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/composer.json +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/composer.json @@ -8,17 +8,14 @@ }, "require-dev": { "phpstan\/extension-installer": "^1.3", - "phpstan\/phpstan": "^1.10", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "phpunit\/phpunit": "^10.5", + "phpstan\/phpstan": "^2.1.8", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.4", "rector\/rector-src": "dev-main", - "rector\/type-perfect": "^0.1.8", "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/phpstan-rules": "^13.0", "symplify\/rule-doc-generator": "^12.2", "symplify\/vendor-patches": "^11.3", - "tomasvotruba\/class-leak": "^0.2.13", + "tomasvotruba\/class-leak": "^1.0", "tracy\/tracy": "^2.10" }, "autoload": { @@ -41,7 +38,7 @@ ] }, "scripts": { - "phpstan": "vendor\/bin\/phpstan analyse --ansi --error-format symplify", + "phpstan": "vendor\/bin\/phpstan analyse --ansi", "check-cs": "vendor\/bin\/ecs check --ansi", "fix-cs": "vendor\/bin\/ecs check --fix --ansi" }, diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php72.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php72.php index 21ae0d905..b1c13ecac 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php72.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php72.php @@ -1,7 +1,7 @@ rules([DowngradeNamedArgumentRector::class, DowngradeDereferenceableOperationRector::class, DowngradeUnionTypeTypedPropertyRector::class, DowngradeUnionTypeDeclarationRector::class, DowngradeMixedTypeDeclarationRector::class, DowngradeStaticTypeDeclarationRector::class, DowngradeAbstractPrivateMethodInTraitRector::class, DowngradePropertyPromotionRector::class, DowngradeNonCapturingCatchesRector::class, DowngradeStrContainsRector::class, DowngradeMatchToSwitchRector::class, DowngradeClassOnObjectToGetClassRector::class, DowngradeArbitraryExpressionsSupportRector::class, DowngradeNullsafeToTernaryOperatorRector::class, DowngradeTrailingCommasInParamUseRector::class, DowngradeStrStartsWithRector::class, DowngradeStrEndsWithRector::class, DowngradePhpTokenRector::class, DowngradeThrowExprRector::class, DowngradePhp80ResourceReturnToObjectRector::class, DowngradeReflectionGetAttributesRector::class, DowngradeRecursiveDirectoryIteratorHasChildrenRector::class, DowngradeReflectionPropertyGetDefaultValueRector::class, DowngradeReflectionClassGetConstantsFilterRector::class, DowngradeArrayFilterNullableCallbackRector::class, DowngradeNumberFormatNoFourthArgRector::class, DowngradeStringReturnTypeOnToStringRector::class, DowngradeMixedTypeTypedPropertyRector::class, RemoveReturnTypeDeclarationFromCloneRector::class, DowngradeEnumToConstantListClassRector::class]); + $rectorConfig->rules([DowngradeNamedArgumentRector::class, DowngradeDereferenceableOperationRector::class, DowngradeUnionTypeTypedPropertyRector::class, DowngradeUnionTypeDeclarationRector::class, DowngradeMixedTypeDeclarationRector::class, DowngradeStaticTypeDeclarationRector::class, DowngradeAbstractPrivateMethodInTraitRector::class, DowngradePropertyPromotionRector::class, DowngradeNonCapturingCatchesRector::class, DowngradeStrContainsRector::class, DowngradeMatchToSwitchRector::class, DowngradeClassOnObjectToGetClassRector::class, DowngradeArbitraryExpressionsSupportRector::class, DowngradeNullsafeToTernaryOperatorRector::class, DowngradeTrailingCommasInParamUseRector::class, DowngradeStrStartsWithRector::class, DowngradeStrEndsWithRector::class, DowngradePhpTokenRector::class, DowngradeThrowExprRector::class, DowngradePhp80ResourceReturnToObjectRector::class, DowngradeReflectionGetAttributesRector::class, DowngradeRecursiveDirectoryIteratorHasChildrenRector::class, DowngradeReflectionPropertyGetDefaultValueRector::class, DowngradeReflectionClassGetConstantsFilterRector::class, DowngradeArrayFilterNullableCallbackRector::class, DowngradeNumberFormatNoFourthArgRector::class, DowngradeStringReturnTypeOnToStringRector::class, DowngradeMixedTypeTypedPropertyRector::class, RemoveReturnTypeDeclarationFromCloneRector::class, DowngradeEnumToConstantListClassRector::class, DowngradeInstanceofStringableRector::class]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php index 3b699a855..95982c7c5 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php @@ -1,7 +1,7 @@ phpVersion(PhpVersion::PHP_81); - $rectorConfig->rules([DowngradeReadonlyClassRector::class, DowngradeStandaloneNullTrueFalseReturnTypeRector::class]); + $rectorConfig->rules([DowngradeReadonlyClassRector::class, DowngradeStandaloneNullTrueFalseReturnTypeRector::class, DowngradeIteratorCountToArrayRector::class]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php83.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php83.php index 8ee37f6fa..e58f4d4ac 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php83.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php83.php @@ -1,12 +1,14 @@ phpVersion(PhpVersion::PHP_82); - $rectorConfig->rules([DowngradeTypedClassConstRector::class]); + $rectorConfig->rules([DowngradeTypedClassConstRector::class, DowngradeReadonlyAnonymousClassRector::class, DowngradeDynamicClassConstFetchRector::class]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php84.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php84.php new file mode 100644 index 000000000..e505f7b64 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php84.php @@ -0,0 +1,13 @@ +phpVersion(PhpVersion::PHP_83); + $rectorConfig->rules([DowngradeNewMethodCallWithoutParenthesesRector::class, DowngradeRoundingModeEnumRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php85.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php85.php new file mode 100644 index 000000000..bb825782b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php85.php @@ -0,0 +1,12 @@ +phpVersion(PhpVersion::PHP_84); + $rectorConfig->rules([DowngradeArrayFirstLastRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php71.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php71.php index 8dbc1edfb..0d96dcc6d 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php71.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php71.php @@ -1,7 +1,7 @@ sets([DowngradeSetList::PHP_83]); + $rectorConfig->sets([DowngradeLevelSetList::DOWN_TO_PHP_83, DowngradeSetList::PHP_83]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php83.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php83.php new file mode 100644 index 000000000..06cc6e03e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php83.php @@ -0,0 +1,11 @@ +sets([DowngradeLevelSetList::DOWN_TO_PHP_84, DowngradeSetList::PHP_84]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php84.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php84.php new file mode 100644 index 000000000..9946d5a28 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/level/down-to-php84.php @@ -0,0 +1,10 @@ +sets([DowngradeSetList::PHP_85]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php index 9bd8d5aef..50f6fc692 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php @@ -10,9 +10,8 @@ final class BuiltInMethodAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/OverrideFromAnonymousClassMethodAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/OverrideFromAnonymousClassMethodAnalyzer.php index 74a60c300..3f332ac92 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/OverrideFromAnonymousClassMethodAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/OverrideFromAnonymousClassMethodAnalyzer.php @@ -18,19 +18,16 @@ final class OverrideFromAnonymousClassMethodAnalyzer { /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(ClassAnalyzer $classAnalyzer, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider) { $this->classAnalyzer = $classAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/RegexFuncAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/RegexFuncAnalyzer.php index 31bce2869..0e9459c50 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/RegexFuncAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeAnalyzer/RegexFuncAnalyzer.php @@ -12,9 +12,8 @@ final class RegexFuncAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @var string[] */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/BitwiseFlagCleaner.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/BitwiseFlagCleaner.php index 4addd80cf..9e951bffc 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/BitwiseFlagCleaner.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/BitwiseFlagCleaner.php @@ -13,14 +13,13 @@ final class BitwiseFlagCleaner { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; } - public function cleanFuncCall(FuncCall $funcCall, BitwiseOr $bitwiseOr, string $flag, Expr $expr = null) : void + public function cleanFuncCall(FuncCall $funcCall, BitwiseOr $bitwiseOr, string $flag, ?Expr $expr = null) : void { if ($bitwiseOr->left instanceof BitwiseOr) { /** @var BitwiseOr $leftLeft */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/JsonConstCleaner.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/JsonConstCleaner.php index bb226f57c..c76dc1175 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/JsonConstCleaner.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/NodeManipulator/JsonConstCleaner.php @@ -7,7 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\BitwiseOr; use PhpParser\Node\Expr\ConstFetch; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\Enum\JsonConstant; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -15,9 +15,8 @@ final class JsonConstCleaner { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; @@ -36,16 +35,16 @@ public function clean($node, array $constants) : ?\PhpParser\Node\Expr /** * @param array $constants */ - private function cleanByConstFetch(ConstFetch $constFetch, array $constants) : ?LNumber + private function cleanByConstFetch(ConstFetch $constFetch, array $constants) : ?Int_ { if (!$this->nodeNameResolver->isNames($constFetch, $constants)) { return null; } - return new LNumber(0); + return new Int_(0); } /** * @param array $constants - * @return null|\PhpParser\Node\Expr|\PhpParser\Node\Scalar\LNumber + * @return null|\PhpParser\Node\Expr|\PhpParser\Node\Scalar\Int_ */ private function cleanByBitwiseOr(BitwiseOr $bitwiseOr, array $constants) { @@ -60,7 +59,7 @@ private function cleanByBitwiseOr(BitwiseOr $bitwiseOr, array $constants) if (!$isRightTransformed) { return $bitwiseOr->right; } - return new LNumber(0); + return new Int_(0); } /** * @param string[] $constants diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/PhpDoc/NativeParamToPhpDocDecorator.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/PhpDoc/NativeParamToPhpDocDecorator.php index 6275621c7..6a57b73e1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/PhpDoc/NativeParamToPhpDocDecorator.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/PhpDoc/NativeParamToPhpDocDecorator.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\DowngradePhp72\PhpDoc; +use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Param; use PhpParser\Node\Stmt\ClassMethod; @@ -18,29 +19,24 @@ final class NativeParamToPhpDocDecorator { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, NodeNameResolver $nodeNameResolver, StaticTypeMapper $staticTypeMapper, PhpDocTypeChanger $phpDocTypeChanger, ValueResolver $valueResolver) { $this->phpDocInfoFactory = $phpDocInfoFactory; @@ -51,7 +47,7 @@ public function __construct(PhpDocInfoFactory $phpDocInfoFactory, NodeNameResolv } public function decorate(ClassMethod $classMethod, Param $param) : void { - if ($param->type === null) { + if (!$param->type instanceof Node) { return; } $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php index 22cb6b751..09960cd2f 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php @@ -18,7 +18,7 @@ use Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @changelog https://www.php.net/manual/en/migration72.new-features.php#migration72.new-features.param-type-widening * @changelog https://3v4l.org/fOgSE @@ -29,38 +29,32 @@ final class DowngradeParameterTypeWideningRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\DowngradePhp72\PhpDoc\NativeParamToPhpDocDecorator */ - private $nativeParamToPhpDocDecorator; + private NativeParamToPhpDocDecorator $nativeParamToPhpDocDecorator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer */ - private $autowiredClassMethodOrPropertyAnalyzer; + private AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer; /** * @readonly - * @var \Rector\DowngradePhp72\NodeAnalyzer\BuiltInMethodAnalyzer */ - private $builtInMethodAnalyzer; + private BuiltInMethodAnalyzer $builtInMethodAnalyzer; /** * @readonly - * @var \Rector\DowngradePhp72\NodeAnalyzer\OverrideFromAnonymousClassMethodAnalyzer */ - private $overrideFromAnonymousClassMethodAnalyzer; + private OverrideFromAnonymousClassMethodAnalyzer $overrideFromAnonymousClassMethodAnalyzer; /** * @readonly - * @var \Rector\DowngradePhp72\NodeAnalyzer\SealedClassAnalyzer */ - private $sealedClassAnalyzer; + private SealedClassAnalyzer $sealedClassAnalyzer; /** * @var array */ - private $unsafeTypesToMethods = []; + private array $unsafeTypesToMethods = []; public function __construct(NativeParamToPhpDocDecorator $nativeParamToPhpDocDecorator, ReflectionResolver $reflectionResolver, AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, BuiltInMethodAnalyzer $builtInMethodAnalyzer, OverrideFromAnonymousClassMethodAnalyzer $overrideFromAnonymousClassMethodAnalyzer, SealedClassAnalyzer $sealedClassAnalyzer) { $this->nativeParamToPhpDocDecorator = $nativeParamToPhpDocDecorator; @@ -212,7 +206,7 @@ private function isSafeType(ClassReflection $classReflection, ClassMethod $class if (!$this->isNames($classMethod, $unsafeMethods)) { continue; } - if ($classReflection->isSubclassOf($unsafeType)) { + if ($classReflection->is($unsafeType)) { return \false; } // skip self too diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ConstFetch/DowngradePhp72JsonConstRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ConstFetch/DowngradePhp72JsonConstRector.php index aa5461f80..6171f3869 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ConstFetch/DowngradePhp72JsonConstRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/ConstFetch/DowngradePhp72JsonConstRector.php @@ -23,14 +23,12 @@ final class DowngradePhp72JsonConstRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp72\NodeManipulator\JsonConstCleaner */ - private $jsonConstCleaner; + private JsonConstCleaner $jsonConstCleaner; /** * @readonly - * @var \Rector\NodeAnalyzer\DefineFuncCallAnalyzer */ - private $defineFuncCallAnalyzer; + private DefineFuncCallAnalyzer $defineFuncCallAnalyzer; /** * @var string */ @@ -63,12 +61,12 @@ public function getNodeTypes() : array } /** * @param ConstFetch|BitwiseOr|If_ $node - * @return \PhpParser\Node\Expr|\PhpParser\Node\Stmt\If_|null|int */ - public function refactor(Node $node) + public function refactor(Node $node) : ?\PhpParser\Node\Expr { if ($node instanceof If_) { - return $this->refactorIf($node); + $this->markConstantKnownInInnerStmts($node); + return null; } // skip as known if ((bool) $node->getAttribute(self::PHP72_JSON_CONSTANT_IS_KNOWN)) { @@ -76,15 +74,14 @@ public function refactor(Node $node) } return $this->jsonConstCleaner->clean($node, [JsonConstant::INVALID_UTF8_IGNORE, JsonConstant::INVALID_UTF8_SUBSTITUTE]); } - private function refactorIf(If_ $if) : ?If_ + private function markConstantKnownInInnerStmts(If_ $if) : void { if (!$this->defineFuncCallAnalyzer->isDefinedWithConstants($if->cond, [JsonConstant::INVALID_UTF8_IGNORE, JsonConstant::INVALID_UTF8_SUBSTITUTE])) { - return null; + return; } $this->traverseNodesWithCallable($if, static function (Node $node) { $node->setAttribute(self::PHP72_JSON_CONSTANT_IS_KNOWN, \true); return null; }); - return $if; } } 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 f0d6c17cc..938f7677c 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 @@ -24,14 +24,12 @@ final class DowngradeJsonDecodeNullAssociativeArgRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) { $this->argsAnalyzer = $argsAnalyzer; 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 c2b745e02..d1038aa03 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 @@ -13,7 +13,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Param; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\ClassConst; @@ -32,19 +32,16 @@ final class DowngradePregUnmatchedAsNullConstantRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp72\NodeManipulator\BitwiseFlagCleaner */ - private $bitwiseFlagCleaner; + private BitwiseFlagCleaner $bitwiseFlagCleaner; /** * @readonly - * @var \Rector\DowngradePhp72\NodeAnalyzer\RegexFuncAnalyzer */ - private $regexFuncAnalyzer; + private RegexFuncAnalyzer $regexFuncAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @see https://www.php.net/manual/en/function.preg-match.php * @var string @@ -138,7 +135,7 @@ private function refactorClassConst(ClassConst $classConst) : ?ClassConst if (!$this->isName($singleClassConst->value, self::UNMATCHED_NULL_FLAG)) { continue; } - $classConst->consts[$key]->value = new LNumber(512); + $classConst->consts[$key]->value = new Int_(512); return $classConst; } return null; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeStreamIsattyRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeStreamIsattyRector.php index e56630ddb..523018358 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeStreamIsattyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeStreamIsattyRector.php @@ -19,7 +19,8 @@ use Rector\NodeAnalyzer\ExprInTopStmtMatcher; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Parser\InlineCodeParser; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -27,27 +28,21 @@ * * @see \Rector\Tests\DowngradePhp72\Rector\FuncCall\DowngradeStreamIsattyRector\DowngradeStreamIsattyRectorTest */ -final class DowngradeStreamIsattyRector extends AbstractScopeAwareRector +final class DowngradeStreamIsattyRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Parser\InlineCodeParser */ - private $inlineCodeParser; + private InlineCodeParser $inlineCodeParser; /** * @readonly - * @var \Rector\Naming\Naming\VariableNaming */ - private $variableNaming; + private VariableNaming $variableNaming; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprInTopStmtMatcher */ - private $exprInTopStmtMatcher; - /** - * @var \PhpParser\Node\Expr\Closure|null - */ - private $cachedClosure; + private ExprInTopStmtMatcher $exprInTopStmtMatcher; + private ?Closure $cachedClosure = null; public function __construct(InlineCodeParser $inlineCodeParser, VariableNaming $variableNaming, ExprInTopStmtMatcher $exprInTopStmtMatcher) { $this->inlineCodeParser = $inlineCodeParser; @@ -106,7 +101,7 @@ public function getNodeTypes() : array * @param StmtsAwareInterface|Switch_|Return_|Expression|Echo_ $node * @return Node[]|null */ - public function refactorWithScope(Node $node, Scope $scope) : ?array + public function refactor(Node $node) : ?array { $expr = $this->exprInTopStmtMatcher->match($node, function (Node $subNode) : bool { if (!$subNode instanceof FuncCall) { @@ -126,6 +121,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?array return null; } $function = $this->createClosure(); + $scope = ScopeFetcher::fetch($node); $variable = new Variable($this->variableNaming->createCountedValueName('streamIsatty', $scope)); $assign = new Assign($variable, $function); $expr->name = $variable; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FunctionLike/DowngradeObjectTypeDeclarationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FunctionLike/DowngradeObjectTypeDeclarationRector.php index 5f6537374..0facf5644 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FunctionLike/DowngradeObjectTypeDeclarationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FunctionLike/DowngradeObjectTypeDeclarationRector.php @@ -19,9 +19,8 @@ final class DowngradeObjectTypeDeclarationRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpDocDecorator\PhpDocFromTypeDeclarationDecorator */ - private $phpDocFromTypeDeclarationDecorator; + private PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator; public function __construct(PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator) { $this->phpDocFromTypeDeclarationDecorator = $phpDocFromTypeDeclarationDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/ConstFetch/DowngradePhp73JsonConstRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/ConstFetch/DowngradePhp73JsonConstRector.php index f83f670a8..5e7e745e7 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/ConstFetch/DowngradePhp73JsonConstRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/ConstFetch/DowngradePhp73JsonConstRector.php @@ -13,16 +13,16 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\New_; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified as NameFullyQualified; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\If_; -use PhpParser\Node\Stmt\Throw_; use PhpParser\Node\Stmt\TryCatch; use PhpParser\Node\VariadicPlaceholder; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\DowngradePhp72\NodeManipulator\JsonConstCleaner; use Rector\Enum\JsonConstant; use Rector\NodeAnalyzer\DefineFuncCallAnalyzer; @@ -38,14 +38,12 @@ final class DowngradePhp73JsonConstRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp72\NodeManipulator\JsonConstCleaner */ - private $jsonConstCleaner; + private JsonConstCleaner $jsonConstCleaner; /** * @readonly - * @var \Rector\NodeAnalyzer\DefineFuncCallAnalyzer */ - private $defineFuncCallAnalyzer; + private DefineFuncCallAnalyzer $defineFuncCallAnalyzer; /** * @var string */ @@ -94,12 +92,13 @@ public function getNodeTypes() : array } /** * @param ConstFetch|BitwiseOr|If_|TryCatch|Expression $node - * @return int|null|Expr|If_|array + * @return null|Expr|array */ public function refactor(Node $node) { if ($node instanceof If_) { - return $this->refactorIf($node); + $this->markConstantKnownInInnerStmts($node); + return null; } // skip as known if ((bool) $node->getAttribute(self::PHP73_JSON_CONSTANT_IS_KNOWN)) { @@ -108,7 +107,7 @@ public function refactor(Node $node) if ($node instanceof TryCatch) { $this->traverseNodesWithCallable($node->stmts, function (Node $subNode) : ?int { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Expression) { return null; @@ -126,16 +125,15 @@ public function refactor(Node $node) } return $this->jsonConstCleaner->clean($node, [JsonConstant::THROW_ON_ERROR]); } - private function refactorIf(If_ $if) : ?If_ + private function markConstantKnownInInnerStmts(If_ $if) : void { if (!$this->defineFuncCallAnalyzer->isDefinedWithConstants($if->cond, [JsonConstant::THROW_ON_ERROR])) { - return null; + return; } $this->traverseNodesWithCallable($if, static function (Node $node) { $node->setAttribute(self::PHP73_JSON_CONSTANT_IS_KNOWN, \true); return null; }); - return $if; } private function resolveFuncCall(Expression $Expression) : ?FuncCall { @@ -180,7 +178,7 @@ private function refactorStmt(Expression $Expression) : ?array return null; } $nodes = [$Expression]; - $nodes[] = new If_(new NotIdentical(new FuncCall(new Name('json_last_error')), new ConstFetch(new Name('JSON_ERROR_NONE'))), ['stmts' => [new Throw_(new New_(new NameFullyQualified('Exception'), [new Arg(new FuncCall(new Name('json_last_error_msg')))]))]]); + $nodes[] = new If_(new NotIdentical(new FuncCall(new Name('json_last_error')), new ConstFetch(new Name('JSON_ERROR_NONE'))), ['stmts' => [new Expression(new Throw_(new New_(new NameFullyQualified('Exception'), [new Arg(new FuncCall(new Name('json_last_error_msg')))])))]]); return $nodes; } /** @@ -211,10 +209,6 @@ private function hasConstFetchInBitwiseOr(BitwiseOr $bitwiseOr, string $constNam { $found = \false; foreach ([$bitwiseOr->left, $bitwiseOr->right] as $subNode) { - // Only `Node` instances can hold the constant. - if (!$subNode instanceof Node) { - continue; - } switch (\true) { case $subNode instanceof BitwiseOr: $found = $this->hasConstFetchInBitwiseOr($subNode, $constName); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeArrayKeyFirstLastRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeArrayKeyFirstLastRector.php index 35242c8df..7672ca2ed 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeArrayKeyFirstLastRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeArrayKeyFirstLastRector.php @@ -40,14 +40,12 @@ final class DowngradeArrayKeyFirstLastRector extends AbstractRector { /** * @readonly - * @var \Rector\Naming\Naming\VariableNaming */ - private $variableNaming; + private VariableNaming $variableNaming; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprInTopStmtMatcher */ - private $exprInTopStmtMatcher; + private ExprInTopStmtMatcher $exprInTopStmtMatcher; public function __construct(VariableNaming $variableNaming, ExprInTopStmtMatcher $exprInTopStmtMatcher) { $this->variableNaming = $variableNaming; @@ -113,9 +111,9 @@ private function resolveVariableFromCallLikeScope(CallLike $callLike, ?Scope $sc { /** @var MethodCall|FuncCall|StaticCall|New_|NullsafeMethodCall $callLike */ if ($callLike instanceof New_) { - $variableName = (string) $this->nodeNameResolver->getName($callLike->class); + $variableName = (string) $this->getName($callLike->class); } else { - $variableName = (string) $this->nodeNameResolver->getName($callLike->name); + $variableName = (string) $this->getName($callLike->name); } if ($variableName === '') { $variableName = 'array'; @@ -214,7 +212,7 @@ private function resolveCastedArray(Expr $expr) return $this->resolveCastedArray($expr->expr); } $scope = $expr->getAttribute(AttributeKey::SCOPE); - $variableName = $this->variableNaming->createCountedValueName((string) $this->nodeNameResolver->getName($expr->expr), $scope); + $variableName = $this->variableNaming->createCountedValueName((string) $this->getName($expr->expr), $scope); return new Variable($variableName); } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeTrailingCommasInFunctionCallsRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeTrailingCommasInFunctionCallsRector.php index cff800224..4b7540281 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeTrailingCommasInFunctionCallsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/DowngradeTrailingCommasInFunctionCallsRector.php @@ -9,7 +9,7 @@ use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\StaticCall; use Rector\DowngradePhp73\Tokenizer\FollowedByCommaAnalyzer; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\DowngradePhp73\Tokenizer\TrailingCommaRemover; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,12 +20,16 @@ final class DowngradeTrailingCommasInFunctionCallsRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp73\Tokenizer\FollowedByCommaAnalyzer */ - private $followedByCommaAnalyzer; - public function __construct(FollowedByCommaAnalyzer $followedByCommaAnalyzer) + private FollowedByCommaAnalyzer $followedByCommaAnalyzer; + /** + * @readonly + */ + private TrailingCommaRemover $trailingCommaRemover; + public function __construct(FollowedByCommaAnalyzer $followedByCommaAnalyzer, TrailingCommaRemover $trailingCommaRemover) { $this->followedByCommaAnalyzer = $followedByCommaAnalyzer; + $this->trailingCommaRemover = $trailingCommaRemover; } public function getRuleDefinition() : RuleDefinition { @@ -74,14 +78,22 @@ public function refactor(Node $node) : ?Node if ($args === []) { return null; } + foreach ($args as $arg) { + // reprinted, needs to remove from call like itself + if ($arg->getEndTokenPos() < 0) { + $hasChanged = $this->trailingCommaRemover->removeFromCallLike($this->file, $node); + if ($hasChanged) { + return $node; + } + return null; + } + } $lastArgKey = \count($args) - 1; $lastArg = $args[$lastArgKey]; if (!$this->followedByCommaAnalyzer->isFollowed($this->file, $lastArg)) { return null; } - // remove comma - $lastArg->setAttribute(AttributeKey::FUNC_ARGS_TRAILING_COMMA, \false); - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $this->trailingCommaRemover->remove($this->file, $lastArg); return $node; } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/SetCookieOptionsArrayToArgumentsRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/SetCookieOptionsArrayToArgumentsRector.php index b1dc469ef..c579256e1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/SetCookieOptionsArrayToArgumentsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/FuncCall/SetCookieOptionsArrayToArgumentsRector.php @@ -6,8 +6,8 @@ use PhpParser\BuilderHelpers; use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Scalar\String_; use Rector\Exception\ShouldNotHappenException; @@ -29,10 +29,7 @@ final class SetCookieOptionsArrayToArgumentsRector extends AbstractRector * @var array */ private const ARGUMENT_DEFAULT_VALUES = [2 => 0, 3 => '', 4 => '', 5 => \false, 6 => \false]; - /** - * @var int - */ - private $highestIndex = 1; + private int $highestIndex = 1; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Convert setcookie option array to arguments', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/List_/DowngradeListReferenceAssignmentRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/List_/DowngradeListReferenceAssignmentRector.php index 2bfaa67b5..17099b0b1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/List_/DowngradeListReferenceAssignmentRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/List_/DowngradeListReferenceAssignmentRector.php @@ -5,14 +5,14 @@ use PhpParser\BuilderHelpers; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\AssignRef; use PhpParser\Node\Expr\List_; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Expression; use Rector\Rector\AbstractRector; @@ -233,7 +233,7 @@ private function getArrayItemKey(ArrayItem $arrayItem, $position) if ($arrayItem->key instanceof String_) { return $arrayItem->key->value; } - if ($arrayItem->key instanceof LNumber) { + if ($arrayItem->key instanceof Int_) { return $arrayItem->key->value; } return $position; @@ -256,7 +256,7 @@ private function createAssignRefWithArrayDimFetch(Variable $assignVariable, Vari return new Expression($assignRef); } /** - * @param array $arrayItems + * @param array<(ArrayItem | null)> $arrayItems * @return ArrayItem[] */ private function getItemsByRef(array $arrayItems, int $condition) : array diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/String_/DowngradeFlexibleHeredocSyntaxRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/String_/DowngradeFlexibleHeredocSyntaxRector.php index 66cc7ffb1..467706edd 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/String_/DowngradeFlexibleHeredocSyntaxRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/String_/DowngradeFlexibleHeredocSyntaxRector.php @@ -4,7 +4,7 @@ namespace Rector\DowngradePhp73\Rector\String_; use PhpParser\Node; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\String_; use Rector\DowngradePhp73\Tokenizer\FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -18,9 +18,8 @@ final class DowngradeFlexibleHeredocSyntaxRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp73\Tokenizer\FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer */ - private $followedByNewlineOnlyMaybeWithSemicolonAnalyzer; + private FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer $followedByNewlineOnlyMaybeWithSemicolonAnalyzer; /** * @var int[] */ @@ -52,10 +51,10 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [String_::class, Encapsed::class]; + return [String_::class, InterpolatedString::class]; } /** - * @param Encapsed|String_ $node + * @param InterpolatedString|String_ $node */ public function refactor(Node $node) : ?Node { @@ -68,8 +67,12 @@ public function refactor(Node $node) : ?Node if ($docIndentation === '' && $this->followedByNewlineOnlyMaybeWithSemicolonAnalyzer->isFollowed($this->file, $node)) { return null; } - $node->setAttribute(AttributeKey::DOC_INDENTATION, ''); + $node->setAttribute(AttributeKey::DOC_INDENTATION, '__REMOVED__'); $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $tokens = $this->file->getOldTokens(); + if (isset($tokens[$node->getEndTokenPos()], $tokens[$node->getEndTokenPos() + 1])) { + $tokens[$node->getEndTokenPos() + 1]->text = "\n" . $tokens[$node->getEndTokenPos() + 1]->text; + } return $node; } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/Unset_/DowngradeTrailingCommasInUnsetRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/Unset_/DowngradeTrailingCommasInUnsetRector.php index 78289914f..bcbbb0e70 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/Unset_/DowngradeTrailingCommasInUnsetRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Rector/Unset_/DowngradeTrailingCommasInUnsetRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Unset_; use Rector\DowngradePhp73\Tokenizer\FollowedByCommaAnalyzer; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\DowngradePhp73\Tokenizer\TrailingCommaRemover; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,12 +17,16 @@ final class DowngradeTrailingCommasInUnsetRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp73\Tokenizer\FollowedByCommaAnalyzer */ - private $followedByCommaAnalyzer; - public function __construct(FollowedByCommaAnalyzer $followedByCommaAnalyzer) + private FollowedByCommaAnalyzer $followedByCommaAnalyzer; + /** + * @readonly + */ + private TrailingCommaRemover $trailingCommaRemover; + public function __construct(FollowedByCommaAnalyzer $followedByCommaAnalyzer, TrailingCommaRemover $trailingCommaRemover) { $this->followedByCommaAnalyzer = $followedByCommaAnalyzer; + $this->trailingCommaRemover = $trailingCommaRemover; } public function getRuleDefinition() : RuleDefinition { @@ -53,16 +57,12 @@ public function getNodeTypes() : array public function refactor(Node $node) : ?Node { if ($node->vars !== []) { - \end($node->vars); - $lastArgumentPosition = \key($node->vars); - \reset($node->vars); + $lastArgumentPosition = \array_key_last($node->vars); $last = $node->vars[$lastArgumentPosition]; if (!$this->followedByCommaAnalyzer->isFollowed($this->file, $last)) { return null; } - // remove comma - $last->setAttribute(AttributeKey::FUNC_ARGS_TRAILING_COMMA, \false); - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $this->trailingCommaRemover->remove($this->file, $last); return $node; } return null; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByCommaAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByCommaAnalyzer.php index bae1398e1..fb0ee5b5c 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByCommaAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByCommaAnalyzer.php @@ -15,12 +15,12 @@ public function isFollowed(File $file, Node $node) : bool while (isset($oldTokens[$nextTokenPosition])) { $currentToken = $oldTokens[$nextTokenPosition]; // only space - if (\is_array($currentToken) || StringUtils::isMatch($currentToken, '#\\s+#')) { + if (StringUtils::isMatch((string) $currentToken, '#\\s+#')) { ++$nextTokenPosition; continue; } // without comma - if (\in_array($currentToken, ['(', ')', ';'], \true)) { + if (\in_array((string) $currentToken, ['(', ')', ';'], \true)) { return \false; } break; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer.php index ebacfa01c..68ea7f15d 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/FollowedByNewlineOnlyMaybeWithSemicolonAnalyzer.php @@ -11,9 +11,9 @@ public function isFollowed(File $file, Node $node) : bool { $oldTokens = $file->getOldTokens(); $nextTokenPosition = $node->getEndTokenPos() + 1; - if (isset($oldTokens[$nextTokenPosition]) && $oldTokens[$nextTokenPosition] === ';') { + if (isset($oldTokens[$nextTokenPosition]) && (string) $oldTokens[$nextTokenPosition] === ';') { ++$nextTokenPosition; } - return !isset($oldTokens[$nextTokenPosition]) || isset($oldTokens[$nextTokenPosition][1]) && \strncmp($oldTokens[$nextTokenPosition][1], "\n", \strlen("\n")) === 0; + return !isset($oldTokens[$nextTokenPosition]) || isset($oldTokens[$nextTokenPosition]) && \strncmp((string) $oldTokens[$nextTokenPosition], "\n", \strlen("\n")) === 0; } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/TrailingCommaRemover.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/TrailingCommaRemover.php new file mode 100644 index 000000000..3f1a5445d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp73/Tokenizer/TrailingCommaRemover.php @@ -0,0 +1,46 @@ +getOldTokens(); + $iteration = 1; + while (isset($tokens[$node->getEndTokenPos() + $iteration])) { + if (\trim($tokens[$node->getEndTokenPos() + $iteration]->text) === '') { + ++$iteration; + continue; + } + if (\trim($tokens[$node->getEndTokenPos() + $iteration]->text) !== ',') { + break; + } + $tokens[$node->getEndTokenPos() + $iteration]->text = ''; + break; + } + } + public function removeFromCallLike(File $file, CallLike $callLike) : bool + { + $tokens = $file->getOldTokens(); + $iteration = 1; + $hasChanged = \false; + while (isset($tokens[$callLike->getEndTokenPos() - $iteration])) { + $text = \trim($tokens[$callLike->getEndTokenPos() - $iteration]->text); + if (\in_array($text, [')', ''], \true)) { + ++$iteration; + continue; + } + if ($text === ',') { + $tokens[$callLike->getEndTokenPos() - $iteration]->text = ''; + $hasChanged = \true; + } + break; + } + return $hasChanged; + } +} 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 611897fae..c196a2d8c 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 @@ -4,21 +4,21 @@ namespace Rector\DowngradePhp74\Rector\Array_; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\ClassLike; use PHPStan\Analyser\MutatingScope; -use PHPStan\Analyser\Scope; use PHPStan\Type\Type; use Rector\DowngradePhp81\NodeAnalyzer\ArraySpreadAnalyzer; use Rector\DowngradePhp81\NodeFactory\ArrayMergeFromArraySpreadFactory; use Rector\PhpParser\AstResolver; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -27,28 +27,24 @@ * * @see \Rector\Tests\DowngradePhp74\Rector\Array_\DowngradeArraySpreadRector\DowngradeArraySpreadRectorTest */ -final class DowngradeArraySpreadRector extends AbstractScopeAwareRector +final class DowngradeArraySpreadRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp81\NodeFactory\ArrayMergeFromArraySpreadFactory */ - private $arrayMergeFromArraySpreadFactory; + private ArrayMergeFromArraySpreadFactory $arrayMergeFromArraySpreadFactory; /** * @readonly - * @var \Rector\DowngradePhp81\NodeAnalyzer\ArraySpreadAnalyzer */ - private $arraySpreadAnalyzer; + private ArraySpreadAnalyzer $arraySpreadAnalyzer; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(ArrayMergeFromArraySpreadFactory $arrayMergeFromArraySpreadFactory, ArraySpreadAnalyzer $arraySpreadAnalyzer, AstResolver $astResolver, BetterNodeFinder $betterNodeFinder) { $this->arrayMergeFromArraySpreadFactory = $arrayMergeFromArraySpreadFactory; @@ -106,7 +102,7 @@ public function getNodeTypes() : array /** * @param Array_|ClassConst $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { if ($node instanceof ClassConst) { return $this->refactorUnderClassConst($node); @@ -115,6 +111,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node return null; } /** @var MutatingScope $scope */ + $scope = ScopeFetcher::fetch($node); return $this->arrayMergeFromArraySpreadFactory->createFromArray($node, $scope); } private function refactorUnderClassConst(ClassConst $classConst) : ?ClassConst @@ -162,14 +159,10 @@ private function refactorArrayConstValue(Array_ $array) : ?Array_ if (!$type instanceof FullyQualifiedObjectType) { continue; } - /** - * @var ArrayItem $item - * @var ClassConstFetch $value - * @var Identifier $name - */ $value = $item->value; - /** @var Identifier $name */ + /** @var ClassConstFetch $value */ $name = $value->name; + /** @var Identifier $name */ $classLike = $this->astResolver->resolveClassFromName($type->getClassName()); if (!$classLike instanceof ClassLike) { continue; 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 d9e545817..22d9a548b 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 @@ -4,14 +4,15 @@ namespace Rector\DowngradePhp74\Rector\ArrowFunction; use PhpParser\Node; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\ClosureUse; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; -use PhpParser\Node\Stmt\Throw_; use PHPStan\Analyser\Scope; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php72\NodeFactory\AnonymousFunctionFactory; @@ -28,14 +29,12 @@ final class ArrowFunctionToAnonymousFunctionRector extends AbstractRector { /** * @readonly - * @var \Rector\Php72\NodeFactory\AnonymousFunctionFactory */ - private $anonymousFunctionFactory; + private AnonymousFunctionFactory $anonymousFunctionFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory, BetterNodeFinder $betterNodeFinder) { $this->anonymousFunctionFactory = $anonymousFunctionFactory; @@ -82,24 +81,24 @@ public function refactor(Node $node) : Closure $stmts = [new Return_($node->expr)]; $anonymousFunctionFactory = $this->anonymousFunctionFactory->create($node->params, $stmts, $node->returnType, $node->static); if ($node->expr instanceof Assign && $node->expr->expr instanceof Variable) { - $isFound = (bool) $this->betterNodeFinder->findFirst($anonymousFunctionFactory->uses, function (Node $subNode) use($node) : bool { - return $subNode instanceof Variable && $this->nodeComparator->areNodesEqual($subNode, $node->expr->expr); - }); + $isFound = (bool) $this->betterNodeFinder->findFirst($anonymousFunctionFactory->uses, fn(Node $subNode): bool => $subNode instanceof Variable && $this->nodeComparator->areNodesEqual($subNode, $node->expr->expr)); if (!$isFound) { - $anonymousFunctionFactory->uses[] = new ClosureUse($node->expr->expr); + $isAlsoParam = \in_array($node->expr->expr->name, \array_map(static fn($param) => $param->var instanceof Variable ? $param->var->name : null, $node->params)); + if (!$isAlsoParam) { + $anonymousFunctionFactory->uses[] = new ClosureUse($node->expr->expr); + } } } // downgrade "return throw" - $this->traverseNodesWithCallable($anonymousFunctionFactory, static function (Node $node) : ?Throw_ { + $this->traverseNodesWithCallable($anonymousFunctionFactory, static function (Node $node) : ?Expression { if (!$node instanceof Return_) { return null; } - if (!$node->expr instanceof Node\Expr\Throw_) { + if (!$node->expr instanceof Throw_) { return null; } - $throw = $node->expr; // throw expr to throw stmts - return new Throw_($throw->expr); + return new Expression($node->expr); }); $this->appendUsesFromInsertedVariable($node->expr, $anonymousFunctionFactory); return $anonymousFunctionFactory; 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 aaae864e0..9a7012b66 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 @@ -31,33 +31,25 @@ final class DowngradeContravariantArgumentTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; - /** - * @var bool - */ - private $hasChanged = \false; + private StaticTypeMapper $staticTypeMapper; + private bool $hasChanged = \false; public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ParamAnalyzer $paramAnalyzer, ReflectionResolver $reflectionResolver, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper) { $this->phpDocTypeChanger = $phpDocTypeChanger; @@ -141,7 +133,7 @@ private function isNullableParam(Param $param, $functionLike) : bool if ($param->variadic) { return \false; } - if ($param->type === null) { + if (!$param->type instanceof Node) { return \false; } // Don't consider for Union types @@ -250,7 +242,7 @@ private function refactorParam(Param $param, $functionLike) : void */ private function decorateWithDocBlock($functionLike, Param $param) : void { - if ($param->type === null) { + if (!$param->type instanceof Node) { return; } $type = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); 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 738c27dc3..70071f92d 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 @@ -40,44 +40,36 @@ final class DowngradeCovariantReturnTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\ReturnTagRemover */ - private $returnTagRemover; + private ReturnTagRemover $returnTagRemover; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\Util\Reflection\PrivatesAccessor */ - private $privatesAccessor; + private PrivatesAccessor $privatesAccessor; /** * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeAnalyzer */ - private $unionTypeAnalyzer; + private UnionTypeAnalyzer $unionTypeAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ReturnTagRemover $returnTagRemover, ReflectionResolver $reflectionResolver, PrivatesAccessor $privatesAccessor, UnionTypeAnalyzer $unionTypeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper) { $this->phpDocTypeChanger = $phpDocTypeChanger; 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 74c332b56..2948cd0af 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 @@ -29,9 +29,8 @@ final class DowngradeStripTagsCallWithArrayRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; 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 4d71afeaa..533a14147 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 @@ -19,9 +19,8 @@ final class DowngradeFreadFwriteFalsyToNegationRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var string[] */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Interface_/DowngradePreviouslyImplementedInterfaceRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Interface_/DowngradePreviouslyImplementedInterfaceRector.php index 87467d501..fa95a90b8 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Interface_/DowngradePreviouslyImplementedInterfaceRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Interface_/DowngradePreviouslyImplementedInterfaceRector.php @@ -17,9 +17,8 @@ final class DowngradePreviouslyImplementedInterfaceRector extends AbstractRector { /** * @readonly - * @var \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer */ - private $familyRelationsAnalyzer; + private FamilyRelationsAnalyzer $familyRelationsAnalyzer; public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer) { $this->familyRelationsAnalyzer = $familyRelationsAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/LNumber/DowngradeNumericLiteralSeparatorRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/LNumber/DowngradeNumericLiteralSeparatorRector.php index 74d944250..e88f8585f 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/LNumber/DowngradeNumericLiteralSeparatorRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/LNumber/DowngradeNumericLiteralSeparatorRector.php @@ -4,8 +4,8 @@ namespace Rector\DowngradePhp74\Rector\LNumber; use PhpParser\Node; -use PhpParser\Node\Scalar\DNumber; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -46,10 +46,10 @@ public function run() */ public function getNodeTypes() : array { - return [LNumber::class, DNumber::class]; + return [Int_::class, Float_::class]; } /** - * @param LNumber|DNumber $node + * @param Int_|Float_ $node */ public function refactor(Node $node) : ?Node { @@ -66,7 +66,7 @@ public function refactor(Node $node) : ?Node return $node; } /** - * @param \PhpParser\Node\Scalar\LNumber|\PhpParser\Node\Scalar\DNumber $node + * @param \PhpParser\Node\Scalar\Int_|\PhpParser\Node\Scalar\Float_ $node * @param mixed $rawValue */ private function shouldSkip($node, $rawValue) : bool @@ -75,9 +75,9 @@ private function shouldSkip($node, $rawValue) : bool return \true; } // "_" notation can be applied to decimal numbers only - if ($node instanceof LNumber) { + if ($node instanceof Int_) { $numberKind = $node->getAttribute(AttributeKey::KIND); - if ($numberKind !== LNumber::KIND_DEC) { + if ($numberKind !== Int_::KIND_DEC) { return \true; } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/MethodCall/DowngradeReflectionGetTypeRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/MethodCall/DowngradeReflectionGetTypeRector.php index 6abb842cb..43c616dab 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/MethodCall/DowngradeReflectionGetTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/MethodCall/DowngradeReflectionGetTypeRector.php @@ -63,15 +63,16 @@ public function getNodeTypes() : array } /** * @param MethodCall|Ternary|Instanceof_ $node - * @return \PhpParser\Node|null|int */ - public function refactor(Node $node) + public function refactor(Node $node) : ?\PhpParser\Node { if ($node instanceof Instanceof_) { - return $this->refactorInstanceof($node); + $this->markSkipInstanceof($node); + return null; } if ($node instanceof Ternary) { - return $this->refactorTernary($node); + $this->markSkipTernary($node); + return null; } if ($node->getAttribute(self::SKIP_NODE) === \true) { return null; @@ -85,30 +86,28 @@ public function refactor(Node $node) $args = [new Arg($node->var), new Arg(new String_('getType'))]; return new Ternary($this->nodeFactory->createFuncCall('method_exists', $args), $node, $this->nodeFactory->createNull()); } - private function refactorInstanceof(Instanceof_ $instanceof) : ?Instanceof_ + private function markSkipInstanceof(Instanceof_ $instanceof) : void { if (!$this->isName($instanceof->class, 'ReflectionNamedType')) { - return null; + return; } if (!$instanceof->expr instanceof MethodCall) { - return null; + return; } // checked typed → safe $instanceof->expr->setAttribute(self::SKIP_NODE, \true); - return $instanceof; } - private function refactorTernary(Ternary $ternary) : ?Ternary + private function markSkipTernary(Ternary $ternary) : void { if (!$ternary->if instanceof Expr) { - return null; + return; } if (!$ternary->cond instanceof FuncCall) { - return null; + return; } if (!$this->isName($ternary->cond, 'method_exists')) { - return null; + return; } $ternary->if->setAttribute(self::SKIP_NODE, \true); - return $ternary; } } 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 481ec697e..19c54c32d 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 @@ -19,14 +19,12 @@ final class DowngradeTypedPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\PropertyDecorator */ - private $propertyDecorator; + private PropertyDecorator $propertyDecorator; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(PropertyDecorator $propertyDecorator, ValueResolver $valueResolver) { $this->propertyDecorator = $propertyDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/EnumAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/EnumAnalyzer.php index 86f02085b..02c664bb1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/EnumAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/EnumAnalyzer.php @@ -18,14 +18,12 @@ final class EnumAnalyzer { /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(AstResolver $astResolver, NodeTypeResolver $nodeTypeResolver) { $this->astResolver = $astResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/NamedToUnnamedArgs.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/NamedToUnnamedArgs.php index a33ca22de..6e5dda5b1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/NamedToUnnamedArgs.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/NamedToUnnamedArgs.php @@ -18,14 +18,12 @@ final class NamedToUnnamedArgs { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\DowngradePhp80\Reflection\DefaultParameterValueResolver */ - private $defaultParameterValueResolver; + private DefaultParameterValueResolver $defaultParameterValueResolver; public function __construct(NodeNameResolver $nodeNameResolver, DefaultParameterValueResolver $defaultParameterValueResolver) { $this->nodeNameResolver = $nodeNameResolver; @@ -52,7 +50,7 @@ public function fillFromNamedArgs(array $parameters, array $currentArgs, array $ if (!$this->nodeNameResolver->isName($currentArg->name, $parameterReflectionName)) { continue; } - $unnamedArgs[$paramPosition] = new Arg($currentArg->value, $currentArg->byRef, $currentArg->unpack, $currentArg->getAttributes(), null); + $unnamedArgs[$paramPosition] = new Arg($currentArg->value, $currentArg->byRef, $currentArg->unpack, [], null); } } return $unnamedArgs; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/UnnamedArgumentResolver.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/UnnamedArgumentResolver.php index 7fcbf2ab8..25b755669 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/UnnamedArgumentResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/NodeAnalyzer/UnnamedArgumentResolver.php @@ -15,14 +15,12 @@ final class UnnamedArgumentResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\DowngradePhp80\NodeAnalyzer\NamedToUnnamedArgs */ - private $namedToUnnamedArgs; + private \Rector\DowngradePhp80\NodeAnalyzer\NamedToUnnamedArgs $namedToUnnamedArgs; public function __construct(NodeNameResolver $nodeNameResolver, \Rector\DowngradePhp80\NodeAnalyzer\NamedToUnnamedArgs $namedToUnnamedArgs) { $this->nodeNameResolver = $nodeNameResolver; @@ -35,8 +33,8 @@ public function __construct(NodeNameResolver $nodeNameResolver, \Rector\Downgrad */ public function resolveFromReflection($functionLikeReflection, array $currentArgs) : array { - $parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::combineAcceptors($functionLikeReflection->getVariants()); - $parameters = $parametersAcceptorWithPhpDocs->getParameters(); + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($functionLikeReflection->getVariants()); + $parameters = $extendedParametersAcceptor->getParameters(); if ($functionLikeReflection instanceof NativeFunctionReflection) { $functionLikeReflection = new ReflectionFunction($functionLikeReflection->getName()); } @@ -45,7 +43,7 @@ public function resolveFromReflection($functionLikeReflection, array $currentArg $toFillArgs = []; foreach ($currentArgs as $key => $arg) { if (!$arg->name instanceof Identifier) { - $unnamedArgs[$key] = new Arg($arg->value, $arg->byRef, $arg->unpack, $arg->getAttributes(), null); + $unnamedArgs[$key] = new Arg($arg->value, $arg->byRef, $arg->unpack, [], null); continue; } /** @var string $argName */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ArrayDimFetch/DowngradeDereferenceableOperationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ArrayDimFetch/DowngradeDereferenceableOperationRector.php index 1d3aa70db..ebc13a789 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ArrayDimFetch/DowngradeDereferenceableOperationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ArrayDimFetch/DowngradeDereferenceableOperationRector.php @@ -6,7 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrayDimFetch; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; use PhpParser\Node\Scalar\MagicConst; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; @@ -58,7 +58,7 @@ private function shouldSkip(ArrayDimFetch $arrayDimFetch) : bool if (!$arrayDimFetch->dim instanceof Expr) { return \true; } - if ($arrayDimFetch->var instanceof Encapsed) { + if ($arrayDimFetch->var instanceof InterpolatedString) { return $this->hasParentheses($arrayDimFetch); } if ($arrayDimFetch->var instanceof MagicConst) { @@ -81,7 +81,7 @@ private function hasParentheses(ArrayDimFetch $arrayDimFetch) : bool if (!isset($oldTokens[$i])) { continue; } - if ($oldTokens[$i] !== ')') { + if ((string) $oldTokens[$i] !== ')') { continue; } return \true; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Catch_/DowngradeNonCapturingCatchesRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Catch_/DowngradeNonCapturingCatchesRector.php index 1cb37bcf5..4425a6ed9 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Catch_/DowngradeNonCapturingCatchesRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Catch_/DowngradeNonCapturingCatchesRector.php @@ -6,9 +6,9 @@ use PhpParser\Node; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Catch_; -use PHPStan\Analyser\Scope; use Rector\Naming\Naming\VariableNaming; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -16,13 +16,12 @@ * * @see \Rector\Tests\DowngradePhp80\Rector\Catch_\DowngradeNonCapturingCatchesRector\DowngradeNonCapturingCatchesRectorTest */ -final class DowngradeNonCapturingCatchesRector extends AbstractScopeAwareRector +final class DowngradeNonCapturingCatchesRector extends AbstractRector { /** * @readonly - * @var \Rector\Naming\Naming\VariableNaming */ - private $variableNaming; + private VariableNaming $variableNaming; public function __construct(VariableNaming $variableNaming) { $this->variableNaming = $variableNaming; @@ -67,11 +66,12 @@ public function getNodeTypes() : array /** * @param Catch_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { if ($node->var instanceof Variable) { return null; } + $scope = ScopeFetcher::fetch($node); $exceptionVarName = $this->variableNaming->createCountedValueName('exception', $scope); $node->var = new Variable($exceptionVarName); return $node; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeAbstractPrivateMethodInTraitRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeAbstractPrivateMethodInTraitRector.php index fbe8739df..784fa5308 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeAbstractPrivateMethodInTraitRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeAbstractPrivateMethodInTraitRector.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\DowngradePhp80\Rector\ClassMethod; +use PhpParser\Modifiers; use PhpParser\Node; -use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\ClassReflection; use Rector\Rector\AbstractRector; @@ -18,9 +18,8 @@ final class DowngradeAbstractPrivateMethodInTraitRector extends AbstractRector { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; @@ -57,7 +56,7 @@ public function refactor(Node $node) : ?Node return null; } // remove abstract - $node->flags -= Class_::MODIFIER_ABSTRACT; + $node->flags -= Modifiers::ABSTRACT; // Add empty array for stmts to generate empty function body $node->stmts = []; return $node; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeRecursiveDirectoryIteratorHasChildrenRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeRecursiveDirectoryIteratorHasChildrenRector.php index e025c2171..308e4bb47 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeRecursiveDirectoryIteratorHasChildrenRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeRecursiveDirectoryIteratorHasChildrenRector.php @@ -16,9 +16,8 @@ final class DowngradeRecursiveDirectoryIteratorHasChildrenRector extends Abstrac { /** * @readonly - * @var \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer */ - private $familyRelationsAnalyzer; + private FamilyRelationsAnalyzer $familyRelationsAnalyzer; public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer) { $this->familyRelationsAnalyzer = $familyRelationsAnalyzer; @@ -64,7 +63,7 @@ public function refactor(Node $node) : ?Node if ($classMethod->params[0]->type === null) { continue; } - if (!$this->nodeNameResolver->isName($classMethod, 'hasChildren')) { + if (!$this->isName($classMethod, 'hasChildren')) { continue; } $ancestorClassNames = $this->familyRelationsAnalyzer->getClassLikeAncestorNames($node); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStaticTypeDeclarationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStaticTypeDeclarationRector.php index 199215027..38e11f08d 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStaticTypeDeclarationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStaticTypeDeclarationRector.php @@ -19,14 +19,12 @@ final class DowngradeStaticTypeDeclarationRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpDocDecorator\PhpDocFromTypeDeclarationDecorator */ - private $phpDocFromTypeDeclarationDecorator; + private PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator, ReflectionResolver $reflectionResolver) { $this->phpDocFromTypeDeclarationDecorator = $phpDocFromTypeDeclarationDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStringReturnTypeOnToStringRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStringReturnTypeOnToStringRector.php index abbd8f55e..e9f9b6deb 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStringReturnTypeOnToStringRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeStringReturnTypeOnToStringRector.php @@ -20,14 +20,12 @@ final class DowngradeStringReturnTypeOnToStringRector extends AbstractRector { /** * @readonly - * @var \Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer */ - private $classChildAnalyzer; + private ClassChildAnalyzer $classChildAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ClassChildAnalyzer $classChildAnalyzer, ReflectionResolver $reflectionResolver) { $this->classChildAnalyzer = $classChildAnalyzer; @@ -94,7 +92,7 @@ private function shouldSkip(ClassMethod $classMethod) : bool if ($classMethod->returnType instanceof Node) { return \true; } - if (!$this->nodeNameResolver->isName($classMethod, '__toString')) { + if (!$this->isName($classMethod, '__toString')) { return \true; } $classReflection = $this->reflectionResolver->resolveClassReflection($classMethod); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeTrailingCommasInParamUseRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeTrailingCommasInParamUseRector.php index 7610ee037..63290582a 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeTrailingCommasInParamUseRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/ClassMethod/DowngradeTrailingCommasInParamUseRector.php @@ -4,13 +4,13 @@ namespace Rector\DowngradePhp80\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\ClosureUse; use PhpParser\Node\Param; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use Rector\DowngradePhp73\Tokenizer\FollowedByCommaAnalyzer; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\DowngradePhp73\Tokenizer\TrailingCommaRemover; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -21,12 +21,16 @@ final class DowngradeTrailingCommasInParamUseRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp73\Tokenizer\FollowedByCommaAnalyzer */ - private $followedByCommaAnalyzer; - public function __construct(FollowedByCommaAnalyzer $followedByCommaAnalyzer) + private FollowedByCommaAnalyzer $followedByCommaAnalyzer; + /** + * @readonly + */ + private TrailingCommaRemover $trailingCommaRemover; + public function __construct(FollowedByCommaAnalyzer $followedByCommaAnalyzer, TrailingCommaRemover $trailingCommaRemover) { $this->followedByCommaAnalyzer = $followedByCommaAnalyzer; + $this->trailingCommaRemover = $trailingCommaRemover; } public function getRuleDefinition() : RuleDefinition { @@ -106,15 +110,12 @@ private function processParams($node) : ?Node */ private function cleanTrailingComma($node, array $array) : ?Node { - \end($array); - $lastPosition = \key($array); - \reset($array); + $lastPosition = \array_key_last($array); $last = $array[$lastPosition]; if (!$this->followedByCommaAnalyzer->isFollowed($this->file, $last)) { return null; } - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); - $last->setAttribute(AttributeKey::FUNC_ARGS_TRAILING_COMMA, \false); + $this->trailingCommaRemover->remove($this->file, $last); return $node; } } 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 a446ac1bf..48330946d 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 @@ -21,7 +21,7 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @changelog https://php.watch/articles/php-attributes#syntax * @@ -31,31 +31,25 @@ final class DowngradeAttributeToAnnotationRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\NodeFactory\DoctrineAnnotationFactory */ - private $doctrineAnnotationFactory; + private DoctrineAnnotationFactory $doctrineAnnotationFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var string[] */ - private const SKIPPED_ATTRIBUTES = ['Attribute', 'ReturnTypeWillChange']; + private const SKIPPED_ATTRIBUTES = ['Attribute', 'ReturnTypeWillChange', 'AllowDynamicProperties']; /** * @var DowngradeAttributeToAnnotation[] */ - private $attributesToAnnotations = []; - /** - * @var bool - */ - private $isDowngraded = \false; + private array $attributesToAnnotations = []; + private bool $isDowngraded = \false; public function __construct(DoctrineAnnotationFactory $doctrineAnnotationFactory, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->doctrineAnnotationFactory = $doctrineAnnotationFactory; @@ -107,9 +101,15 @@ public function refactor(Node $node) : ?Node } $this->isDowngraded = \false; $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $oldTokens = $this->file->getOldTokens(); foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $key => $attribute) { if ($this->shouldSkipAttribute($attribute)) { + if (isset($oldTokens[$attrGroup->getEndTokenPos() + 1]) && \strpos((string) $oldTokens[$attrGroup->getEndTokenPos() + 1], "\n") === \false) { + // add new line + $oldTokens[$attrGroup->getEndTokenPos() + 1]->text = "\n" . $oldTokens[$attrGroup->getEndTokenPos() + 1]->text; + $this->isDowngraded = \true; + } continue; } $attributeToAnnotation = $this->matchAttributeToAnnotation($attribute, $this->attributesToAnnotations); @@ -138,7 +138,7 @@ public function refactor(Node $node) : ?Node return $node; } /** - * @param mixed[] $configuration + * @param DowngradeAttributeToAnnotation[] $configuration */ public function configure(array $configuration) : void { 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 0f4f9909f..4389f6f47 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 @@ -8,11 +8,12 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\New_; use PhpParser\Node\Param; +use PhpParser\Node\PropertyItem; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; +use PhpParser\Node\Stmt\Trait_; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; @@ -33,24 +34,20 @@ final class DowngradePropertyPromotionRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(PhpDocTypeChanger $phpDocTypeChanger, BetterStandardPrinter $betterStandardPrinter, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder) { $this->phpDocTypeChanger = $phpDocTypeChanger; @@ -86,10 +83,10 @@ public function __construct(float $value = 0.0) */ public function getNodeTypes() : array { - return [Class_::class]; + return [Class_::class, Trait_::class]; } /** - * @param Class_ $node + * @param Class_|Trait_ $node */ public function refactor(Node $node) : ?Node { @@ -152,8 +149,9 @@ private function setParamAttrGroupAsComment(Param $param) : void /** * @param Param[] $promotedParams * @return Property[] + * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Trait_ $class */ - private function resolvePropertiesFromPromotedParams(ClassMethod $classMethod, array $promotedParams, Class_ $class) : array + private function resolvePropertiesFromPromotedParams(ClassMethod $classMethod, array $promotedParams, $class) : array { $properties = $this->createPropertiesFromParams($classMethod, $promotedParams); $class->stmts = \array_merge($properties, $class->stmts); @@ -162,8 +160,9 @@ private function resolvePropertiesFromPromotedParams(ClassMethod $classMethod, a /** * @param Property[] $properties * @param array $oldComments + * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Trait_ $class */ - private function addPropertyAssignsToConstructorClassMethod(array $properties, Class_ $class, array $oldComments) : void + private function addPropertyAssignsToConstructorClassMethod(array $properties, $class, array $oldComments) : void { $assigns = []; foreach ($properties as $property) { @@ -187,7 +186,7 @@ private function createPropertiesFromParams(ClassMethod $classMethod, array $par foreach ($params as $param) { /** @var string $name */ $name = $this->getName($param->var); - $property = new Property($param->flags, [new PropertyProperty($name)], [], $param->type); + $property = new Property($param->flags, [new PropertyItem($name)], [], $param->type); $this->decoratePropertyWithParamDocInfo($classMethod, $param, $property); $hasNew = $param->default instanceof Expr && (bool) $this->betterNodeFinder->findFirstInstanceOf($param->default, New_::class); if ($param->default instanceof Expr && !$hasNew) { 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 5e876ec18..d291433c3 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 @@ -32,29 +32,24 @@ final class DowngradeEnumToConstantListClassRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeFactory\ClassFromEnumFactory */ - private $classFromEnumFactory; + private ClassFromEnumFactory $classFromEnumFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\DowngradePhp80\NodeAnalyzer\EnumAnalyzer */ - private $enumAnalyzer; + private EnumAnalyzer $enumAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(ClassFromEnumFactory $classFromEnumFactory, ReflectionProvider $reflectionProvider, EnumAnalyzer $enumAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->classFromEnumFactory = $classFromEnumFactory; @@ -136,7 +131,7 @@ private function decorateParamDocType(ClassReflection $classReflection, Param $p $constTypeNode = new ConstTypeNode($constFetchNode); $paramName = '$' . $this->getName($param); $paramTypeNode = $isNullable ? new NullableTypeNode($constTypeNode) : $constTypeNode; - $paramTagValueNode = new ParamTagValueNode($paramTypeNode, \false, $paramName, ''); + $paramTagValueNode = new ParamTagValueNode($paramTypeNode, \false, $paramName, '', \false); $phpDocInfo->addTagValueNode($paramTagValueNode); $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeMatchToSwitchRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeMatchToSwitchRector.php index fa381cca0..31b370dac 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeMatchToSwitchRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeMatchToSwitchRector.php @@ -5,9 +5,11 @@ use PhpParser\Node; use PhpParser\Node\Arg; -use PhpParser\Node\Expr\ArrayItem; +use PhpParser\Node\ArrayItem; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Match_; @@ -24,11 +26,12 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Analyser\Scope; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php72\NodeFactory\AnonymousFunctionFactory; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -36,13 +39,12 @@ * * @see \Rector\Tests\DowngradePhp80\Rector\Expression\DowngradeMatchToSwitchRector\DowngradeMatchToSwitchRectorTest */ -final class DowngradeMatchToSwitchRector extends AbstractScopeAwareRector +final class DowngradeMatchToSwitchRector extends AbstractRector { /** * @readonly - * @var \Rector\Php72\NodeFactory\AnonymousFunctionFactory */ - private $anonymousFunctionFactory; + private AnonymousFunctionFactory $anonymousFunctionFactory; public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory) { $this->anonymousFunctionFactory = $anonymousFunctionFactory; @@ -94,57 +96,58 @@ public function getNodeTypes() : array /** * @param Echo_|Expression|Return_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { /** @var Match_|null $match */ $match = null; $hasChanged = \false; + $scope = ScopeFetcher::fetch($node); $this->traverseNodesWithCallable($node, function (Node $subNode) use($node, &$match, &$hasChanged, $scope) { if (($subNode instanceof ArrayItem || $subNode instanceof Arg) && $subNode->value instanceof Match_ && $this->isEqualScope($subNode->value, $scope)) { $switchCases = $this->createSwitchCasesFromMatchArms($node, $subNode->value, \true); $switch = new Switch_($subNode->value->cond, $switchCases); $subNode->value = new FuncCall($this->anonymousFunctionFactory->create([], [$switch], null)); $hasChanged = \true; - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Arg && $subNode->value instanceof ArrowFunction && $subNode->value->expr instanceof Match_) { $refactoredNode = $this->refactorInArrowFunction($subNode, $subNode->value, $subNode->value->expr); if ($refactoredNode instanceof Node) { $hasChanged = \true; } - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Assign && $subNode->expr instanceof ArrowFunction && $subNode->expr->expr instanceof Match_) { $refactoredNode = $this->refactorInArrowFunction($subNode, $subNode->expr, $subNode->expr->expr); if ($refactoredNode instanceof Node) { $hasChanged = \true; } - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Expression && $subNode->expr instanceof ArrowFunction && $subNode->expr->expr instanceof Match_) { $refactoredNode = $this->refactorInArrowFunction($subNode, $subNode->expr, $subNode->expr->expr); if ($refactoredNode instanceof Node) { $hasChanged = \true; } - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Return_ && $subNode->expr instanceof ArrowFunction && $subNode->expr->expr instanceof Match_) { $refactoredNode = $this->refactorInArrowFunction($subNode, $subNode->expr, $subNode->expr->expr); if ($refactoredNode instanceof Node) { $hasChanged = \true; } - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof FuncCall && $subNode->name instanceof ArrowFunction && $subNode->name->expr instanceof Match_) { $refactoredNode = $this->refactorInArrowFunction($subNode, $subNode->name, $subNode->name->expr); if ($refactoredNode instanceof Node) { $hasChanged = \true; } - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if ($subNode instanceof Match_) { $match = $subNode; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } }); if ($hasChanged) { @@ -153,6 +156,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node if (!$match instanceof Match_) { return null; } + $scope = ScopeFetcher::fetch($node); if (!$this->isEqualScope($match, $scope)) { return null; } @@ -235,7 +239,11 @@ private function createSwitchStmts($node, MatchArm $matchArm, bool $isInsideArra } elseif ($matchArm->body instanceof Throw_) { $stmts[] = new Expression($matchArm->body); } elseif ($node instanceof Return_) { - $stmts[] = new Return_($matchArm->body); + if ($node->expr instanceof BinaryOp) { + $stmts[] = $this->replicateBinaryOp($node->expr, $matchArm->body); + } else { + $stmts[] = new Return_($matchArm->body); + } } elseif ($node instanceof Echo_) { $stmts[] = new Echo_([$matchArm->body]); $stmts[] = new Break_(); @@ -254,4 +262,16 @@ private function createSwitchStmts($node, MatchArm $matchArm, bool $isInsideArra } return $stmts; } + private function replicateBinaryOp(BinaryOp $binaryOp, Expr $expr) : Return_ + { + $newExpr = clone $binaryOp; + // remove the match statement from the binary operation + $this->traverseNodesWithCallable($newExpr, static function (Node $node) use($expr) : ?Expr { + if ($node instanceof Match_) { + return $expr; + } + return null; + }); + return new Return_($newExpr); + } } 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 9f2b8cc7d..bff7ee3cd 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 @@ -6,11 +6,12 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrayDimFetch; +use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp\Coalesce; use PhpParser\Node\Expr\BinaryOp\Identical; -use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\BooleanNot; +use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\Isset_; use PhpParser\Node\Expr\PropertyFetch; @@ -24,6 +25,7 @@ use PhpParser\Node\Stmt\Return_; use Rector\NodeAnalyzer\CoalesceAnalyzer; use Rector\NodeManipulator\BinaryOpManipulator; +use Rector\Php72\NodeFactory\AnonymousFunctionFactory; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -37,24 +39,26 @@ final class DowngradeThrowExprRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\CoalesceAnalyzer */ - private $coalesceAnalyzer; + private CoalesceAnalyzer $coalesceAnalyzer; /** * @readonly - * @var \Rector\NodeManipulator\BinaryOpManipulator */ - private $binaryOpManipulator; + private BinaryOpManipulator $binaryOpManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; - public function __construct(CoalesceAnalyzer $coalesceAnalyzer, BinaryOpManipulator $binaryOpManipulator, BetterNodeFinder $betterNodeFinder) + private BetterNodeFinder $betterNodeFinder; + /** + * @readonly + */ + private AnonymousFunctionFactory $anonymousFunctionFactory; + public function __construct(CoalesceAnalyzer $coalesceAnalyzer, BinaryOpManipulator $binaryOpManipulator, BetterNodeFinder $betterNodeFinder, AnonymousFunctionFactory $anonymousFunctionFactory) { $this->coalesceAnalyzer = $coalesceAnalyzer; $this->binaryOpManipulator = $binaryOpManipulator; $this->betterNodeFinder = $betterNodeFinder; + $this->anonymousFunctionFactory = $anonymousFunctionFactory; } public function getRuleDefinition() : RuleDefinition { @@ -75,14 +79,17 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [Expression::class, Return_::class]; + return [ArrowFunction::class, Expression::class, Return_::class]; } /** - * @param Expression|Return_ $node + * @param ArrowFunction|Expression|Return_ $node * @return Node|Node[]|null */ public function refactor(Node $node) { + if ($node instanceof ArrowFunction) { + return $this->refactorArrowFunctionReturn($node); + } if ($node instanceof Return_) { return $this->refactorReturn($node); } @@ -103,6 +110,14 @@ public function refactor(Node $node) } return $this->refactorDirectCoalesce($node); } + private function refactorArrowFunctionReturn(ArrowFunction $arrowFunction) : ?Closure + { + if (!$arrowFunction->expr instanceof Throw_) { + return null; + } + $stmts = [new Expression($arrowFunction->expr)]; + return $this->anonymousFunctionFactory->create($arrowFunction->params, $stmts, $arrowFunction->returnType, $arrowFunction->static); + } /** * @return If_|Expression|Stmt[]|null */ @@ -144,8 +159,25 @@ private function refactorTernary(Ternary $ternary, ?Assign $assign) private function refactorCoalesce(Coalesce $coalesce, ?Assign $assign) { if (!$coalesce->right instanceof Throw_) { + $rightCoalesce = $coalesce->right; + $leftCoalesce = $coalesce->left; + while ($rightCoalesce instanceof Coalesce) { + $leftCoalesce = new Coalesce($leftCoalesce, $rightCoalesce->left); + $rightCoalesce = $rightCoalesce->right; + } + if ($rightCoalesce instanceof Throw_) { + $coalesce = new Coalesce($leftCoalesce, $rightCoalesce); + return $this->processCoalesce($coalesce, $assign, \true); + } return null; } + return $this->processCoalesce($coalesce, $assign); + } + /** + * @return If_|Stmt[]|null + */ + private function processCoalesce(Coalesce $coalesce, ?Assign $assign, bool $assignEarly = \false) + { if (!$this->coalesceAnalyzer->hasIssetableLeft($coalesce)) { return null; } @@ -155,13 +187,16 @@ private function refactorCoalesce(Coalesce $coalesce, ?Assign $assign) return $if; } $assign->expr = $coalesce->left; + if ($assignEarly && $if->cond instanceof Identical) { + $expression = new Expression(new Assign($assign->var, $if->cond->left)); + $if->cond->left = $assign->var; + return [$expression, $if]; + } return [$if, new Expression($assign)]; } private function hasThrowInAssignExpr(Assign $assign) : bool { - return (bool) $this->betterNodeFinder->findFirst($assign->expr, static function (Node $node) : bool { - return $node instanceof Throw_; - }); + return (bool) $this->betterNodeFinder->findFirst($assign->expr, static fn(Node $node): bool => $node instanceof Throw_); } /** * @return Node[]|null @@ -198,7 +233,7 @@ private function createIf(Coalesce $coalesce, Throw_ $throw) : If_ if ($conditionalExpr instanceof Variable || $conditionalExpr instanceof ArrayDimFetch || $conditionalExpr instanceof PropertyFetch) { $booleanNot = new BooleanNot(new Isset_([$conditionalExpr])); } else { - $booleanNot = new NotIdentical($conditionalExpr, new ConstFetch(new Name('null'))); + $booleanNot = new Identical($conditionalExpr, new ConstFetch(new Name('null'))); } return new If_($booleanNot, ['stmts' => [new Expression($throw)]]); } @@ -225,8 +260,7 @@ private function refactorDirectCoalesce(Expression $expression) : ?array } // add condition if above $throwExpr = $coalesce->right; - $throw = new Stmt\Throw_($throwExpr->expr); - $if = new If_(new Identical($coalesce->left, new ConstFetch(new Name('null'))), ['stmts' => [$throw]]); + $if = new If_(new Identical($coalesce->left, new ConstFetch(new Name('null'))), ['stmts' => [new Expression($throwExpr)]]); // replace coalsese with left :) $this->traverseNodesWithCallable($expression, static function (Node $node) : ?Expr { if (!$node 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 e56627460..c5e48e68c 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 @@ -19,7 +19,7 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Param; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PHPStan\Type\ArrayType; use PHPStan\Type\ClosureType; @@ -40,14 +40,12 @@ final class DowngradeArrayFilterNullableCallbackRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) { $this->argsAnalyzer = $argsAnalyzer; @@ -86,9 +84,8 @@ public function getNodeTypes() : array } /** * @param FuncCall $node - * @return \PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\Ternary|null */ - public function refactor(Node $node) + public function refactor(Node $node) : ?\PhpParser\Node\Expr\FuncCall { if (!$this->isName($node, 'array_filter')) { return null; @@ -143,7 +140,7 @@ private function createNewArgSecondTernary(array $args) : Ternary { $identical = new Identical($args[1]->value, $this->nodeFactory->createNull()); $constFetch = new ConstFetch(new Name('ARRAY_FILTER_USE_BOTH')); - return new Ternary($identical, $constFetch, isset($args[2]) ? $args[2]->value : new LNumber(0)); + return new Ternary($identical, $constFetch, isset($args[2]) ? $args[2]->value : new Int_(0)); } private function isAlreadyConditionedToNull(Expr $expr) : bool { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeNumberFormatNoFourthArgRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeNumberFormatNoFourthArgRector.php index cd97331ae..a75e89513 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeNumberFormatNoFourthArgRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeNumberFormatNoFourthArgRector.php @@ -21,9 +21,8 @@ final class DowngradeNumberFormatNoFourthArgRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; public function __construct(ArgsAnalyzer $argsAnalyzer) { $this->argsAnalyzer = $argsAnalyzer; @@ -71,7 +70,7 @@ public function refactor(Node $node) : ?Node } private function shouldSkip(FuncCall $funcCall) : bool { - if (!$this->nodeNameResolver->isName($funcCall, 'number_format')) { + if (!$this->isName($funcCall, 'number_format')) { return \true; } $args = $funcCall->getArgs(); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrEndsWithRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrEndsWithRector.php index ee8e02484..3fc20cde6 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrEndsWithRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrEndsWithRector.php @@ -12,7 +12,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -40,12 +40,12 @@ public function getNodeTypes() : array public function refactor(Node $node) : ?Node { if ($node instanceof FuncCall && $this->isName($node->name, 'str_ends_with')) { - return new Identical($this->createSubstrCompareFuncCall($node), new LNumber(0)); + return new Identical($this->createSubstrCompareFuncCall($node), new Int_(0)); } if ($node instanceof BooleanNot) { $funcCall = $node->expr; if ($funcCall instanceof FuncCall && $this->isName($funcCall->name, 'str_ends_with')) { - return new NotIdentical($this->createSubstrCompareFuncCall($funcCall), new LNumber(0)); + return new NotIdentical($this->createSubstrCompareFuncCall($funcCall), new Int_(0)); } } return null; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrStartsWithRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrStartsWithRector.php index e2398f520..29e166b70 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrStartsWithRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeStrStartsWithRector.php @@ -10,7 +10,7 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -52,13 +52,13 @@ private function createIdentical(FuncCall $funcCall) : Identical { $strlenFuncCall = $this->createStrlenFuncCall($funcCall); $strncmpFuncCall = $this->createStrncmpFuncCall($funcCall, $strlenFuncCall); - return new Identical($strncmpFuncCall, new LNumber(0)); + return new Identical($strncmpFuncCall, new Int_(0)); } private function createNotIdenticalStrncmpFuncCall(FuncCall $funcCall) : NotIdentical { $strlenFuncCall = $this->createStrlenFuncCall($funcCall); $strncmpFuncCall = $this->createStrncmpFuncCall($funcCall, $strlenFuncCall); - return new NotIdentical($strncmpFuncCall, new LNumber(0)); + return new NotIdentical($strncmpFuncCall, new Int_(0)); } private function createStrlenFuncCall(FuncCall $funcCall) : FuncCall { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeMixedTypeDeclarationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeMixedTypeDeclarationRector.php index 03a751169..594edca14 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeMixedTypeDeclarationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeMixedTypeDeclarationRector.php @@ -20,9 +20,8 @@ final class DowngradeMixedTypeDeclarationRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpDocDecorator\PhpDocFromTypeDeclarationDecorator */ - private $phpDocFromTypeDeclarationDecorator; + private PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator; public function __construct(PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator) { $this->phpDocFromTypeDeclarationDecorator = $phpDocFromTypeDeclarationDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeUnionTypeDeclarationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeUnionTypeDeclarationRector.php index 2d0b2419d..08df2908a 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeUnionTypeDeclarationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FunctionLike/DowngradeUnionTypeDeclarationRector.php @@ -20,9 +20,8 @@ final class DowngradeUnionTypeDeclarationRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpDocDecorator\PhpDocFromTypeDeclarationDecorator */ - private $phpDocFromTypeDeclarationDecorator; + private PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator; public function __construct(PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator) { $this->phpDocFromTypeDeclarationDecorator = $phpDocFromTypeDeclarationDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradeInstanceofStringableRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradeInstanceofStringableRector.php new file mode 100644 index 000000000..2dd640aeb --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradeInstanceofStringableRector.php @@ -0,0 +1,57 @@ +> + */ + public function getNodeTypes() : array + { + return [Instanceof_::class]; + } + /** + * @param Instanceof_ $node + * @return null|\PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\BinaryOp\BooleanAnd + */ + public function refactor(Node $node) + { + if (!$node->class instanceof FullyQualified) { + return null; + } + if (!$this->isName($node->class, 'Stringable')) { + return null; + } + $nativeExprType = $this->nodeTypeResolver->getNativeType($node->expr); + $funcCall = $this->nodeFactory->createFuncCall('method_exists', [$node->expr, new String_('__toString')]); + if ($nativeExprType->isObject()->yes()) { + return $funcCall; + } + return new BooleanAnd($this->nodeFactory->createFuncCall('is_object', [$node->expr]), $funcCall); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradePhp80ResourceReturnToObjectRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradePhp80ResourceReturnToObjectRector.php index 59869662e..3bea0818d 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradePhp80ResourceReturnToObjectRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Instanceof_/DowngradePhp80ResourceReturnToObjectRector.php @@ -19,9 +19,8 @@ final class DowngradePhp80ResourceReturnToObjectRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp81\NodeManipulator\ObjectToResourceReturn */ - private $objectToResourceReturn; + private ObjectToResourceReturn $objectToResourceReturn; /** * @var string[] */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeNamedArgumentRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeNamedArgumentRector.php index 1ca3e10ac..186f96bd2 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeNamedArgumentRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeNamedArgumentRector.php @@ -24,19 +24,16 @@ final class DowngradeNamedArgumentRector extends AbstractRector { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\DowngradePhp80\NodeAnalyzer\UnnamedArgumentResolver */ - private $unnamedArgumentResolver; + private UnnamedArgumentResolver $unnamedArgumentResolver; /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; public function __construct(ReflectionResolver $reflectionResolver, UnnamedArgumentResolver $unnamedArgumentResolver, ArgsAnalyzer $argsAnalyzer) { $this->reflectionResolver = $reflectionResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionClassGetConstantsFilterRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionClassGetConstantsFilterRector.php index dcdf451e6..a333fa37f 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionClassGetConstantsFilterRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionClassGetConstantsFilterRector.php @@ -4,13 +4,13 @@ namespace Rector\DowngradePhp80\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp\BitwiseOr; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\ClosureUse; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; @@ -33,14 +33,12 @@ final class DowngradeReflectionClassGetConstantsFilterRector extends AbstractRec { /** * @readonly - * @var \Rector\Naming\Naming\VariableNaming */ - private $variableNaming; + private VariableNaming $variableNaming; /** * @readonly - * @var \Rector\NodeCollector\BinaryOpConditionsCollector */ - private $binaryOpConditionsCollector; + private BinaryOpConditionsCollector $binaryOpConditionsCollector; /** * @var array */ @@ -182,11 +180,11 @@ private function shouldSkipClassConstFetch(ClassConstFetch $classConstFetch) : b return \true; } $constants = \array_keys(self::MAP_CONSTANT_TO_METHOD); - return !$this->nodeNameResolver->isNames($classConstFetch->name, $constants); + return !$this->isNames($classConstFetch->name, $constants); } private function shouldSkipMethodCall(MethodCall $methodCall) : bool { - if (!$this->nodeNameResolver->isName($methodCall->name, 'getConstants')) { + if (!$this->isName($methodCall->name, 'getConstants')) { return \true; } $varType = $this->nodeTypeResolver->getType($methodCall->var); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionGetAttributesRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionGetAttributesRector.php index 030ee9b77..9064dfe2d 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionGetAttributesRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionGetAttributesRector.php @@ -49,9 +49,8 @@ public function getNodeTypes() : array } /** * @param Ternary|MethodCall $node - * @return \PhpParser\Node\Expr\Ternary|null|int */ - public function refactor(Node $node) + public function refactor(Node $node) : ?\PhpParser\Node\Expr\Ternary { if ($node instanceof Ternary) { if ($node->if instanceof Expr && $node->cond instanceof FuncCall && $this->isName($node->cond, 'method_exists')) { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionPropertyGetDefaultValueRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionPropertyGetDefaultValueRector.php index 7baced356..0b7866924 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionPropertyGetDefaultValueRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/MethodCall/DowngradeReflectionPropertyGetDefaultValueRector.php @@ -50,7 +50,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if (!$this->nodeNameResolver->isName($node->name, 'getDefaultValue')) { + if (!$this->isName($node->name, 'getDefaultValue')) { return null; } $objectType = $this->nodeTypeResolver->getType($node->var); 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 d32fe742d..fb6862f11 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 @@ -30,14 +30,12 @@ final class DowngradeArbitraryExpressionsSupportRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeFactory\NamedVariableFactory */ - private $namedVariableFactory; + private NamedVariableFactory $namedVariableFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(NamedVariableFactory $namedVariableFactory, BetterNodeFinder $betterNodeFinder) { $this->namedVariableFactory = $namedVariableFactory; @@ -71,9 +69,9 @@ public function getNodeTypes() : array } /** * @param Expression $node - * @return Node\Stmt[]|null|Expression + * @return Expression[]|null */ - public function refactor(Node $node) + public function refactor(Node $node) : ?array { /** @var Assign[] $assigns */ $assigns = $this->betterNodeFinder->findInstancesOf($node, [Assign::class]); @@ -102,18 +100,18 @@ private function isBetweenParentheses(Node $node) : bool while ($previousTokenPos >= 0) { $token = $oldTokens[$previousTokenPos] ?? null; --$previousTokenPos; - if (!isset($token[0])) { - return $token === '('; + if ((string) $token === '(') { + return \true; } - if (!\in_array($token[0], [\T_COMMENT, \T_WHITESPACE], \true)) { - return $token === '('; + if (!\in_array((string) $token, [\T_COMMENT, \T_WHITESPACE], \true)) { + continue; } } return \false; } /** * @param Assign[] $assigns - * @return Node\Stmt[]|null + * @return Expression[]|null */ private function refactorAssign(array $assigns, Expression $expression) : ?array { @@ -148,7 +146,7 @@ private function refactorAssign(array $assigns, Expression $expression) : ?array return null; } /** - * @return Node\Stmt[]|null + * @return Expression[]|null */ private function refactorInstanceof(Instanceof_ $instanceof, Expression $expression) : ?array { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php index c5aa00890..7bde8d7fe 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php @@ -19,10 +19,7 @@ */ final class DowngradeNullsafeToTernaryOperatorRector extends AbstractRector { - /** - * @var int - */ - private $counter = 0; + private int $counter = 0; /** * Hack-ish way to reset counter for a new file, to avoid rising counter for each file * @@ -49,15 +46,36 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [NullsafeMethodCall::class, NullsafePropertyFetch::class]; + return [MethodCall::class, PropertyFetch::class, NullsafeMethodCall::class, NullsafePropertyFetch::class]; } /** - * @param NullsafeMethodCall|NullsafePropertyFetch $node + * @param MethodCall|NullsafeMethodCall|NullsafePropertyFetch $node */ public function refactor(Node $node) : ?Ternary { + if ($node instanceof MethodCall || $node instanceof PropertyFetch) { + if ($node->var instanceof NullsafeMethodCall || $node->var instanceof NullsafePropertyFetch) { + $nullsafeVariable = $this->createNullsafeVariable(); + $assign = new Assign($nullsafeVariable, $node->var->var); + if ($node instanceof MethodCall) { + if ($node->var instanceof NullsafeMethodCall) { + $methodCallOrPropertyFetch = new MethodCall(new MethodCall($nullsafeVariable, $node->var->name, $node->var->args), $node->name, $node->args); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + $methodCallOrPropertyFetch = new MethodCall(new PropertyFetch($nullsafeVariable, $node->var->name), $node->name, $node->args); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + if ($node->var instanceof NullsafeMethodCall) { + $methodCallOrPropertyFetch = new PropertyFetch(new MethodCall($nullsafeVariable, $node->var->name, $node->var->args), $node->name); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + $methodCallOrPropertyFetch = new PropertyFetch(new PropertyFetch($nullsafeVariable, $node->var->name), $node->name); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + return null; + } $nullsafeVariable = $this->createNullsafeVariable(); - $methodCallOrPropertyFetch = $node instanceof NullsafeMethodCall ? new MethodCall($nullsafeVariable, $node->name, $node->getArgs()) : new PropertyFetch($nullsafeVariable, $node->name); + $methodCallOrPropertyFetch = $node instanceof NullsafeMethodCall ? new MethodCall($nullsafeVariable, $node->name, $node->args) : new PropertyFetch($nullsafeVariable, $node->name); $assign = new Assign($nullsafeVariable, $node->var); return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeMixedTypeTypedPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeMixedTypeTypedPropertyRector.php index 970486721..2f067e8e1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeMixedTypeTypedPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeMixedTypeTypedPropertyRector.php @@ -17,9 +17,8 @@ final class DowngradeMixedTypeTypedPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\PropertyDecorator */ - private $PropertyDecorator; + private PropertyDecorator $PropertyDecorator; public function __construct(PropertyDecorator $PropertyDecorator) { $this->PropertyDecorator = $PropertyDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeUnionTypeTypedPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeUnionTypeTypedPropertyRector.php index 359d3050c..b3d4b138c 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeUnionTypeTypedPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Property/DowngradeUnionTypeTypedPropertyRector.php @@ -17,9 +17,8 @@ final class DowngradeUnionTypeTypedPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\PropertyDecorator */ - private $PropertyDecorator; + private PropertyDecorator $PropertyDecorator; public function __construct(PropertyDecorator $PropertyDecorator) { $this->PropertyDecorator = $PropertyDecorator; @@ -67,7 +66,7 @@ public function refactor(Node $node) : ?Node } private function shouldRemoveProperty(Property $property) : bool { - if ($property->type === null) { + if (!$property->type instanceof Node) { return \false; } // Check it is the union type diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/StaticCall/DowngradePhpTokenRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/StaticCall/DowngradePhpTokenRector.php index a21cbea35..b5a3aebfe 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/StaticCall/DowngradePhpTokenRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/StaticCall/DowngradePhpTokenRector.php @@ -12,8 +12,10 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PHPStan\Type\ObjectType; +use PHPStan\Type\ThisType; +use PHPStan\Type\Type; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -74,6 +76,9 @@ private function refactorStaticCall(StaticCall $staticCall) : ?FuncCall if (!$this->isObjectType($staticCall->class, new ObjectType(self::PHP_TOKEN))) { return null; } + if ($this->skipPhpParserInternalToken($this->getType($staticCall->class))) { + return null; + } return new FuncCall(new Name('token_get_all'), $staticCall->args); } private function refactorMethodCall(MethodCall $methodCall) : ?Ternary @@ -84,8 +89,11 @@ private function refactorMethodCall(MethodCall $methodCall) : ?Ternary if (!$this->isObjectType($methodCall->var, new ObjectType(self::PHP_TOKEN))) { return null; } + if ($this->skipPhpParserInternalToken($this->getType($methodCall->var))) { + return null; + } $isArrayFuncCall = new FuncCall(new Name('is_array'), [new Arg($methodCall->var)]); - $arrayDimFetch = new ArrayDimFetch($methodCall->var, new LNumber(0)); + $arrayDimFetch = new ArrayDimFetch($methodCall->var, new Int_(0)); $tokenGetNameFuncCall = new FuncCall(new Name('token_name'), [new Arg($arrayDimFetch)]); return new Ternary($isArrayFuncCall, $tokenGetNameFuncCall, $this->nodeFactory->createNull()); } @@ -98,8 +106,21 @@ private function refactorPropertyFetch(PropertyFetch $propertyFetch) : ?Ternary if (!$this->isObjectType($propertyFetch->var, new ObjectType(self::PHP_TOKEN))) { return null; } + if ($this->skipPhpParserInternalToken($this->getType($propertyFetch->var))) { + return null; + } $isArrayFuncCall = new FuncCall(new Name('is_array'), [new Arg($propertyFetch->var)]); - $arrayDimFetch = new ArrayDimFetch($propertyFetch->var, $propertyFetchName === 'id' ? new LNumber(0) : new LNumber(1)); + $arrayDimFetch = new ArrayDimFetch($propertyFetch->var, $propertyFetchName === 'id' ? new Int_(0) : new Int_(1)); return new Ternary($isArrayFuncCall, $arrayDimFetch, $propertyFetch->var); } + private function skipPhpParserInternalToken(Type $type) : bool + { + if ($type instanceof ThisType) { + $type = $type->getStaticObjectType(); + } + if ($type instanceof ObjectType) { + return $type->isInstanceOf('PhpParser\\Internal\\TokenPolyfill')->yes(); + } + return \false; + } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/DefaultParameterValueResolver.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/DefaultParameterValueResolver.php index 762537200..3fbb7bfc2 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/DefaultParameterValueResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/DefaultParameterValueResolver.php @@ -10,7 +10,9 @@ use PHPStan\Reflection\ParameterReflection; use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\Constant\ConstantBooleanType; -use PHPStan\Type\ConstantType; +use PHPStan\Type\Constant\ConstantIntegerType; +use PHPStan\Type\Constant\ConstantStringType; +use PHPStan\Type\NullType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use Rector\Exception\ShouldNotHappenException; @@ -22,7 +24,7 @@ public function resolveFromParameterReflection(ParameterReflection $parameterRef if (!$defaultValueType instanceof Type) { return null; } - if (!$defaultValueType instanceof ConstantType) { + if (!$defaultValueType->isConstantValue()->yes()) { throw new ShouldNotHappenException(); } return $this->resolveValueFromType($defaultValueType); @@ -30,7 +32,7 @@ public function resolveFromParameterReflection(ParameterReflection $parameterRef /** * @return \PhpParser\Node\Expr\ConstFetch|\PhpParser\Node\Expr */ - private function resolveValueFromType(ConstantType $constantType) + private function resolveValueFromType(Type $constantType) { if ($constantType instanceof ConstantBooleanType) { return $this->resolveConstantBooleanType($constantType); @@ -38,13 +40,14 @@ private function resolveValueFromType(ConstantType $constantType) if ($constantType instanceof ConstantArrayType) { $values = []; foreach ($constantType->getValueTypes() as $valueType) { - if (!$valueType instanceof ConstantType) { + if (!$valueType->isConstantValue()->yes()) { throw new ShouldNotHappenException(); } $values[] = $this->resolveValueFromType($valueType); } return BuilderHelpers::normalizeValue($values); } + /** @var ConstantStringType|ConstantIntegerType|NullType $constantType */ return BuilderHelpers::normalizeValue($constantType->getValue()); } private function resolveConstantBooleanType(ConstantBooleanType $constantBooleanType) : ConstFetch diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/SimplePhpParameterReflection.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/SimplePhpParameterReflection.php index ac8e281c0..b40c95305 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/SimplePhpParameterReflection.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Reflection/SimplePhpParameterReflection.php @@ -15,9 +15,8 @@ final class SimplePhpParameterReflection implements ParameterReflection { /** * @readonly - * @var \ReflectionParameter */ - private $reflectionParameter; + private ReflectionParameter $reflectionParameter; public function __construct(ReflectionFunction $reflectionFunction, int $position) { $this->reflectionParameter = $reflectionFunction->getParameters()[$position]; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/ValueObject/DowngradeAttributeToAnnotation.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/ValueObject/DowngradeAttributeToAnnotation.php index 50c9bd2ec..78d8781a5 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/ValueObject/DowngradeAttributeToAnnotation.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/ValueObject/DowngradeAttributeToAnnotation.php @@ -9,12 +9,12 @@ final class DowngradeAttributeToAnnotation * @var class-string * @readonly */ - private $attributeClass; + private string $attributeClass; /** * @var class-string|string|null * @readonly */ - private $tag; + private ?string $tag = null; /** * @param class-string $attributeClass * @param class-string|string|null $tag diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeAnalyzer/ArraySpreadAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeAnalyzer/ArraySpreadAnalyzer.php index 53af84a56..64faa55c4 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeAnalyzer/ArraySpreadAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeAnalyzer/ArraySpreadAnalyzer.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\DowngradePhp81\NodeAnalyzer; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; final class ArraySpreadAnalyzer { public function isArrayWithUnpack(Array_ $array) : bool diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeFactory/ArrayMergeFromArraySpreadFactory.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeFactory/ArrayMergeFromArraySpreadFactory.php index fb2f86fa2..90314d5ae 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeFactory/ArrayMergeFromArraySpreadFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeFactory/ArrayMergeFromArraySpreadFactory.php @@ -3,16 +3,14 @@ declare (strict_types=1); namespace Rector\DowngradePhp81\NodeFactory; -use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PHPStan\Analyser\MutatingScope; -use PHPStan\Type\ArrayType; use PHPStan\Type\IterableType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; @@ -23,14 +21,13 @@ final class ArrayMergeFromArraySpreadFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; } - public function createFromArray(Array_ $array, MutatingScope $mutatingScope) : ?Node + public function createFromArray(Array_ $array, MutatingScope $mutatingScope) : FuncCall { $newArrayItems = $this->disolveArrayItems($array); return $this->createArrayMergeFuncCall($newArrayItems, $mutatingScope); @@ -79,12 +76,12 @@ private function createArrayMergeFuncCall(array $arrayItems, MutatingScope $muta $arrayItem->unpack = \false; return $this->createArgFromSpreadArrayItem($mutatingScope, $arrayItem); } - return new Arg($arrayItem); + return new Arg($arrayItem->value); }, $arrayItems); return new FuncCall(new Name('array_merge'), $args); } /** - * @param array $items + * @param array $items */ private function createArrayItemFromArray(array $items) : ArrayItem { @@ -109,20 +106,20 @@ private function createArgFromSpreadArrayItem(MutatingScope $mutatingScope, Arra throw new ShouldNotHappenException(); } } - $iteratorToArrayFuncCall = new FuncCall(new Name('iterator_to_array'), [new Arg($arrayItem)]); + $iteratorToArrayFuncCall = new FuncCall(new Name('iterator_to_array'), [new Arg($arrayItem->value)]); // If we know it is an array, then print it directly // Otherwise PHPStan throws an error: // "Else branch is unreachable because ternary operator condition is always true." - if ($type instanceof ArrayType) { - return new Arg($arrayItem); + if ($type->isArray()->yes()) { + return new Arg($arrayItem->value); } // If it is iterable, then directly return `iterator_to_array` if ($this->isIterableType($type)) { return new Arg($iteratorToArrayFuncCall); } // Print a ternary, handling either an array or an iterator - $inArrayFuncCall = new FuncCall(new Name('is_array'), [new Arg($arrayItem)]); - return new Arg(new Ternary($inArrayFuncCall, $arrayItem, $iteratorToArrayFuncCall)); + $inArrayFuncCall = new FuncCall(new Name('is_array'), [new Arg($arrayItem->value)]); + return new Arg(new Ternary($inArrayFuncCall, $arrayItem->value, $iteratorToArrayFuncCall)); } /** * Iterables: objects declaring the interface Traversable, diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeManipulator/ObjectToResourceReturn.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeManipulator/ObjectToResourceReturn.php index 093752995..df42726b1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeManipulator/ObjectToResourceReturn.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/NodeManipulator/ObjectToResourceReturn.php @@ -20,29 +20,24 @@ final class ObjectToResourceReturn { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\PhpParser\Comparing\NodeComparator */ - private $nodeComparator; + private NodeComparator $nodeComparator; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Array_/DowngradeArraySpreadStringKeyRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Array_/DowngradeArraySpreadStringKeyRector.php index 93267cff0..9a59d86e3 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Array_/DowngradeArraySpreadStringKeyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Array_/DowngradeArraySpreadStringKeyRector.php @@ -4,15 +4,16 @@ namespace Rector\DowngradePhp81\Rector\Array_; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PHPStan\Analyser\MutatingScope; -use PHPStan\Analyser\Scope; use PHPStan\Type\ArrayType; +use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\IntegerType; use Rector\DowngradePhp81\NodeAnalyzer\ArraySpreadAnalyzer; use Rector\DowngradePhp81\NodeFactory\ArrayMergeFromArraySpreadFactory; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -20,18 +21,16 @@ * * @see \Rector\Tests\DowngradePhp81\Rector\Array_\DowngradeArraySpreadStringKeyRector\DowngradeArraySpreadStringKeyRectorTest */ -final class DowngradeArraySpreadStringKeyRector extends AbstractScopeAwareRector +final class DowngradeArraySpreadStringKeyRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp81\NodeFactory\ArrayMergeFromArraySpreadFactory */ - private $arrayMergeFromArraySpreadFactory; + private ArrayMergeFromArraySpreadFactory $arrayMergeFromArraySpreadFactory; /** * @readonly - * @var \Rector\DowngradePhp81\NodeAnalyzer\ArraySpreadAnalyzer */ - private $arraySpreadAnalyzer; + private ArraySpreadAnalyzer $arraySpreadAnalyzer; public function __construct(ArrayMergeFromArraySpreadFactory $arrayMergeFromArraySpreadFactory, ArraySpreadAnalyzer $arraySpreadAnalyzer) { $this->arrayMergeFromArraySpreadFactory = $arrayMergeFromArraySpreadFactory; @@ -63,7 +62,7 @@ public function getNodeTypes() : array /** * @param Array_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { if (!$this->arraySpreadAnalyzer->isArrayWithUnpack($node)) { return null; @@ -72,6 +71,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node return null; } /** @var MutatingScope $scope */ + $scope = ScopeFetcher::fetch($node); return $this->arrayMergeFromArraySpreadFactory->createFromArray($node, $scope); } private function shouldSkipArray(Array_ $array) : bool @@ -81,7 +81,7 @@ private function shouldSkipArray(Array_ $array) : bool continue; } $type = $this->nodeTypeResolver->getType($item->value); - if (!$type instanceof ArrayType) { + if (!$type instanceof ArrayType && !$type instanceof ConstantArrayType) { continue; } $keyType = $type->getKeyType(); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/ClassConst/DowngradeFinalizePublicClassConstantRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/ClassConst/DowngradeFinalizePublicClassConstantRector.php index 82b215bfc..e6b765a05 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/ClassConst/DowngradeFinalizePublicClassConstantRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/ClassConst/DowngradeFinalizePublicClassConstantRector.php @@ -18,9 +18,8 @@ final class DowngradeFinalizePublicClassConstantRector extends AbstractRector { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; public function __construct(VisibilityManipulator $visibilityManipulator) { $this->visibilityManipulator = $visibilityManipulator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeArrayIsListRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeArrayIsListRector.php index 03e10f8b0..98060283f 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeArrayIsListRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeArrayIsListRector.php @@ -31,18 +31,13 @@ final class DowngradeArrayIsListRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Parser\InlineCodeParser */ - private $inlineCodeParser; + private InlineCodeParser $inlineCodeParser; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprInTopStmtMatcher */ - private $exprInTopStmtMatcher; - /** - * @var \PhpParser\Node\Expr\Closure|null - */ - private $cachedClosure; + private ExprInTopStmtMatcher $exprInTopStmtMatcher; + private ?Closure $cachedClosure = null; public function __construct(InlineCodeParser $inlineCodeParser, ExprInTopStmtMatcher $exprInTopStmtMatcher) { $this->inlineCodeParser = $inlineCodeParser; @@ -126,7 +121,7 @@ private function shouldSkip(CallLike $callLike) : bool if (!$callLike instanceof FuncCall) { return \false; } - if (!$this->nodeNameResolver->isName($callLike, 'array_is_list')) { + if (!$this->isName($callLike, 'array_is_list')) { return \true; } $scope = $callLike->getAttribute(AttributeKey::SCOPE); diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeFirstClassCallableSyntaxRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeFirstClassCallableSyntaxRector.php index 6ecb44ee1..69c3aeef8 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeFirstClassCallableSyntaxRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeFirstClassCallableSyntaxRector.php @@ -5,9 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php index 1c6dbe49b..380130d7a 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php @@ -20,20 +20,15 @@ final class DowngradeHashAlgorithmXxHashRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; private const HASH_ALGORITHMS_TO_DOWNGRADE = ['xxh32' => \MHASH_XXH32, 'xxh64' => \MHASH_XXH64, 'xxh3' => \MHASH_XXH3, 'xxh128' => \MHASH_XXH128]; private const REPLACEMENT_ALGORITHM = 'md5'; - /** - * @var int - */ - private $argNamedKey; + private int $argNamedKey; public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) { $this->argsAnalyzer = $argsAnalyzer; @@ -94,7 +89,7 @@ private function shouldSkip(FuncCall $funcCall) : bool if ($funcCall->isFirstClassCallable()) { return \true; } - return !$this->nodeNameResolver->isName($funcCall, 'hash'); + return !$this->isName($funcCall, 'hash'); } /** * @param Arg[] $args diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNeverTypeDeclarationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNeverTypeDeclarationRector.php index 1a6b1d314..47c534c15 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNeverTypeDeclarationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNeverTypeDeclarationRector.php @@ -21,9 +21,8 @@ final class DowngradeNeverTypeDeclarationRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpDocDecorator\PhpDocFromTypeDeclarationDecorator */ - private $phpDocFromTypeDeclarationDecorator; + private PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator; public function __construct(PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator) { $this->phpDocFromTypeDeclarationDecorator = $phpDocFromTypeDeclarationDecorator; 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 221c200b6..6aa544507 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 @@ -42,14 +42,12 @@ final class DowngradeNewInInitializerRector extends AbstractRector { /** * @readonly - * @var \Rector\Php72\NodeFactory\AnonymousFunctionFactory */ - private $anonymousFunctionFactory; + private AnonymousFunctionFactory $anonymousFunctionFactory; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory, BetterNodeFinder $betterNodeFinder) { $this->anonymousFunctionFactory = $anonymousFunctionFactory; @@ -156,13 +154,17 @@ private function replaceNewInParams($functionLike) } else { $assign = new AssignCoalesce($param->var, $default); } + // recheck after + if ($isConstructor && $param->type !== null) { + $param->type = $this->ensureNullableType($param->type); + } $stmts[] = new Expression($assign); $param->default = $this->nodeFactory->createNull(); } if ($functionLike->stmts === null) { return $functionLike; } - $functionLike->stmts = $functionLike->stmts ?? []; + $functionLike->stmts ??= []; $functionLike->stmts = \array_merge($stmts, $functionLike->stmts); return $functionLike; } @@ -179,23 +181,17 @@ private function ensureNullableType($type) return new NullableType($type); } if ($type instanceof UnionType) { - if (!$this->hasNull($type)) { - $type->types[] = new Name('null'); + foreach ($type->types as $typeChild) { + if (!$typeChild instanceof Identifier) { + continue; + } + if ($typeChild->toLowerString() === 'null') { + return $type; + } } + $type->types[] = new Identifier('null'); return $type; } throw new ShouldNotHappenException(); } - private function hasNull(UnionType $unionType) : bool - { - foreach ($unionType->types as $type) { - if (!$type instanceof Identifier) { - continue; - } - if ($type->toLowerString() === 'null') { - return \true; - } - } - return \false; - } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradePureIntersectionTypeRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradePureIntersectionTypeRector.php index 3db381999..4f1ee9eb1 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradePureIntersectionTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradePureIntersectionTypeRector.php @@ -22,9 +22,8 @@ final class DowngradePureIntersectionTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpDocDecorator\PhpDocFromTypeDeclarationDecorator */ - private $phpDocFromTypeDeclarationDecorator; + private PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator; public function __construct(PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator) { $this->phpDocFromTypeDeclarationDecorator = $phpDocFromTypeDeclarationDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Instanceof_/DowngradePhp81ResourceReturnToObjectRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Instanceof_/DowngradePhp81ResourceReturnToObjectRector.php index d60443e2d..eaeea933c 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Instanceof_/DowngradePhp81ResourceReturnToObjectRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Instanceof_/DowngradePhp81ResourceReturnToObjectRector.php @@ -20,9 +20,8 @@ final class DowngradePhp81ResourceReturnToObjectRector extends AbstractRector { /** * @readonly - * @var \Rector\DowngradePhp81\NodeManipulator\ObjectToResourceReturn */ - private $objectToResourceReturn; + private ObjectToResourceReturn $objectToResourceReturn; /** * @var string[]|class-string[] */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/LNumber/DowngradeOctalNumberRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/LNumber/DowngradeOctalNumberRector.php index e7327bbcb..ce14559fd 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/LNumber/DowngradeOctalNumberRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/LNumber/DowngradeOctalNumberRector.php @@ -4,7 +4,7 @@ namespace Rector\DowngradePhp81\Rector\LNumber; use PhpParser\Node; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -43,15 +43,15 @@ public function run() */ public function getNodeTypes() : array { - return [LNumber::class]; + return [Int_::class]; } /** - * @param LNumber $node + * @param Int_ $node */ public function refactor(Node $node) : ?Node { $numberKind = $node->getAttribute(AttributeKey::KIND); - if ($numberKind !== LNumber::KIND_OCT) { + if ($numberKind !== Int_::KIND_OCT) { return null; } /** @var string $rawValue */ 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 8175d005c..f6d1baff2 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 @@ -23,18 +23,16 @@ final class DowngradeReadonlyPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + * @readonly */ - protected $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/NodeManipulator/DowngradeReadonlyClassManipulator.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/NodeManipulator/DowngradeReadonlyClassManipulator.php new file mode 100644 index 000000000..0ec6d0aef --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/NodeManipulator/DowngradeReadonlyClassManipulator.php @@ -0,0 +1,78 @@ +visibilityManipulator = $visibilityManipulator; + } + public function process(Class_ $class) : ?Class_ + { + if (!$this->visibilityManipulator->isReadonly($class)) { + return null; + } + $this->visibilityManipulator->removeReadonly($class); + $this->makePropertiesReadonly($class); + $this->makePromotedPropertiesReadonly($class); + return $class; + } + private function makePropertiesReadonly(Class_ $class) : void + { + foreach ($class->getProperties() as $property) { + if ($property->isReadonly()) { + continue; + } + /** + * It technically impossible that readonly class has: + * + * - non-typed property + * - static property + * + * but here to ensure no flip-flop when using direct rule for multiple rules applied + */ + if ($property->type === null) { + continue; + } + if ($property->isStatic()) { + continue; + } + $this->visibilityManipulator->makeReadonly($property); + } + } + private function makePromotedPropertiesReadonly(Class_ $class) : void + { + $classMethod = $class->getMethod(MethodName::CONSTRUCT); + if (!$classMethod instanceof ClassMethod) { + return; + } + foreach ($classMethod->getParams() as $param) { + if ($this->visibilityManipulator->isReadonly($param)) { + continue; + } + /** + * not property promotion, just param + */ + if ($param->flags === 0) { + continue; + } + /** + * also not typed, just param + */ + if ($param->type === null) { + continue; + } + $this->visibilityManipulator->makeReadonly($param); + } + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/Class_/DowngradeReadonlyClassRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/Class_/DowngradeReadonlyClassRector.php index 91813f571..d792078f9 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/Class_/DowngradeReadonlyClassRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/Class_/DowngradeReadonlyClassRector.php @@ -5,10 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; -use Rector\Privatization\NodeManipulator\VisibilityManipulator; +use Rector\DowngradePhp82\NodeManipulator\DowngradeReadonlyClassManipulator; use Rector\Rector\AbstractRector; -use Rector\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -20,12 +18,11 @@ final class DowngradeReadonlyClassRector extends AbstractRector { /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; - public function __construct(VisibilityManipulator $visibilityManipulator) + private DowngradeReadonlyClassManipulator $downgradeReadonlyClassManipulator; + public function __construct(DowngradeReadonlyClassManipulator $downgradeReadonlyClassManipulator) { - $this->visibilityManipulator = $visibilityManipulator; + $this->downgradeReadonlyClassManipulator = $downgradeReadonlyClassManipulator; } /** * @return array> @@ -65,60 +62,9 @@ public function __construct() */ public function refactor(Node $node) : ?Node { - if (!$this->visibilityManipulator->isReadonly($node)) { + if ($node->isAnonymous()) { return null; } - $this->visibilityManipulator->removeReadonly($node); - $this->makePropertiesReadonly($node); - $this->makePromotedPropertiesReadonly($node); - return $node; - } - private function makePropertiesReadonly(Class_ $class) : void - { - foreach ($class->getProperties() as $property) { - if ($property->isReadonly()) { - continue; - } - /** - * It technically impossible that readonly class has: - * - * - non-typed property - * - static property - * - * but here to ensure no flip-flop when using direct rule for multiple rules applied - */ - if ($property->type === null) { - continue; - } - if ($property->isStatic()) { - continue; - } - $this->visibilityManipulator->makeReadonly($property); - } - } - private function makePromotedPropertiesReadonly(Class_ $class) : void - { - $classMethod = $class->getMethod(MethodName::CONSTRUCT); - if (!$classMethod instanceof ClassMethod) { - return; - } - foreach ($classMethod->getParams() as $param) { - if ($this->visibilityManipulator->isReadonly($param)) { - continue; - } - /** - * not property promotion, just param - */ - if ($param->flags === 0) { - continue; - } - /** - * also not typed, just param - */ - if ($param->type === null) { - continue; - } - $this->visibilityManipulator->makeReadonly($param); - } + return $this->downgradeReadonlyClassManipulator->process($node); } } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FuncCall/DowngradeIteratorCountToArrayRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FuncCall/DowngradeIteratorCountToArrayRector.php new file mode 100644 index 000000000..7b2eaa8ad --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FuncCall/DowngradeIteratorCountToArrayRector.php @@ -0,0 +1,108 @@ +argsAnalyzer = $argsAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Ternary::class, FuncCall::class]; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Ensure pass Traversable instance before use in iterator_count() and iterator_to_array()', [new CodeSample(<<<'CODE_SAMPLE' +function test(array|Traversable $data) { + $c = iterator_count($data); + $v = iterator_to_array($data); +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +function test(array|Traversable $data) { + $c = iterator_count(is_array($data) ? new ArrayIterator($data) : $data); + $v = iterator_to_array(is_array($data) ? new ArrayIterator($data) : $data); +} +CODE_SAMPLE +)]); + } + /** + * @param Ternary|FuncCall $node + * @return null|\PhpParser\Node\Expr\FuncCall|int + */ + public function refactor(Node $node) + { + if ($node instanceof Ternary) { + $hasIsArrayCheck = (bool) $this->betterNodeFinder->findFirst($node, fn(Node $subNode): bool => $subNode instanceof FuncCall && $this->isName($subNode, 'is_array')); + if ($hasIsArrayCheck) { + return NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + return null; + } + if (!$this->isNames($node, ['iterator_count', 'iterator_to_array'])) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $args = $node->getArgs(); + if ($this->argsAnalyzer->hasNamedArg($args)) { + return null; + } + if (!isset($args[0])) { + return null; + } + $type = $this->nodeTypeResolver->getType($args[0]->value); + if ($this->shouldSkip($type)) { + return null; + } + Assert::isInstanceOf($node->args[0], Arg::class); + $firstValue = $node->args[0]->value; + $node->args[0]->value = new Ternary($this->nodeFactory->createFuncCall('is_array', [new Arg($firstValue)]), new New_(new FullyQualified('ArrayIterator'), [new Arg($firstValue)]), $firstValue); + return $node; + } + private function shouldSkip(Type $type) : bool + { + if ($type->isArray()->yes()) { + return \false; + } + $type = TypeCombinator::removeNull($type); + return $type->isObject()->yes(); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FunctionLike/DowngradeStandaloneNullTrueFalseReturnTypeRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FunctionLike/DowngradeStandaloneNullTrueFalseReturnTypeRector.php index c1764f7d5..44fdd2040 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FunctionLike/DowngradeStandaloneNullTrueFalseReturnTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp82/Rector/FunctionLike/DowngradeStandaloneNullTrueFalseReturnTypeRector.php @@ -32,19 +32,16 @@ final class DowngradeStandaloneNullTrueFalseReturnTypeRector extends AbstractRec { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, PhpDocTypeChanger $phpDocTypeChanger, AstResolver $astResolver) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConst/DowngradeTypedClassConstRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConst/DowngradeTypedClassConstRector.php index cf2422938..50fd451b8 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConst/DowngradeTypedClassConstRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConst/DowngradeTypedClassConstRector.php @@ -18,9 +18,8 @@ final class DowngradeTypedClassConstRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeManipulator\PropertyDecorator */ - private $propertyDecorator; + private PropertyDecorator $propertyDecorator; public function __construct(PropertyDecorator $propertyDecorator) { $this->propertyDecorator = $propertyDecorator; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php new file mode 100644 index 000000000..4445d94bf --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php @@ -0,0 +1,48 @@ +> + */ + public function getNodeTypes() : array + { + return [ClassConstFetch::class]; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change dynamic class const fetch Example::{$constName} to constant(Example::class . \'::\' . $constName)', [new CodeSample(<<<'CODE_SAMPLE' +$value = Example::{$constName}; +CODE_SAMPLE +, <<<'CODE_SAMPLE' +$value = constant(Example::class . '::' . $constName); +CODE_SAMPLE +)]); + } + /** + * @param ClassConstFetch $node + */ + public function refactor(Node $node) : ?Node + { + if ($node->name instanceof Identifier) { + return null; + } + return $this->nodeFactory->createFuncCall('constant', [new Concat(new Concat(new ClassConstFetch($node->class, new Identifier('class')), new String_('::')), $node->name)]); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/Class_/DowngradeReadonlyAnonymousClassRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/Class_/DowngradeReadonlyAnonymousClassRector.php new file mode 100644 index 000000000..73b5a3218 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp83/Rector/Class_/DowngradeReadonlyAnonymousClassRector.php @@ -0,0 +1,69 @@ +downgradeReadonlyClassManipulator = $downgradeReadonlyClassManipulator; + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove "readonly" class type on anonymous class, decorate all properties to "readonly"', [new CodeSample(<<<'CODE_SAMPLE' +new readonly class +{ + public string $foo; + + public function __construct() + { + $this->foo = 'foo'; + } +}; +CODE_SAMPLE +, <<<'CODE_SAMPLE' +new class +{ + public readonly string $foo; + + public function __construct() + { + $this->foo = 'foo'; + } +} +CODE_SAMPLE +)]); + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$node->isAnonymous()) { + return null; + } + return $this->downgradeReadonlyClassManipulator->process($node); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php new file mode 100644 index 000000000..30b6483f7 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php @@ -0,0 +1,89 @@ +isName($node, 'round')) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $args = $node->getArgs(); + if (\count($args) !== 3) { + return null; + } + if (!isset($args[2])) { + return null; + } + $modeArg = $args[2]->value; + $hasChanged = \false; + if ($modeArg instanceof ClassConstFetch && $modeArg->class instanceof FullyQualified && $this->isName($modeArg->class, 'RoundingMode')) { + if (!$modeArg->name instanceof Identifier) { + return null; + } + switch ($modeArg->name->name) { + case 'HalfAwayFromZero': + $constantName = 'PHP_ROUND_HALF_UP'; + break; + case 'HalfTowardsZero': + $constantName = 'PHP_ROUND_HALF_DOWN'; + break; + case 'HalfEven': + $constantName = 'PHP_ROUND_HALF_EVEN'; + break; + case 'HalfOdd': + $constantName = 'PHP_ROUND_HALF_ODD'; + break; + default: + $constantName = null; + break; + } + if ($constantName === null) { + return null; + } + $args[2]->value = new ConstFetch(new FullyQualified($constantName)); + $hasChanged = \true; + } + if ($hasChanged) { + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php new file mode 100644 index 000000000..9ba949386 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php @@ -0,0 +1,57 @@ +> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add parentheses on new method call without parentheses', [new CodeSample(<<<'CODE_SAMPLE' +new Request()->withMethod('GET')->withUri('/hello-world'); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +(new Request())->withMethod('GET')->withUri('/hello-world'); +CODE_SAMPLE +)]); + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?Node + { + if (!$node->var instanceof New_) { + return null; + } + $oldTokens = $this->file->getOldTokens(); + $startTokenPos = $node->getStartTokenPos(); + $endTokenPos = $node->getEndTokenPos(); + if (!isset($oldTokens[$startTokenPos], $oldTokens[$endTokenPos])) { + return null; + } + if ((string) $oldTokens[$node->getStartTokenPos()] === '(') { + return null; + } + $oldTokens[$node->var->getStartTokenPos()]->text = '(' . $oldTokens[$node->var->getStartTokenPos()]; + $oldTokens[$node->var->getEndTokenPos()]->text .= ')'; + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp85/Rector/FuncCall/DowngradeArrayFirstLastRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp85/Rector/FuncCall/DowngradeArrayFirstLastRector.php new file mode 100644 index 000000000..7975aebad --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp85/Rector/FuncCall/DowngradeArrayFirstLastRector.php @@ -0,0 +1,52 @@ +isNames($node, ['array_first', 'array_last'])) { + return null; + } + if ($node->isFirstClassCallable()) { + return null; + } + $args = $node->getArgs(); + if (\count($args) !== 1) { + return null; + } + $functionName = $this->isName($node, 'array_first') ? 'array_key_first' : 'array_key_last'; + return new ArrayDimFetch($args[0]->value, $this->nodeFactory->createFuncCall($functionName, [$args[0]->value])); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/CoalesceAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/CoalesceAnalyzer.php index 6c9bd9b50..675c58694 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/CoalesceAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/CoalesceAnalyzer.php @@ -17,6 +17,9 @@ final class CoalesceAnalyzer private const ISSETABLE_EXPR = [Variable::class, ArrayDimFetch::class, PropertyFetch::class, StaticPropertyFetch::class]; public function hasIssetableLeft(Coalesce $coalesce) : bool { + if ($coalesce->left instanceof Coalesce) { + return \true; + } $leftClass = \get_class($coalesce->left); return \in_array($leftClass, self::ISSETABLE_EXPR, \true); } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/DefineFuncCallAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/DefineFuncCallAnalyzer.php index ea698be67..afa673865 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/DefineFuncCallAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/DefineFuncCallAnalyzer.php @@ -11,9 +11,8 @@ final class DefineFuncCallAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; 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 8ff61ea54..c9dca00bd 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 @@ -27,9 +27,8 @@ final class ExprInTopStmtMatcher { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(BetterNodeFinder $betterNodeFinder) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/ClassFromEnumFactory.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/ClassFromEnumFactory.php index 0c95ad096..0c0af6d7a 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/ClassFromEnumFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/ClassFromEnumFactory.php @@ -16,9 +16,8 @@ final class ClassFromEnumFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/DoctrineAnnotationFactory.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/DoctrineAnnotationFactory.php index 5b3905a85..5a3daf9eb 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/DoctrineAnnotationFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/DoctrineAnnotationFactory.php @@ -15,9 +15,8 @@ final class DoctrineAnnotationFactory { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; public function __construct(BetterStandardPrinter $betterStandardPrinter) { $this->betterStandardPrinter = $betterStandardPrinter; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/NamedVariableFactory.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/NamedVariableFactory.php index 194b07a75..2478e0377 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/NamedVariableFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeFactory/NamedVariableFactory.php @@ -11,9 +11,8 @@ final class NamedVariableFactory { /** * @readonly - * @var \Rector\Naming\Naming\VariableNaming */ - private $variableNaming; + private VariableNaming $variableNaming; public function __construct(VariableNaming $variableNaming) { $this->variableNaming = $variableNaming; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeManipulator/PropertyDecorator.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeManipulator/PropertyDecorator.php index b97fe2b63..991d87b98 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeManipulator/PropertyDecorator.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeManipulator/PropertyDecorator.php @@ -16,19 +16,16 @@ final class PropertyDecorator { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, PhpDocTypeChanger $phpDocTypeChanger) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/PhpDocDecorator/PhpDocFromTypeDeclarationDecorator.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/PhpDocDecorator/PhpDocFromTypeDeclarationDecorator.php index f5f7cf27b..0ced68867 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/PhpDocDecorator/PhpDocFromTypeDeclarationDecorator.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/PhpDocDecorator/PhpDocFromTypeDeclarationDecorator.php @@ -3,12 +3,15 @@ declare (strict_types=1); namespace Rector\PhpDocDecorator; +use PhpParser\Node; use PhpParser\Node\ComplexType; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Identifier; use PhpParser\Node\Name; +use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Param; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; @@ -25,6 +28,7 @@ use Rector\Php\PhpVersionProvider; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory; +use Rector\PhpParser\AstResolver; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\Reflection\ReflectionResolver; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -38,49 +42,45 @@ final class PhpDocFromTypeDeclarationDecorator { /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; + /** + * @readonly + */ + private AstResolver $astResolver; /** * @var ClassMethodWillChangeReturnType[] */ - private $classMethodWillChangeReturnTypes = []; - public function __construct(StaticTypeMapper $staticTypeMapper, PhpDocInfoFactory $phpDocInfoFactory, NodeNameResolver $nodeNameResolver, PhpDocTypeChanger $phpDocTypeChanger, PhpAttributeGroupFactory $phpAttributeGroupFactory, ReflectionResolver $reflectionResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, PhpVersionProvider $phpVersionProvider) + private array $classMethodWillChangeReturnTypes = []; + public function __construct(StaticTypeMapper $staticTypeMapper, PhpDocInfoFactory $phpDocInfoFactory, NodeNameResolver $nodeNameResolver, PhpDocTypeChanger $phpDocTypeChanger, PhpAttributeGroupFactory $phpAttributeGroupFactory, ReflectionResolver $reflectionResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, PhpVersionProvider $phpVersionProvider, AstResolver $astResolver) { $this->staticTypeMapper = $staticTypeMapper; $this->phpDocInfoFactory = $phpDocInfoFactory; @@ -90,6 +90,7 @@ public function __construct(StaticTypeMapper $staticTypeMapper, PhpDocInfoFactor $this->reflectionResolver = $reflectionResolver; $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; $this->phpVersionProvider = $phpVersionProvider; + $this->astResolver = $astResolver; $this->classMethodWillChangeReturnTypes = [ // @todo how to make list complete? is the method list needed or can we use just class names? new ClassMethodWillChangeReturnType('ArrayAccess', 'offsetGet'), @@ -101,7 +102,7 @@ public function __construct(StaticTypeMapper $staticTypeMapper, PhpDocInfoFactor */ public function decorateReturn($functionLike) : void { - if ($functionLike->returnType === null) { + if (!$functionLike->returnType instanceof Node) { return; } $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($functionLike); @@ -121,6 +122,22 @@ public function decorateReturn($functionLike) : void if (!$classReflection instanceof ClassReflection || !$classReflection->isInterface() && !$classReflection->isClass()) { return; } + $ancestors = \array_filter($classReflection->getAncestors(), static fn(ClassReflection $ancestor): bool => $classReflection->getName() !== $ancestor->getName()); + foreach ($ancestors as $ancestor) { + $classLike = $this->astResolver->resolveClassFromClassReflection($ancestor); + if (!$classLike instanceof ClassLike) { + continue; + } + $classMethod = $classLike->getMethod($functionLike->name->toString()); + if (!$classMethod instanceof ClassMethod) { + continue; + } + $returnType = $classMethod->returnType; + if ($returnType instanceof Node && $returnType instanceof FullyQualified) { + $functionLike->returnType = new FullyQualified($returnType->toString()); + break; + } + } if (!$this->isRequireReturnTypeWillChange($classReflection, $functionLike)) { return; } @@ -132,7 +149,7 @@ public function decorateReturn($functionLike) : void */ public function decorateParam(Param $param, $functionLike, array $requiredTypes) : void { - if ($param->type === null) { + if (!$param->type instanceof Node) { return; } $type = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); @@ -150,7 +167,7 @@ public function decorateParam(Param $param, $functionLike, array $requiredTypes) */ public function decorateParamWithSpecificType(Param $param, $functionLike, Type $requireType) : bool { - if ($param->type === null) { + if (!$param->type instanceof Node) { return \false; } if (!$this->isTypeMatch($param->type, $requireType)) { @@ -170,7 +187,7 @@ public function decorateParamWithSpecificType(Param $param, $functionLike, Type */ public function decorateReturnWithSpecificType($functionLike, Type $requireType) : bool { - if ($functionLike->returnType === null) { + if (!$functionLike->returnType instanceof Node) { return \false; } if (!$this->isTypeMatch($functionLike->returnType, $requireType)) { @@ -191,7 +208,7 @@ private function isRequireReturnTypeWillChange(ClassReflection $classReflection, if ($classMethodWillChangeReturnType->getMethodName() !== $methodName) { continue; } - if (!$classReflection->isSubclassOf($classMethodWillChangeReturnType->getClassName())) { + if (!$classReflection->is($classMethodWillChangeReturnType->getClassName())) { continue; } if ($this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, 'ReturnTypeWillChange')) { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeLevelSetList.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeLevelSetList.php index 9ff7d32c3..e5bd0f948 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeLevelSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeLevelSetList.php @@ -3,12 +3,20 @@ declare (strict_types=1); namespace Rector\Set\ValueObject; -use Rector\Set\Contract\SetListInterface; /** * @api + * @deprecated use ->withDowngradeSets() in rector.php instead */ -final class DowngradeLevelSetList implements SetListInterface +final class DowngradeLevelSetList { + /** + * @var string + */ + public const DOWN_TO_PHP_84 = __DIR__ . '/../../../config/set/level/down-to-php84.php'; + /** + * @var string + */ + public const DOWN_TO_PHP_83 = __DIR__ . '/../../../config/set/level/down-to-php83.php'; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeSetList.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeSetList.php index 4de4a011b..4976405af 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/Set/ValueObject/DowngradeSetList.php @@ -3,11 +3,11 @@ declare (strict_types=1); namespace Rector\Set\ValueObject; -use Rector\Set\Contract\SetListInterface; /** * @api + * @deprecated use ->withDowngradeSets() in rector.php instead */ -final class DowngradeSetList implements SetListInterface +final class DowngradeSetList { /** * @var string @@ -37,4 +37,12 @@ final class DowngradeSetList implements SetListInterface * @var string */ public const PHP_83 = __DIR__ . '/../../../config/set/downgrade-php83.php'; + /** + * @var string + */ + public const PHP_84 = __DIR__ . '/../../../config/set/downgrade-php84.php'; + /** + * @var string + */ + public const PHP_85 = __DIR__ . '/../../../config/set/downgrade-php85.php'; } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/ValueObject/ClassMethodWillChangeReturnType.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/ValueObject/ClassMethodWillChangeReturnType.php index cf0695371..682f801ba 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/ValueObject/ClassMethodWillChangeReturnType.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/ValueObject/ClassMethodWillChangeReturnType.php @@ -7,14 +7,12 @@ final class ClassMethodWillChangeReturnType { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; public function __construct(string $className, string $methodName) { $this->className = $className; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/stubs/Symfony/Component/Annotation/Route.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/stubs/Symfony/Component/Annotation/Route.php index 43bf7176f..b7a2206c7 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/stubs/Symfony/Component/Annotation/Route.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/stubs/Symfony/Component/Annotation/Route.php @@ -1,7 +1,7 @@ =8.2" }, "require-dev": { - "rector\/rector-src": "dev-main", - "phpunit\/phpunit": "^10.5", - "phpstan\/phpstan": "^1.12", - "symplify\/phpstan-rules": "^13.0", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/easy-coding-standard": "^12.3", + "phpecs\/phpecs": "^2.1.1", "phpstan\/extension-installer": "^1.4", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "symplify\/vendor-patches": "^11.3", - "tracy\/tracy": "^2.10", - "tomasvotruba\/class-leak": "^1.0", - "rector\/type-perfect": "^1.0", - "rector\/swiss-knife": "^1.0" + "phpstan\/phpstan": "^2.1.8", + "phpstan\/phpstan-deprecation-rules": "^2.0", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.5", + "rector\/rector-src": "dev-main", + "rector\/swiss-knife": "^1.0", + "rector\/type-perfect": "^2.0", + "symplify\/phpstan-extensions": "^12.0", + "symplify\/vendor-patches": "^11.4", + "tomasvotruba\/class-leak": "^1.2", + "tracy\/tracy": "^2.10" }, "autoload": { "psr-4": { @@ -49,24 +49,22 @@ "@docs", "phpunit" ], - "phpstan": "vendor\/bin\/phpstan analyse --ansi --error-format symplify", + "phpstan": "vendor\/bin\/phpstan analyse --ansi", "check-cs": "vendor\/bin\/ecs check --ansi", "class-leak": "vendor\/bin\/class-leak check config src rules --skip-suffix \"Rector\"", "fix-cs": "vendor\/bin\/ecs check --fix --ansi", "rector": "vendor\/bin\/rector process --ansi" }, "extra": { - "enable-patching": true, - "branch-alias": { - "dev-main": "0.11-dev" - } + "enable-patching": true }, "conflict": { - "rector\/rector": "<0.11" + "rector\/rector": "<2.0" }, "minimum-stability": "dev", "prefer-stable": true, "config": { + "sort-packages": true, "allow-plugins": { "cweagans\/composer-patches": true, "rector\/extension-installer": true, diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/annotations-to-attributes.php b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/annotations-to-attributes.php index b42d1a52d..a2e8308b2 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/annotations-to-attributes.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/annotations-to-attributes.php @@ -1,13 +1,14 @@ ruleWithConfiguration(AnnotationWithValueToAttributeRector::class, [new AnnotationWithValueToAttribute('backupGlobals', 'PHPUnit\\Framework\\Attributes\\BackupGlobals', ['enabled' => \true, 'disabled' => \false]), new AnnotationWithValueToAttribute('backupStaticAttributes', 'PHPUnit\\Framework\\Attributes\\BackupStaticProperties', ['enabled' => \true, 'disabled' => \false]), new AnnotationWithValueToAttribute('preserveGlobalState', 'PHPUnit\\Framework\\Attributes\\PreserveGlobalState', ['enabled' => \true, 'disabled' => \false]), new AnnotationWithValueToAttribute('depends', 'PHPUnit\\Framework\\Attributes\\Depends'), new AnnotationWithValueToAttribute('group', 'PHPUnit\\Framework\\Attributes\\Group'), new AnnotationWithValueToAttribute('uses', 'PHPUnit\\Framework\\Attributes\\UsesClass'), new AnnotationWithValueToAttribute('testDox', 'PHPUnit\\Framework\\Attributes\\TestDox'), new AnnotationWithValueToAttribute('testdox', 'PHPUnit\\Framework\\Attributes\\TestDox')]); + $rectorConfig->ruleWithConfiguration(AnnotationWithValueToAttributeRector::class, [new AnnotationWithValueToAttribute('backupGlobals', 'PHPUnit\\Framework\\Attributes\\BackupGlobals', ['enabled' => \true, 'disabled' => \false]), new AnnotationWithValueToAttribute('backupStaticAttributes', 'PHPUnit\\Framework\\Attributes\\BackupStaticProperties', ['enabled' => \true, 'disabled' => \false]), new AnnotationWithValueToAttribute('preserveGlobalState', 'PHPUnit\\Framework\\Attributes\\PreserveGlobalState', ['enabled' => \true, 'disabled' => \false]), new AnnotationWithValueToAttribute('depends', 'PHPUnit\\Framework\\Attributes\\Depends'), new AnnotationWithValueToAttribute('group', 'PHPUnit\\Framework\\Attributes\\Group'), new AnnotationWithValueToAttribute('uses', 'PHPUnit\\Framework\\Attributes\\UsesClass', [], \true), new AnnotationWithValueToAttribute('testDox', 'PHPUnit\\Framework\\Attributes\\TestDox'), new AnnotationWithValueToAttribute('testdox', 'PHPUnit\\Framework\\Attributes\\TestDox')]); $rectorConfig->ruleWithConfiguration(AnnotationToAttributeRector::class, [ // @see https://github.com/sebastianbergmann/phpunit/issues/4502 new AnnotationToAttribute('after', 'PHPUnit\\Framework\\Attributes\\After'), diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php index 01f6691f0..38a5a9afe 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php @@ -1,21 +1,23 @@ sets([PHPUnitSetList::ANNOTATIONS_TO_ATTRIBUTES]); - $rectorConfig->rules([AssertIssetToAssertObjectHasPropertyRector::class, StaticDataProviderClassMethodRector::class, PublicDataProviderClassMethodRector::class, AddProphecyTraitRector::class, WithConsecutiveRector::class, RemoveSetMethodsMethodCallRector::class]); + $rectorConfig->rules([StaticDataProviderClassMethodRector::class, PublicDataProviderClassMethodRector::class, AddProphecyTraitRector::class, WithConsecutiveRector::class, RemoveSetMethodsMethodCallRector::class, PropertyExistsWithoutAssertRector::class, ParentTestClassConstructorRector::class]); $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ // https://github.com/sebastianbergmann/phpunit/issues/4087 new MethodCallRename('PHPUnit\\Framework\\Assert', 'assertRegExp', 'assertMatchesRegularExpression'), diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit110.php b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit110.php index 90b1a38af..56575b7b4 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit110.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit110.php @@ -1,8 +1,10 @@ rule(NamedArgumentForDataProviderRector::class); }; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit120.php b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit120.php new file mode 100644 index 000000000..6ccf65ed6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit120.php @@ -0,0 +1,10 @@ +rule(RemoveOverrideFinalConstructTestCaseRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit40.php b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit40.php index aa0007a7e..6685227e1 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit40.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit40.php @@ -1,7 +1,7 @@ testsNodeAnalyzer = $testsNodeAnalyzer; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; @@ -64,6 +67,7 @@ public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGr $this->reflectionResolver = $reflectionResolver; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->reflectionProvider = $reflectionProvider; } public function getRuleDefinition() : RuleDefinition { @@ -118,6 +122,9 @@ public function refactor(Node $node) : ?Node if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } + if (!$this->reflectionProvider->hasClass(self::DATA_PROVIDER_CLASS)) { + return null; + } $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); if (!$phpDocInfo instanceof PhpDocInfo) { return null; @@ -159,6 +166,6 @@ private function createAttributeGroup(string $originalAttributeValue) : Attribut } return $this->phpAttributeGroupFactory->createFromClassWithItems('PHPUnit\\Framework\\Attributes\\DataProviderExternal', [$className . '::class', $methodName]); } - return $this->phpAttributeGroupFactory->createFromClassWithItems('PHPUnit\\Framework\\Attributes\\DataProvider', [$methodName]); + return $this->phpAttributeGroupFactory->createFromClassWithItems(self::DATA_PROVIDER_CLASS, [$methodName]); } } 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 10272c943..1490dd5ab 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 @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; 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; @@ -26,36 +27,40 @@ final class DependsAnnotationWithValueToAttributeRector extends AbstractRector i { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private ReflectionProvider $reflectionProvider; + /** + * @var string + */ + private const DEPENDS_ATTRIBUTE = 'PHPUnit\\Framework\\Attributes\\Depends'; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ReflectionProvider $reflectionProvider) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->reflectionProvider = $reflectionProvider; } public function getRuleDefinition() : RuleDefinition { @@ -108,6 +113,9 @@ public function refactor(Node $node) : ?Node if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } + if (!$this->reflectionProvider->hasClass(self::DEPENDS_ATTRIBUTE)) { + return null; + } $hasChanged = \false; foreach ($node->getMethods() as $classMethod) { $phpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod); @@ -157,7 +165,7 @@ private function resolveAttributeValueAndAttributeName(Class_ $currentClass, str { // process depends other ClassMethod $attributeValue = $this->resolveDependsClassMethod($currentClass, $currentMethodName, $originalAttributeValue); - $attributeName = 'PHPUnit\\Framework\\Attributes\\Depends'; + $attributeName = self::DEPENDS_ATTRIBUTE; if (!\is_string($attributeValue)) { // other: depends other Class_ $attributeValue = $this->resolveDependsClass($originalAttributeValue); 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 148a20775..d0c450ee4 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 @@ -3,11 +3,12 @@ declare (strict_types=1); namespace Rector\PHPUnit\AnnotationsToAttributes\Rector\ClassMethod; -use RectorPrefix202411\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\Json; use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; 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; @@ -29,36 +30,40 @@ final class TestWithAnnotationToAttributeRector extends AbstractRector implement { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private ReflectionProvider $reflectionProvider; + /** + * @var string + */ + private const TEST_WITH_ATTRIBUTE = 'PHPUnit\\Framework\\Attributes\\TestWith'; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ReflectionProvider $reflectionProvider) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->reflectionProvider = $reflectionProvider; } public function getRuleDefinition() : RuleDefinition { @@ -106,6 +111,10 @@ public function refactor(Node $node) : ?Node if (!$this->testsNodeAnalyzer->isTestClassMethod($node)) { return null; } + // make sure the attribute class exists + if (!$this->reflectionProvider->hasClass(self::TEST_WITH_ATTRIBUTE)) { + return null; + } $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); if (!$phpDocInfo instanceof PhpDocInfo) { return null; @@ -127,8 +136,8 @@ public function refactor(Node $node) : ?Node $genericTagValueNode = $testWithPhpDocTagNode->value; $testWithItems = \explode("\n", \trim($genericTagValueNode->value)); foreach ($testWithItems as $testWithItem) { - $jsonArray = Json::decode(\trim($testWithItem), Json::FORCE_ARRAY); - $attributeGroups[] = $this->phpAttributeGroupFactory->createFromClassWithItems('PHPUnit\\Framework\\Attributes\\TestWith', [$jsonArray]); + $jsonArray = Json::decode(\trim($testWithItem), \true); + $attributeGroups[] = $this->phpAttributeGroupFactory->createFromClassWithItems(self::TEST_WITH_ATTRIBUTE, [$jsonArray]); } } $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); 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 af81b0766..66a1a19b2 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 @@ -21,7 +21,7 @@ use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\Class_\AnnotationWithValueToAttributeRector\AnnotationWithValueToAttributeRectorTest */ @@ -29,33 +29,29 @@ final class AnnotationWithValueToAttributeRector extends AbstractRector implemen { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var AnnotationWithValueToAttribute[] */ - private $annotationWithValueToAttributes = []; + private array $annotationWithValueToAttributes = []; + private ?Class_ $currentClass = null; public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->phpDocTagRemover = $phpDocTagRemover; @@ -106,6 +102,9 @@ public function refactor(Node $node) : ?Node if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } + if ($node instanceof Class_) { + $this->currentClass = $node; + } $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); if (!$phpDocInfo instanceof PhpDocInfo) { return null; @@ -120,7 +119,12 @@ public function refactor(Node $node) : ?Node } $attributeValue = $this->resolveAttributeValue($desiredTagValueNode->value, $annotationWithValueToAttribute); $attributeGroup = $this->phpAttributeGroupFactory->createFromClassWithItems($annotationWithValueToAttribute->getAttributeClass(), [$attributeValue]); - $node->attrGroups[] = $attributeGroup; + if ($node instanceof ClassMethod && $annotationWithValueToAttribute->getIsOnClassLevel() && $this->currentClass instanceof Class_) { + Assert::isInstanceOf($this->currentClass, Class_::class); + $this->currentClass->attrGroups = \array_merge($this->currentClass->attrGroups, [$attributeGroup]); + } else { + $node->attrGroups = \array_merge($node->attrGroups, [$attributeGroup]); + } // cleanup $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); $hasChanged = \true; 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 e5330b182..00f6de267 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 @@ -3,12 +3,13 @@ declare (strict_types=1); namespace Rector\PHPUnit\AnnotationsToAttributes\Rector\Class_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\AttributeGroup; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; +use PHPStan\Reflection\ReflectionProvider; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; @@ -27,36 +28,52 @@ final class CoversAnnotationWithValueToAttributeRector extends AbstractRector im { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; - public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, TestsNodeAnalyzer $testsNodeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private ReflectionProvider $reflectionProvider; + /** + * @var string + */ + private const COVERS_FUNCTION_ATTRIBUTE = 'PHPUnit\\Framework\\Attributes\\CoversFunction'; + /** + * @var string + */ + private const COVERTS_CLASS_ATTRIBUTE = 'PHPUnit\\Framework\\Attributes\\CoversClass'; + /** + * @var string + */ + private const COVERTS_TRAIT_ATTRIBUTE = 'PHPUnit\\Framework\\Attributes\\CoversTrait'; + /** + * @var string + */ + private const COVERS_METHOD_ATTRIBUTE = 'PHPUnit\\Framework\\Attributes\\CoversMethod'; + public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, TestsNodeAnalyzer $testsNodeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ReflectionProvider $reflectionProvider) { $this->phpDocTagRemover = $phpDocTagRemover; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->reflectionProvider = $reflectionProvider; } public function getRuleDefinition() : RuleDefinition { @@ -111,6 +128,9 @@ public function refactor(Node $node) : ?Node if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } + if (!$this->reflectionProvider->hasClass(self::COVERS_FUNCTION_ATTRIBUTE)) { + return null; + } if ($node instanceof Class_) { $coversAttributeGroups = $this->resolveClassAttributes($node); if ($coversAttributeGroups === []) { @@ -127,16 +147,31 @@ public function refactor(Node $node) : ?Node $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); return $node; } - private function createAttributeGroup(string $annotationValue) : AttributeGroup + private function createAttributeGroup(string $annotationValue) : ?AttributeGroup { if (\strncmp($annotationValue, '::', \strlen('::')) === 0) { - $attributeClass = 'PHPUnit\\Framework\\Attributes\\CoversFunction'; - $attributeValue = \trim($annotationValue, ':()'); + $attributeClass = self::COVERS_FUNCTION_ATTRIBUTE; + $attributeValue = [\trim($annotationValue, ':()')]; + } elseif (\strpos($annotationValue, '::') !== \false) { + $attributeClass = self::COVERS_METHOD_ATTRIBUTE; + if (!$this->reflectionProvider->hasClass($attributeClass)) { + return null; + } + $attributeValue = [$this->getClass($annotationValue) . '::class', $this->getMethod($annotationValue)]; } else { - $attributeClass = 'PHPUnit\\Framework\\Attributes\\CoversClass'; - $attributeValue = \trim($annotationValue) . '::class'; + $attributeClass = self::COVERTS_CLASS_ATTRIBUTE; + if ($this->reflectionProvider->hasClass($annotationValue)) { + $classReflection = $this->reflectionProvider->getClass($annotationValue); + if ($classReflection->isTrait()) { + $attributeClass = self::COVERTS_TRAIT_ATTRIBUTE; + if (!$this->reflectionProvider->hasClass($attributeClass)) { + return null; + } + } + } + $attributeValue = [\trim($annotationValue) . '::class']; } - return $this->phpAttributeGroupFactory->createFromClassWithItems($attributeClass, [$attributeValue]); + return $this->phpAttributeGroupFactory->createFromClassWithItems($attributeClass, $attributeValue); } /** * @return array @@ -170,7 +205,12 @@ private function handleCoversDefaultClass(PhpDocInfo $phpDocInfo) : array if (!$desiredTagValueNode->value instanceof GenericTagValueNode) { continue; } - $attributeGroups[] = $this->createAttributeGroup($desiredTagValueNode->value->value); + $attributeGroup = $this->createAttributeGroup($desiredTagValueNode->value->value); + // phpunit 10 may not fully support attribute + if (!$attributeGroup instanceof AttributeGroup) { + continue; + } + $attributeGroups[] = $attributeGroup; $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); } return $attributeGroups; @@ -187,12 +227,17 @@ private function handleCovers(PhpDocInfo $phpDocInfo, bool $hasCoversDefault) : continue; } $covers = $desiredTagValueNode->value->value; - if (\strncmp($covers, '\\', \strlen('\\')) === 0) { - $attributeGroups[$covers] = $this->createAttributeGroup($covers); - } elseif (!$hasCoversDefault && \strncmp($covers, '::', \strlen('::')) === 0) { - $attributeGroups[$covers] = $this->createAttributeGroup($covers); + if (\strncmp($covers, '\\', \strlen('\\')) === 0 || !$hasCoversDefault && \strncmp($covers, '::', \strlen('::')) === 0) { + $attributeGroup = $this->createAttributeGroup($covers); + // phpunit 10 may not fully support attribute + if (!$attributeGroup instanceof AttributeGroup) { + continue; + } + $attributeGroups[$covers] = $attributeGroup; + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); + } elseif ($hasCoversDefault && \strncmp($covers, '::', \strlen('::')) === 0) { + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); } - $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); } return $attributeGroups; } @@ -212,11 +257,13 @@ private function resolveMethodAttributes(ClassMethod $classMethod, bool $hasCove continue; } $covers = $desiredTagValueNode->value->value; - if (\strncmp($covers, '\\', \strlen('\\')) === 0) { - $covers = $this->getClass($covers); - $attributeGroups[$covers] = $this->createAttributeGroup($covers); - } elseif (!$hasCoversDefault && \strncmp($covers, '::', \strlen('::')) === 0) { - $attributeGroups[$covers] = $this->createAttributeGroup($covers); + if (\strncmp($covers, '\\', \strlen('\\')) === 0 || !$hasCoversDefault && \strncmp($covers, '::', \strlen('::')) === 0) { + $attributeGroup = $this->createAttributeGroup($covers); + // phpunit 10 may not fully support attribute + if (!$attributeGroup instanceof AttributeGroup) { + continue; + } + $attributeGroups[$covers] = $attributeGroup; } } return $attributeGroups; @@ -233,6 +280,9 @@ private function removeMethodCoversAnnotations(ClassMethod $classMethod) : bool if (!$desiredTagValueNode->value instanceof GenericTagValueNode) { continue; } + if (\strpos($desiredTagValueNode->value->value, '::') !== \false && !$this->reflectionProvider->hasClass(self::COVERS_METHOD_ATTRIBUTE)) { + continue; + } $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); $hasChanged = \true; } @@ -242,4 +292,8 @@ private function getClass(string $classWithMethod) : string { return Strings::replace($classWithMethod, '/::.*$/'); } + private function getMethod(string $classWithMethod) : string + { + return Strings::replace($classWithMethod, '/^.*::/'); + } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php new file mode 100644 index 000000000..7230d79a3 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php @@ -0,0 +1,242 @@ +phpDocTagRemover = $phpDocTagRemover; + $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change Requires annotations with values to attributes', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +/** + * @requires PHP > 8.4 + * @requires PHPUnit >= 10 + * @requires OS Windows + * @requires OSFAMILY Darwin + * @requires function someFunction + * @requires function \some\className::someMethod + * @requires extension mysqli + * @requires extension mysqli >= 8.3.0 + * @requires setting date.timezone Europe/Berlin + */ + +final class SomeTest extends TestCase +{ + /** + * @requires PHP > 8.4 + * @requires PHPUnit >= 10 + * @requires OS Windows + * @requires OSFAMILY Darwin + * @requires function someFunction + * @requires function \some\className::someMethod + * @requires extension mysqli + * @requires extension mysqli >= 8.3.0 + * @requires setting date.timezone Europe/Berlin + */ + public function test() + { + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +#[\PHPUnit\Framework\Attributes\RequiresPhp('> 8.4')] +#[\PHPUnit\Framework\Attributes\RequiresPhpunit('>= 10')] +#[\PHPUnit\Framework\Attributes\RequiresOperatingSystem('Windows')] +#[\PHPUnit\Framework\Attributes\RequiresOperatingSystemFamily('Darwin')] +#[\PHPUnit\Framework\Attributes\RequiresFunction('someFunction')] +#[\PHPUnit\Framework\Attributes\RequiresMethod(\some\className::class, 'someMethod')] +#[\PHPUnit\Framework\Attributes\RequiresPhpExtension('mysqli')] +#[\PHPUnit\Framework\Attributes\RequiresPhpExtension('mysqli', '>= 8.3.0')] +#[\PHPUnit\Framework\Attributes\RequiresSetting('date.timezone', 'Europe/Berlin')] +final class SomeTest extends TestCase +{ + + #[\PHPUnit\Framework\Attributes\RequiresPhp('> 8.4')] + #[\PHPUnit\Framework\Attributes\RequiresPhpunit('>= 10')] + #[\PHPUnit\Framework\Attributes\RequiresOperatingSystem('Windows')] + #[\PHPUnit\Framework\Attributes\RequiresOperatingSystemFamily('Darwin')] + #[\PHPUnit\Framework\Attributes\RequiresFunction('someFunction')] + #[\PHPUnit\Framework\Attributes\RequiresMethod(\some\className::class, 'someMethod')] + #[\PHPUnit\Framework\Attributes\RequiresPhpExtension('mysqli')] + #[\PHPUnit\Framework\Attributes\RequiresPhpExtension('mysqli', '>= 8.3.0')] + #[\PHPUnit\Framework\Attributes\RequiresSetting('date.timezone', 'Europe/Berlin')] + public function test() + { + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class, ClassMethod::class]; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::ATTRIBUTES; + } + /** + * @param Class_|ClassMethod $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $hasChanged = \false; + if ($node instanceof Class_) { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + if ($phpDocInfo instanceof PhpDocInfo) { + $requiresAttributeGroups = $this->handleRequires($phpDocInfo); + if ($requiresAttributeGroups !== []) { + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + $node->attrGroups = \array_merge($node->attrGroups, $requiresAttributeGroups); + $this->removeMethodRequiresAnnotations($phpDocInfo); + $hasChanged = \true; + } + } + foreach ($node->getMethods() as $classMethod) { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod); + if ($phpDocInfo instanceof PhpDocInfo) { + $requiresAttributeGroups = $this->handleRequires($phpDocInfo); + if ($requiresAttributeGroups !== []) { + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); + $classMethod->attrGroups = \array_merge($classMethod->attrGroups, $requiresAttributeGroups); + $this->removeMethodRequiresAnnotations($phpDocInfo); + $hasChanged = \true; + } + } + } + } + return $hasChanged ? $node : null; + } + private function createAttributeGroup(string $annotationValue) : ?AttributeGroup + { + $annotationValues = \explode(' ', $annotationValue, 2); + $type = \array_shift($annotationValues); + $attributeValue = \array_shift($annotationValues); + switch ($type) { + case 'PHP': + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresPhp'; + $attributeValue = [$attributeValue]; + break; + case 'PHPUnit': + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresPhpunit'; + $attributeValue = [$attributeValue]; + break; + case 'OS': + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystem'; + $attributeValue = [$attributeValue]; + break; + case 'OSFAMILY': + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresOperatingSystemFamily'; + $attributeValue = [$attributeValue]; + break; + case 'function': + if (\strpos((string) $attributeValue, '::') !== \false) { + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresMethod'; + $attributeValue = \explode('::', (string) $attributeValue); + $attributeValue[0] .= '::class'; + } else { + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresFunction'; + $attributeValue = [$attributeValue]; + } + break; + case 'extension': + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresPhpExtension'; + $attributeValue = \explode(' ', (string) $attributeValue, 2); + break; + case 'setting': + $attributeClass = 'PHPUnit\\Framework\\Attributes\\RequiresSetting'; + $attributeValue = \explode(' ', (string) $attributeValue, 2); + break; + default: + return null; + } + return $this->phpAttributeGroupFactory->createFromClassWithItems($attributeClass, \array_merge($attributeValue)); + } + /** + * @return array + */ + private function handleRequires(PhpDocInfo $phpDocInfo) : array + { + $attributeGroups = []; + $desiredTagValueNodes = $phpDocInfo->getTagsByName('requires'); + foreach ($desiredTagValueNodes as $desiredTagValueNode) { + if (!$desiredTagValueNode->value instanceof GenericTagValueNode) { + continue; + } + $requires = $desiredTagValueNode->value->value; + $attributeGroups[$requires] = $this->createAttributeGroup($requires); + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); + } + return $attributeGroups; + } + private function removeMethodRequiresAnnotations(PhpDocInfo $phpDocInfo) : bool + { + $hasChanged = \false; + $desiredTagValueNodes = $phpDocInfo->getTagsByName('requires'); + foreach ($desiredTagValueNodes as $desiredTagValueNode) { + if (!$desiredTagValueNode->value instanceof GenericTagValueNode) { + continue; + } + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $desiredTagValueNode); + $hasChanged = \true; + } + return $hasChanged; + } +} 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 0c5c7453c..cab3939fe 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 @@ -13,10 +13,12 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; 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\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -31,28 +33,35 @@ final class TicketAnnotationToAttributeRector extends AbstractRector implements { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private ReflectionProvider $reflectionProvider; + /** + * @readonly + */ + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var string */ private const TICKET_CLASS = 'PHPUnit\\Framework\\Attributes\\Ticket'; - public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) + public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ReflectionProvider $reflectionProvider, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->reflectionProvider = $reflectionProvider; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -93,6 +102,13 @@ public function provideMinPhpVersion() : int */ public function refactor(Node $node) : ?Node { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + // make sure the attribute class exists + if (!$this->reflectionProvider->hasClass(self::TICKET_CLASS)) { + return null; + } $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); if (!$phpDocInfo instanceof PhpDocInfo) { return null; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Enum/NonAssertNonStaticMethods.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Enum/NonAssertNonStaticMethods.php new file mode 100644 index 000000000..1923209ae --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Enum/NonAssertNonStaticMethods.php @@ -0,0 +1,12 @@ +nodeNameResolver = $nodeNameResolver; + $this->reflectionResolver = $reflectionResolver; + $this->nodeTypeResolver = $nodeTypeResolver; + } + /** + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $call + */ + public function detectTestCaseCall($call) : bool + { + $objectCaller = $call instanceof MethodCall ? $call->var : $call->class; + if (!$this->nodeTypeResolver->isObjectType($objectCaller, new ObjectType('PHPUnit\\Framework\\TestCase'))) { + return \false; + } + $methodName = $this->nodeNameResolver->getName($call->name); + if (\strncmp((string) $methodName, 'assert', \strlen('assert')) !== 0 && !\in_array($methodName, NonAssertNonStaticMethods::ALL, \true)) { + return \false; + } + if ($call instanceof StaticCall && !$this->nodeNameResolver->isNames($call->class, ['static', 'self'])) { + return \false; + } + $extendedMethodReflection = $this->resolveMethodReflection($call); + if (!$extendedMethodReflection instanceof ExtendedMethodReflection) { + return \false; + } + // only handle methods in TestCase or Assert class classes + $declaringClassName = $extendedMethodReflection->getDeclaringClass()->getName(); + return \in_array($declaringClassName, [PHPUnitClassName::TEST_CASE, PHPUnitClassName::ASSERT]); + } + public function detectTestCaseCallForStatic(MethodCall $methodCall) : bool + { + if (!$this->detectTestCaseCall($methodCall)) { + return \false; + } + $extendedMethodReflection = $this->resolveMethodReflection($methodCall); + return $extendedMethodReflection instanceof ExtendedMethodReflection && $extendedMethodReflection->isStatic(); + } + /** + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $call + */ + private function resolveMethodReflection($call) : ?ExtendedMethodReflection + { + $methodName = $this->nodeNameResolver->getName($call->name); + $classReflection = $this->reflectionResolver->resolveClassReflection($call); + if (!$classReflection instanceof ClassReflection) { + return null; + } + return $classReflection->getNativeMethod($methodName); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/NullableObjectAssignCollector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/NullableObjectAssignCollector.php new file mode 100644 index 000000000..9b1a747ea --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/NullableObjectAssignCollector.php @@ -0,0 +1,76 @@ +getSomething(); + */ +final class NullableObjectAssignCollector +{ + /** + * @readonly + */ + private NodeNameResolver $nodeNameResolver; + /** + * @readonly + */ + private NodeTypeResolver $nodeTypeResolver; + public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver) + { + $this->nodeNameResolver = $nodeNameResolver; + $this->nodeTypeResolver = $nodeTypeResolver; + } + /** + * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Foreach_ $stmtsAware + */ + public function collect($stmtsAware) : VariableNameToTypeCollection + { + $variableNamesToType = []; + // first round to collect assigns + foreach ((array) $stmtsAware->stmts as $stmt) { + if (!$stmt instanceof Expression) { + return new VariableNameToTypeCollection([]); + } + if (!$stmt->expr instanceof Assign) { + continue; + } + $variableNameToType = $this->collectFromAssign($stmt->expr); + if (!$variableNameToType instanceof VariableNameToType) { + continue; + } + $variableNamesToType[] = $variableNameToType; + } + return new VariableNameToTypeCollection($variableNamesToType); + } + private function collectFromAssign(Assign $assign) : ?VariableNameToType + { + if (!$assign->expr instanceof MethodCall) { + return null; + } + if (!$assign->var instanceof Variable) { + return null; + } + $variableType = $this->nodeTypeResolver->getType($assign); + $bareVariableType = TypeCombinator::removeNull($variableType); + if (!$bareVariableType instanceof ObjectType) { + return null; + } + $variableName = $this->nodeNameResolver->getName($assign->var); + return new VariableNameToType($variableName, $bareVariableType->getClassName()); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/SetUpAssignedMockTypesResolver.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/SetUpAssignedMockTypesResolver.php new file mode 100644 index 000000000..f215d67d9 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeAnalyser/SetUpAssignedMockTypesResolver.php @@ -0,0 +1,75 @@ +nodeNameResolver = $nodeNameResolver; + } + /** + * @return array + */ + public function resolveFromClass(Class_ $class) : array + { + $setUpClassMethod = $class->getMethod(MethodName::SET_UP); + if (!$setUpClassMethod instanceof ClassMethod) { + return []; + } + $propertyNameToMockedTypes = []; + foreach ((array) $setUpClassMethod->stmts as $stmt) { + if (!$stmt instanceof Expression) { + continue; + } + if (!$stmt->expr instanceof Assign) { + continue; + } + $assign = $stmt->expr; + if (!$assign->expr instanceof MethodCall) { + continue; + } + if (!$this->nodeNameResolver->isNames($assign->expr->name, ['createMock', 'getMockBuilder'])) { + continue; + } + if (!$assign->var instanceof PropertyFetch && !$assign->var instanceof Variable) { + continue; + } + $mockedClassNameExpr = $assign->expr->getArgs()[0]->value; + if (!$mockedClassNameExpr instanceof ClassConstFetch) { + continue; + } + $propertyOrVariableName = $this->resolvePropertyOrVariableName($assign->var); + $mockedClass = $this->nodeNameResolver->getName($mockedClassNameExpr->class); + Assert::string($mockedClass); + $propertyNameToMockedTypes[$propertyOrVariableName] = $mockedClass; + } + return $propertyNameToMockedTypes; + } + /** + * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\Variable $propertyFetchOrVariable + */ + private function resolvePropertyOrVariableName($propertyFetchOrVariable) : ?string + { + if ($propertyFetchOrVariable instanceof Variable) { + return $this->nodeNameResolver->getName($propertyFetchOrVariable); + } + return $this->nodeNameResolver->getName($propertyFetchOrVariable->name); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php index 8eac3ac12..77c2f9c4e 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/NodeFactory/NestedClosureAssertFactory.php @@ -15,7 +15,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use Rector\PHPUnit\Enum\ConsecutiveVariable; @@ -49,7 +49,7 @@ public function create(MethodCall $assertMethodCall, int $assertKey) : array $callbackVariable = new Variable('callback'); $callbackAssign = new Assign($callbackVariable, $callableFirstArg->value); $stmts = [new Expression($callbackAssign)]; - $parametersArrayDimFetch = new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)); + $parametersArrayDimFetch = new ArrayDimFetch(new Variable('parameters'), new Int_($assertKey)); $callbackFuncCall = new FuncCall($callbackVariable, [new Arg($parametersArrayDimFetch)]); // add assert true to the callback $assertTrueMethodCall = new MethodCall(new Variable('this'), 'assertTrue', [new Arg($callbackFuncCall)]); @@ -62,7 +62,7 @@ public function create(MethodCall $assertMethodCall, int $assertKey) : array private function createAssertSameParameters(Expr $comparedExpr, int $assertKey) : array { // use assert same directly instead - $args = [new Arg($comparedExpr), new Arg(new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)))]; + $args = [new Arg($comparedExpr), new Arg(new ArrayDimFetch(new Variable('parameters'), new Int_($assertKey)))]; $assertSameMethodCall = new MethodCall(new Variable('this'), new Identifier('assertSame'), $args); return [new Expression($assertSameMethodCall)]; } @@ -71,7 +71,7 @@ private function createAssertSameParameters(Expr $comparedExpr, int $assertKey) */ private function createAssertNotEmpty(int $assertKey, string $emptyMethodName) : array { - $arrayDimFetch = new ArrayDimFetch(new Variable(ConsecutiveVariable::PARAMETERS), new LNumber($assertKey)); + $arrayDimFetch = new ArrayDimFetch(new Variable(ConsecutiveVariable::PARAMETERS), new Int_($assertKey)); $assertEmptyMethodCall = new MethodCall(new Variable('this'), new Identifier($emptyMethodName), [new Arg($arrayDimFetch)]); return [new Expression($assertEmptyMethodCall)]; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/AddInstanceofAssertForNullableInstanceRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/AddInstanceofAssertForNullableInstanceRector.php new file mode 100644 index 000000000..b21aaa639 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/AddInstanceofAssertForNullableInstanceRector.php @@ -0,0 +1,170 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->nullableObjectAssignCollector = $nullableObjectAssignCollector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Add explicit instance assert between nullable object assign and method call on nullable object (spotted by PHPStan)', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeTest extends TestCase +{ + public function test() + { + $someObject = $this->getSomeObject(); + + $value = $someObject->getSomeMethod(); + } + + private function getSomeObject(): ?SomeClass + { + if (mt_rand(0, 1)) { + return new SomeClass(); + } + + return null; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeTest extends TestCase +{ + public function test() + { + $someObject = $this->getSomeObject(); + $this->assertInstanceOf(SomeClass::class, $someObject); + + $value = $someObject->getSomeMethod(); + } + + private function getSomeObject(): ?SomeClass + { + if (mt_rand(0, 1)) { + return new SomeClass(); + } + + return null; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [ClassMethod::class, Foreach_::class]; + } + /** + * @param ClassMethod|Foreach_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + if ($node->stmts === [] || $node->stmts === null || \count($node->stmts) < 2) { + return null; + } + $hasChanged = \false; + $variableNameToTypeCollection = $this->nullableObjectAssignCollector->collect($node); + $next = 0; + foreach ($node->stmts as $key => $stmt) { + // has callable on nullable variable of already collected name? + $matchedNullableVariableNameToType = $this->matchedNullableVariableNameToType($stmt, $variableNameToTypeCollection); + if (!$matchedNullableVariableNameToType instanceof VariableNameToType) { + continue; + } + // adding type here + popping the variable name out + $assertInstanceOfExpression = $this->createAssertInstanceOf($matchedNullableVariableNameToType); + \array_splice($node->stmts, $key + $next, 0, [$assertInstanceOfExpression]); + // remove variable name from nullable ones + $hasChanged = \true; + // from now on, the variable is not nullable, remove to avoid double asserts + $variableNameToTypeCollection->remove($matchedNullableVariableNameToType); + ++$next; + } + if (!$hasChanged) { + return null; + } + return $node; + } + private function isNullableType(Type $type) : bool + { + if (!$type instanceof UnionType) { + return \false; + } + if (!TypeCombinator::containsNull($type)) { + return \false; + } + return \count($type->getTypes()) === 2; + } + private function createAssertInstanceOf(VariableNameToType $variableNameToType) : Expression + { + $args = [new Arg(new ClassConstFetch(new FullyQualified($variableNameToType->getObjectType()), 'class')), new Arg(new Variable($variableNameToType->getVariableName()))]; + $methodCall = new MethodCall(new Variable('this'), 'assertInstanceOf', $args); + return new Expression($methodCall); + } + private function matchedNullableVariableNameToType(Stmt $stmt, VariableNameToTypeCollection $variableNameToTypeCollection) : ?VariableNameToType + { + $matchedNullableVariableNameToType = null; + $this->traverseNodesWithCallable($stmt, function (Node $node) use($variableNameToTypeCollection, &$matchedNullableVariableNameToType) { + if (!$node instanceof MethodCall) { + return null; + } + if (!$node->var instanceof Variable) { + return null; + } + $variableType = $this->getType($node->var); + if (!$this->isNullableType($variableType)) { + return null; + } + $matchedNullableVariableNameToType = $variableNameToTypeCollection->matchByVariableName($this->getName($node->var)); + // is the variable we're interested in? + return null; + }); + return $matchedNullableVariableNameToType; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php index 55f7becd8..b0058896b 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/CreateMockToAnonymousClassRector.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\CodeQuality\Rector\ClassMethod; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; @@ -31,9 +32,8 @@ final class CreateMockToAnonymousClassRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -197,6 +197,6 @@ private function createMockedClassMethod(MethodCall $rootMethodCall, MethodCall throw new NotImplementedYetException(); } $returnedExpr = $methodCall->getArgs()[0]->value; - return new ClassMethod($methodName, ['flags' => Class_::MODIFIER_PUBLIC, 'stmts' => [new Return_($returnedExpr)]]); + return new ClassMethod($methodName, ['flags' => Modifiers::PUBLIC, 'stmts' => [new Return_($returnedExpr)]]); } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php index 92648cceb..b9f52c007 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/DataProviderArrayItemsNewLinedRector.php @@ -4,8 +4,8 @@ namespace Rector\PHPUnit\CodeQuality\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -21,14 +21,12 @@ final class DataProviderArrayItemsNewLinedRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php index 5048239dc..6d1a1bcab 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/EntityDocumentCreateMockToDirectNewRector.php @@ -30,19 +30,16 @@ final class EntityDocumentCreateMockToDirectNewRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PHPUnit\CodeQuality\NodeAnalyser\DoctrineEntityDocumentAnalyser */ - private $doctrineEntityDocumentAnalyser; + private DoctrineEntityDocumentAnalyser $doctrineEntityDocumentAnalyser; public function __construct(ValueResolver $valueResolver, ReflectionProvider $reflectionProvider, DoctrineEntityDocumentAnalyser $doctrineEntityDocumentAnalyser) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/RemoveEmptyTestMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/RemoveEmptyTestMethodRector.php index 9374b9c77..1e34e686c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/RemoveEmptyTestMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/RemoveEmptyTestMethodRector.php @@ -5,7 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -17,9 +17,8 @@ final class RemoveEmptyTestMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -70,6 +69,6 @@ public function refactor(Node $node) : ?int if ($node->stmts !== []) { return null; } - return NodeTraverser::REMOVE_NODE; + return NodeVisitor::REMOVE_NODE; } } 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 0f3f65b7c..5216523d9 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 @@ -20,24 +20,20 @@ final class ReplaceTestAnnotationWithPrefixedFunctionRector extends AbstractRect { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php index d88971883..97109bd04 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestFunctionPrefixWithAttributeRector.php @@ -19,19 +19,16 @@ final class ReplaceTestFunctionPrefixWithAttributeRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpAttributeAnalyzer $phpAttributeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddCoversClassAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddCoversClassAttributeRector.php index d2f28fc4c..29e96d50c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddCoversClassAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddCoversClassAttributeRector.php @@ -26,24 +26,20 @@ final class AddCoversClassAttributeRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(ReflectionProvider $reflectionProvider, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpAttributeAnalyzer $phpAttributeAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->reflectionProvider = $reflectionProvider; @@ -119,9 +115,7 @@ private function resolveSourceClassNames(string $className) : array $partCount = count($classNameParts); $classNameParts[$partCount - 1] = preg_replace(['#TestCase$#', '#Test$#'], '', $classNameParts[$partCount - 1]); $possibleTestClassNames = [implode('\\', $classNameParts)]; - $partsWithoutTests = array_filter($classNameParts, static function (?string $part) : bool { - return $part === null ? \false : !in_array(strtolower($part), ['test', 'tests'], \true); - }); + $partsWithoutTests = array_filter($classNameParts, static fn(?string $part): bool => $part === null ? \false : !in_array(strtolower($part), ['test', 'tests'], \true)); $possibleTestClassNames[] = implode('\\', $partsWithoutTests); return $possibleTestClassNames; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddParentSetupCallOnSetupRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddParentSetupCallOnSetupRector.php index 94c33d14c..669c9a770 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddParentSetupCallOnSetupRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddParentSetupCallOnSetupRector.php @@ -23,14 +23,12 @@ final class AddParentSetupCallOnSetupRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; 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 588c3c728..790ee8afd 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 @@ -23,24 +23,20 @@ final class AddSeeTestAnnotationRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PHPUnit\Naming\TestClassNameResolver */ - private $testClassNameResolver; + private TestClassNameResolver $testClassNameResolver; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/ConstructClassMethodToSetUpTestCaseRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/ConstructClassMethodToSetUpTestCaseRector.php index c47682642..a7a54ae43 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/ConstructClassMethodToSetUpTestCaseRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/ConstructClassMethodToSetUpTestCaseRector.php @@ -12,7 +12,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Reflection\ClassReflection; use Rector\NodeAnalyzer\ClassAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -33,29 +33,24 @@ final class ConstructClassMethodToSetUpTestCaseRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\SetUpMethodDecorator */ - private $setUpMethodDecorator; + private SetUpMethodDecorator $setUpMethodDecorator; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ClassAnalyzer $classAnalyzer, VisibilityManipulator $visibilityManipulator, SetUpMethodDecorator $setUpMethodDecorator, ReflectionResolver $reflectionResolver) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -112,11 +107,11 @@ public function refactor(Node $node) : ?Node if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } - $constructClassMethod = $node->getMethod(MethodName::CONSTRUCT); - if (!$constructClassMethod instanceof ClassMethod) { + if ($this->shouldSkipClass($node)) { return null; } - if ($this->classAnalyzer->isAnonymousClass($node)) { + $constructClassMethod = $node->getMethod(MethodName::CONSTRUCT); + if (!$constructClassMethod instanceof ClassMethod) { return null; } if ($this->shouldSkip($node, $constructClassMethod)) { @@ -158,11 +153,11 @@ private function shouldSkip(Class_ $class, ClassMethod $classMethod) : bool $isFoundParamUsed = \false; $this->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $subNode) use($paramNames, &$isFoundParamUsed) : ?int { if ($subNode instanceof StaticCall && $this->isName($subNode->name, MethodName::CONSTRUCT)) { - return NodeTraverser::DONT_TRAVERSE_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CHILDREN; } if ($subNode instanceof Variable && $this->isNames($subNode, $paramNames)) { $isFoundParamUsed = \true; - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; } return null; }); @@ -194,12 +189,21 @@ private function isParentCallNamed(Node $node, string $desiredMethodName) : bool if ($node->class instanceof Expr) { return \false; } - if (!$this->nodeNameResolver->isName($node->class, 'parent')) { + if (!$this->isName($node->class, 'parent')) { return \false; } if ($node->name instanceof Expr) { return \false; } - return $this->nodeNameResolver->isName($node->name, $desiredMethodName); + return $this->isName($node->name, $desiredMethodName); + } + private function shouldSkipClass(Class_ $class) : bool + { + $className = $this->getName($class); + // probably helper class with access to protected methods like createMock() + if (\substr_compare((string) $className, 'Test', -\strlen('Test')) !== 0 && \substr_compare((string) $className, 'TestCase', -\strlen('TestCase')) !== 0) { + return \true; + } + return $this->classAnalyzer->isAnonymousClass($class); } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php index 127072a13..e549b39d7 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/NarrowUnusedSetUpDefinedPropertyRector.php @@ -26,24 +26,20 @@ final class NarrowUnusedSetUpDefinedPropertyRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\NodeManipulator\PropertyManipulator */ - private $propertyManipulator; + private PropertyManipulator $propertyManipulator; /** * @readonly - * @var \PhpParser\NodeFinder */ - private $nodeFinder; + private NodeFinder $nodeFinder; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ReflectionResolver $reflectionResolver, PropertyManipulator $propertyManipulator) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php index 9a6e360a9..e757285e3 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector.php @@ -7,32 +7,28 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Stmt\Class_; -use PHPStan\Reflection\ClassReflection; -use PHPStan\Type\ObjectType; +use Rector\PHPUnit\CodeQuality\NodeAnalyser\AssertMethodAnalyzer; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; -use Rector\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\PHPUnit\Tests\Rector\Class_\PreferPHPUnitSelfCallRector\PreferPHPUnitSelfCallRectorTest + * @see \Rector\PHPUnit\Tests\CodeQuality\Rector\Class_\PreferPHPUnitSelfCallRector\PreferPHPUnitSelfCallRectorTest */ final class PreferPHPUnitSelfCallRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ReflectionResolver $reflectionResolver) + private AssertMethodAnalyzer $assertMethodAnalyzer; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, AssertMethodAnalyzer $assertMethodAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; - $this->reflectionResolver = $reflectionResolver; + $this->assertMethodAnalyzer = $assertMethodAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -80,31 +76,15 @@ public function refactor(Node $node) : ?Node if (!$node instanceof MethodCall) { return null; } - $methodName = $this->getName($node->name); - if (!\is_string($methodName)) { - return null; - } - if (\strncmp($methodName, 'assert', \strlen('assert')) !== 0) { - return null; - } - if (!$this->isName($node->var, 'this')) { + if ($node->isFirstClassCallable()) { return null; } - if (!$this->isObjectType($node->var, new ObjectType('PHPUnit\\Framework\\TestCase'))) { + if (!$this->assertMethodAnalyzer->detectTestCaseCallForStatic($node)) { return null; } - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - if ($classReflection instanceof ClassReflection && $classReflection->hasNativeMethod($methodName)) { - $method = $classReflection->getNativeMethod($methodName); - if ($node->isFirstClassCallable()) { - return null; - } - if ($method->isStatic()) { - $hasChanged = \true; - return $this->nodeFactory->createStaticCall('self', $methodName, $node->getArgs()); - } - } - return null; + $methodName = $this->getName($node->name); + $hasChanged = \true; + return $this->nodeFactory->createStaticCall('self', $methodName, $node->getArgs()); }); if ($hasChanged) { return $node; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php index f278627d5..4fb220ec7 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector.php @@ -4,12 +4,14 @@ namespace Rector\PHPUnit\CodeQuality\Rector\Class_; use PhpParser\Node; +use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; +use Rector\PHPUnit\CodeQuality\NodeAnalyser\AssertMethodAnalyzer; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -21,12 +23,16 @@ final class PreferPHPUnitThisCallRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) + private TestsNodeAnalyzer $testsNodeAnalyzer; + /** + * @readonly + */ + private AssertMethodAnalyzer $assertMethodAnalyzer; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, AssertMethodAnalyzer $assertMethodAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->assertMethodAnalyzer = $assertMethodAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -71,26 +77,20 @@ public function refactor(Node $node) : ?Node } $hasChanged = \false; $this->traverseNodesWithCallable($node, function (Node $node) use(&$hasChanged) { - $isStatic = $node instanceof ClassMethod && $node->isStatic() || $node instanceof Closure && $node->static; - if ($isStatic) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + $isInsideStaticFunctionLike = $node instanceof ClassMethod && $node->isStatic() || ($node instanceof Closure || $node instanceof ArrowFunction) && $node->static; + if ($isInsideStaticFunctionLike) { + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof StaticCall) { return null; } - $methodName = $this->getName($node->name); - if (!\is_string($methodName)) { - return null; - } - if (!$this->isNames($node->class, ['static', 'self'])) { + if ($node->isFirstClassCallable()) { return null; } - if (\strncmp($methodName, 'assert', \strlen('assert')) !== 0) { - return null; - } - if ($node->isFirstClassCallable()) { + if (!$this->assertMethodAnalyzer->detectTestCaseCall($node)) { return null; } + $methodName = $this->getName($node->name); $hasChanged = \true; return $this->nodeFactory->createMethodCall('this', $methodName, $node->getArgs()); }); diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/RemoveDataProviderParamKeysRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/RemoveDataProviderParamKeysRector.php new file mode 100644 index 000000000..96c237109 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/RemoveDataProviderParamKeysRector.php @@ -0,0 +1,148 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->dataProviderClassMethodFinder = $dataProviderClassMethodFinder; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove data provider keys, that should match param names, as order is good enough', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\DataProvider; + +final class SomeServiceTest extends TestCase +{ + #[DataProvider('provideData')] + public function test(string $name): void + { + } + + public function provideData(): array + { + return [ + 'name' => ['Tom'], + ]; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\DataProvider; + +final class SomeServiceTest extends TestCase +{ + #[DataProvider('provideData')] + public function test(string $name): void + { + } + + public function provideData(): array + { + return [ + ['Tom'], + ]; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $dataProviderClassMethods = $this->dataProviderClassMethodFinder->find($node); + $hasChanged = \false; + foreach ($dataProviderClassMethods as $dataProviderClassMethod) { + // 1. remove array keys + foreach ((array) $dataProviderClassMethod->stmts as $classMethodStmt) { + if (!$classMethodStmt instanceof Return_) { + continue; + } + if (!$classMethodStmt->expr instanceof Array_) { + continue; + } + $returnedArray = $classMethodStmt->expr; + foreach ($returnedArray->items as $arrayItem) { + if (!$arrayItem->value instanceof Array_) { + continue; + } + $nestedArray = $arrayItem->value; + foreach ($nestedArray->items as $nestedArrayItem) { + if (!$nestedArrayItem->key instanceof Expr) { + continue; + } + // remove key + $nestedArrayItem->key = null; + $hasChanged = \true; + } + } + } + // 2. remove yield keys + foreach ((array) $dataProviderClassMethod->stmts as $classMethodStmt) { + if (!$classMethodStmt instanceof Expression) { + continue; + } + if (!$classMethodStmt->expr instanceof Yield_) { + continue; + } + $yield = $classMethodStmt->expr; + if (!$yield->value instanceof Array_) { + continue; + } + $yieldArray = $yield->value; + foreach ($yieldArray->items as $yieldArrayItem) { + if (!$yieldArrayItem->key instanceof Expr) { + continue; + } + // remove key + $yieldArrayItem->key = null; + $hasChanged = \true; + } + } + } + if ($hasChanged === \false) { + return null; + } + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php index f59d7ae5f..d9a229558 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SetUpBeforeClassToSetUpRector.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\CodeQuality\Rector\Class_; +use PhpParser\Modifiers; use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\PropertyFetch; @@ -23,9 +24,8 @@ final class SetUpBeforeClassToSetUpRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -117,18 +117,18 @@ public function refactor(Node $node) : ?Node return null; } // remove static flag - $setUpBeforeClassMethod->flags -= Class_::MODIFIER_STATIC; + $setUpBeforeClassMethod->flags -= Modifiers::STATIC; // remove public flag - $setUpBeforeClassMethod->flags -= Class_::MODIFIER_PUBLIC; + $setUpBeforeClassMethod->flags -= Modifiers::PUBLIC; // make protected - $setUpBeforeClassMethod->flags += Class_::MODIFIER_PROTECTED; + $setUpBeforeClassMethod->flags += Modifiers::PROTECTED; $setUpBeforeClassMethod->name = new Identifier('setUp'); foreach ($node->getProperties() as $property) { if (!$property->isStatic()) { continue; } if ($this->isNames($property, $changedPropertyNames)) { - $property->flags -= Class_::MODIFIER_STATIC; + $property->flags -= Modifiers::STATIC; } } // replace same property access in the class diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php index 8504919f9..805074df0 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/SingleMockPropertyTypeRector.php @@ -7,7 +7,7 @@ use PhpParser\Node\IntersectionType; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\UnionType; -use RectorPrefix202411\PHPUnit\Framework\MockObject\MockObject; +use RectorPrefix202506\PHPUnit\Framework\MockObject\MockObject; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -19,9 +19,8 @@ final class SingleMockPropertyTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php index def483940..259460d8f 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TestWithToDataProviderRector.php @@ -3,12 +3,13 @@ declare (strict_types=1); namespace Rector\PHPUnit\CodeQuality\Rector\Class_; -use RectorPrefix202411\Nette\Utils\Json; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\Strings; +use PhpParser\Modifiers; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; @@ -33,33 +34,25 @@ final class TestWithToDataProviderRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\NodeManipulator\ClassInsertManipulator */ - private $classInsertManipulator; - /** - * @var bool - */ - private $hasChanged = \false; + private ClassInsertManipulator $classInsertManipulator; + private bool $hasChanged = \false; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpDocInfoFactory $phpDocInfoFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, ClassInsertManipulator $classInsertManipulator) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -167,7 +160,7 @@ private function refactorClassMethod(Class_ $class, ClassMethod $classMethod) : $returnValue = new Array_($arrayItemsSingleLine); } $providerMethod = new ClassMethod($dataProviderName); - $providerMethod->flags = Class_::MODIFIER_PUBLIC; + $providerMethod->flags = Modifiers::PUBLIC; $providerMethod->stmts[] = new Return_($returnValue); $this->classInsertManipulator->addAsFirstMethod($class, $providerMethod); } @@ -179,7 +172,7 @@ private function extractTestWithData(GenericTagValueNode $genericTagValueNode) : $testWithItems = \explode("\n", \trim($genericTagValueNode->value)); $jsonArray = []; foreach ($testWithItems as $testWithItem) { - $jsonArray[] = Json::decode(\trim($testWithItem), Json::FORCE_ARRAY); + $jsonArray[] = Json::decode(\trim($testWithItem), \true); } return $jsonArray; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php new file mode 100644 index 000000000..b95a65d4f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php @@ -0,0 +1,241 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->staticTypeMapper = $staticTypeMapper; + $this->setUpAssignedMockTypesResolver = $setUpAssignedMockTypesResolver; + $this->methodParametersAndReturnTypesResolver = $methodParametersAndReturnTypesResolver; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Decorate callbacks and arrow functions in willReturnCallback() with known param/return types based on reflection method', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeTest extends TestCase +{ + public function testSomething() + { + $this->createMock(SomeClass::class) + ->method('someMethod') + ->willReturnCallback(function ($arg) { + return $arg; + }); + } +} + +final class SomeClass +{ + public function someMethod(string $arg): string + { + return $arg . ' !'; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeTest extends TestCase +{ + public function testSomething() + { + $this->createMock(SomeClass::class) + ->method('someMethod') + ->willReturnCallback( + function (string $arg): string { + return $arg; + } + ); + } +} + +final class SomeClass +{ + public function someMethod(string $arg): string + { + return $arg . ' !'; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $hasChanged = \false; + $propertyNameToMockedTypes = $this->setUpAssignedMockTypesResolver->resolveFromClass($node); + $this->traverseNodesWithCallable($node->getMethods(), function (Node $node) use(&$hasChanged, $propertyNameToMockedTypes) { + if (!$node instanceof MethodCall || $node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node->name, self::WILL_RETURN_CALLBACK)) { + return null; + } + $innerArg = $node->getArgs()[0]->value; + if (!$innerArg instanceof ArrowFunction && !$innerArg instanceof Closure) { + return null; + } + if (!$node->var instanceof MethodCall) { + return null; + } + $parentMethodCall = $node->var; + if (!$this->isName($parentMethodCall->name, 'method')) { + return null; + } + $methodNameExpr = $parentMethodCall->getArgs()[0]->value; + if (!$methodNameExpr instanceof String_) { + return null; + } + $methodName = $methodNameExpr->value; + $callerType = $this->getType($parentMethodCall->var); + if ($callerType instanceof ObjectType && $callerType->getClassName() === InvocationMocker::class) { + $parentMethodCall = $parentMethodCall->var; + if ($parentMethodCall instanceof MethodCall) { + $callerType = $this->getType($parentMethodCall->var); + } + } + $callerType = $this->fallbackMockedObjectInSetUp($callerType, $parentMethodCall, $propertyNameToMockedTypes); + // we need mocks + if (!$callerType instanceof IntersectionType) { + return null; + } + $hasChanged = \false; + $parameterTypesAndReturnType = $this->methodParametersAndReturnTypesResolver->resolveFromReflection($callerType, $methodName); + if (!$parameterTypesAndReturnType instanceof ParamTypesAndReturnType) { + return null; + } + foreach ($innerArg->params as $key => $param) { + // avoid typing variadic parameters + if ($param->variadic) { + continue; + } + // already filled, lets skip it + if ($param->type instanceof Node) { + continue; + } + $nativeParameterType = $parameterTypesAndReturnType->getParamTypes()[$key] ?? null; + // we need specific non-mixed type + if ($nativeParameterType === null) { + continue; + } + if ($nativeParameterType instanceof MixedType) { + continue; + } + $parameterTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($nativeParameterType, TypeKind::PARAM); + if (!$parameterTypeNode instanceof Node) { + continue; + } + $param->type = $parameterTypeNode; + $hasChanged = \true; + } + if (!$innerArg->returnType instanceof Node) { + $returnTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($parameterTypesAndReturnType->getReturnType(), TypeKind::RETURN); + if ($returnTypeNode instanceof Node) { + $innerArg->returnType = $returnTypeNode; + $hasChanged = \true; + } + } + $hasChanged = \true; + }); + if (!$hasChanged) { + return null; + } + return $node; + } + /** + * @param array $propertyNameToMockedTypes + * @return mixed + */ + private function fallbackMockedObjectInSetUp(Type $callerType, Expr $expr, array $propertyNameToMockedTypes) + { + if (!$callerType instanceof ObjectType && !$callerType instanceof NeverType) { + return $callerType; + } + if (!$expr instanceof MethodCall) { + return $callerType; + } + if ($callerType instanceof ObjectType && $callerType->getClassName() !== ClassName::MOCK_OBJECT) { + return $callerType; + } + // type is missing, because of "final" keyword on mocked class + // resolve from constructor instead + if (!$expr->var instanceof PropertyFetch && !$expr->var instanceof Variable) { + return $callerType; + } + if ($expr->var instanceof Variable) { + $propertyOrVariableName = $this->getName($expr->var); + } else { + $propertyOrVariableName = $this->getName($expr->var->name); + } + if (isset($propertyNameToMockedTypes[$propertyOrVariableName])) { + $mockedType = $propertyNameToMockedTypes[$propertyOrVariableName]; + return new IntersectionType([$callerType, new ObjectType($mockedType)]); + } + return $callerType; + } +} 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 0a8184eb4..ddc212415 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,9 +10,14 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; +use PHPStan\Type\Generic\GenericObjectType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; +use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; +use Rector\Comments\NodeDocBlock\DocBlockUpdater; +use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\NodeTransformer; +use Rector\PHPStan\ScopeFetcher; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\PHPUnit\NodeFinder\DataProviderClassMethodFinder; use Rector\Rector\AbstractRector; @@ -28,30 +33,41 @@ final class YieldDataProviderRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\NodeTransformer */ - private $nodeTransformer; + private NodeTransformer $nodeTransformer; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeFinder\DataProviderClassMethodFinder */ - private $dataProviderClassMethodFinder; + private DataProviderClassMethodFinder $dataProviderClassMethodFinder; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; - public function __construct(NodeTransformer $nodeTransformer, TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, PhpDocInfoFactory $phpDocInfoFactory) + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer; + /** + * @readonly + */ + private PhpDocTypeChanger $phpDocTypeChanger; + /** + * @readonly + */ + private DocBlockUpdater $docBlockUpdater; + public function __construct(NodeTransformer $nodeTransformer, TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, PhpDocInfoFactory $phpDocInfoFactory, IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, PhpDocTypeChanger $phpDocTypeChanger, DocBlockUpdater $docBlockUpdater) { $this->nodeTransformer = $nodeTransformer; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->dataProviderClassMethodFinder = $dataProviderClassMethodFinder; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->isClassMethodUsedAnalyzer = $isClassMethodUsedAnalyzer; + $this->phpDocTypeChanger = $phpDocTypeChanger; + $this->docBlockUpdater = $docBlockUpdater; } public function getRuleDefinition() : RuleDefinition { @@ -91,7 +107,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactor(Node $node) : ?Node + public function refactor(Node $node) : ?Class_ { if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; @@ -103,6 +119,10 @@ public function refactor(Node $node) : ?Node if (!$array instanceof Array_) { continue; } + $scope = ScopeFetcher::fetch($node); + if ($this->isClassMethodUsedAnalyzer->isClassMethodUsed($node, $dataProviderClassMethod, $scope)) { + continue; + } $this->transformArrayToYieldsOnMethodNode($dataProviderClassMethod, $array); $hasChanged = \true; } @@ -149,6 +169,16 @@ private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Ar private function removeReturnTag(ClassMethod $classMethod) : void { $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); - $phpDocInfo->removeByType(ReturnTagValueNode::class); + if (!$phpDocInfo->getReturnTagValue() instanceof ReturnTagValueNode) { + return; + } + if ($phpDocInfo->getReturnType()->isArray()->yes()) { + $keyType = $phpDocInfo->getReturnType()->getIterableKeyType(); + $itemType = $phpDocInfo->getReturnType()->getIterableValueType(); + $this->phpDocTypeChanger->changeReturnType($classMethod, $phpDocInfo, new GenericObjectType('Iterator', [$keyType, $itemType])); + } else { + $phpDocInfo->removeByType(ReturnTagValueNode::class); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); + } } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php new file mode 100644 index 000000000..414a544f5 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php @@ -0,0 +1,149 @@ +valueResolver = $valueResolver; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Turns assert() calls to their explicit PHPUnit assert alternative', [new CodeSample('assert($value === 100, "message");', '$this->assertSame(100, $value, "message");')]); + } + /** + * @return class-string[] + */ + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + * @return \PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall|null + */ + public function refactor(Node $node) + { + if ($node->isFirstClassCallable()) { + return null; + } + if (!$this->isName($node, 'assert')) { + return null; + } + if (!$this->isTestFilePath($node) && !$this->isBehatContext($node)) { + return null; + } + $comparedExpr = $node->getArgs()[0]->value; + if ($comparedExpr instanceof Equal) { + $methodName = AssertMethod::ASSERT_EQUALS; + $exprs = [$comparedExpr->right, $comparedExpr->left]; + } elseif ($comparedExpr instanceof Identical) { + $methodName = AssertMethod::ASSERT_SAME; + $exprs = [$comparedExpr->right, $comparedExpr->left]; + } elseif ($comparedExpr instanceof NotIdentical) { + if ($this->valueResolver->isNull($comparedExpr->right)) { + $methodName = 'assertNotNull'; + $exprs = [$comparedExpr->left]; + } else { + return null; + } + } elseif ($comparedExpr instanceof Bool_) { + $methodName = 'assertTrue'; + $exprs = [$comparedExpr]; + } elseif ($comparedExpr instanceof FuncCall) { + if ($this->isName($comparedExpr, 'method_exists')) { + $methodName = 'assertTrue'; + $exprs = [$comparedExpr]; + } else { + return null; + } + } elseif ($comparedExpr instanceof Instanceof_) { + // outside TestCase + $methodName = 'assertInstanceOf'; + $exprs = []; + if ($comparedExpr->class instanceof FullyQualified) { + $classConstFetch = new ClassConstFetch($comparedExpr->class, 'class'); + $exprs[] = $classConstFetch; + } else { + return null; + } + $exprs[] = $comparedExpr->expr; + } else { + return null; + } + // is there a comment message + if (isset($node->getArgs()[1])) { + $exprs[] = $node->getArgs()[1]->value; + } + return $this->createCall($node, $methodName, $exprs); + } + private function isBehatContext(FuncCall $funcCall) : bool + { + $scope = ScopeFetcher::fetch($funcCall); + if (!$scope->getClassReflection() instanceof ClassReflection) { + return \false; + } + $className = $scope->getClassReflection()->getName(); + // special case with static call + return \substr_compare($className, 'Context', -\strlen('Context')) === 0; + } + private function isTestFilePath(FuncCall $funcCall) : bool + { + $scope = ScopeFetcher::fetch($funcCall); + if (!$scope->getClassReflection() instanceof ClassReflection) { + return \false; + } + $className = $scope->getClassReflection()->getName(); + if (\substr_compare($className, 'Test', -\strlen('Test')) === 0) { + return \true; + } + return \substr_compare($className, 'TestCase', -\strlen('TestCase')) === 0; + } + /** + * @param Expr[] $exprs + * @return \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall + */ + private function createCall(FuncCall $funcCall, string $methodName, array $exprs) + { + $args = []; + foreach ($exprs as $expr) { + $args[] = new Arg($expr); + } + if ($this->isBehatContext($funcCall)) { + $assertFullyQualified = new FullyQualified(PHPUnitClassName::ASSERT); + return new StaticCall($assertFullyQualified, $methodName, $args); + } + return new MethodCall(new Variable('this'), $methodName, $args); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php index 5d2ba5e6b..25688306c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php @@ -21,9 +21,8 @@ final class AssertCompareOnCountableWithMethodToAssertCountRector extends Abstra { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -36,7 +35,7 @@ public function getRuleDefinition() : RuleDefinition , <<<'CODE_SAMPLE' $this->assertCount(1, $countable); CODE_SAMPLE -)]); +), new CodeSample('$this->assertSame(10, count($anything), "message");', '$this->assertCount(10, $anything, "message");')]); } /** * @return array> @@ -51,7 +50,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) { - if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, ['assertSame', 'assertEquals'])) { + if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, ['assertSame', 'assertNotSame', 'assertEquals', 'assertNotEquals'])) { return null; } if ($node->isFirstClassCallable()) { @@ -62,11 +61,11 @@ public function refactor(Node $node) return null; } $comparedExpr = $assertArgs[1]->value; - if ($comparedExpr instanceof FuncCall && $this->isName($comparedExpr->name, 'count')) { + if ($comparedExpr instanceof FuncCall && $this->isNames($comparedExpr->name, ['count', 'sizeof', 'iterator_count'])) { $countArg = $comparedExpr->getArgs()[0]; $assertArgs[1] = new Arg($countArg->value); $node->args = $assertArgs; - $node->name = new Identifier('assertCount'); + $this->renameMethod($node); return $node; } if ($comparedExpr instanceof MethodCall && $this->isName($comparedExpr->name, 'count') && $comparedExpr->getArgs() === []) { @@ -75,9 +74,20 @@ public function refactor(Node $node) $args = $assertArgs; $args[1] = new Arg($comparedExpr->var); $node->args = $args; - $node->name = new Identifier('assertCount'); + $this->renameMethod($node); } } return null; } + /** + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $node + */ + private function renameMethod($node) : void + { + if ($this->isNames($node->name, ['assertSame', 'assertEquals'])) { + $node->name = new Identifier('assertCount'); + } elseif ($this->isNames($node->name, ['assertNotSame', 'assertNotEquals'])) { + $node->name = new Identifier('assertNotCount'); + } + } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php deleted file mode 100644 index d93e3835c..000000000 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php +++ /dev/null @@ -1,118 +0,0 @@ -testsNodeAnalyzer = $testsNodeAnalyzer; - $this->functionNamesWithAssertMethods = [new FunctionNameWithAssertMethods('count', self::ASSERT_COUNT, self::ASSERT_NOT_COUNT), new FunctionNameWithAssertMethods('sizeof', self::ASSERT_COUNT, self::ASSERT_NOT_COUNT), new FunctionNameWithAssertMethods('iterator_count', self::ASSERT_COUNT, self::ASSERT_NOT_COUNT), new FunctionNameWithAssertMethods('get_class', 'assertInstanceOf', 'assertNotInstanceOf')]; - } - public function getRuleDefinition() : RuleDefinition - { - return new RuleDefinition('Turns vague php-only method in PHPUnit TestCase to more specific', [new CodeSample('$this->assertSame(10, count($anything), "message");', '$this->assertCount(10, $anything, "message");'), new CodeSample('$this->assertNotEquals(get_class($value), SomeInstance::class);', '$this->assertNotInstanceOf(SomeInstance::class, $value);')]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [MethodCall::class, StaticCall::class]; - } - /** - * @param MethodCall|StaticCall $node - */ - public function refactor(Node $node) : ?Node - { - if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, ['assertSame', 'assertNotSame', 'assertEquals', 'assertNotEquals'])) { - return null; - } - if ($node->isFirstClassCallable()) { - return null; - } - // we need 2 args - if (!isset($node->args[1])) { - return null; - } - $firstArgument = $node->getArgs()[0]; - $secondArgument = $node->getArgs()[1]; - $firstArgumentValue = $firstArgument->value; - $secondArgumentValue = $secondArgument->value; - if ($secondArgumentValue instanceof FuncCall) { - return $this->processFuncCallArgumentValue($node, $secondArgumentValue, $firstArgument); - } - if ($firstArgumentValue instanceof FuncCall) { - return $this->processFuncCallArgumentValue($node, $firstArgumentValue, $secondArgument); - } - return null; - } - /** - * @return MethodCall|StaticCall|null - * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $node - */ - private function processFuncCallArgumentValue($node, FuncCall $funcCall, Arg $requiredArg) : ?Node - { - foreach ($this->functionNamesWithAssertMethods as $functionNameWithAssertMethod) { - if (!$this->isName($funcCall, $functionNameWithAssertMethod->getFunctionName())) { - continue; - } - $this->renameMethod($node, $functionNameWithAssertMethod); - $this->moveFunctionArgumentsUp($node, $funcCall, $requiredArg); - return $node; - } - return null; - } - /** - * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $node - */ - private function renameMethod($node, FunctionNameWithAssertMethods $functionNameWithAssertMethods) : void - { - if ($this->isNames($node->name, ['assertSame', 'assertEquals'])) { - $node->name = new Identifier($functionNameWithAssertMethods->getAssetMethodName()); - } elseif ($this->isNames($node->name, ['assertNotSame', 'assertNotEquals'])) { - $node->name = new Identifier($functionNameWithAssertMethods->getNotAssertMethodName()); - } - } - /** - * Handles custom error messages to not be overwrite by function with multiple args. - * @param \PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall $node - */ - private function moveFunctionArgumentsUp($node, FuncCall $funcCall, Arg $requiredArg) : void - { - $node->args[1] = $funcCall->getArgs()[0]; - $node->args[0] = $requiredArg; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php index dcacd4e46..d3ccf1f97 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php @@ -32,18 +32,16 @@ final class AssertComparisonToSpecificMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var BinaryOpWithAssertMethod[] */ - private $binaryOpWithAssertMethods = []; + private array $binaryOpWithAssertMethods = []; public function __construct(IdentifierManipulator $identifierManipulator, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->identifierManipulator = $identifierManipulator; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php index 0d8eb7130..b18da80f9 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php @@ -23,16 +23,15 @@ final class AssertEmptyNullableObjectToAssertInstanceofRector extends AbstractRe { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change assertNotEmpty() on an object to more clear assertInstanceof()', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change assertNotEmpty() and assertNotNull() on an object to more clear assertInstanceof()', [new CodeSample(<<<'CODE_SAMPLE' use PHPUnit\Framework\TestCase; class SomeClass extends TestCase @@ -75,7 +74,7 @@ public function refactor(Node $node) : ?Node if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } - if (!$this->isNames($node->name, ['assertNotEmpty', 'assertEmpty'])) { + if (!$this->isNames($node->name, ['assertNotEmpty', 'assertEmpty', 'assertNull', 'assertNotNull'])) { return null; } if ($node->isFirstClassCallable()) { @@ -93,11 +92,15 @@ public function refactor(Node $node) : ?Node if (!$pureType instanceof ObjectType) { return null; } - $methodName = $this->isName($node->name, 'assertEmpty') ? 'assertNotInstanceOf' : 'assertInstanceOf'; + $methodName = $this->isNames($node->name, ['assertEmpty', 'assertNull']) ? 'assertNotInstanceOf' : 'assertInstanceOf'; $node->name = new Identifier($methodName); $fullyQualified = new FullyQualified($pureType->getClassName()); + $customMessageArg = $node->getArgs()[1] ?? null; $node->args[0] = new Arg(new ClassConstFetch($fullyQualified, 'class')); $node->args[1] = $firstArg; + if ($customMessageArg instanceof Arg) { + $node->args[] = $customMessageArg; + } return $node; } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php index 85f14e216..ad988a7b8 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php @@ -8,7 +8,7 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\DNumber; +use PhpParser\Node\Scalar\Float_; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\PHPUnit\NodeFactory\AssertCallFactory; use Rector\Rector\AbstractRector; @@ -23,14 +23,12 @@ final class AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector ex { /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\AssertCallFactory */ - private $assertCallFactory; + private AssertCallFactory $assertCallFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(AssertCallFactory $assertCallFactory, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->assertCallFactory = $assertCallFactory; @@ -42,16 +40,12 @@ public function getRuleDefinition() : RuleDefinition // 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, PHP_FLOAT_EPSILON); -$this->assertEqualsWithDelta(10.20, $value, PHP_FLOAT_EPSILON); $this->assertEqualsWithDelta(10.200, $value, PHP_FLOAT_EPSILON); -$this->assertSame(10, $value); CODE_SAMPLE )]); @@ -76,13 +70,17 @@ public function refactor(Node $node) : ?Node } $args = $node->getArgs(); $firstValue = $args[0]->value; - if (!$firstValue instanceof DNumber) { + if (!$firstValue instanceof Float_) { return null; } + $customMessageArg = $args[2] ?? null; $newMethodCall = $this->assertCallFactory->createCallWithName($node, 'assertEqualsWithDelta'); $newMethodCall->args[0] = $args[0]; $newMethodCall->args[1] = $args[1]; $newMethodCall->args[2] = new Arg(new ConstFetch(new Name('PHP_FLOAT_EPSILON'))); + if ($customMessageArg instanceof Arg) { + $newMethodCall->args[] = $customMessageArg; + } return $newMethodCall; } public function provideMinPhpVersion() : int diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php index 3555e982a..9c15f3ded 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php @@ -4,16 +4,23 @@ namespace Rector\PHPUnit\CodeQuality\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Scalar\Encapsed; +use PhpParser\Node\Scalar\InterpolatedString; +use PHPStan\Type\BooleanType; use PHPStan\Type\Constant\ConstantArrayType; +use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; +use PHPStan\Type\MixedType; +use PHPStan\Type\NeverType; +use PHPStan\Type\ObjectType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use PHPStan\Type\TypeCombinator; use Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; @@ -26,14 +33,12 @@ final class AssertEqualsToSameRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ @@ -78,7 +83,7 @@ public function refactor(Node $node) : ?Node return null; } $args = $node->getArgs(); - if (!isset($args[0])) { + if (!isset($args[0], $args[1])) { return null; } $firstArgValue = $args[0]->value; @@ -88,12 +93,39 @@ public function refactor(Node $node) : ?Node if ($this->shouldSkipConstantArrayType($firstArgValue)) { return null; } + if ($this->shouldSkipLooseComparison($args)) { + return null; + } $hasChanged = $this->identifierManipulator->renameNodeWithMap($node, self::RENAME_METHODS_MAP); return $hasChanged ? $node : null; } + /** + * @param Arg[] $args + */ + private function shouldSkipLooseComparison(array $args) : bool + { + $firstArgType = $this->nodeTypeResolver->getNativeType($args[0]->value); + $secondArgType = TypeCombinator::removeNull($this->nodeTypeResolver->getNativeType($args[1]->value)); + // loose comparison + if ($firstArgType instanceof IntegerType && ($secondArgType instanceof FloatType || $secondArgType instanceof StringType)) { + return \true; + } + if ($firstArgType instanceof FloatType && ($secondArgType instanceof IntegerType || $secondArgType instanceof StringType)) { + return \true; + } + if ($firstArgType instanceof StringType && $secondArgType instanceof ObjectType && $this->isObjectType($args[1]->value, new ObjectType('Stringable'))) { + return \true; + } + // compare to mixed type is can be anything + if ($secondArgType instanceof MixedType) { + return \true; + } + // can happen with magic process + return $secondArgType instanceof NeverType; + } private function shouldSkipConstantArrayType(Expr $expr) : bool { - $type = $this->getType($expr); + $type = $this->nodeTypeResolver->getNativeType($expr); if (!$type instanceof ConstantArrayType) { return \false; } @@ -124,17 +156,20 @@ private function isScalarType(Type $valueNodeType) : bool return \true; } } - return \false; + if ($valueNodeType instanceof ConstantBooleanType) { + return \false; + } + return $valueNodeType instanceof BooleanType; } private function isScalarOrEnumValue(Expr $expr) : bool { if ($expr instanceof ClassConstFetch) { return \true; } - if ($expr instanceof Encapsed) { + if ($expr instanceof InterpolatedString) { return \true; } - $valueNodeType = $this->nodeTypeResolver->getType($expr); + $valueNodeType = $this->nodeTypeResolver->getNativeType($expr); return $this->isScalarType($valueNodeType); } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertFalseStrposToContainsRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertFalseStrposToContainsRector.php index bbacd70cb..e550120d9 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertFalseStrposToContainsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertFalseStrposToContainsRector.php @@ -19,14 +19,12 @@ final class AssertFalseStrposToContainsRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertInstanceOfComparisonRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertInstanceOfComparisonRector.php index 8f5ba519e..a3682575c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertInstanceOfComparisonRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertInstanceOfComparisonRector.php @@ -5,10 +5,12 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Identifier; use Rector\Exception\ShouldNotHappenException; use Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; @@ -22,14 +24,12 @@ final class AssertInstanceOfComparisonRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ @@ -41,7 +41,7 @@ public function __construct(IdentifierManipulator $identifierManipulator, TestsN } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Turns instanceof comparisons to their method name alternatives in PHPUnit TestCase', [new CodeSample('$this->assertTrue($foo instanceof Foo, "message");', '$this->assertInstanceOf("Foo", $foo, "message");'), new CodeSample('$this->assertFalse($foo instanceof Foo, "message");', '$this->assertNotInstanceOf("Foo", $foo, "message");')]); + return new RuleDefinition('Turns instanceof comparisons to their method name alternatives in PHPUnit TestCase', [new CodeSample('$this->assertTrue($foo instanceof Foo, "message");', '$this->assertInstanceOf("Foo", $foo, "message");'), new CodeSample('$this->assertFalse($foo instanceof Foo, "message");', '$this->assertNotInstanceOf("Foo", $foo, "message");'), new CodeSample('$this->assertNotEquals(SomeInstance::class, get_class($value));', '$this->assertNotInstanceOf(SomeInstance::class, $value);')]); } /** * @return array> @@ -55,11 +55,14 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - $oldMethodNames = \array_keys(self::RENAME_METHODS_MAP); - if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, $oldMethodNames)) { + if ($node->isFirstClassCallable()) { return null; } - if ($node->isFirstClassCallable()) { + if ($this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, ['assertSame', 'assertNotSame', 'assertEquals', 'assertNotEquals'])) { + return $this->refactorGetClass($node); + } + $oldMethodNames = \array_keys(self::RENAME_METHODS_MAP); + if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, $oldMethodNames)) { return null; } $firstArgumentValue = $node->getArgs()[0]->value; @@ -70,6 +73,28 @@ public function refactor(Node $node) : ?Node $this->changeArgumentsOrder($node); return $node; } + /** + * @param MethodCall|StaticCall $node + */ + private function refactorGetClass(Node $node) : ?Node + { + // we need 2 args + if (!isset($node->args[1])) { + return null; + } + $secondArgument = $node->getArgs()[1]; + $secondArgumentValue = $secondArgument->value; + if ($secondArgumentValue instanceof FuncCall && $this->isName($secondArgumentValue->name, 'get_class')) { + $node->args[1] = $secondArgumentValue->getArgs()[0]; + if ($this->isNames($node->name, ['assertSame', 'assertEquals'])) { + $node->name = new Identifier('assertInstanceOf'); + } elseif ($this->isNames($node->name, ['assertNotSame', 'assertNotEquals'])) { + $node->name = new Identifier('assertNotInstanceOf'); + } + return $node; + } + return null; + } /** * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $node */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertIssetToSpecificMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertIssetToSpecificMethodRector.php index 67befb730..5b5e28fcf 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertIssetToSpecificMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertIssetToSpecificMethodRector.php @@ -21,14 +21,12 @@ final class AssertIssetToSpecificMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(IdentifierManipulator $identifierManipulator, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->identifierManipulator = $identifierManipulator; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertNotOperatorRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertNotOperatorRector.php index 220c5f261..ccc247091 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertNotOperatorRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertNotOperatorRector.php @@ -20,14 +20,12 @@ final class AssertNotOperatorRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertPropertyExistsRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertPropertyExistsRector.php index 5b0c507a2..eb94e178f 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertPropertyExistsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertPropertyExistsRector.php @@ -22,14 +22,12 @@ final class AssertPropertyExistsRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ 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 1079f4164..8e3297e52 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 @@ -11,7 +11,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt\Expression; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Exception\ShouldNotHappenException; @@ -28,19 +28,16 @@ final class AssertRegExpRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\NodeManipulator\StmtsManipulator */ - private $stmtsManipulator; + private StmtsManipulator $stmtsManipulator; /** * @var string */ @@ -128,7 +125,7 @@ public function refactor(Node $node) : ?Node } private function resolveOldCondition(Expr $expr) : int { - if ($expr instanceof LNumber) { + if ($expr instanceof Int_) { return $expr->value; } if ($expr instanceof ConstFetch) { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameBoolNullToSpecificMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameBoolNullToSpecificMethodRector.php index 3d35193cd..68eef02a2 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameBoolNullToSpecificMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameBoolNullToSpecificMethodRector.php @@ -21,23 +21,20 @@ final class AssertSameBoolNullToSpecificMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\IdentifierManipulator */ - private $identifierManipulator; + private IdentifierManipulator $identifierManipulator; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\ArgumentMover */ - private $argumentMover; + private ArgumentMover $argumentMover; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var ConstantWithAssertMethods[] */ - private $constantWithAssertMethods = []; + private array $constantWithAssertMethods = []; public function __construct(IdentifierManipulator $identifierManipulator, ArgumentMover $argumentMover, TestsNodeAnalyzer $testsNodeAnalyzer) { $this->identifierManipulator = $identifierManipulator; 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 484dbce99..93a6e22e5 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 @@ -19,19 +19,16 @@ final class AssertSameTrueFalseToAssertTrueFalseRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\ArgumentMover */ - private $argumentMover; + private ArgumentMover $argumentMover; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ArgumentMover $argumentMover, TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver) { $this->argumentMover = $argumentMover; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector.php index a836e0db9..1c3ae06e0 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector.php @@ -23,13 +23,12 @@ final class AssertTrueFalseToSpecificMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array> */ - private const FUNCTION_NAME_WITH_ASSERT_METHOD_NAMES = ['is_readable' => ['is_readable', 'assertIsReadable', 'assertNotIsReadable'], 'array_key_exists' => ['array_key_exists', 'assertArrayHasKey', 'assertArrayNotHasKey'], 'array_search' => ['array_search', 'assertContains', 'assertNotContains'], 'in_array' => ['in_array', 'assertContains', 'assertNotContains'], 'empty' => ['empty', 'assertEmpty', 'assertNotEmpty'], 'file_exists' => ['file_exists', 'assertFileExists', 'assertFileNotExists'], 'is_dir' => ['is_dir', 'assertDirectoryExists', 'assertDirectoryNotExists'], 'is_infinite' => ['is_infinite', 'assertInfinite', 'assertFinite'], 'is_null' => ['is_null', 'assertNull', 'assertNotNull'], 'is_writable' => ['is_writable', 'assertIsWritable', 'assertNotIsWritable'], 'is_nan' => ['is_nan', 'assertNan', ''], 'is_a' => ['is_a', 'assertInstanceOf', 'assertNotInstanceOf']]; + private const FUNCTION_NAME_WITH_ASSERT_METHOD_NAMES = ['is_readable' => ['is_readable', 'assertIsReadable', 'assertNotIsReadable'], 'array_key_exists' => ['array_key_exists', 'assertArrayHasKey', 'assertArrayNotHasKey'], 'array_search' => ['array_search', 'assertContains', 'assertNotContains'], 'in_array' => ['in_array', 'assertContains', 'assertNotContains'], 'empty' => ['empty', 'assertEmpty', 'assertNotEmpty'], 'file_exists' => ['file_exists', 'assertFileExists', 'assertFileNotExists'], 'is_dir' => ['is_dir', 'assertDirectoryExists', 'assertDirectoryNotExists'], 'is_infinite' => ['is_infinite', 'assertInfinite', 'assertFinite'], 'is_null' => ['is_null', 'assertNull', 'assertNotNull'], 'is_writable' => ['is_writable', 'assertIsWritable', 'assertNotIsWritable'], 'is_nan' => ['is_nan', 'assertNan', ''], 'is_a' => ['is_a', 'assertInstanceOf', 'assertNotInstanceOf'], 'str_contains' => ['str_contains', 'assertStringContainsString', 'assertStringNotContainsString']]; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -69,11 +68,9 @@ public function refactor(Node $node) : ?Node return null; } if ($firstArgumentName === 'is_a') { - /** - * @var FuncCall $firstArgumentValue - * @var array $args - **/ + /** @var FuncCall $firstArgumentValue */ $args = $firstArgumentValue->getArgs(); + /** @var array $args */ if ($args === []) { return null; } @@ -150,7 +147,8 @@ private function buildNewArguments(string $funcCallOrEmptyNodeName, array $funcC unset($funcCallOrEmptyNodeArgs[2]); return \array_merge($funcCallOrEmptyNodeArgs, $oldArguments); } - if ($funcCallOrEmptyNodeName === 'is_a') { + if (\in_array($funcCallOrEmptyNodeName, ['is_a', 'str_contains'], \true)) { + // flip arguments $newArgs = [$funcCallOrEmptyNodeArgs[1], $funcCallOrEmptyNodeArgs[0]]; return \array_merge($newArgs, $oldArguments); } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php index 93340e40f..76fb3f8b4 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/FlipAssertRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Scalar; @@ -20,9 +21,12 @@ final class FlipAssertRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; + /** + * @var string[] + */ + private const METHOD_NAMES = ['assertSame', 'assertNotSame', 'assertNotEquals', 'assertEquals', 'assertStringContainsString']; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -32,7 +36,7 @@ public function getRuleDefinition() : RuleDefinition return new RuleDefinition('Turns accidentally flipped assert order to right one, with expected expr to left', [new CodeSample(<<<'CODE_SAMPLE' testsNodeAnalyzer->isPHPUnitMethodCallNames($node, ['assertSame', 'assertEquals'])) { + if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, self::METHOD_NAMES)) { return null; } if ($node->isFirstClassCallable()) { @@ -101,6 +105,9 @@ private function isScalarValue(Expr $expr) : bool if ($expr instanceof Scalar) { return \true; } + if ($expr instanceof ConstFetch) { + return \true; + } return $expr instanceof ClassConstFetch; } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowIdenticalWithConsecutiveRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowIdenticalWithConsecutiveRector.php index f8686a0d2..c00b3fd7e 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowIdenticalWithConsecutiveRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowIdenticalWithConsecutiveRector.php @@ -19,9 +19,8 @@ final class NarrowIdenticalWithConsecutiveRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowSingleWillReturnCallbackRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowSingleWillReturnCallbackRector.php index 9be1a239f..4dc37b45f 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowSingleWillReturnCallbackRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/NarrowSingleWillReturnCallbackRector.php @@ -11,7 +11,7 @@ use PhpParser\Node\Expr\Match_; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use Rector\PHPUnit\CodeQuality\ValueObject\MatchAndReturnMatch; @@ -26,9 +26,8 @@ final class NarrowSingleWillReturnCallbackRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -167,7 +166,7 @@ private function matchSingleMatchArmBodyWithConditionOne(Match_ $match) : ?Expr } private function isNumberOne(Expr $expr) : bool { - if (!$expr instanceof LNumber) { + if (!$expr instanceof Int_) { return \false; } return $expr->value === 1; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/RemoveExpectAnyFromMockRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/RemoveExpectAnyFromMockRector.php index 9d1f1967f..30c379999 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/RemoveExpectAnyFromMockRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/RemoveExpectAnyFromMockRector.php @@ -18,9 +18,8 @@ final class RemoveExpectAnyFromMockRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/SingleWithConsecutiveToWithRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/SingleWithConsecutiveToWithRector.php index a21821902..615ac196a 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/SingleWithConsecutiveToWithRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/SingleWithConsecutiveToWithRector.php @@ -20,14 +20,12 @@ final class SingleWithConsecutiveToWithRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php index 77ab4cde9..c03c56fe1 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWillMethodRector.php @@ -20,9 +20,8 @@ final class UseSpecificWillMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWithMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWithMethodRector.php index 670eff882..407cb014c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWithMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/UseSpecificWithMethodRector.php @@ -19,9 +19,8 @@ final class UseSpecificWithMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php new file mode 100644 index 000000000..bee0484dd --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php @@ -0,0 +1,56 @@ +getTypes() as $intersectionedType) { + if (!$intersectionedType instanceof ObjectType) { + continue; + } + if ($intersectionedType->getClassName() === ClassName::MOCK_OBJECT) { + continue; + } + $classReflection = $intersectionedType->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + continue; + } + if (!$classReflection->hasNativeMethod($methodName)) { + continue; + } + $mockedMethodReflection = $classReflection->getNativeMethod($methodName); + $parameterTypes = $this->resolveParameterTypes($mockedMethodReflection); + $returnType = $this->resolveReturnType($mockedMethodReflection); + return new ParamTypesAndReturnType($parameterTypes, $returnType); + } + return null; + } + /** + * @return Type[] + */ + private function resolveParameterTypes(ExtendedMethodReflection $extendedMethodReflection) : array + { + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + $parameterTypes = []; + foreach ($extendedParametersAcceptor->getParameters() as $parameterReflection) { + $parameterTypes[] = $parameterReflection->getType(); + } + return $parameterTypes; + } + private function resolveReturnType(ExtendedMethodReflection $extendedMethodReflection) : Type + { + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + return $extendedParametersAcceptor->getReturnType(); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php index b825247d2..ef5579b89 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/MatchAndReturnMatch.php @@ -11,14 +11,12 @@ final class MatchAndReturnMatch { /** * @readonly - * @var \PhpParser\Node\Expr\Match_ */ - private $consecutiveMatch; + private Match_ $consecutiveMatch; /** * @readonly - * @var \PhpParser\Node\Expr\Match_|null */ - private $willReturnMatch; + private ?Match_ $willReturnMatch; public function __construct(Match_ $consecutiveMatch, ?Match_ $willReturnMatch) { $this->consecutiveMatch = $consecutiveMatch; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/ParamTypesAndReturnType.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/ParamTypesAndReturnType.php new file mode 100644 index 000000000..7dabb372e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/ParamTypesAndReturnType.php @@ -0,0 +1,37 @@ +paramTypes = $paramTypes; + $this->returnType = $returnType; + } + /** + * @return Type[] + */ + public function getParamTypes() : array + { + return $this->paramTypes; + } + public function getReturnType() : ?Type + { + return $this->returnType; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToType.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToType.php new file mode 100644 index 000000000..c15d3954d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToType.php @@ -0,0 +1,29 @@ +variableName = $variableName; + $this->objectType = $objectType; + } + public function getVariableName() : string + { + return $this->variableName; + } + public function getObjectType() : string + { + return $this->objectType; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToTypeCollection.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToTypeCollection.php new file mode 100644 index 000000000..137d5559a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/ValueObject/VariableNameToTypeCollection.php @@ -0,0 +1,39 @@ +variableNameToType = $variableNameToType; + } + public function matchByVariableName(string $variableName) : ?\Rector\PHPUnit\CodeQuality\ValueObject\VariableNameToType + { + foreach ($this->variableNameToType as $variableNameToType) { + if ($variableNameToType->getVariableName() !== $variableName) { + continue; + } + return $variableNameToType; + } + return null; + } + public function remove(\Rector\PHPUnit\CodeQuality\ValueObject\VariableNameToType $matchedNullableVariableNameToType) : void + { + foreach ($this->variableNameToType as $key => $variableNamesToType) { + if ($matchedNullableVariableNameToType !== $variableNamesToType) { + continue; + } + unset($this->variableNameToType[$key]); + break; + } + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php index aea1e40ef..ed708fdad 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/NodeFactory/WillReturnCallbackFactory.php @@ -5,15 +5,15 @@ use PhpParser\BuilderFactory; use PhpParser\Node\Arg; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\BinaryOp\Minus; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\ClosureUse; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Param; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use Rector\PHPUnit\Enum\ConsecutiveVariable; @@ -24,24 +24,20 @@ final class WillReturnCallbackFactory { /** * @readonly - * @var \PhpParser\BuilderFactory */ - private $builderFactory; + private BuilderFactory $builderFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\UsedVariablesResolver */ - private $usedVariablesResolver; + private UsedVariablesResolver $usedVariablesResolver; /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\MatcherInvocationCountMethodCallNodeFactory */ - private $matcherInvocationCountMethodCallNodeFactory; + private MatcherInvocationCountMethodCallNodeFactory $matcherInvocationCountMethodCallNodeFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\ConsecutiveIfsFactory */ - private $consecutiveIfsFactory; + private ConsecutiveIfsFactory $consecutiveIfsFactory; public function __construct(BuilderFactory $builderFactory, UsedVariablesResolver $usedVariablesResolver, MatcherInvocationCountMethodCallNodeFactory $matcherInvocationCountMethodCallNodeFactory, ConsecutiveIfsFactory $consecutiveIfsFactory) { $this->builderFactory = $builderFactory; @@ -81,7 +77,7 @@ public function createParametersMatch(MethodCall $withConsecutiveMethodCall) : a private function createAssertSameDimFetch(Arg $firstArg, Variable $variable) : MethodCall { $matcherCountMethodCall = $this->matcherInvocationCountMethodCallNodeFactory->create(); - $currentValueArrayDimFetch = new ArrayDimFetch($firstArg->value, new Minus($matcherCountMethodCall, new LNumber(1))); + $currentValueArrayDimFetch = new ArrayDimFetch($firstArg->value, new Minus($matcherCountMethodCall, new Int_(1))); $compareArgs = [new Arg($currentValueArrayDimFetch), new Arg($variable)]; return $this->builderFactory->methodCall(new Variable('this'), 'assertSame', $compareArgs); } 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 62e278a87..32dc5140a 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 @@ -25,19 +25,16 @@ final class AddProphecyTraitRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @var string */ @@ -98,9 +95,7 @@ public function refactor(Node $node) : ?Node } private function shouldSkipClass(Class_ $class) : bool { - $hasProphesizeMethodCall = (bool) $this->betterNodeFinder->findFirst($class, function (Node $node) : bool { - return $this->testsNodeAnalyzer->isAssertMethodCallName($node, 'prophesize'); - }); + $hasProphesizeMethodCall = (bool) $this->betterNodeFinder->findFirst($class, fn(Node $node): bool => $this->testsNodeAnalyzer->isAssertMethodCallName($node, 'prophesize')); if (!$hasProphesizeMethodCall) { return \true; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/ParentTestClassConstructorRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/ParentTestClassConstructorRector.php new file mode 100644 index 000000000..e1d26a04b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/ParentTestClassConstructorRector.php @@ -0,0 +1,109 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('PHPUnit\\Framework\\TestCase requires a parent constructor call', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeHelper extends TestCase +{ +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeHelper extends TestCase +{ + public function __construct() + { + parent::__construct(static::class); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + if ($this->shouldSkipClass($node)) { + return null; + } + // it already has a constructor, skip as it might require specific tweaking + if ($node->getMethod(MethodName::CONSTRUCT)) { + return null; + } + $constructorClassMethod = new ClassMethod(MethodName::CONSTRUCT); + $constructorClassMethod->flags |= Modifiers::PUBLIC; + $constructorClassMethod->stmts[] = new Expression($this->createParentConstructorCall()); + $node->stmts = \array_merge([$constructorClassMethod], $node->stmts); + return $node; + } + private function createParentConstructorCall() : StaticCall + { + $staticClassConstFetch = new ClassConstFetch(new Name('static'), 'class'); + return new StaticCall(new Name('parent'), MethodName::CONSTRUCT, [new Arg($staticClassConstFetch)]); + } + private function shouldSkipClass(Class_ $class) : bool + { + if ($class->isAbstract()) { + return \true; + } + if ($class->isAnonymous()) { + return \true; + } + $className = $this->getName($class); + // loaded automatically by PHPUnit + if (\substr_compare((string) $className, 'Test', -\strlen('Test')) === 0) { + return \true; + } + if (\substr_compare((string) $className, 'TestCase', -\strlen('TestCase')) === 0) { + return \true; + } + return (bool) $class->getAttribute('hasRemovedFinalConstruct'); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php index 16a11e7b4..827ed160c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/PublicDataProviderClassMethodRector.php @@ -19,19 +19,16 @@ final class PublicDataProviderClassMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeFinder\DataProviderClassMethodFinder */ - private $dataProviderClassMethodFinder; + private DataProviderClassMethodFinder $dataProviderClassMethodFinder; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, VisibilityManipulator $visibilityManipulator) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php new file mode 100644 index 000000000..da291ae9f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php @@ -0,0 +1,132 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + $this->dataProviderClassMethodFinder = $dataProviderClassMethodFinder; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove named arguments in data provider', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeTest extends TestCase +{ + /** + * @dataProvider provideData() + */ + public function test() + { + } + + public static function provideData() + { + yield ['namedArg' => 100]; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeTest extends TestCase +{ + /** + * @dataProvider provideData() + */ + public function test() + { + } + + public static function provideData() + { + yield [100]; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $hasChanged = \false; + $dataProviders = $this->dataProviderClassMethodFinder->find($node); + foreach ($dataProviders as $dataProvider) { + /** @var Expression $stmt */ + foreach ($dataProvider->getStmts() ?? [] as $stmt) { + $expr = $stmt->expr; + $arrayChanged = \false; + if ($expr instanceof Yield_) { + $arrayChanged = $this->handleArray($expr->value); + } elseif ($expr instanceof Array_) { + $arrayChanged = $this->handleArray($expr); + } + if ($arrayChanged) { + $hasChanged = \true; + } + } + } + if ($hasChanged) { + return $node; + } + return null; + } + private function handleArray(Array_ $array) : bool + { + $hasChanged = \false; + foreach ($array->items as $item) { + if (!$item instanceof ArrayItem) { + continue; + } + if (!$item->key instanceof Expr) { + continue; + } + if (!$item->key instanceof Int_ && $item->key instanceof Expr) { + $item->key = null; + $hasChanged = \true; + } + } + return $hasChanged; + } +} 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 26f327b82..9b344b5f1 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 @@ -21,24 +21,20 @@ final class StaticDataProviderClassMethodRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeFinder\DataProviderClassMethodFinder */ - private $dataProviderClassMethodFinder; + private DataProviderClassMethodFinder $dataProviderClassMethodFinder; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, VisibilityManipulator $visibilityManipulator, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -124,8 +120,6 @@ private function skipMethod(ClassMethod $classMethod) : bool if ($classMethod->stmts === null) { return \false; } - return (bool) $this->betterNodeFinder->findFirst($classMethod->stmts, function (Node $node) : bool { - return $node instanceof Variable && $this->nodeNameResolver->isName($node, 'this'); - }); + return (bool) $this->betterNodeFinder->findFirst($classMethod->stmts, fn(Node $node): bool => $node instanceof Variable && $this->isName($node, 'this')); } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php deleted file mode 100644 index ec6ebf168..000000000 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/AssertIssetToAssertObjectHasPropertyRector.php +++ /dev/null @@ -1,142 +0,0 @@ -testsNodeAnalyzer = $testsNodeAnalyzer; - $this->identifierManipulator = $identifierManipulator; - $this->classReflectionAnalyzer = $classReflectionAnalyzer; - } - public function getRuleDefinition() : RuleDefinition - { - return new RuleDefinition('Change "isset()" property check, to assertObjectHasProperty() method', [new CodeSample(<<<'CODE_SAMPLE' -use PHPUnit\Framework\TestCase; - -final class SomeTest extends TestCase -{ - public function test() - { - $object = new stdClass(); - $this->assertTrue(isset($object->someProperty)); - } -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use PHPUnit\Framework\TestCase; - -final class SomeTest extends TestCase -{ - public function test() - { - $object = new stdClass(); - $this->assertObjectHasProperty('someProperty', $object); - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [MethodCall::class, StaticCall::class]; - } - /** - * @param MethodCall|StaticCall $node - */ - public function refactor(Node $node) : ?Node - { - if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, [AssertMethod::ASSERT_TRUE, AssertMethod::ASSERT_FALSE])) { - return null; - } - if ($node->isFirstClassCallable()) { - return null; - } - $firstArg = $node->getArgs()[0]; - $firstArgValue = $firstArg->value; - if (!$firstArgValue instanceof Isset_) { - return null; - } - $issetExpr = $firstArgValue->vars[0]; - if (!$issetExpr instanceof PropertyFetch) { - return null; - } - if ($this->hasMagicIsset($issetExpr->var)) { - return null; - } - $name = $this->getName($issetExpr); - if ($name === null) { - return null; - } - $this->identifierManipulator->renameNodeWithMap($node, [AssertMethod::ASSERT_TRUE => 'assertObjectHasProperty', AssertMethod::ASSERT_FALSE => 'assertObjectNotHasProperty']); - $oldArgs = $node->getArgs(); - unset($oldArgs[0]); - $newArgs = $this->nodeFactory->createArgs([new String_($name), $issetExpr->var]); - $node->args = \array_merge($newArgs, $oldArgs); - return $node; - } - private function hasMagicIsset(Expr $expr) : bool - { - $type = $this->nodeTypeResolver->getType($expr); - if (!$type instanceof TypeWithClassName) { - // object not found, skip - return $type instanceof ObjectWithoutClassType; - } - $classReflection = $type->getClassReflection(); - if (!$classReflection instanceof ClassReflection) { - return \false; - } - if ($classReflection->hasMethod('__isset')) { - return \true; - } - if ($classReflection->hasMethod('__get')) { - return \true; - } - if (!$classReflection->isClass()) { - return \false; - } - return $this->classReflectionAnalyzer->resolveParentClassName($classReflection) !== null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/PropertyExistsWithoutAssertRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/PropertyExistsWithoutAssertRector.php new file mode 100644 index 000000000..11afbfae6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/PropertyExistsWithoutAssertRector.php @@ -0,0 +1,87 @@ + + */ + private const RENAME_METHODS_WITH_OBJECT_MAP = ['assertClassHasStaticAttribute' => 'assertTrue', 'classHasStaticAttribute' => 'assertTrue', 'assertClassNotHasStaticAttribute' => 'assertFalse']; + public function __construct(IdentifierManipulator $identifierManipulator, TestsNodeAnalyzer $testsNodeAnalyzer) + { + $this->identifierManipulator = $identifierManipulator; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Replace deleted PHPUnit methods: assertClassHasStaticAttribute, classHasStaticAttribute and assertClassNotHasStaticAttribute by property_exists()', [new CodeSample(<<<'CODE_SAMPLE' +$this->assertClassHasStaticAttribute("Class", "property"); +$this->classHasStaticAttribute("Class", "property"); +$this->assertClassNotHasStaticAttribute("Class", "property"); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +$this->assertTrue(property_exists("Class", "property")); +$this->assertTrue(property_exists("Class", "property")); +$this->assertFalse(property_exists("Class", "property")); +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?Node + { + $map = self::RENAME_METHODS_WITH_OBJECT_MAP; + if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, \array_keys($map))) { + return null; + } + if ($node->isFirstClassCallable() || !isset($node->getArgs()[0], $node->getArgs()[1])) { + return null; + } + $firstNode = new Arg($node->getArgs()[0]->value); + if ($node->getArgs()[1]->value instanceof ClassConstFetch) { + $secondNode = $node->getArgs()[1]; + } else { + $secondNode = new Arg($node->getArgs()[1]->value); + } + $funcCall = new FuncCall(new Name('property_exists'), [$secondNode, $firstNode]); + $newArgs = $this->nodeFactory->createArgs([$funcCall]); + unset($node->args[0], $node->args[1]); + $node->args = \array_merge($newArgs, $node->getArgs()); + $this->identifierManipulator->renameNodeWithMap($node, $map); + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php index c36ecd613..32d4a3e51 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/MethodCall/RemoveSetMethodsMethodCallRector.php @@ -24,19 +24,16 @@ final class RemoveSetMethodsMethodCallRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver, ReflectionProvider $reflectionProvider) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php index fa17bbb3b..0fdbfcf92 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/ExpectsMethodCallDecorator.php @@ -10,7 +10,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Expression; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PHPUnit\Enum\ConsecutiveVariable; @@ -18,14 +18,12 @@ final class ExpectsMethodCallDecorator { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; @@ -71,7 +69,7 @@ public function decorate(Expression $expression) return null; } $node->var = new MethodCall($node->var, 'expects', [new Arg(new Variable(ConsecutiveVariable::MATCHER))]); - return NodeTraverser::STOP_TRAVERSAL; + return NodeVisitor::STOP_TRAVERSAL; }); } return $expectsExactlyCall; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php index ea981f241..e5fbfba94 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php @@ -11,14 +11,14 @@ use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; +use PhpParser\Node\Expr\Throw_; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; use PhpParser\Node\Param; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; -use PhpParser\Node\Stmt\Throw_; use Rector\Exception\ShouldNotHappenException; use Rector\PHPUnit\Enum\ConsecutiveMethodName; use Rector\PHPUnit\Enum\ConsecutiveVariable; @@ -37,34 +37,28 @@ final class WithConsecutiveRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\PHPUnit100\NodeFactory\WillReturnCallbackFactory */ - private $willReturnCallbackFactory; + private WillReturnCallbackFactory $willReturnCallbackFactory; /** * @readonly - * @var \Rector\PHPUnit\MethodCallRemover */ - private $methodCallRemover; + private MethodCallRemover $methodCallRemover; /** * @readonly - * @var \Rector\PHPUnit\NodeFinder\MethodCallNodeFinder */ - private $methodCallNodeFinder; + private MethodCallNodeFinder $methodCallNodeFinder; /** * @readonly - * @var \Rector\PHPUnit\PHPUnit100\Rector\StmtsAwareInterface\ExpectsMethodCallDecorator */ - private $expectsMethodCallDecorator; + private \Rector\PHPUnit\PHPUnit100\Rector\StmtsAwareInterface\ExpectsMethodCallDecorator $expectsMethodCallDecorator; /** * @readonly - * @var \Rector\PHPUnit\PHPUnit100\NodeDecorator\WillReturnIfNodeDecorator */ - private $willReturnIfNodeDecorator; + private WillReturnIfNodeDecorator $willReturnIfNodeDecorator; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, WillReturnCallbackFactory $willReturnCallbackFactory, MethodCallRemover $methodCallRemover, MethodCallNodeFinder $methodCallNodeFinder, \Rector\PHPUnit\PHPUnit100\Rector\StmtsAwareInterface\ExpectsMethodCallDecorator $expectsMethodCallDecorator, WillReturnIfNodeDecorator $willReturnIfNodeDecorator) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -126,6 +120,7 @@ public function getNodeTypes() : array } /** * @param Expression $node + * @return null|Stmt[]|Expression */ public function refactor(Node $node) { @@ -164,7 +159,7 @@ public function refactor(Node $node) if ($willThrowException instanceof MethodCall) { $this->methodCallRemover->removeMethodCall($node, ConsecutiveMethodName::WILL_THROW_EXCEPTION); $expr = $this->getFirstArgValue($willThrowException); - $returnStmt = new Throw_($expr); + $returnStmt = new Expression(new Throw_($expr)); } $willReturnReferenceArgument = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN_REFERENCE); $referenceVariable = null; @@ -178,8 +173,8 @@ public function refactor(Node $node) $expectsCall = $this->expectsMethodCallDecorator->decorate($node); if (!$expectsCall instanceof MethodCall && !$expectsCall instanceof StaticCall) { // fallback to default by case count - $lNumber = new LNumber(\count($withConsecutiveMethodCall->args)); - $expectsCall = new MethodCall(new Variable('this'), new Identifier('exactly'), [new Arg($lNumber)]); + $int = new Int_(\count($withConsecutiveMethodCall->args)); + $expectsCall = new MethodCall(new Variable('this'), new Identifier('exactly'), [new Arg($int)]); } // 2. does willReturnCallback() exist? just merge them together $existingWillReturnCallback = $this->methodCallNodeFinder->findByName($node, ConsecutiveMethodName::WILL_RETURN_CALLBACK); @@ -191,10 +186,11 @@ public function refactor(Node $node) } /** * @return Stmt[] + * @param \PhpParser\Node\Stmt\Return_|\PhpParser\Node\Stmt\Expression|null $returnStmt * @param \PhpParser\Node\Expr|\PhpParser\Node\Expr\Variable|null $referenceVariable * @param \PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\MethodCall $expectsCall */ - private function refactorToWillReturnCallback(MethodCall $withConsecutiveMethodCall, ?Stmt $returnStmt, $referenceVariable, $expectsCall, Expression $expression, ?MethodCall $willReturnOnConsecutiveMethodCall) : array + private function refactorToWillReturnCallback(MethodCall $withConsecutiveMethodCall, $returnStmt, $referenceVariable, $expectsCall, Expression $expression, ?MethodCall $willReturnOnConsecutiveMethodCall) : array { $closure = $this->willReturnCallbackFactory->createClosure($withConsecutiveMethodCall, $returnStmt, $referenceVariable); $withConsecutiveMethodCall->name = new Identifier(ConsecutiveMethodName::WILL_RETURN_CALLBACK); diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php index a45e4c866..0eb606780 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php @@ -26,9 +26,8 @@ final class NamedArgumentForDataProviderRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -188,7 +187,7 @@ private function refactorArrayKey(Array_ $array, array $dataProviderNameMapping) $needToSetAllKeyNames = \false; $allArrayKeyNames = []; foreach ($array->items as $arrayItem) { - if ((($nullsafeVariable1 = $arrayItem) ? $nullsafeVariable1->key : null) instanceof String_) { + if ($arrayItem->key instanceof String_) { $needToSetAllKeyNames = \true; $allArrayKeyNames[] = $arrayItem->key->value; } @@ -198,9 +197,6 @@ private function refactorArrayKey(Array_ $array, array $dataProviderNameMapping) return \false; } foreach ($array->items as $arrayIndex => $arrayItem) { - if ($arrayItem === null) { - continue; - } if (!isset($dataProviderNameMapping[$arrayIndex])) { continue; } @@ -231,15 +227,15 @@ private function extractDataProviderArrayItem(ClassMethod $classMethod) : iterab if ($stmt instanceof Return_ && $stmt->expr instanceof Array_) { $dataProviderTestCases = $stmt->expr; foreach ($dataProviderTestCases->items as $dataProviderTestCase) { - $arrayItem = ($nullsafeVariable2 = $dataProviderTestCase) ? $nullsafeVariable2->value : null; + $arrayItem = $dataProviderTestCase->value; if ($arrayItem instanceof Array_) { (yield $arrayItem); } - $variableName = $arrayItem === null ? null : $this->getName($arrayItem); + $variableName = $this->getName($arrayItem); if ($arrayItem instanceof Variable && $variableName !== null && isset($resolvedVariables[$variableName])) { $dataProviderList = $resolvedVariables[$variableName]; foreach ($dataProviderList->items as $dataProviderItem) { - if ((($nullsafeVariable3 = $dataProviderItem) ? $nullsafeVariable3->value : null) instanceof Array_) { + if ($dataProviderItem->value instanceof Array_) { (yield $dataProviderItem->value); } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php new file mode 100644 index 000000000..a37c1d51e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php @@ -0,0 +1,76 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove override final construct test case', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeClass extends TestCase +{ + public function __construct() + { + parent::__construct(static::class); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeClass extends TestCase +{ +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?\PhpParser\Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $constructClassMethod = $node->getMethod(MethodName::CONSTRUCT); + if ($constructClassMethod instanceof ClassMethod) { + foreach ($node->stmts as $key => $stmt) { + if ($stmt instanceof ClassMethod && $this->isName($stmt, MethodName::CONSTRUCT)) { + unset($node->stmts[$key]); + $node->setAttribute('hasRemovedFinalConstruct', \true); + return $node; + } + } + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php index 98cca1150..17ba96b22 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit50/Rector/StaticCall/GetMockRector.php @@ -23,14 +23,12 @@ final class GetMockRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ReflectionResolver $reflectionResolver) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; 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 f005a1035..4f0f61022 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 @@ -26,34 +26,28 @@ final class AddDoesNotPerformAssertionToNonAssertingTestRector extends AbstractR { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\AssertCallAnalyzer */ - private $assertCallAnalyzer; + private AssertCallAnalyzer $assertCallAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\MockedVariableAnalyzer */ - private $mockedVariableAnalyzer; + private MockedVariableAnalyzer $mockedVariableAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, AssertCallAnalyzer $assertCallAnalyzer, MockedVariableAnalyzer $mockedVariableAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; 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 e1a325f17..beac97c3d 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 @@ -24,29 +24,24 @@ final class ExceptionAnnotationRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\ExpectExceptionMethodCallFactory */ - private $expectExceptionMethodCallFactory; + private ExpectExceptionMethodCallFactory $expectExceptionMethodCallFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * In reversed order, which they should be called in code. * diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/MethodCall/DelegateExceptionArgumentsRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/MethodCall/DelegateExceptionArgumentsRector.php index f65bfec6e..25cb7537d 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/MethodCall/DelegateExceptionArgumentsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/MethodCall/DelegateExceptionArgumentsRector.php @@ -21,14 +21,12 @@ final class DelegateExceptionArgumentsRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\AssertCallFactory */ - private $assertCallFactory; + private AssertCallFactory $assertCallFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php index 228425023..36256d414 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit70/Rector/Class_/RemoveDataProviderTestPrefixRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\PHPUnit70\Rector\Class_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Class_; @@ -22,19 +22,16 @@ final class RemoveDataProviderTestPrefixRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeFinder\DataProviderClassMethodFinder */ - private $dataProviderClassMethodFinder; + private DataProviderClassMethodFinder $dataProviderClassMethodFinder; /** * @readonly - * @var \Rector\PHPUnit\PhpDoc\DataProviderMethodRenamer */ - private $dataProviderMethodRenamer; + private DataProviderMethodRenamer $dataProviderMethodRenamer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, DataProviderMethodRenamer $dataProviderMethodRenamer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; 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 7e8634fcb..aa76f75b0 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 @@ -23,19 +23,16 @@ final class AssertEqualsParameterToSpecificMethodsTypeRector extends AbstractRec { /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\AssertCallFactory */ - private $assertCallFactory; + private AssertCallFactory $assertCallFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(AssertCallFactory $assertCallFactory, TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver) { $this->assertCallFactory = $assertCallFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertContainsRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertContainsRector.php index 50f0e1060..8e54ab803 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertContainsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertContainsRector.php @@ -23,9 +23,8 @@ final class SpecificAssertContainsRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertInternalTypeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertInternalTypeRector.php index 290962197..f8650ed7b 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertInternalTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/SpecificAssertInternalTypeRector.php @@ -22,9 +22,8 @@ final class SpecificAssertInternalTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ExplicitPhpErrorApiRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ExplicitPhpErrorApiRector.php index ef973d8d8..eaeb0e4e9 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ExplicitPhpErrorApiRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ExplicitPhpErrorApiRector.php @@ -23,14 +23,12 @@ final class ExplicitPhpErrorApiRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeFactory\AssertCallFactory */ - private $assertCallFactory; + private AssertCallFactory $assertCallFactory; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ReplaceAtMethodWithDesiredMatcherRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ReplaceAtMethodWithDesiredMatcherRector.php new file mode 100644 index 000000000..cedb1fe96 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/ReplaceAtMethodWithDesiredMatcherRector.php @@ -0,0 +1,103 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Replace at() method call with desired matcher', [new CodeSample(<<<'CODE_SAMPLE' +$mock->expects($this->at(0)) + ->method('foo') + ->willReturn('1'); +CODE_SAMPLE +, <<<'CODE_SAMPLE' +$mock->expects($this->never()) + ->method('foo') + ->willReturn('1'); +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?\PhpParser\Node\Expr\MethodCall + { + $this->hasChanged = \false; + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + if ($node->var instanceof MethodCall && ($arg = $this->findAtMethodCall($node->var))) { + $this->replaceWithDesiredMatcher($arg); + } + if ($this->hasChanged) { + return $node; + } + return null; + } + private function findAtMethodCall(MethodCall $methodCall) : ?Arg + { + foreach ($methodCall->getArgs() as $arg) { + if ($arg->value instanceof MethodCall && $arg->value->name instanceof Identifier && $arg->value->name->toString() === 'at') { + return $arg; + } + } + if ($methodCall->var instanceof MethodCall) { + $this->findAtMethodCall($methodCall->var); + } + return null; + } + private function replaceWithDesiredMatcher(Arg $arg) : void + { + if (!$arg->value instanceof MethodCall) { + return; + } + foreach ($arg->value->getArgs() as $item) { + if ($item->value instanceof Int_) { + $count = $item->value->value; + } + } + if (!isset($count)) { + return; + } + if ($count === 0) { + $arg->value = new MethodCall($arg->value->var, 'never'); + $this->hasChanged = \true; + } elseif ($count === 1) { + $arg->value = new MethodCall($arg->value->var, 'once'); + $this->hasChanged = \true; + } elseif ($count > 1) { + $arg->value = new MethodCall($arg->value->var, 'exactly', [new Arg(new Int_($count))]); + $this->hasChanged = \true; + } + } +} 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 622b2a778..c0d48fba7 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 @@ -21,14 +21,12 @@ final class SpecificAssertContainsWithoutIdentityRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var array> */ @@ -82,6 +80,9 @@ public function refactor(Node $node) : ?Node if ($node->isFirstClassCallable()) { return null; } + if (\count($node->getArgs()) < 2) { + return null; + } // when second argument is string: do nothing $secondArgType = $this->getType($node->getArgs()[1]->value); if ($secondArgType instanceof StringType) { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php index e330f596b..a570a02ad 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Composer/ProjectPackageVersionResolver.php @@ -14,16 +14,15 @@ final class ProjectPackageVersionResolver { /** * @readonly - * @var \Rector\Composer\InstalledPackageResolver */ - private $installedPackageResolver; - public function __construct(InstalledPackageResolver $installedPackageResolver) + private InstalledPackageResolver $installedPackageResolver; + public function __construct() { - $this->installedPackageResolver = $installedPackageResolver; + $this->installedPackageResolver = new InstalledPackageResolver(\getcwd()); } public function findPackageVersion(string $packageName) : ?string { - $rootProjectInstalledPackages = $this->installedPackageResolver->resolve(\getcwd()); + $rootProjectInstalledPackages = $this->installedPackageResolver->resolve(); foreach ($rootProjectInstalledPackages as $rootProjectInstalledPackage) { if ($rootProjectInstalledPackage->getName() === $packageName) { return $rootProjectInstalledPackage->getVersion(); diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/AssertMethod.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/AssertMethod.php index 2daf3c857..f53ab8494 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/AssertMethod.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/AssertMethod.php @@ -13,4 +13,12 @@ final class AssertMethod * @var string */ public const ASSERT_TRUE = 'assertTrue'; + /** + * @var string + */ + public const ASSERT_EQUALS = 'assertEquals'; + /** + * @var string + */ + public const ASSERT_SAME = 'assertSame'; } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/PHPUnitClassName.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/PHPUnitClassName.php new file mode 100644 index 000000000..d59fe3ec4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Enum/PHPUnitClassName.php @@ -0,0 +1,16 @@ +simpleCallableNodeTraverser = $simpleCallableNodeTraverser; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php index 38cd673c9..6f159d8e5 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/AssertCallAnalyzer.php @@ -19,29 +19,24 @@ final class AssertCallAnalyzer { /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @var int */ @@ -53,12 +48,11 @@ final class AssertCallAnalyzer /** * @var array */ - private $containsAssertCallByClassMethod = []; + private array $containsAssertCallByClassMethod = []; /** * This should prevent segfaults while going too deep into to parsed code. Without it, it might end-up with segfault - * @var int */ - private $classMethodNestingLevel = 0; + private int $classMethodNestingLevel = 0; public function __construct(AstResolver $astResolver, BetterStandardPrinter $betterStandardPrinter, BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver) { $this->astResolver = $astResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/IdentifierManipulator.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/IdentifierManipulator.php index 426153b5e..45290124d 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/IdentifierManipulator.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/IdentifierManipulator.php @@ -20,9 +20,8 @@ final class IdentifierManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/MockedVariableAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/MockedVariableAnalyzer.php index 5e130d7d5..9d771ec5c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/MockedVariableAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/MockedVariableAnalyzer.php @@ -19,19 +19,16 @@ final class MockedVariableAnalyzer { /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver) { $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/SetUpMethodDecorator.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/SetUpMethodDecorator.php index 276215c03..5ea9dedaa 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/SetUpMethodDecorator.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/SetUpMethodDecorator.php @@ -15,9 +15,8 @@ final class SetUpMethodDecorator { /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; public function __construct(AstResolver $astResolver) { $this->astResolver = $astResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/TestsNodeAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/TestsNodeAnalyzer.php index d65f5cf37..266b5bfd9 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -12,29 +12,26 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\PHPUnit\Enum\PHPUnitClassName; use Rector\Reflection\ReflectionResolver; final class TestsNodeAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @var string[] */ @@ -53,7 +50,7 @@ public function isInTestClass(Node $node) : bool return \false; } foreach (self::TEST_CASE_OBJECT_CLASSES as $testCaseObjectClass) { - if ($classReflection->isSubclassOf($testCaseObjectClass)) { + if ($classReflection->is($testCaseObjectClass)) { return \true; } } @@ -67,6 +64,13 @@ public function isTestClassMethod(ClassMethod $classMethod) : bool if (\strncmp($classMethod->name->toString(), 'test', \strlen('test')) === 0) { return \true; } + foreach ($classMethod->getAttrGroups() as $attributeGroup) { + foreach ($attributeGroup->attrs as $attribute) { + if ($attribute->name->toString() === 'PHPUnit\\Framework\\Attributes\\Test') { + return \true; + } + } + } $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); return $phpDocInfo->hasByName('test'); } @@ -99,9 +103,20 @@ public function isPHPUnitMethodCallNames(Node $node, array $names) : bool } public function isPHPUnitTestCaseCall(Node $node) : bool { - if (!$this->isInTestClass($node)) { - return \false; + if ($node instanceof MethodCall) { + return $this->isInTestClass($node); } - return $node instanceof MethodCall || $node instanceof StaticCall; + if ($node instanceof StaticCall) { + $classType = $this->nodeTypeResolver->getType($node->class); + if ($classType instanceof ObjectType) { + if ($classType->isInstanceOf(PHPUnitClassName::TEST_CASE)->yes()) { + return \true; + } + if ($classType->isInstanceOf(PHPUnitClassName::ASSERT)->yes()) { + return \true; + } + } + } + return \false; } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php index 5cb050076..ab1f70183 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ConsecutiveIfsFactory.php @@ -4,15 +4,15 @@ namespace Rector\PHPUnit\NodeFactory; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; @@ -24,14 +24,12 @@ final class ConsecutiveIfsFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PHPUnit\CodeQuality\NodeFactory\NestedClosureAssertFactory */ - private $nestedClosureAssertFactory; + private NestedClosureAssertFactory $nestedClosureAssertFactory; public function __construct(NodeNameResolver $nodeNameResolver, NestedClosureAssertFactory $nestedClosureAssertFactory) { $this->nodeNameResolver = $nodeNameResolver; @@ -53,8 +51,8 @@ public function createIfs(MethodCall $withConsecutiveMethodCall, MethodCall $num continue; } if (!$assertArrayItem->value instanceof MethodCall) { - $parametersDimFetch = new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)); - $args = [new Arg($assertArrayItem), new Arg($parametersDimFetch)]; + $parametersDimFetch = new ArrayDimFetch(new Variable('parameters'), new Int_($assertKey)); + $args = [new Arg($assertArrayItem->value), new Arg($parametersDimFetch)]; $ifStmts[] = new Expression(new MethodCall(new Variable('this'), 'assertSame', $args)); continue; } @@ -64,7 +62,7 @@ public function createIfs(MethodCall $withConsecutiveMethodCall, MethodCall $num } elseif ($this->nodeNameResolver->isName($assertMethodCall->name, 'callback')) { $ifStmts = \array_merge($ifStmts, $this->nestedClosureAssertFactory->create($assertMethodCall, $assertKey)); } else { - $args = [new Arg($assertMethodCall), new Arg(new ArrayDimFetch(new Variable('parameters'), new LNumber($assertKey)))]; + $args = [new Arg($assertMethodCall), new Arg(new ArrayDimFetch(new Variable('parameters'), new Int_($assertKey)))]; $assertSameMethodCall = new MethodCall(new Variable('this'), new Identifier('assertSame'), $args); $ifStmts[] = new Expression($assertSameMethodCall); } @@ -80,7 +78,7 @@ public function createIfs(MethodCall $withConsecutiveMethodCall, MethodCall $num $identicalCompare = $arrowFunction->expr; // @todo improve in time if ($identicalCompare->left instanceof Variable) { - $parametersArrayDimFetch = new ArrayDimFetch(new Variable('parameters'), new LNumber(0)); + $parametersArrayDimFetch = new ArrayDimFetch(new Variable('parameters'), new Int_(0)); $assertSameMethodCall = new MethodCall(new Variable('this'), new Identifier('assertSame')); $assertSameMethodCall->args[] = new Arg($identicalCompare->right); $assertSameMethodCall->args[] = new Arg($parametersArrayDimFetch); @@ -91,14 +89,14 @@ public function createIfs(MethodCall $withConsecutiveMethodCall, MethodCall $num } throw new NotImplementedYetException(); } - $ifs[] = new If_(new Identical($numberOfInvocationsMethodCall, new LNumber($key + 1)), ['stmts' => $ifStmts]); + $ifs[] = new If_(new Identical($numberOfInvocationsMethodCall, new Int_($key + 1)), ['stmts' => $ifStmts]); } return $ifs; } private function createAssertMethodCall(MethodCall $assertMethodCall, Variable $parametersVariable, int $parameterPositionKey) : Expression { $assertMethodCall->name = new Identifier('assertEquals'); - $parametersArrayDimFetch = new ArrayDimFetch($parametersVariable, new LNumber($parameterPositionKey)); + $parametersArrayDimFetch = new ArrayDimFetch($parametersVariable, new Int_($parameterPositionKey)); $assertMethodCall->args[] = new Arg($parametersArrayDimFetch); return new Expression($assertMethodCall); } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ExpectExceptionMethodCallFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ExpectExceptionMethodCallFactory.php index 87a593b72..fc41ab1a4 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ExpectExceptionMethodCallFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/ExpectExceptionMethodCallFactory.php @@ -17,14 +17,12 @@ final class ExpectExceptionMethodCallFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\PHPUnit\PhpDoc\PhpDocValueToNodeMapper */ - private $phpDocValueToNodeMapper; + private PhpDocValueToNodeMapper $phpDocValueToNodeMapper; public function __construct(NodeFactory $nodeFactory, PhpDocValueToNodeMapper $phpDocValueToNodeMapper) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/MatcherInvocationCountMethodCallNodeFactory.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/MatcherInvocationCountMethodCallNodeFactory.php index a77130b1f..2b45df9b7 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/MatcherInvocationCountMethodCallNodeFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/MatcherInvocationCountMethodCallNodeFactory.php @@ -12,9 +12,8 @@ final class MatcherInvocationCountMethodCallNodeFactory { /** * @readonly - * @var \Rector\PHPUnit\Composer\ProjectPackageVersionResolver */ - private $projectPackageVersionResolver; + private ProjectPackageVersionResolver $projectPackageVersionResolver; public function __construct(ProjectPackageVersionResolver $projectPackageVersionResolver) { $this->projectPackageVersionResolver = $projectPackageVersionResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php index 1a3c21bf4..0ec59f5e0 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFactory/UsedVariablesResolver.php @@ -14,14 +14,12 @@ final class UsedVariablesResolver { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/DataProviderClassMethodFinder.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/DataProviderClassMethodFinder.php index c28d5221a..8371c894b 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/DataProviderClassMethodFinder.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/DataProviderClassMethodFinder.php @@ -19,24 +19,20 @@ final class DataProviderClassMethodFinder { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\AstResolver */ - private $astResolver; + private AstResolver $astResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, ReflectionResolver $reflectionResolver, AstResolver $astResolver, NodeNameResolver $nodeNameResolver) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php index 4bf595063..ac3ebb22a 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/NodeFinder/MethodCallNodeFinder.php @@ -12,14 +12,12 @@ final class MethodCallNodeFinder { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php index 119ee5b5c..010210eb4 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/DataProviderMethodRenamer.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\PHPUnit\PhpDoc; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Stmt\Class_; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; @@ -13,14 +13,12 @@ final class DataProviderMethodRenamer { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) { $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/PhpDocValueToNodeMapper.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/PhpDocValueToNodeMapper.php index dac7f7ded..3f576b602 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/PhpDocValueToNodeMapper.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/PhpDoc/PhpDocValueToNodeMapper.php @@ -13,14 +13,12 @@ final class PhpDocValueToNodeMapper { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(NodeFactory $nodeFactory, ReflectionProvider $reflectionProvider) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Set/PHPUnitSetList.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Set/PHPUnitSetList.php index 66df54acb..ee5574e8e 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Set/PHPUnitSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Set/PHPUnitSetList.php @@ -3,11 +3,10 @@ declare (strict_types=1); namespace Rector\PHPUnit\Set; -use Rector\Set\Contract\SetListInterface; /** * @api */ -final class PHPUnitSetList implements SetListInterface +final class PHPUnitSetList { /** * @var string @@ -41,6 +40,10 @@ final class PHPUnitSetList implements SetListInterface * @var string */ public const PHPUNIT_110 = __DIR__ . '/../../config/sets/phpunit110.php'; + /** + * @var string + */ + public const PHPUNIT_120 = __DIR__ . '/../../config/sets/phpunit120.php'; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/AnnotationWithValueToAttribute.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/AnnotationWithValueToAttribute.php index f97bff09d..df9745eaf 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/AnnotationWithValueToAttribute.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/AnnotationWithValueToAttribute.php @@ -7,27 +7,30 @@ final class AnnotationWithValueToAttribute { /** * @readonly - * @var string */ - private $annotationName; + private string $annotationName; /** * @readonly - * @var string */ - private $attributeClass; + private string $attributeClass; /** * @var array * @readonly */ - private $valueMap = []; + private array $valueMap = []; + /** + * @readonly + */ + private bool $isOnClassLevel = \false; /** * @param array $valueMap */ - public function __construct(string $annotationName, string $attributeClass, array $valueMap = []) + public function __construct(string $annotationName, string $attributeClass, array $valueMap = [], bool $isOnClassLevel = \false) { $this->annotationName = $annotationName; $this->attributeClass = $attributeClass; $this->valueMap = $valueMap; + $this->isOnClassLevel = $isOnClassLevel; } public function getAnnotationName() : string { @@ -44,4 +47,8 @@ public function getValueMap() : array { return $this->valueMap; } + public function getIsOnClassLevel() : bool + { + return $this->isOnClassLevel; + } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/BinaryOpWithAssertMethod.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/BinaryOpWithAssertMethod.php index 240035968..0557da596 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/BinaryOpWithAssertMethod.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/BinaryOpWithAssertMethod.php @@ -7,19 +7,16 @@ final class BinaryOpWithAssertMethod { /** * @readonly - * @var string */ - private $binaryOpClass; + private string $binaryOpClass; /** * @readonly - * @var string */ - private $assetMethodName; + private string $assetMethodName; /** * @readonly - * @var string */ - private $notAssertMethodName; + private string $notAssertMethodName; public function __construct(string $binaryOpClass, string $assetMethodName, string $notAssertMethodName) { $this->binaryOpClass = $binaryOpClass; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/ConstantWithAssertMethods.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/ConstantWithAssertMethods.php index dcf318fe1..fc9ff59d3 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/ConstantWithAssertMethods.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/ConstantWithAssertMethods.php @@ -7,19 +7,16 @@ final class ConstantWithAssertMethods { /** * @readonly - * @var string */ - private $constant; + private string $constant; /** * @readonly - * @var string */ - private $assetMethodName; + private string $assetMethodName; /** * @readonly - * @var string */ - private $notAssertMethodName; + private string $notAssertMethodName; public function __construct(string $constant, string $assetMethodName, string $notAssertMethodName) { $this->constant = $constant; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/FunctionNameWithAssertMethods.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/FunctionNameWithAssertMethods.php index 913fcb732..d62ba31bf 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/FunctionNameWithAssertMethods.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/ValueObject/FunctionNameWithAssertMethods.php @@ -7,19 +7,16 @@ final class FunctionNameWithAssertMethods { /** * @readonly - * @var string */ - private $functionName; + private string $functionName; /** * @readonly - * @var string */ - private $assetMethodName; + private string $assetMethodName; /** * @readonly - * @var string */ - private $notAssertMethodName; + private string $notAssertMethodName; public function __construct(string $functionName, string $assetMethodName, string $notAssertMethodName) { $this->functionName = $functionName; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/composer.json b/vendor/rector/rector/vendor/rector/rector-symfony/composer.json index e8c2a34fc..74f258632 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/composer.json +++ b/vendor/rector/rector/vendor/rector/rector-symfony/composer.json @@ -8,25 +8,25 @@ "ext-xml": "*" }, "require-dev": { + "phpecs\/phpecs": "^2.0.1", "phpstan\/extension-installer": "^1.4", - "phpstan\/phpstan": "^1.11", - "phpstan\/phpstan-webmozart-assert": "^1.2", - "phpunit\/phpunit": "^10.5", + "phpstan\/phpstan": "^2.1.8", + "phpstan\/phpstan-webmozart-assert": "^2.0", + "phpunit\/phpunit": "^11.4", "rector\/rector-src": "dev-main", - "rector\/type-perfect": "^0.1.8", + "rector\/type-perfect": "^2.0", "symfony\/config": "^6.4", "symfony\/dependency-injection": "^6.4", - "symfony\/http-kernel": "~6.3", + "symfony\/http-kernel": "^6.4", "symfony\/routing": "^6.4", "symfony\/security-core": "^6.4", "symfony\/security-http": "^6.4", "symfony\/validator": "^6.4", - "symplify\/easy-coding-standard": "^12.3", - "symplify\/phpstan-extensions": "^11.4", - "symplify\/phpstan-rules": "^13.0", + "symplify\/phpstan-rules": "^14.6", "symplify\/vendor-patches": "^11.3", - "tomasvotruba\/class-leak": "^0.2", - "tomasvotruba\/unused-public": "^0.4", + "tomasvotruba\/class-leak": "^2.0", + "tomasvotruba\/type-coverage": "^2.0", + "tomasvotruba\/unused-public": "^2.0", "tracy\/tracy": "^2.10" }, "autoload": { @@ -49,7 +49,7 @@ ] }, "scripts": { - "phpstan": "vendor\/bin\/phpstan analyse --ansi --error-format symplify", + "phpstan": "vendor\/bin\/phpstan analyse --ansi", "check-cs": "vendor\/bin\/ecs check --ansi", "fix-cs": "vendor\/bin\/ecs check --fix --ansi" }, diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php index 44cc94207..396931472 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/fosrest/annotations-to-attributes.php @@ -1,7 +1,7 @@ rules([ContainerGetToConstructorInjectionRector::class, ContainerGetNameToTypeInTestsRector::class, GetToConstructorInjectionRector::class]); + $rectorConfig->rules([ + // modern step-by-step narrow approach + ControllerGetByTypeToConstructorInjectionRector::class, + CommandGetByTypeToConstructorInjectionRector::class, + GetBySymfonyStringToConstructorInjectionRector::class, + TraitGetByTypeToInjectRector::class, + // legacy rules that require container fetch + ContainerGetNameToTypeInTestsRector::class, + GetToConstructorInjectionRector::class, + ]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony25.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony25.php index e017d1368..896a6ee5f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony25.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony25.php @@ -1,7 +1,7 @@ import(__DIR__ . '/symfony30/symfony30-class-loader.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-console.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-form.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-security.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-process.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-property-access.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-validator.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-translation.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-bridge-monolog.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-twig-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony30/symfony30-bridge-swift-mailer.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-monolog.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-monolog.php new file mode 100644 index 000000000..cb1370272 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-monolog.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Bridge\\Monolog\\Logger' => 'Psr\\Log\\LoggerInterface']); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'emerg', 'emergency'), new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'crit', 'critical'), new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'err', 'error'), new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'warn', 'warning')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-swift-mailer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-swift-mailer.php new file mode 100644 index 000000000..6f5bacd1a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-bridge-swift-mailer.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // swift mailer + 'Symfony\\Bridge\\Swiftmailer\\DataCollector\\MessageDataCollector' => 'Symfony\\Bundle\\SwiftmailerBundle\\DataCollector\\MessageDataCollector', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-class-loader.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-class-loader.php new file mode 100644 index 000000000..21af5c813 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-class-loader.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerNamespaces', 'addPrefixes'), new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerPrefixes', 'addPrefixes'), new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerNamespace', 'addPrefix'), new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerPrefix', 'addPrefix'), new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'getNamespaces', 'getPrefixes'), new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'getNamespaceFallbacks', 'getFallbackDirs'), new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'getPrefixFallbacks', 'getFallbackDirs')]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader' => 'Symfony\\Component\\ClassLoader\\ClassLoader']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-console.php new file mode 100644 index 000000000..99e386dae --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-console.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // console + 'Symfony\\Component\\Console\\Helper\\ProgressHelper' => 'Symfony\\Component\\Console\\Helper\\ProgressBar', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-form.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-form.php new file mode 100644 index 000000000..48e9523e5 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-form.php @@ -0,0 +1,24 @@ +rules([FormTypeInstanceToClassConstRector::class, StringFormTypeToClassRector::class, RemoveDefaultGetBlockPrefixRector::class, FormTypeGetParentRector::class, OptionNameRector::class, ReadOnlyOptionToAttributeRector::class, ChangeStringCollectionOptionToConstantRector::class]); + $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassConstFetch('Symfony\\Component\\Form\\FormEvents', 'PRE_BIND', 'PRE_SUBMIT'), new RenameClassConstFetch('Symfony\\Component\\Form\\FormEvents', 'BIND', 'SUBMIT'), new RenameClassConstFetch('Symfony\\Component\\Form\\FormEvents', 'POST_BIND', 'POST_SUBMIT'), new RenameClassConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer', 'ROUND_HALFEVEN', 'ROUND_HALF_EVEN'), new RenameClassConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer', 'ROUND_HALFUP', 'ROUND_HALF_UP'), new RenameClassConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer', 'ROUND_HALFDOWN', 'ROUND_HALF_DOWN')]); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Form\\AbstractType', 'getName', 'getBlockPrefix'), new MethodCallRename('Symfony\\Component\\Form\\FormTypeInterface', 'getName', 'getBlockPrefix'), new MethodCallRename('Symfony\\Component\\Form\\FormTypeInterface', 'setDefaultOptions', 'configureOptions'), new MethodCallRename('Symfony\\Component\\Form\\ResolvedFormTypeInterface', 'getName', 'getBlockPrefix'), new MethodCallRename('Symfony\\Component\\Form\\AbstractTypeExtension', 'setDefaultOptions', 'configureOptions'), new MethodCallRename('Symfony\\Component\\Form\\Form', 'bind', 'submit'), new MethodCallRename('Symfony\\Component\\Form\\Form', 'isBound', 'isSubmitted')]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Form\\Util\\VirtualFormAwareIterator' => 'Symfony\\Component\\Form\\Util\\InheritDataAwareIterator', 'Symfony\\Component\\Form\\Tests\\Extension\\Core\\Type\\TypeTestCase' => 'Symfony\\Component\\Form\\Test\\TypeTestCase', 'Symfony\\Component\\Form\\Tests\\FormIntegrationTestCase' => 'Symfony\\Component\\Form\\Test\\FormIntegrationTestCase', 'Symfony\\Component\\Form\\Tests\\FormPerformanceTestCase' => 'Symfony\\Component\\Form\\Test\\FormPerformanceTestCase', 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\ChoiceListInterface' => 'Symfony\\Component\\Form\\ChoiceList\\ChoiceListInterface', 'Symfony\\Component\\Form\\Extension\\Core\\View\\ChoiceView' => 'Symfony\\Component\\Form\\ChoiceList\\View\\ChoiceView', 'Symfony\\Component\\Form\\Extension\\Csrf\\CsrfProvider\\CsrfProviderInterface' => 'Symfony\\Component\\Security\\Csrf\\CsrfTokenManagerInterface', 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\ChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList', 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\LazyChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\LazyChoiceList', 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\ObjectChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList', 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\SimpleChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList', 'Symfony\\Component\\Form\\ChoiceList\\ArrayKeyChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-foundation.php new file mode 100644 index 000000000..a38878676 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-foundation.php @@ -0,0 +1,10 @@ +rules([GetRequestRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-kernel.php new file mode 100644 index 000000000..fb1672685 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-http-kernel.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'emerg', 'emergency'), new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'crit', 'critical'), new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'err', 'error'), new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'warn', 'warning'), new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'emerg', 'emergency'), new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'crit', 'critical'), new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'err', 'error'), new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'warn', 'warning')]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\HttpKernel\\Debug\\ErrorHandler' => 'Symfony\\Component\\Debug\\ErrorHandler', 'Symfony\\Component\\HttpKernel\\Debug\\ExceptionHandler' => 'Symfony\\Component\\Debug\\ExceptionHandler', 'Symfony\\Component\\HttpKernel\\Exception\\FatalErrorException' => 'Symfony\\Component\\Debug\\Exception\\FatalErrorException', 'Symfony\\Component\\HttpKernel\\Exception\\FlattenException' => 'Symfony\\Component\\Debug\\Exception\\FlattenException', 'Symfony\\Component\\HttpKernel\\Log\\LoggerInterface' => 'Psr\\Log\\LoggerInterface', 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterListenersPass' => 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass', 'Symfony\\Component\\HttpKernel\\Log\\NullLogger' => 'Psr\\Log\\LoggerInterface']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-process.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-process.php new file mode 100644 index 000000000..f8002fa6c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-process.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Process\\Process', 'setStdin', 'setInput'), new MethodCallRename('Symfony\\Component\\Process\\Process', 'getStdin', 'getInput')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-property-access.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-property-access.php new file mode 100644 index 000000000..f1eb07e87 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-property-access.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\PropertyAccess\\PropertyAccess', 'getPropertyAccessor', 'createPropertyAccessor')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-security.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-security.php new file mode 100644 index 000000000..b9dc1cc80 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-security.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AbstractVoter' => 'Symfony\\Component\\Security\\Core\\Authorization\\Voter\\Voter']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-translation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-translation.php new file mode 100644 index 000000000..48fd9f58c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-translation.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Translation\\Dumper\\FileDumper', 'format', 'formatCatalogue'), new MethodCallRename('Symfony\\Component\\Translation\\Translator', 'getMessages', 'getCatalogue')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-twig-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-twig-bundle.php new file mode 100644 index 000000000..a6302d1e6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-twig-bundle.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Bundle\\TwigBundle\\TwigDefaultEscapingStrategy' => 'Twig_FileExtensionEscapingStrategy']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-validator.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-validator.php new file mode 100644 index 000000000..a0a15e144 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony30/symfony30-validator.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Validator\\Constraints\\Collection\\Optional' => 'Symfony\\Component\\Validator\\Constraints\\Optional', 'Symfony\\Component\\Validator\\Constraints\\Collection\\Required' => 'Symfony\\Component\\Validator\\Constraints\\Required', 'Symfony\\Component\\Validator\\MetadataInterface' => 'Symfony\\Component\\Validator\\Mapping\\MetadataInterface', 'Symfony\\Component\\Validator\\PropertyMetadataInterface' => 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface', 'Symfony\\Component\\Validator\\PropertyMetadataContainerInterface' => 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface', 'Symfony\\Component\\Validator\\ClassBasedInterface' => 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface', 'Symfony\\Component\\Validator\\Mapping\\ElementMetadata' => 'Symfony\\Component\\Validator\\Mapping\\GenericMetadata', 'Symfony\\Component\\Validator\\ExecutionContextInterface' => 'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface', 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataFactory' => 'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory', 'Symfony\\Component\\Validator\\Mapping\\MetadataFactoryInterface' => 'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface']); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolationInterface', 'getMessageParameters', 'getParameters'), new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolationInterface', 'getMessagePluralization', 'getPlural'), new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolation', 'getMessageParameters', 'getParameters'), new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolation', 'getMessagePluralization', 'getPlural')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-dbal-210.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony31.php similarity index 56% rename from vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-dbal-210.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony31.php index 0a68161a7..5af36ad1a 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-dbal-210.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony31.php @@ -1,9 +1,9 @@ import(__DIR__ . '/symfony31/symfony31-yaml.php'); }; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony31.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony31/symfony31-yaml.php similarity index 97% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony31.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony31/symfony31-yaml.php index a44db5a9c..e297b0597 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony31.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony31/symfony31-yaml.php @@ -1,7 +1,7 @@ import(__DIR__ . '/symfony32/symfony32-dependency-injection.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony32.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony32/symfony32-dependency-injection.php similarity index 93% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony32.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony32/symfony32-dependency-injection.php index 795c171c2..26288ae9f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony32.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony32/symfony32-dependency-injection.php @@ -1,7 +1,7 @@ import(__DIR__ . '/symfony33/symfony33-console.php'); + $rectorConfig->import(__DIR__ . '/symfony33/symfony33-debug.php'); + $rectorConfig->import(__DIR__ . '/symfony33/symfony33-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony33/symfony33-framework-bundle.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-console.php new file mode 100644 index 000000000..480196cce --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-console.php @@ -0,0 +1,15 @@ +rules([ConsoleExceptionToErrorEventConstantRector::class]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + // console + 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-debug.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-debug.php new file mode 100644 index 000000000..1dc224df3 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-debug.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // debug + 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => 'ErrorException', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-dependency-injection.php new file mode 100644 index 000000000..94795cbae --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-dependency-injection.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\DependencyInjection\\ContainerBuilder', 'compile', 0, 'resolveEnvPlaceholders', \false), new ArgumentAdder('Symfony\\Component\\DependencyInjection\\ContainerBuilder', 'addCompilerPass', 2, 'priority', 0), new ArgumentAdder('Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph', 'connect', 6, 'weak', \false)]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\DependencyInjection\\DefinitionDecorator' => 'Symfony\\Component\\DependencyInjection\\ChildDefinition']); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\DependencyInjection\\Container', 'isFrozen', 'isCompiled')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-framework-bundle.php new file mode 100644 index 000000000..d8429a91c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony33/symfony33-framework-bundle.php @@ -0,0 +1,19 @@ +ruleWithConfiguration(RenameClassRector::class, [ + # framework bundle + 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddConsoleCommandPass' => 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass', + 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SerializerPass' => 'Symfony\\Component\\Serializer\\DependencyInjection\\SerializerPass', + 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\FormPass' => 'Symfony\\Component\\Form\\DependencyInjection\\FormPass', + 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener', + 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListenr' => 'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener', + 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ConfigCachePass' => 'Symfony\\Component\\Config\\DependencyInjection\\ConfigCachePass', + 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\PropertyInfoPass' => 'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34.php new file mode 100644 index 000000000..6a25d1ecb --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34.php @@ -0,0 +1,11 @@ +import(__DIR__ . '/symfony34/symfony34-yaml.php'); + $rectorConfig->import(__DIR__ . '/symfony34/symfony34-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony34/symfony34-sensio-framework-extra-bundle.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-dependency-injection.php new file mode 100644 index 000000000..650f4fa41 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-dependency-injection.php @@ -0,0 +1,10 @@ +rules([ContainerGetNameToTypeInTestsRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony34.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-sensio-framework-extra-bundle.php similarity index 50% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony34.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-sensio-framework-extra-bundle.php index 5b2315484..53a40cc9e 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony34.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-sensio-framework-extra-bundle.php @@ -1,16 +1,12 @@ ruleWithConfiguration(ArgumentRemoverRector::class, [new ArgumentRemover('Symfony\\Component\\Yaml\\Yaml', 'parse', 2, ['Symfony\\Component\\Yaml\\Yaml::PARSE_KEYS_AS_STRINGS'])]); - $rectorConfig->rules([MergeMethodAnnotationToRouteAnnotationRector::class, RemoveServiceFromSensioRouteRector::class, ReplaceSensioRouteAnnotationWithSymfonyRector::class, ContainerGetNameToTypeInTestsRector::class]); + $rectorConfig->rules([MergeMethodAnnotationToRouteAnnotationRector::class, RemoveServiceFromSensioRouteRector::class, ReplaceSensioRouteAnnotationWithSymfonyRector::class]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-yaml.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-yaml.php new file mode 100644 index 000000000..92a874022 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony3/symfony34/symfony34-yaml.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(ArgumentRemoverRector::class, [new ArgumentRemover('Symfony\\Component\\Yaml\\Yaml', 'parse', 2, ['Symfony\\Component\\Yaml\\Yaml::PARSE_KEYS_AS_STRINGS'])]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony30.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony30.php deleted file mode 100644 index 50755b61c..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony30.php +++ /dev/null @@ -1,132 +0,0 @@ -rules([ - // php - GetRequestRector::class, - FormTypeGetParentRector::class, - OptionNameRector::class, - ReadOnlyOptionToAttributeRector::class, - // forms - FormTypeInstanceToClassConstRector::class, - StringFormTypeToClassRector::class, - RemoveDefaultGetBlockPrefixRector::class, - // forms - collection - ChangeStringCollectionOptionToConstantRector::class, - ]); - $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassConstFetch('Symfony\\Component\\Form\\FormEvents', 'PRE_BIND', 'PRE_SUBMIT'), new RenameClassConstFetch('Symfony\\Component\\Form\\FormEvents', 'BIND', 'SUBMIT'), new RenameClassConstFetch('Symfony\\Component\\Form\\FormEvents', 'POST_BIND', 'POST_SUBMIT'), new RenameClassConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer', 'ROUND_HALFEVEN', 'ROUND_HALF_EVEN'), new RenameClassConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer', 'ROUND_HALFUP', 'ROUND_HALF_UP'), new RenameClassConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer', 'ROUND_HALFDOWN', 'ROUND_HALF_DOWN')]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerNamespaces', 'addPrefixes'), - new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerPrefixes', 'addPrefixes'), - new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerNamespace', 'addPrefix'), - new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'registerPrefix', 'addPrefix'), - new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'getNamespaces', 'getPrefixes'), - new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'getNamespaceFallbacks', 'getFallbackDirs'), - new MethodCallRename('Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader', 'getPrefixFallbacks', 'getFallbackDirs'), - // form - new MethodCallRename('Symfony\\Component\\Form\\AbstractType', 'getName', 'getBlockPrefix'), - new MethodCallRename('Symfony\\Component\\Form\\FormTypeInterface', 'getName', 'getBlockPrefix'), - new MethodCallRename('Symfony\\Component\\Form\\FormTypeInterface', 'setDefaultOptions', 'configureOptions'), - new MethodCallRename('Symfony\\Component\\Form\\ResolvedFormTypeInterface', 'getName', 'getBlockPrefix'), - new MethodCallRename('Symfony\\Component\\Form\\AbstractTypeExtension', 'setDefaultOptions', 'configureOptions'), - new MethodCallRename('Symfony\\Component\\Form\\Form', 'bind', 'submit'), - new MethodCallRename('Symfony\\Component\\Form\\Form', 'isBound', 'isSubmitted'), - // process - new MethodCallRename('Symfony\\Component\\Process\\Process', 'setStdin', 'setInput'), - new MethodCallRename('Symfony\\Component\\Process\\Process', 'getStdin', 'getInput'), - // monolog - new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'emerg', 'emergency'), - new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'crit', 'critical'), - new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'err', 'error'), - new MethodCallRename('Symfony\\Bridge\\Monolog\\Logger', 'warn', 'warning'), - # http kernel - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'emerg', 'emergency'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'crit', 'critical'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'err', 'error'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface', 'warn', 'warning'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'emerg', 'emergency'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'crit', 'critical'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'err', 'error'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Log\\NullLogger', 'warn', 'warning'), - // property access - new MethodCallRename('Symfony\\Component\\PropertyAccess\\PropertyAccess', 'getPropertyAccessor', 'createPropertyAccessor'), - // translator - new MethodCallRename('Symfony\\Component\\Translation\\Dumper\\FileDumper', 'format', 'formatCatalogue'), - new MethodCallRename('Symfony\\Component\\Translation\\Translator', 'getMessages', 'getCatalogue'), - // validator - new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolationInterface', 'getMessageParameters', 'getParameters'), - new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolationInterface', 'getMessagePluralization', 'getPlural'), - new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolation', 'getMessageParameters', 'getParameters'), - new MethodCallRename('Symfony\\Component\\Validator\\ConstraintViolation', 'getMessagePluralization', 'getPlural'), - ]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - # class loader - # partial with method rename - 'Symfony\\Component\\ClassLoader\\UniversalClassLoader\\UniversalClassLoader' => 'Symfony\\Component\\ClassLoader\\ClassLoader', - # console - 'Symfony\\Component\\Console\\Helper\\ProgressHelper' => 'Symfony\\Component\\Console\\Helper\\ProgressBar', - # form - 'Symfony\\Component\\Form\\Util\\VirtualFormAwareIterator' => 'Symfony\\Component\\Form\\Util\\InheritDataAwareIterator', - 'Symfony\\Component\\Form\\Tests\\Extension\\Core\\Type\\TypeTestCase' => 'Symfony\\Component\\Form\\Test\\TypeTestCase', - 'Symfony\\Component\\Form\\Tests\\FormIntegrationTestCase' => 'Symfony\\Component\\Form\\Test\\FormIntegrationTestCase', - 'Symfony\\Component\\Form\\Tests\\FormPerformanceTestCase' => 'Symfony\\Component\\Form\\Test\\FormPerformanceTestCase', - 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\ChoiceListInterface' => 'Symfony\\Component\\Form\\ChoiceList\\ChoiceListInterface', - 'Symfony\\Component\\Form\\Extension\\Core\\View\\ChoiceView' => 'Symfony\\Component\\Form\\ChoiceList\\View\\ChoiceView', - 'Symfony\\Component\\Form\\Extension\\Csrf\\CsrfProvider\\CsrfProviderInterface' => 'Symfony\\Component\\Security\\Csrf\\CsrfTokenManagerInterface', - 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\ChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList', - 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\LazyChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\LazyChoiceList', - 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\ObjectChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList', - 'Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\SimpleChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList', - 'Symfony\\Component\\Form\\ChoiceList\\ArrayKeyChoiceList' => 'Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList', - # http kernel - 'Symfony\\Component\\HttpKernel\\Debug\\ErrorHandler' => 'Symfony\\Component\\Debug\\ErrorHandler', - 'Symfony\\Component\\HttpKernel\\Debug\\ExceptionHandler' => 'Symfony\\Component\\Debug\\ExceptionHandler', - 'Symfony\\Component\\HttpKernel\\Exception\\FatalErrorException' => 'Symfony\\Component\\Debug\\Exception\\FatalErrorException', - 'Symfony\\Component\\HttpKernel\\Exception\\FlattenException' => 'Symfony\\Component\\Debug\\Exception\\FlattenException', - # partial with method rename - 'Symfony\\Component\\HttpKernel\\Log\\LoggerInterface' => 'Psr\\Log\\LoggerInterface', - # event disptacher - 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterListenersPass' => 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass', - # partial with methor rename - 'Symfony\\Component\\HttpKernel\\Log\\NullLogger' => 'Psr\\Log\\LoggerInterface', - # monolog - # partial with method rename - 'Symfony\\Bridge\\Monolog\\Logger' => 'Psr\\Log\\LoggerInterface', - # security - 'Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AbstractVoter' => 'Symfony\\Component\\Security\\Core\\Authorization\\Voter\\Voter', - # twig - 'Symfony\\Bundle\\TwigBundle\\TwigDefaultEscapingStrategy' => 'Twig_FileExtensionEscapingStrategy', - # validator - 'Symfony\\Component\\Validator\\Constraints\\Collection\\Optional' => 'Symfony\\Component\\Validator\\Constraints\\Optional', - 'Symfony\\Component\\Validator\\Constraints\\Collection\\Required' => 'Symfony\\Component\\Validator\\Constraints\\Required', - 'Symfony\\Component\\Validator\\MetadataInterface' => 'Symfony\\Component\\Validator\\Mapping\\MetadataInterface', - 'Symfony\\Component\\Validator\\PropertyMetadataInterface' => 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface', - 'Symfony\\Component\\Validator\\PropertyMetadataContainerInterface' => 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface', - 'Symfony\\Component\\Validator\\ClassBasedInterface' => 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface', - 'Symfony\\Component\\Validator\\Mapping\\ElementMetadata' => 'Symfony\\Component\\Validator\\Mapping\\GenericMetadata', - 'Symfony\\Component\\Validator\\ExecutionContextInterface' => 'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface', - 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataFactory' => 'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory', - 'Symfony\\Component\\Validator\\Mapping\\MetadataFactoryInterface' => 'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface', - # swift mailer - 'Symfony\\Bridge\\Swiftmailer\\DataCollector\\MessageDataCollector' => 'Symfony\\Bundle\\SwiftmailerBundle\\DataCollector\\MessageDataCollector', - ]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony33.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony33.php deleted file mode 100644 index 58e67d8d6..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony33.php +++ /dev/null @@ -1,33 +0,0 @@ -ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\DependencyInjection\\ContainerBuilder', 'compile', 0, 'resolveEnvPlaceholders', \false), new ArgumentAdder('Symfony\\Component\\DependencyInjection\\ContainerBuilder', 'addCompilerPass', 2, 'priority', 0), new ArgumentAdder('Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph', 'connect', 6, 'weak', \false)]); - $rectorConfig->rule(ConsoleExceptionToErrorEventConstantRector::class); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - # console - 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent', - # debug - 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => 'ErrorException', - # dependency-injection - 'Symfony\\Component\\DependencyInjection\\DefinitionDecorator' => 'Symfony\\Component\\DependencyInjection\\ChildDefinition', - # framework bundle - 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddConsoleCommandPass' => 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass', - 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SerializerPass' => 'Symfony\\Component\\Serializer\\DependencyInjection\\SerializerPass', - 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\FormPass' => 'Symfony\\Component\\Form\\DependencyInjection\\FormPass', - 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener', - 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListenr' => 'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener', - 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ConfigCachePass' => 'Symfony\\Component\\Config\\DependencyInjection\\ConfigCachePass', - 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\PropertyInfoPass' => 'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass', - ]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\DependencyInjection\\Container', 'isFrozen', 'isCompiled')]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40.php new file mode 100644 index 000000000..0c3439dac --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40.php @@ -0,0 +1,13 @@ +import(__DIR__ . '/symfony40/symfony40-validator.php'); + $rectorConfig->import(__DIR__ . '/symfony40/symfony40-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony40/symfony40-process.php'); + $rectorConfig->import(__DIR__ . '/symfony40/symfony40-form.php'); + $rectorConfig->import(__DIR__ . '/symfony40/symfony40-var-dumper.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-dependency-injection.php new file mode 100644 index 000000000..163654a86 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-dependency-injection.php @@ -0,0 +1,10 @@ +rules([ContainerBuilderCompileEnvArgumentRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-form.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-form.php new file mode 100644 index 000000000..285e04fb5 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-form.php @@ -0,0 +1,10 @@ +rules([FormIsValidRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-process.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-process.php new file mode 100644 index 000000000..27c83a349 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-process.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Process\\ProcessBuilder' => 'Symfony\\Component\\Process\\Process']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-validator.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-validator.php new file mode 100644 index 000000000..58c932f04 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-validator.php @@ -0,0 +1,12 @@ +rules([ConstraintUrlOptionRector::class]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Validator\\Tests\\Constraints\\AbstractConstraintValidatorTest' => 'Symfony\\Component\\Validator\\Test\\ConstraintValidatorTestCase']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-var-dumper.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-var-dumper.php new file mode 100644 index 000000000..e7c0f81d9 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony40/symfony40-var-dumper.php @@ -0,0 +1,10 @@ +rules([VarDumperTestTraitMethodArgsRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41.php new file mode 100644 index 000000000..bb9b1c873 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41.php @@ -0,0 +1,13 @@ +import(__DIR__ . '/symfony41/symfony41-console.php'); + $rectorConfig->import(__DIR__ . '/symfony41/symfony41-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony41/symfony41-workflow.php'); + $rectorConfig->import(__DIR__ . '/symfony41/symfony41-framework-bundle.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony41.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-console.php similarity index 59% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony41.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-console.php index cc73680d7..b6dc8a84a 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony41.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-console.php @@ -1,14 +1,12 @@ ruleWithConfiguration(RenameMethodRector::class, [ # https://github.com/symfony/symfony/commit/463f986c28a497571967e37c1314e9911f1ef6ba @@ -17,9 +15,6 @@ new MethodCallRename('Symfony\\Component\\Console\\Helper\\TableStyle', 'setVerticalBorderChar', 'setVerticalBorderChars'), # https://github.com/symfony/symfony/commit/463f986c28a497571967e37c1314e9911f1ef6ba new MethodCallRename('Symfony\\Component\\Console\\Helper\\TableStyle', 'setCrossingChar', 'setDefaultCrossingChar'), - new MethodCallRename('Symfony\\Component\\HttpFoundation\\File\\UploadedFile', 'getClientSize', 'getSize'), - new MethodCallRename('Symfony\\Component\\Workflow\\DefinitionBuilder', 'reset', 'clear'), - new MethodCallRename('Symfony\\Component\\Workflow\\DefinitionBuilder', 'add', 'addWorkflow'), # https://github.com/symfony/symfony/commit/463f986c28a497571967e37c1314e9911f1ef6ba new MethodCallRenameWithArrayKey( 'Symfony\\Component\\Console\\Helper\\TableStyle', @@ -31,10 +26,4 @@ # https://github.com/symfony/symfony/commit/463f986c28a497571967e37c1314e9911f1ef6ba new MethodCallRenameWithArrayKey('Symfony\\Component\\Console\\Helper\\TableStyle', 'getHorizontalBorderChar', 'getBorderChars', 2), ]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - # https://github.com/symfony/symfony/commit/07dd09db59e2f2a86a291d00d978169d9059e307 - 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector' => 'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector', - 'Symfony\\Component\\Workflow\\SupportStrategy\\SupportStrategyInterface' => 'Symfony\\Component\\Workflow\\SupportStrategy\\WorkflowSupportStrategyInterface', - 'Symfony\\Component\\Workflow\\SupportStrategy\\ClassInstanceSupportStrategy' => 'Symfony\\Component\\Workflow\\SupportStrategy\\InstanceOfSupportStrategy', - ]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-framework-bundle.php new file mode 100644 index 000000000..56dfb627e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-framework-bundle.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + # https://github.com/symfony/symfony/commit/07dd09db59e2f2a86a291d00d978169d9059e307 + 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector' => 'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-http-foundation.php new file mode 100644 index 000000000..fc8d2e2cf --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-http-foundation.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\HttpFoundation\\File\\UploadedFile', 'getClientSize', 'getSize')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-workflow.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-workflow.php new file mode 100644 index 000000000..6fc75fe96 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony41/symfony41-workflow.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Workflow\\DefinitionBuilder', 'reset', 'clear'), new MethodCallRename('Symfony\\Component\\Workflow\\DefinitionBuilder', 'add', 'addWorkflow')]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Workflow\\SupportStrategy\\SupportStrategyInterface' => 'Symfony\\Component\\Workflow\\SupportStrategy\\WorkflowSupportStrategyInterface', 'Symfony\\Component\\Workflow\\SupportStrategy\\ClassInstanceSupportStrategy' => 'Symfony\\Component\\Workflow\\SupportStrategy\\InstanceOfSupportStrategy']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42.php new file mode 100644 index 000000000..569f22de6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42.php @@ -0,0 +1,21 @@ +import(__DIR__ . '/symfony42/symfony42-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-framework-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-translation.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-process.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-config.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-dom-crawler.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-finder.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-monolog-bridge.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-serializer.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-form.php'); + $rectorConfig->import(__DIR__ . '/symfony42/symfony42-cache.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-cache.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-cache.php new file mode 100644 index 000000000..01f48cbcf --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-cache.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Cache\\CacheItem', 'getPreviousTags', 'getMetadata')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-config.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-config.php new file mode 100644 index 000000000..17a2c0279 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-config.php @@ -0,0 +1,13 @@ +rules([ + // https://symfony.com/blog/new-in-symfony-4-2-important-deprecations + RootNodeTreeBuilderRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-dom-crawler.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-dom-crawler.php new file mode 100644 index 000000000..b63545525 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-dom-crawler.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\DomCrawler\\Crawler', 'children', 0, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-finder.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-finder.php new file mode 100644 index 000000000..078383ba1 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-finder.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\Finder\\Finder', 'sortByName', 0, null, \false, null, ArgumentAddingScope::SCOPE_METHOD_CALL)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-form.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-form.php new file mode 100644 index 000000000..1930647ee --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-form.php @@ -0,0 +1,24 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedType', 'getExtendedTypes')]); + $iterableType = new IterableType(new MixedType(), new MixedType()); + $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedTypes', $iterableType)]); + $rectorConfig->ruleWithConfiguration(ChangeMethodVisibilityRector::class, [new ChangeMethodVisibility('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedTypes', Visibility::STATIC)]); + $rectorConfig->ruleWithConfiguration(WrapReturnRector::class, [new WrapReturn('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedTypes', \true)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-framework-bundle.php new file mode 100644 index 000000000..600a2362e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-framework-bundle.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + # https://github.com/symfony/symfony/commit/a7e319d9e1316e2e18843f8ce15b67a8693e5bf9 + 'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller' => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-foundation.php new file mode 100644 index 000000000..94284f2cc --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-foundation.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(NewToStaticCallRector::class, [new NewToStaticCall('Symfony\\Component\\HttpFoundation\\Cookie', 'Symfony\\Component\\HttpFoundation\\Cookie', 'create')]); + // https://github.com/symfony/symfony/commit/9493cfd5f2366dab19bbdde0d0291d0575454567 + $rectorConfig->ruleWithConfiguration(ReplaceArgumentDefaultValueRector::class, [new ReplaceArgumentDefaultValue('Symfony\\Component\\HttpFoundation\\Cookie', MethodName::CONSTRUCT, 5, \false, null), new ReplaceArgumentDefaultValue('Symfony\\Component\\HttpFoundation\\Cookie', MethodName::CONSTRUCT, 8, null, 'lax')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-kernel.php new file mode 100644 index 000000000..935f03f68 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-http-kernel.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(ArgumentRemoverRector::class, [new ArgumentRemover('Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector', MethodName::CONSTRUCT, 0, null), new ArgumentRemover('Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector', MethodName::CONSTRUCT, 1, null)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-monolog-bridge.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-monolog-bridge.php new file mode 100644 index 000000000..7edc49e46 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-monolog-bridge.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Bridge\\Monolog\\Processor\\DebugProcessor', 'getLogs', 0, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Bridge\\Monolog\\Processor\\DebugProcessor', 'countErrors', 0, 'default_value', null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Bridge\\Monolog\\Logger', 'getLogs', 0, 'default_value', null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Bridge\\Monolog\\Logger', 'countErrors', 0, 'default_value', null, null, ArgumentAddingScope::SCOPE_METHOD_CALL)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-process.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-process.php new file mode 100644 index 000000000..f98dfc1ac --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-process.php @@ -0,0 +1,13 @@ +rules([ + // https://symfony.com/blog/new-in-symfony-4-2-important-deprecations + StringToArrayArgumentProcessRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-serializer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-serializer.php new file mode 100644 index 000000000..ee2d77804 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-serializer.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\Serializer\\Normalizer', 'handleCircularReference', 1, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Component\\Serializer\\Normalizer', 'handleCircularReference', 2, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-translation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-translation.php new file mode 100644 index 000000000..56d7ffc40 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony42/symfony42-translation.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Translation\\TranslatorInterface' => 'Symfony\\Contracts\\Translation\\TranslatorInterface']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43.php new file mode 100644 index 000000000..846f53b1b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43.php @@ -0,0 +1,20 @@ +import(__DIR__ . '/symfony43/symfony43-browser-kit.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-cache.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-event-dispatcher.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-framework-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-intl.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-security-core.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-security-http.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-twig-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony43/symfony43-workflow.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-browser-kit.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-browser-kit.php new file mode 100644 index 000000000..ce111f521 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-browser-kit.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\BrowserKit\\Response', 'getStatus', 'getStatusCode')]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\BrowserKit\\Client' => 'Symfony\\Component\\BrowserKit\\AbstractBrowser']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-cache.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-cache.php new file mode 100644 index 000000000..ee07cde52 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-cache.php @@ -0,0 +1,26 @@ +ruleWithConfiguration(RenameClassRector::class, [ + # https://github.com/symfony/symfony/pull/29236 + 'Symfony\\Component\\Cache\\Traits\\ApcuTrait\\ApcuCache' => 'Symfony\\Component\\Cache\\Traits\\ApcuTrait\\ApcuAdapter', + 'Symfony\\Component\\Cache\\Adapter\\SimpleCacheAdapter' => 'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter', + 'Symfony\\Component\\Cache\\Simple\\ArrayCache' => 'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter', + 'Symfony\\Component\\Cache\\Simple\\ChainCache' => 'Symfony\\Component\\Cache\\Adapter\\ChainAdapter', + 'Symfony\\Component\\Cache\\Simple\\DoctrineCache' => 'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter', + 'Symfony\\Component\\Cache\\Simple\\FilesystemCache' => 'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter', + 'Symfony\\Component\\Cache\\Simple\\MemcachedCache' => 'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter', + 'Symfony\\Component\\Cache\\Simple\\NullCache' => 'Symfony\\Component\\Cache\\Adapter\\NullAdapter', + 'Symfony\\Component\\Cache\\Simple\\PdoCache' => 'Symfony\\Component\\Cache\\Adapter\\PdoAdapter', + 'Symfony\\Component\\Cache\\Simple\\PhpArrayCache' => 'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter', + 'Symfony\\Component\\Cache\\Simple\\PhpFilesCache' => 'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter', + 'Symfony\\Component\\Cache\\Simple\\RedisCache' => 'Symfony\\Component\\Cache\\Adapter\\RedisAdapter', + 'Symfony\\Component\\Cache\\Simple\\TraceableCache' => 'Symfony\\Component\\Cache\\Adapter\\TraceableAdapterCache', + 'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => 'Symfony\\Component\\Cache\\Psr16Cache', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-event-dispatcher.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-event-dispatcher.php new file mode 100644 index 000000000..70fa18d1d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-event-dispatcher.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // has lowest priority, have to be last + 'Symfony\\Component\\EventDispatcher\\Event' => 'Symfony\\Contracts\\EventDispatcher\\Event', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-framework-bundle.php new file mode 100644 index 000000000..f45dd1cb5 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-framework-bundle.php @@ -0,0 +1,25 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // assets deprecation + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\AssetsHelper' => 'Symfony\\Component\\Asset\\Packages', + // templating + 'Symfony\\Bundle\\FrameworkBundle\\Templating\\EngineInterface' => 'Symfony\\Component\\Templating\\EngineInterface', + ]); + $rectorConfig->rules([ + ConvertRenderTemplateShortNotationToBundleSyntaxRector::class, + # https://symfony.com/blog/new-in-symfony-4-3-better-test-assertions + // + WebTestCaseAssertIsSuccessfulRector::class, + WebTestCaseAssertResponseCodeRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-foundation.php new file mode 100644 index 000000000..5e559c202 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-foundation.php @@ -0,0 +1,17 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // MimeType + 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesserInterface' => 'Symfony\\Component\\Mime\\MimeTypesInterface', + 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesserInterface' => 'Symfony\\Component\\Mime\\MimeTypesInterface', + 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeExtensionGuesser' => 'Symfony\\Component\\Mime\\MimeTypes', + 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileBinaryMimeTypeGuesser' => 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser', + 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileinfoMimeTypeGuesser' => 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-kernel.php new file mode 100644 index 000000000..ee9bb0567 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-http-kernel.php @@ -0,0 +1,21 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // EventDispatcher + 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerArgumentsEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent', + 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent', + 'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent', + 'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent' => 'Symfony\\Component\\HttpKernel\\Event\\RequestEvent', + 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ViewEvent', + 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent', + 'Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent' => 'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent', + // @todo unpack after YAML to PHP migration, Symfony\Component\HttpKernel\Client: Symfony\Component\HttpKernel\HttpKernelBrowser + 'Symfony\\Component\\HttpKernel\\EventListener\\TranslatorListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-intl.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-intl.php new file mode 100644 index 000000000..9ce847d10 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-intl.php @@ -0,0 +1,10 @@ +rules([GetCurrencyBundleMethodCallsToIntlRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-core.php new file mode 100644 index 000000000..2851c553e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-core.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameClassRector::class, [ + # Security + 'Symfony\\Component\\Security\\Core\\Encoder\\Argon2iPasswordEncoder' => 'Symfony\\Component\\Security\\Core\\Encoder\\SodiumPasswordEncoder', + 'Symfony\\Component\\Security\\Core\\Encoder\\BCryptPasswordEncoder' => 'Symfony\\Component\\Security\\Core\\Encoder\\NativePasswordEncoder', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-http.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-http.php new file mode 100644 index 000000000..2263ba6be --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-security-http.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Security\\Http\\Firewall', 'handleRequest', 'callListeners')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-twig-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-twig-bundle.php new file mode 100644 index 000000000..178cfefdb --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-twig-bundle.php @@ -0,0 +1,10 @@ +rules([TwigBundleFilesystemLoaderToTwigRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-workflow.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-workflow.php new file mode 100644 index 000000000..0edb1e44d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony43/symfony43-workflow.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\Workflow\\MarkingStore\\MarkingStoreInterface', 'setMarking', 2, 'context', [])]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44.php new file mode 100644 index 000000000..7165a3e6c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44.php @@ -0,0 +1,14 @@ +import(__DIR__ . '/symfony44/symfony44-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony44/symfony44-console.php'); + $rectorConfig->import(__DIR__ . '/symfony44/symfony44-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony44/symfony44-templating.php'); + $rectorConfig->import(__DIR__ . '/symfony44/symfony44-security-core.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-console.php new file mode 100644 index 000000000..37cc9ddf6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-console.php @@ -0,0 +1,13 @@ +rules([ + // https://github.com/symfony/symfony/pull/33775 + ConsoleExecuteReturnIntRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-dependency-injection.php new file mode 100644 index 000000000..aac3f0fc5 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-dependency-injection.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameFunctionRector::class, ['Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\tagged' => 'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\tagged_iterator']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-http-kernel.php new file mode 100644 index 000000000..5a978bbd2 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-http-kernel.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + // https://github.com/symfony/http-kernel/blob/801b925e308518ddf821ba91952c41ae77c77507/Event/GetResponseForExceptionEvent.php#L55 + new MethodCallRename('Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent', 'getException', 'getThrowable'), + // https://github.com/symfony/http-kernel/blob/801b925e308518ddf821ba91952c41ae77c77507/Event/GetResponseForExceptionEvent.php#L67 + new MethodCallRename('Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent', 'setException', 'setThrowable'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-security-core.php new file mode 100644 index 000000000..493817685 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-security-core.php @@ -0,0 +1,10 @@ +rules([AuthorizationCheckerIsGrantedExtractorRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-templating.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-templating.php new file mode 100644 index 000000000..9913f3396 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony4/symfony44/symfony44-templating.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Templating\\EngineInterface' => 'Twig\\Environment']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony40.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony40.php deleted file mode 100644 index 7af851e6e..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony40.php +++ /dev/null @@ -1,15 +0,0 @@ -rules([ConstraintUrlOptionRector::class, FormIsValidRector::class, VarDumperTestTraitMethodArgsRector::class, ContainerBuilderCompileEnvArgumentRector::class]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Validator\\Tests\\Constraints\\AbstractConstraintValidatorTest' => 'Symfony\\Component\\Validator\\Test\\ConstraintValidatorTestCase', 'Symfony\\Component\\Process\\ProcessBuilder' => 'Symfony\\Component\\Process\\Process']); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony42.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony42.php deleted file mode 100644 index d6a394016..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony42.php +++ /dev/null @@ -1,57 +0,0 @@ -ruleWithConfiguration(NewToStaticCallRector::class, [new NewToStaticCall('Symfony\\Component\\HttpFoundation\\Cookie', 'Symfony\\Component\\HttpFoundation\\Cookie', 'create')]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - # https://github.com/symfony/symfony/commit/a7e319d9e1316e2e18843f8ce15b67a8693e5bf9 - 'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller' => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController', - # https://github.com/symfony/symfony/commit/744bf0e7ac3ecf240d0bf055cc58f881bb0b3ec0 - 'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerAwareCommand' => 'Symfony\\Component\\Console\\Command\\Command', - 'Symfony\\Component\\Translation\\TranslatorInterface' => 'Symfony\\Contracts\\Translation\\TranslatorInterface', - ]); - # related to "Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand" deprecation, @see https://github.com/rectorphp/rector/issues/1629 - $rectorConfig->rule(ContainerGetToConstructorInjectionRector::class); - # https://symfony.com/blog/new-in-symfony-4-2-important-deprecations - $rectorConfig->rule(StringToArrayArgumentProcessRector::class); - $rectorConfig->rule(RootNodeTreeBuilderRector::class); - $rectorConfig->ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\DomCrawler\\Crawler', 'children', 0, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Component\\Finder\\Finder', 'sortByName', 0, null, \false, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Bridge\\Monolog\\Processor\\DebugProcessor', 'getLogs', 0, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Bridge\\Monolog\\Processor\\DebugProcessor', 'countErrors', 0, 'default_value', null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Bridge\\Monolog\\Logger', 'getLogs', 0, 'default_value', null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Bridge\\Monolog\\Logger', 'countErrors', 0, 'default_value', null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Component\\Serializer\\Normalizer', 'handleCircularReference', 1, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL), new ArgumentAdder('Symfony\\Component\\Serializer\\Normalizer', 'handleCircularReference', 2, null, null, null, ArgumentAddingScope::SCOPE_METHOD_CALL)]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Cache\\CacheItem', 'getPreviousTags', 'getMetadata'), new MethodCallRename('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedType', 'getExtendedTypes')]); - $iterableType = new IterableType(new MixedType(), new MixedType()); - $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedTypes', $iterableType)]); - $rectorConfig->ruleWithConfiguration(ChangeMethodVisibilityRector::class, [new ChangeMethodVisibility('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedTypes', Visibility::STATIC)]); - $rectorConfig->ruleWithConfiguration(WrapReturnRector::class, [new WrapReturn('Symfony\\Component\\Form\\AbstractTypeExtension', 'getExtendedTypes', \true)]); - // https://github.com/symfony/symfony/commit/9493cfd5f2366dab19bbdde0d0291d0575454567 - $rectorConfig->ruleWithConfiguration(ReplaceArgumentDefaultValueRector::class, [new ReplaceArgumentDefaultValue('Symfony\\Component\\HttpFoundation\\Cookie', MethodName::CONSTRUCT, 5, \false, null), new ReplaceArgumentDefaultValue('Symfony\\Component\\HttpFoundation\\Cookie', MethodName::CONSTRUCT, 8, null, 'lax')]); - # https://github.com/symfony/symfony/commit/f5c355e1ba399a1b3512367647d902148bdaf09f - $rectorConfig->ruleWithConfiguration(ArgumentRemoverRector::class, [new ArgumentRemover('Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector', MethodName::CONSTRUCT, 0, null), new ArgumentRemover('Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector', MethodName::CONSTRUCT, 1, null)]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony43.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony43.php deleted file mode 100644 index 1fe7fcf93..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony43.php +++ /dev/null @@ -1,73 +0,0 @@ -rules([WebTestCaseAssertIsSuccessfulRector::class, WebTestCaseAssertResponseCodeRector::class, TwigBundleFilesystemLoaderToTwigRector::class, MakeDispatchFirstArgumentEventRector::class, GetCurrencyBundleMethodCallsToIntlRector::class, ConvertRenderTemplateShortNotationToBundleSyntaxRector::class, EventDispatcherParentConstructRector::class]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\BrowserKit\\Response', 'getStatus', 'getStatusCode'), new MethodCallRename('Symfony\\Component\\Security\\Http\\Firewall', 'handleRequest', 'callListeners')]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - // assets deprecation - 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\AssetsHelper' => 'Symfony\\Component\\Asset\\Packages', - // templating - 'Symfony\\Bundle\\FrameworkBundle\\Templating\\EngineInterface' => 'Symfony\\Component\\Templating\\EngineInterface', - # https://symfony.com/blog/new-in-symfony-4-3-simpler-event-dispatching - # Browser Kit - 'Symfony\\Component\\BrowserKit\\Client' => 'Symfony\\Component\\BrowserKit\\AbstractBrowser', - # Cache - # https://github.com/symfony/symfony/pull/29236 - 'Symfony\\Component\\Cache\\Traits\\ApcuTrait\\ApcuCache' => 'Symfony\\Component\\Cache\\Traits\\ApcuTrait\\ApcuAdapter', - 'Symfony\\Component\\Cache\\Adapter\\SimpleCacheAdapter' => 'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter', - 'Symfony\\Component\\Cache\\Simple\\ArrayCache' => 'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter', - 'Symfony\\Component\\Cache\\Simple\\ChainCache' => 'Symfony\\Component\\Cache\\Adapter\\ChainAdapter', - 'Symfony\\Component\\Cache\\Simple\\DoctrineCache' => 'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter', - 'Symfony\\Component\\Cache\\Simple\\FilesystemCache' => 'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter', - 'Symfony\\Component\\Cache\\Simple\\MemcachedCache' => 'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter', - 'Symfony\\Component\\Cache\\Simple\\NullCache' => 'Symfony\\Component\\Cache\\Adapter\\NullAdapter', - 'Symfony\\Component\\Cache\\Simple\\PdoCache' => 'Symfony\\Component\\Cache\\Adapter\\PdoAdapter', - 'Symfony\\Component\\Cache\\Simple\\PhpArrayCache' => 'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter', - 'Symfony\\Component\\Cache\\Simple\\PhpFilesCache' => 'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter', - 'Symfony\\Component\\Cache\\Simple\\RedisCache' => 'Symfony\\Component\\Cache\\Adapter\\RedisAdapter', - 'Symfony\\Component\\Cache\\Simple\\TraceableCache' => 'Symfony\\Component\\Cache\\Adapter\\TraceableAdapterCache', - 'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => 'Symfony\\Component\\Cache\\Psr16Cache', - # EventDispatcher - 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerArgumentsEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent', - 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent', - 'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent', - 'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent' => 'Symfony\\Component\\HttpKernel\\Event\\RequestEvent', - 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ViewEvent', - 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent' => 'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent', - 'Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent' => 'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent', - # has lowest priority, have to be last - 'Symfony\\Component\\EventDispatcher\\Event' => 'Symfony\\Contracts\\EventDispatcher\\Event', - # MimeType - 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesserInterface' => 'Symfony\\Component\\Mime\\MimeTypesInterface', - 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesserInterface' => 'Symfony\\Component\\Mime\\MimeTypesInterface', - 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeExtensionGuesser' => 'Symfony\\Component\\Mime\\MimeTypes', - 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileBinaryMimeTypeGuesser' => 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser', - 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileinfoMimeTypeGuesser' => 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser', - # HttpKernel - # @todo unpack after YAML to PHP migration, Symfony\Component\HttpKernel\Client: Symfony\Component\HttpKernel\HttpKernelBrowser - 'Symfony\\Component\\HttpKernel\\EventListener\\TranslatorListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener', - # Security - 'Symfony\\Component\\Security\\Core\\Encoder\\Argon2iPasswordEncoder' => 'Symfony\\Component\\Security\\Core\\Encoder\\SodiumPasswordEncoder', - 'Symfony\\Component\\Security\\Core\\Encoder\\BCryptPasswordEncoder' => 'Symfony\\Component\\Security\\Core\\Encoder\\NativePasswordEncoder', - ]); - # https://github.com/symfony/symfony/blob/4.4/UPGRADE-4.3.md#workflow - $rectorConfig->ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Symfony\\Component\\Workflow\\MarkingStore\\MarkingStoreInterface', 'setMarking', 2, 'context', [])]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony44.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony44.php deleted file mode 100644 index 0b6160475..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony44.php +++ /dev/null @@ -1,29 +0,0 @@ -rules([ - // https://github.com/symfony/symfony/pull/33775 - ConsoleExecuteReturnIntRector::class, - // https://github.com/symfony/symfony/blob/4.4/UPGRADE-4.4.md#security - AuthorizationCheckerIsGrantedExtractorRector::class, - ]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Templating\\EngineInterface' => 'Twig\\Environment']); - $rectorConfig->ruleWithConfiguration(RenameFunctionRector::class, ['Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\tagged' => 'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\tagged_iterator']); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - # https://github.com/symfony/http-kernel/blob/801b925e308518ddf821ba91952c41ae77c77507/Event/GetResponseForExceptionEvent.php#L55 - new MethodCallRename('Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent', 'getException', 'getThrowable'), - # https://github.com/symfony/http-kernel/blob/801b925e308518ddf821ba91952c41ae77c77507/Event/GetResponseForExceptionEvent.php#L67 - new MethodCallRename('Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent', 'setException', 'setThrowable'), - ]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50.php new file mode 100644 index 000000000..3d889eb21 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50.php @@ -0,0 +1,12 @@ +import(__DIR__ . '/symfony50/symfony50-types.php'); + $rectorConfig->import(__DIR__ . '/symfony50/symfony50-console.php'); + $rectorConfig->import(__DIR__ . '/symfony50/symfony50-debug.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony50.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-console.php similarity index 59% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony50.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-console.php index 7dee37f50..f6e0731e6 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony50.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-console.php @@ -1,15 +1,11 @@ import(__DIR__ . '/symfony50-types.php'); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Debug\\Debug' => 'Symfony\\Component\\ErrorHandler\\Debug']); $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Console\\Application', 'renderException', 'renderThrowable'), new MethodCallRename('Symfony\\Component\\Console\\Application', 'doRenderException', 'doRenderThrowable')]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-debug.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-debug.php new file mode 100644 index 000000000..35af0971f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-debug.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Debug\\Debug' => 'Symfony\\Component\\ErrorHandler\\Debug']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony50-types.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-types.php similarity index 95% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony50-types.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-types.php index 5790f6182..ce77331d6 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony50-types.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony50/symfony50-types.php @@ -1,7 +1,7 @@ import(__DIR__ . '/symfony51/symfony51-config.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-console.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-event-dispatcher.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-form.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-framework-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-inflector.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-notifier.php'); + $rectorConfig->import(__DIR__ . '/symfony51/symfony51-security-http.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-config.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-config.php new file mode 100644 index 000000000..4f2d27f90 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-config.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Config\\Definition\\BaseNode', 'getDeprecationMessage', 'getDeprecation')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-console.php new file mode 100644 index 000000000..fb3b34b83 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-console.php @@ -0,0 +1,13 @@ +rules([ + // @see https://symfony.com/blog/new-in-symfony-5-1-misc-improvements-part-1#added-constants-for-command-exit-codes + CommandConstantReturnCodeRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-dependency-injection.php new file mode 100644 index 000000000..9f78c6e44 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-dependency-injection.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameFunctionRector::class, ['Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\inline' => 'Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\inline_service', 'Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\ref' => 'Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\service']); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\DependencyInjection\\Definition', 'getDeprecationMessage', 'getDeprecation'), new MethodCallRename('Symfony\\Component\\DependencyInjection\\Alias', 'getDeprecationMessage', 'getDeprecation')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-event-dispatcher.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-event-dispatcher.php new file mode 100644 index 000000000..ba1a5759e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-event-dispatcher.php @@ -0,0 +1,10 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-form.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-form.php new file mode 100644 index 000000000..c9bcad78b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-form.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\Form\\Extension\\Validator\\Util\\ServerParams' => 'Symfony\\Component\\Form\\Util\\ServerParams']); + $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_FLOOR', 'NumberFormatter', 'ROUND_FLOOR'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_DOWN', 'NumberFormatter', 'ROUND_DOWN'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_HALF_DOWN', 'NumberFormatter', 'ROUND_HALFDOWN'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_HALF_EVEN', 'NumberFormatter', 'ROUND_HALFEVEN'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_HALFUP', 'NumberFormatter', 'ROUND_HALFUP'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_UP', 'NumberFormatter', 'ROUND_UP'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_CEILING', 'NumberFormatter', 'ROUND_CEILING')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-framework-bundle.php new file mode 100644 index 000000000..99f551d25 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-framework-bundle.php @@ -0,0 +1,15 @@ +rules([RouteCollectionBuilderToRoutingConfiguratorRector::class]); + // @see https://github.com/symfony/symfony/pull/36943 + $rectorConfig->ruleWithConfiguration(AddParamTypeDeclarationRector::class, [new AddParamTypeDeclaration('Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait', 'configureRoutes', 0, new ObjectType('Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator'))]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-http-foundation.php new file mode 100644 index 000000000..52babbb21 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-http-foundation.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(StaticCallToNewRector::class, [new StaticCallToNew('Symfony\\Component\\HttpFoundation\\Response', 'create'), new StaticCallToNew('Symfony\\Component\\HttpFoundation\\JsonResponse', 'create'), new StaticCallToNew('Symfony\\Component\\HttpFoundation\\RedirectResponse', 'create'), new StaticCallToNew('Symfony\\Component\\HttpFoundation\\StreamedResponse', 'create')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-inflector.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-inflector.php new file mode 100644 index 000000000..74edaaad4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-inflector.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/35092 + 'Symfony\\Component\\Inflector' => 'Symfony\\Component\\String\\Inflector\\InflectorInterface', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-notifier.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-notifier.php new file mode 100644 index 000000000..8c9f0d402 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-notifier.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + // @see https://github.com/symfony/symfony/pull/35828 + new MethodCallRename('Symfony\\Component\\Notifier\\Bridge\\Slack\\Slack', 'channel', 'recipient'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-core.php new file mode 100644 index 000000000..84dcad194 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-core.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameStringRector::class, [ + // @see https://github.com/symfony/symfony/pull/35858 + 'ROLE_PREVIOUS_ADMIN' => 'IS_IMPERSONATOR', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-http.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-http.php new file mode 100644 index 000000000..c8ce8b12d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony51/symfony51-security-http.php @@ -0,0 +1,15 @@ +rules([ + // @see https://github.com/symfony/symfony/pull/36243 + LogoutHandlerToLogoutEventSubscriberRector::class, + LogoutSuccessHandlerToLogoutEventSubscriberRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony52-validator-attributes.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52-validator-attributes.php similarity index 99% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony52-validator-attributes.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52-validator-attributes.php index 8969baa55..c4edd7508 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony52-validator-attributes.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52-validator-attributes.php @@ -1,7 +1,7 @@ sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-form.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-mime.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-notifier.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-property-access.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-property-info.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-security-core.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-security-http.php'); + $rectorConfig->import(__DIR__ . '/symfony52/symfony52-validator.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-dependency-injection.php new file mode 100644 index 000000000..5e7cbde1e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-dependency-injection.php @@ -0,0 +1,13 @@ +rules([ + # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#dependencyinjection + DefinitionAliasSetPrivateToSetPublicRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-form.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-form.php new file mode 100644 index 000000000..55239f4de --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-form.php @@ -0,0 +1,12 @@ +rules([PropertyPathMapperToDataMapperRector::class, FormBuilderSetDataMapperRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-http-foundation.php new file mode 100644 index 000000000..041455443 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-http-foundation.php @@ -0,0 +1,13 @@ +rules([ + // https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#httpfoundation + BinaryFileResponseCreateToNewInstanceRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-mime.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-mime.php new file mode 100644 index 000000000..29e34decf --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-mime.php @@ -0,0 +1,15 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#mime + new MethodCallRename('Symfony\\Component\\Mime\\Address', 'fromString', 'create'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-notifier.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-notifier.php new file mode 100644 index 000000000..1cf7e93eb --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-notifier.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(AddParamTypeDeclarationRector::class, [new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\NotifierInterface', 'send', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notifier', 'getChannels', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Channel\\ChannelInterface', 'notify', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Channel\\ChannelInterface', 'supports', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notification\\ChatNotificationInterface', 'asChatMessage', 0, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notification\\EmailNotificationInterface', 'asEmailMessage', 0, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\EmailRecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notification\\SmsNotificationInterface', 'asSmsMessage', 0, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\SmsRecipientInterface'))]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-access.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-access.php new file mode 100644 index 000000000..2afff4d75 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-access.php @@ -0,0 +1,13 @@ +rules([ + // https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#propertyaccess + PropertyAccessorCreationBooleanToFlagsRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-info.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-info.php new file mode 100644 index 000000000..c8e5974ed --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-property-info.php @@ -0,0 +1,13 @@ +rules([ + // https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#propertyinfo + ReflectionExtractorEnableMagicCallExtractorRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-core.php new file mode 100644 index 000000000..2ac60b4c6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-core.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\PreAuthenticatedToken', 'setProviderKey', 'setFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\PreAuthenticatedToken', 'getProviderKey', 'getFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken', 'setProviderKey', 'setFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken', 'getProviderKey', 'getFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\SwitchUserToken', 'setProviderKey', 'setFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\SwitchUserToken', 'getProviderKey', 'getFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken', 'setProviderKey', 'setFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken', 'getProviderKey', 'getFirewallName')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-http.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-http.php new file mode 100644 index 000000000..d838a75e8 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-security-http.php @@ -0,0 +1,19 @@ +ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassAndConstFetch('Symfony\\Component\\Security\\Http\\Firewall\\AccessListener', 'PUBLIC_ACCESS', 'Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter', 'PUBLIC_ACCESS')]); + # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#security + $rectorConfig->ruleWithConfiguration(RenamePropertyRector::class, [new RenameProperty('Symfony\\Component\\Security\\Http\\RememberMe\\AbstractRememberMeServices', 'providerKey', 'firewallName')]); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationSuccessHandler', 'setProviderKey', 'setFirewallName'), new MethodCallRename('Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationSuccessHandler', 'getProviderKey', 'getFirewallName')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-validator.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-validator.php new file mode 100644 index 000000000..249d60c7f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony52/symfony52-validator.php @@ -0,0 +1,13 @@ +rules([ + # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#validator + ValidatorBuilderEnableAnnotationMappingRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53.php new file mode 100644 index 000000000..11243cd7c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53.php @@ -0,0 +1,17 @@ +sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); + $rectorConfig->import(__DIR__ . '/symfony53/symfony53-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony53/symfony53-console.php'); + $rectorConfig->import(__DIR__ . '/symfony53/symfony53-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony53/symfony53-security-core.php'); + $rectorConfig->import(__DIR__ . '/symfony53/symfony53-mailer.php'); + $rectorConfig->import(__DIR__ . '/symfony53/symfony53-form.php'); + $rectorConfig->import(__DIR__ . '/symfony53/symfony53-framework-bundle.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-console.php new file mode 100644 index 000000000..971579893 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-console.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Console\\Helper\\Helper', 'strlen', 'width'), new MethodCallRename('Symfony\\Component\\Console\\Helper\\Helper', 'strlenWithoutDecoration', 'removeDecoration')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-form.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-form.php new file mode 100644 index 000000000..ee3cffeab --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-form.php @@ -0,0 +1,17 @@ +ruleWithConfiguration(AddParamTypeDeclarationRector::class, [ + // @see https://github.com/symfony/symfony/commit/ce77be2507631cd12e4ca37510dab37f4c2b759a + new AddParamTypeDeclaration('Symfony\\Component\\Form\\DataMapperInterface', 'mapFormsToData', 0, new ObjectType(\Traversable::class)), + // @see https://github.com/symfony/symfony/commit/ce77be2507631cd12e4ca37510dab37f4c2b759a + new AddParamTypeDeclaration('Symfony\\Component\\Form\\DataMapperInterface', 'mapDataToForms', 1, new ObjectType(\Traversable::class)), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-framework-bundle.php new file mode 100644 index 000000000..01649fa77 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-framework-bundle.php @@ -0,0 +1,10 @@ +rules([KernelTestCaseContainerPropertyDeprecationRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-foundation.php new file mode 100644 index 000000000..3342fc192 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-foundation.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + // @see https://github.com/symfony/symfony/pull/40536 + new MethodCallRename('Symfony\\Component\\HttpFoundation\\RequestStack', 'getMasterRequest', 'getMainRequest'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-kernel.php new file mode 100644 index 000000000..a255f5516 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-http-kernel.php @@ -0,0 +1,18 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\HttpKernel\\Event\\KernelEvent', 'isMasterRequest', 'isMainRequest')]); + // rename constant + $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [ + // @see https://github.com/symfony/symfony/pull/40536 + new RenameClassConstFetch('Symfony\\Component\\HttpKernel\\HttpKernelInterface', 'MASTER_REQUEST', 'MAIN_REQUEST'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-mailer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-mailer.php new file mode 100644 index 000000000..444d0aa15 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-mailer.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Mailer\\Transport\\AbstractTransportFactory', 'getEndpoint', new StringType())]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-security-core.php new file mode 100644 index 000000000..168ef0f2d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony53/symfony53-security-core.php @@ -0,0 +1,27 @@ +ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\TokenInterface', 'getUsername', 'getUserIdentifier'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException', 'getUsername', 'getUserIdentifier'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException', 'setUsername', 'setUserIdentifier'), new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentTokenInterface', 'getUsername', 'getUserIdentifier')]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + 'Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException' => 'Symfony\\Component\\Security\\Core\\Exception\\UserNotFoundException', + // @see https://github.com/symfony/symfony/pull/39802 + 'Symfony\\Component\\Security\\Core\\Encoder\\EncoderFactoryInterface' => 'Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactoryInterface', + 'Symfony\\Component\\Security\\Core\\Encoder\\MessageDigestPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\MessageDigestPasswordHasher', + 'Symfony\\Component\\Security\\Core\\Encoder\\MigratingPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\MigratingPasswordHasher', + 'Symfony\\Component\\Security\\Core\\Encoder\\NativePasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\NativePasswordHasher', + 'Symfony\\Component\\Security\\Core\\Encoder\\PasswordEncoderInterface' => 'Symfony\\Component\\PasswordHasher\\PasswordHasherInterface', + 'Symfony\\Component\\Security\\Core\\Encoder\\Pbkdf2PasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\Pbkdf2PasswordHasher', + 'Symfony\\Component\\Security\\Core\\Encoder\\PlaintextPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\PlaintextPasswordHasher', + 'Symfony\\Component\\Security\\Core\\Encoder\\SelfSaltingEncoderInterface' => 'Symfony\\Component\\PasswordHasher\\LegacyPasswordHasherInterface', + 'Symfony\\Component\\Security\\Core\\Encoder\\SodiumPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\SodiumPasswordHasher', + 'Symfony\\Component\\Security\\Core\\Encoder\\UserPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasher', + 'Symfony\\Component\\Security\\Core\\Encoder\\UserPasswordEncoderInterface' => 'Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasherInterface', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54.php new file mode 100644 index 000000000..95f9ff814 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54.php @@ -0,0 +1,17 @@ +sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); + $rectorConfig->import(__DIR__ . '/symfony54/symfony54-validator.php'); + $rectorConfig->import(__DIR__ . '/symfony54/symfony54-security-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony54/symfony54-security-core.php'); + $rectorConfig->import(__DIR__ . '/symfony54/symfony54-security-http.php'); + $rectorConfig->import(__DIR__ . '/symfony54/symfony54-cache.php'); + $rectorConfig->import(__DIR__ . '/symfony54/symfony54-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony54/symfony54-notifier.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-cache.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-cache.php new file mode 100644 index 000000000..9caf20022 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-cache.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/42965 + 'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => 'Doctrine\\Common\\Cache\\Psr6\\CacheAdapter', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-http-kernel.php new file mode 100644 index 000000000..f912f8dac --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-http-kernel.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/45615 + 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractTestSessionListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener', + 'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-notifier.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-notifier.php new file mode 100644 index 000000000..2828c3be3 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-notifier.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/44271 + 'Symfony\\Component\\Notifier\\Bridge\\Nexmo\\NexmoTransportFactory' => 'Symfony\\Component\\Notifier\\Bridge\\Vonage\\VonageTransportFactory', + 'Symfony\\Component\\Notifier\\Bridge\\Nexmo\\NexmoTransport' => 'Symfony\\Component\\Notifier\\Bridge\\Vonage\\VonageTransport', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-bundle.php new file mode 100644 index 000000000..818a78038 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-bundle.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + // @see https://github.com/symfony/symfony/pull/42582 + new MethodCallRename('Symfony\\Bundle\\SecurityBundle\\Security\\FirewallConfig', 'getListeners', 'getAuthenticators'), + // @see https://github.com/symfony/symfony/pull/41754 + new MethodCallRename('Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\SecurityExtension', 'addSecurityListenerFactory', 'addAuthenticatorFactory'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-core.php new file mode 100644 index 000000000..8aac7c5e9 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-core.php @@ -0,0 +1,18 @@ +ruleWithConfiguration(RenameClassConstFetchRector::class, [ + new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\AuthenticationEvents', 'AUTHENTICATION_SUCCESS', 'Symfony\\Component\\Security\\Core\\Event\\AuthenticationSuccessEvent', 'class'), + new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\AuthenticationEvents', 'AUTHENTICATION_FAILURE', 'Symfony\\Component\\Security\\Core\\Event\\AuthenticationFailureEvent', 'class'), + // @see https://github.com/symfony/symfony/pull/42510 + new RenameClassConstFetch('Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter', 'IS_ANONYMOUS', 'PUBLIC_ACCESS'), + new RenameClassConstFetch('Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter', 'IS_AUTHENTICATED_ANONYMOUSLY', 'PUBLIC_ACCESS'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-http.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-http.php new file mode 100644 index 000000000..b95e49cd6 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-security-http.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/42050 + 'Symfony\\Component\\Security\\Http\\Event\\DeauthenticatedEvent' => 'Symfony\\Component\\Security\\Http\\Event\\TokenDeauthenticatedEvent', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-validator.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-validator.php new file mode 100644 index 000000000..10891cbc9 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony5/symfony54/symfony54-validator.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(AnnotationToAttributeRector::class, [new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\All'), new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\Collection'), new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\AtLeastOneOf'), new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\Sequentially')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony51.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony51.php deleted file mode 100644 index d0b7782e7..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony51.php +++ /dev/null @@ -1,55 +0,0 @@ -rules([ - // @see https://github.com/symfony/symfony/pull/36243 - LogoutHandlerToLogoutEventSubscriberRector::class, - LogoutSuccessHandlerToLogoutEventSubscriberRector::class, - // @see https://symfony.com/blog/new-in-symfony-5-1-misc-improvements-part-1#added-constants-for-command-exit-codes - CommandConstantReturnCodeRector::class, - RouteCollectionBuilderToRoutingConfiguratorRector::class, - ]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - 'Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface', - 'Symfony\\Component\\Form\\Extension\\Validator\\Util\\ServerParams' => 'Symfony\\Component\\Form\\Util\\ServerParams', - // @see https://github.com/symfony/symfony/pull/35092 - 'Symfony\\Component\\Inflector' => 'Symfony\\Component\\String\\Inflector\\InflectorInterface', - ]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - new MethodCallRename('Symfony\\Component\\Config\\Definition\\BaseNode', 'getDeprecationMessage', 'getDeprecation'), - new MethodCallRename('Symfony\\Component\\DependencyInjection\\Definition', 'getDeprecationMessage', 'getDeprecation'), - new MethodCallRename('Symfony\\Component\\DependencyInjection\\Alias', 'getDeprecationMessage', 'getDeprecation'), - // @see https://github.com/symfony/symfony/pull/35828 - new MethodCallRename('Symfony\\Component\\Notifier\\Bridge\\Slack\\Slack', 'channel', 'recipient'), - ]); - $rectorConfig->ruleWithConfiguration(RenameFunctionRector::class, ['Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\inline' => 'Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\inline_service', 'Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\ref' => 'Symfony\\Component\\DependencyInjection\\Loader\\Configuraton\\service']); - $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_FLOOR', 'NumberFormatter', 'ROUND_FLOOR'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_DOWN', 'NumberFormatter', 'ROUND_DOWN'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_HALF_DOWN', 'NumberFormatter', 'ROUND_HALFDOWN'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_HALF_EVEN', 'NumberFormatter', 'ROUND_HALFEVEN'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_HALFUP', 'NumberFormatter', 'ROUND_HALFUP'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_UP', 'NumberFormatter', 'ROUND_UP'), new RenameClassAndConstFetch('Symfony\\Component\\Form\\Extension\\Core\\DataTransformer\\NumberToLocalizedStringTransformer', 'ROUND_CEILING', 'NumberFormatter', 'ROUND_CEILING')]); - // @see https://github.com/symfony/symfony/pull/36943 - $rectorConfig->ruleWithConfiguration(AddParamTypeDeclarationRector::class, [new AddParamTypeDeclaration('Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait', 'configureRoutes', 0, new ObjectType('Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator'))]); - $rectorConfig->ruleWithConfiguration(StaticCallToNewRector::class, [new StaticCallToNew('Symfony\\Component\\HttpFoundation\\Response', 'create'), new StaticCallToNew('Symfony\\Component\\HttpFoundation\\JsonResponse', 'create'), new StaticCallToNew('Symfony\\Component\\HttpFoundation\\RedirectResponse', 'create'), new StaticCallToNew('Symfony\\Component\\HttpFoundation\\StreamedResponse', 'create')]); - $rectorConfig->ruleWithConfiguration(RenameStringRector::class, [ - // @see https://github.com/symfony/symfony/pull/35858 - 'ROLE_PREVIOUS_ADMIN' => 'IS_IMPERSONATOR', - ]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony52.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony52.php deleted file mode 100644 index 10a49b047..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony52.php +++ /dev/null @@ -1,63 +0,0 @@ -sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); - $rectorConfig->rules([ - // https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#form - PropertyPathMapperToDataMapperRector::class, - // https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#httpfoundation - BinaryFileResponseCreateToNewInstanceRector::class, - // https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#propertyaccess - PropertyAccessorCreationBooleanToFlagsRector::class, - // https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#propertyinfo - ReflectionExtractorEnableMagicCallExtractorRector::class, - # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#dependencyinjection - DefinitionAliasSetPrivateToSetPublicRector::class, - # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#form - FormBuilderSetDataMapperRector::class, - # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#validator - ValidatorBuilderEnableAnnotationMappingRector::class, - ]); - # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#security - $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassAndConstFetch('Symfony\\Component\\Security\\Http\\Firewall\\AccessListener', 'PUBLIC_ACCESS', 'Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter', 'PUBLIC_ACCESS')]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#mime - new MethodCallRename('Symfony\\Component\\Mime\\Address', 'fromString', 'create'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\PreAuthenticatedToken', 'setProviderKey', 'setFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\PreAuthenticatedToken', 'getProviderKey', 'getFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken', 'setProviderKey', 'setFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken', 'getProviderKey', 'getFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\SwitchUserToken', 'setProviderKey', 'setFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\SwitchUserToken', 'getProviderKey', 'getFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken', 'setProviderKey', 'setFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken', 'getProviderKey', 'getFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationSuccessHandler', 'setProviderKey', 'setFirewallName'), - new MethodCallRename('Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationSuccessHandler', 'getProviderKey', 'getFirewallName'), - ]); - # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#notifier - $rectorConfig->ruleWithConfiguration(AddParamTypeDeclarationRector::class, [new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\NotifierInterface', 'send', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notifier', 'getChannels', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Channel\\ChannelInterface', 'notify', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Channel\\ChannelInterface', 'supports', 1, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notification\\ChatNotificationInterface', 'asChatMessage', 0, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\RecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notification\\EmailNotificationInterface', 'asEmailMessage', 0, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\EmailRecipientInterface')), new AddParamTypeDeclaration('Symfony\\Component\\Notifier\\Notification\\SmsNotificationInterface', 'asSmsMessage', 0, new ObjectType('Symfony\\Component\\Notifier\\Recipient\\SmsRecipientInterface'))]); - # https://github.com/symfony/symfony/blob/5.x/UPGRADE-5.2.md#security - $rectorConfig->ruleWithConfiguration(RenamePropertyRector::class, [new RenameProperty('Symfony\\Component\\Security\\Http\\RememberMe\\AbstractRememberMeServices', 'providerKey', 'firewallName')]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony53.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony53.php deleted file mode 100644 index 9a1c5faec..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony53.php +++ /dev/null @@ -1,62 +0,0 @@ -sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - // @see https://github.com/symfony/symfony/pull/40536 - new MethodCallRename('Symfony\\Component\\HttpFoundation\\RequestStack', 'getMasterRequest', 'getMainRequest'), - new MethodCallRename('Symfony\\Component\\Console\\Helper\\Helper', 'strlen', 'width'), - new MethodCallRename('Symfony\\Component\\Console\\Helper\\Helper', 'strlenWithoutDecoration', 'removeDecoration'), - new MethodCallRename('Symfony\\Component\\HttpKernel\\Event\\KernelEvent', 'isMasterRequest', 'isMainRequest'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\Token\\TokenInterface', 'getUsername', 'getUserIdentifier'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException', 'getUsername', 'getUserIdentifier'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException', 'setUsername', 'setUserIdentifier'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentTokenInterface', 'getUsername', 'getUserIdentifier'), - ]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - 'Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException' => 'Symfony\\Component\\Security\\Core\\Exception\\UserNotFoundException', - // @see https://github.com/symfony/symfony/pull/39802 - 'Symfony\\Component\\Security\\Core\\Encoder\\EncoderFactoryInterface' => 'Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactoryInterface', - 'Symfony\\Component\\Security\\Core\\Encoder\\MessageDigestPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\MessageDigestPasswordHasher', - 'Symfony\\Component\\Security\\Core\\Encoder\\MigratingPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\MigratingPasswordHasher', - 'Symfony\\Component\\Security\\Core\\Encoder\\NativePasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\NativePasswordHasher', - 'Symfony\\Component\\Security\\Core\\Encoder\\PasswordEncoderInterface' => 'Symfony\\Component\\PasswordHasher\\PasswordHasherInterface', - 'Symfony\\Component\\Security\\Core\\Encoder\\Pbkdf2PasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\Pbkdf2PasswordHasher', - 'Symfony\\Component\\Security\\Core\\Encoder\\PlaintextPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\PlaintextPasswordHasher', - 'Symfony\\Component\\Security\\Core\\Encoder\\SelfSaltingEncoderInterface' => 'Symfony\\Component\\PasswordHasher\\LegacyPasswordHasherInterface', - 'Symfony\\Component\\Security\\Core\\Encoder\\SodiumPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\SodiumPasswordHasher', - 'Symfony\\Component\\Security\\Core\\Encoder\\UserPasswordEncoder' => 'Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasher', - 'Symfony\\Component\\Security\\Core\\Encoder\\UserPasswordEncoderInterface' => 'Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasherInterface', - ]); - $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Mailer\\Transport\\AbstractTransportFactory', 'getEndpoint', new StringType())]); - // rename constant - $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [ - // @see https://github.com/symfony/symfony/pull/40536 - new RenameClassConstFetch('Symfony\\Component\\HttpKernel\\HttpKernelInterface', 'MASTER_REQUEST', 'MAIN_REQUEST'), - ]); - $rectorConfig->ruleWithConfiguration(AddParamTypeDeclarationRector::class, [ - // @see https://github.com/symfony/symfony/commit/ce77be2507631cd12e4ca37510dab37f4c2b759a - new AddParamTypeDeclaration('Symfony\\Component\\Form\\DataMapperInterface', 'mapFormsToData', 0, new ObjectType(\Traversable::class)), - // @see https://github.com/symfony/symfony/commit/ce77be2507631cd12e4ca37510dab37f4c2b759a - new AddParamTypeDeclaration('Symfony\\Component\\Form\\DataMapperInterface', 'mapDataToForms', 1, new ObjectType(\Traversable::class)), - ]); - $rectorConfig->rules([KernelTestCaseContainerPropertyDeprecationRector::class]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony54.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony54.php deleted file mode 100644 index b84dcd569..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony54.php +++ /dev/null @@ -1,47 +0,0 @@ -sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); - // @see https://symfony.com/blog/new-in-symfony-5-4-nested-validation-attributes - // @see https://github.com/symfony/symfony/pull/41994 - $rectorConfig->ruleWithConfiguration(AnnotationToAttributeRector::class, [new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\All'), new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\Collection'), new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\AtLeastOneOf'), new AnnotationToAttribute('Symfony\\Component\\Validator\\Constraints\\Sequentially')]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - // @see https://github.com/symfony/symfony/pull/42582 - new MethodCallRename('Symfony\\Bundle\\SecurityBundle\\Security\\FirewallConfig', 'getListeners', 'getAuthenticators'), - // @see https://github.com/symfony/symfony/pull/41754 - new MethodCallRename('Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\SecurityExtension', 'addSecurityListenerFactory', 'addAuthenticatorFactory'), - ]); - $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [ - new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\AuthenticationEvents', 'AUTHENTICATION_SUCCESS', 'Symfony\\Component\\Security\\Core\\Event\\AuthenticationSuccessEvent', 'class'), - new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\AuthenticationEvents', 'AUTHENTICATION_FAILURE', 'Symfony\\Component\\Security\\Core\\Event\\AuthenticationFailureEvent', 'class'), - // @see https://github.com/symfony/symfony/pull/42510 - new RenameClassConstFetch('Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter', 'IS_ANONYMOUS', 'PUBLIC_ACCESS'), - new RenameClassConstFetch('Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter', 'IS_AUTHENTICATED_ANONYMOUSLY', 'PUBLIC_ACCESS'), - ]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - // @see https://github.com/symfony/symfony/pull/42050 - 'Symfony\\Component\\Security\\Http\\Event\\DeauthenticatedEvent' => 'Symfony\\Component\\Security\\Http\\Event\\TokenDeauthenticatedEvent', - // @see https://github.com/symfony/symfony/pull/42965 - 'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => 'Doctrine\\Common\\Cache\\Psr6\\CacheAdapter', - // @see https://github.com/symfony/symfony/pull/45615 - 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractTestSessionListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener', - 'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener' => 'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener', - // @see https://github.com/symfony/symfony/pull/44271 - 'Symfony\\Component\\Notifier\\Bridge\\Nexmo\\NexmoTransportFactory' => 'Symfony\\Component\\Notifier\\Bridge\\Vonage\\VonageTransportFactory', - 'Symfony\\Component\\Notifier\\Bridge\\Nexmo\\NexmoTransport' => 'Symfony\\Component\\Notifier\\Bridge\\Vonage\\VonageTransport', - ]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony-return-types.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony-return-types.php deleted file mode 100644 index a793aae19..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony-return-types.php +++ /dev/null @@ -1,171 +0,0 @@ -newInstanceWithoutConstructor(); - $privatesAccessor = new PrivatesAccessor(); - $privatesAccessor->setPrivateProperty($scalarArrayObjectUnionType, 'types', $scalarArrayObjectUnionedTypes); - $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [ - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'load', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\Loader', 'import', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\KernelInterface', 'registerBundles', $iterableType), - // @see https://wouterj.nl/2021/09/symfony-6-native-typing#when-upgrading-to-symfony-54 - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\User\\UserInterface', 'getRoles', new ArrayType(new MixedType(), new MixedType())), - // @see https://github.com/symfony/symfony/pull/43028/files - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Helper\\HelperInterface', 'getName', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'doRequestInProcess', new ObjectWithoutClassType()), - new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'doRequest', new ObjectWithoutClassType()), - new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'filterRequest', new ObjectWithoutClassType()), - new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'filterResponse', $browserKitResponseType), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Definition\\ConfigurationInterface', 'getConfigTreeBuilder', new ObjectType('Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder')), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\FileLocator', 'locate', new UnionType([new StringType(), $arrayType])), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\FileLocatorInterface', 'locate', new UnionType([new StringType(), $arrayType])), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\FileLoader', 'import', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\Loader', 'import', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'load', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'supports', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'getResolver', new ObjectType('Symfony\\Component\\Config\\Loader\\LoaderResolverInterface')), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\ResourceCheckerInterface', 'supports', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Config\\ResourceCheckerInterface', 'isFresh', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'doRun', new IntegerType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'getLongVersion', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'add', new UnionType([new NullType(), $commandType])), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'get', $commandType), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'find', $commandType), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'all', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'doRunCommand', new IntegerType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Command\\Command', 'isEnabled', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Command\\Command', 'execute', new IntegerType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Helper\\HelperInterface', 'getName', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Input\\InputInterface', 'getParameterOption', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Input\\InputInterface', 'getArgument', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Input\\InputInterface', 'getOption', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass', 'processValue', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface', 'getConfiguration', new UnionType([new NullType(), $configurationType])), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\Extension', 'getXsdValidationBasePath', new UnionType([new StringType(), new ConstantBooleanType(\false)])), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\Extension', 'getNamespace', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\Extension', 'getConfiguration', new UnionType([new NullType(), $configurationType])), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface', 'getNamespace', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface', 'getXsdValidationBasePath', new UnionType([new StringType(), new ConstantBooleanType(\false)])), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface', 'getAlias', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface', 'instantiateProxy', new ObjectWithoutClassType()), - new AddReturnTypeDeclaration('Symfony\\Component\\EventDispatcher\\EventSubscriberInterface', 'getSubscribedEvents', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface', 'getFunctions', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractExtension', 'loadTypes', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractExtension', 'loadTypeGuesser', new UnionType([new NullType(), new ObjectType('Symfony\\Component\\Form\\FormTypeGuesserInterface')])), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractRendererEngine', 'loadResourceForBlockName', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractType', 'getBlockPrefix', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractType', 'getParent', $nullableStringType), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\DataTransformerInterface', 'transform', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\DataTransformerInterface', 'reverseTransform', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormRendererEngineInterface', 'renderBlock', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessType', new UnionType([new NullType(), $typeGuessType])), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessRequired', $nullableValueGuessType), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessMaxLength', $nullableValueGuessType), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessPattern', $nullableValueGuessType), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'getBlockPrefix', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'getParent', $nullableStringType), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'buildForm', new VoidType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'configureOptions', new VoidType()), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface', 'isOptional', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface', 'warmUp', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector', 'getCasters', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface', 'getName', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache', 'forward', $httpFoundationResponseType), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\HttpKernelBrowser', 'doRequest', $httpFoundationResponseType), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\HttpKernelBrowser', 'getScript', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface', 'getLogs', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface', 'countErrors', new IntegerType()), - new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'setNormalizer', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), - new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'setAllowedValues', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), - new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'addAllowedValues', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), - new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'setAllowedTypes', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), - new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'addAllowedTypes', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getLength', new IntegerType()), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getParent', new UnionType([new NullType(), new ObjectType('Symfony\\Component\\PropertyAccess\\PropertyPathInterface')])), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getElements', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getElement', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'isProperty', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'isIndex', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface', 'isReadable', $nullableBooleanType), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface', 'isWritable', $nullableBooleanType), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyListExtractorInterface', 'getProperties', $nullableArrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyTypeExtractorInterface', 'getTypes', $nullableArrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader', 'getDefaultRouteName', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Routing\\Router', 'getRouteCollection', $routeCollectionType), - new AddReturnTypeDeclaration('Symfony\\Component\\Routing\\RouterInterface', 'getRouteCollection', $routeCollectionType), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\TokenProviderInterface', 'loadTokenBySeries', new ObjectType('Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentTokenInterface')), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface', 'vote', new IntegerType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException', 'getMessageKey', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface', 'refreshUser', new ObjectType('Symfony\\Component\\Security\\Core\\User\\UserInterface')), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface', 'supportsClass', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\EntryPoint\\AuthenticationEntryPointInterface', 'start', $httpFoundationResponseType), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\Firewall', 'getSubscribedEvents', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\FirewallMapInterface', 'getListeners', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Encoder\\DecoderInterface', 'decode', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Encoder\\DecoderInterface', 'supportsDecoding', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer', 'getAllowedAttributes', new UnionType([$arrayType, new BooleanType()])), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer', 'isAllowedAttribute', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer', 'instantiateObject', new ObjectWithoutClassType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'supportsNormalization', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'instantiateObject', new ObjectWithoutClassType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'extractAttributes', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'getAttributeValue', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'supportsDenormalization', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'denormalize', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface', 'denormalize', new MixedType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface', 'supportsDenormalization', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', 'supportsNormalization', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Templating\\Helper\\HelperInterface', 'getName', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor', 'canBeExtracted', new BooleanType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor', 'extractFromDirectory', $iterableType), - new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'getDefaultOption', $nullableStringType), - new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'getRequiredOptions', $arrayType), - new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'validatedBy', new StringType()), - new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'getTargets', new UnionType([new StringType(), $arrayType])), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'normalize', $scalarArrayObjectUnionType), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Container', 'getParameter', new UnionType($scalarTypes)), - new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\ContainerInterface', 'getParameter', new UnionType($scalarTypes)), - new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', 'normalize', $scalarArrayObjectUnionType), - new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\Authenticator\\AuthenticatorInterface', 'authenticate', new ObjectType('Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Passport')), - ]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60.php new file mode 100644 index 000000000..f0dab6d92 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60.php @@ -0,0 +1,31 @@ +sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-serializer.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-security-http.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-console.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-browser-kit.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-validator.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-form.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-translation.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-property-access.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-property-info.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-routing.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-templating.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-event-dispatcher.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-expression-language.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-options-resolver.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-contracts.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-config.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-framework-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-doctrine-bridge.php'); + $rectorConfig->import(__DIR__ . '/symfony60/symfony60-security-core.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-browser-kit.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-browser-kit.php new file mode 100644 index 000000000..67d51be3f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-browser-kit.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'doRequestInProcess', new ObjectWithoutClassType()), new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'doRequest', new ObjectWithoutClassType()), new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'filterRequest', new ObjectWithoutClassType()), new AddReturnTypeDeclaration('Symfony\\Component\\BrowserKit\\AbstractBrowser', 'filterResponse', $browserKitResponseType)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-config.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-config.php new file mode 100644 index 000000000..e1a8dbd76 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-config.php @@ -0,0 +1,21 @@ +ruleWithConfiguration(AddParamTypeDeclarationRector::class, [new AddParamTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'load', 0, new MixedType(\true)), new AddParamTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'supports', 0, new MixedType(\true))]); + $arrayType = new ArrayType(new MixedType(), new MixedType()); + $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'load', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\Loader', 'import', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Definition\\ConfigurationInterface', 'getConfigTreeBuilder', new ObjectType('Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder')), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\FileLocator', 'locate', new UnionType([new StringType(), $arrayType])), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\FileLocatorInterface', 'locate', new UnionType([new StringType(), $arrayType])), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\FileLoader', 'import', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\Loader', 'import', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'load', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'supports', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'getResolver', new ObjectType('Symfony\\Component\\Config\\Loader\\LoaderResolverInterface')), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\ResourceCheckerInterface', 'supports', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Config\\ResourceCheckerInterface', 'isFresh', new BooleanType())]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-console.php new file mode 100644 index 000000000..1afac0c94 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-console.php @@ -0,0 +1,39 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [ + // @see https://github.com/symfony/symfony/pull/43028/files + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Helper\\HelperInterface', 'getName', new StringType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'doRun', new IntegerType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'getLongVersion', new StringType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'add', new UnionType([new NullType(), $commandType])), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'get', $commandType), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'find', $commandType), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'all', $arrayType), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Application', 'doRunCommand', new IntegerType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Command\\Command', 'isEnabled', new BooleanType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Command\\Command', 'execute', new IntegerType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Helper\\HelperInterface', 'getName', new StringType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Input\\InputInterface', 'getParameterOption', new MixedType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Input\\InputInterface', 'getArgument', new MixedType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Console\\Input\\InputInterface', 'getOption', new MixedType()), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-contracts.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-contracts.php new file mode 100644 index 000000000..242d50580 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-contracts.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/39484 + 'Symfony\\Contracts\\HttpClient\\HttpClientInterface\\RemoteJsonManifestVersionStrategy' => 'Symfony\\Component\\Asset\\VersionStrategy\\JsonManifestVersionStrategy', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-dependency-injection.php new file mode 100644 index 000000000..949f2f7f4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-dependency-injection.php @@ -0,0 +1,29 @@ +ruleWithConfiguration(ReplaceServiceArgumentRector::class, [new ReplaceServiceArgument('Psr\\Container\\ContainerInterface', new String_('service_container')), new ReplaceServiceArgument('Symfony\\Component\\DependencyInjection\\ContainerInterface', new String_('service_container'))]); + $configurationType = new ObjectType('Symfony\\Component\\Config\\Definition\\ConfigurationInterface'); + $arrayType = new ArrayType(new MixedType(), new MixedType()); + $scalarTypes = [$arrayType, new BooleanType(), new StringType(), new IntegerType(), new FloatType(), new NullType()]; + $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass', 'processValue', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface', 'getConfiguration', new UnionType([new NullType(), $configurationType])), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\Extension', 'getXsdValidationBasePath', new UnionType([new StringType(), new ConstantBooleanType(\false)])), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\Extension', 'getNamespace', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\Extension', 'getConfiguration', new UnionType([new NullType(), $configurationType])), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface', 'getNamespace', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface', 'getXsdValidationBasePath', new UnionType([new StringType(), new ConstantBooleanType(\false)])), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface', 'getAlias', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface', 'instantiateProxy', new ObjectWithoutClassType()), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\Container', 'getParameter', new UnionType($scalarTypes)), new AddReturnTypeDeclaration('Symfony\\Component\\DependencyInjection\\ContainerInterface', 'getParameter', new UnionType($scalarTypes))]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-doctrine-bridge.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-doctrine-bridge.php new file mode 100644 index 000000000..0ff830390 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-doctrine-bridge.php @@ -0,0 +1,15 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + // @see https://github.com/symfony/symfony/pull/40403 + new MethodCallRename('Symfony\\Bridge\\Doctrine\\Security\\User\\UserLoaderInterface', 'loadUserByUsername', 'loadUserByIdentifier'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-event-dispatcher.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-event-dispatcher.php new file mode 100644 index 000000000..cf9acad0b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-event-dispatcher.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\EventDispatcher\\EventSubscriberInterface', 'getSubscribedEvents', $arrayType)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-expression-language.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-expression-language.php new file mode 100644 index 000000000..ddd5d0865 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-expression-language.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface', 'getFunctions', $arrayType)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-form.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-form.php new file mode 100644 index 000000000..ce0819e80 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-form.php @@ -0,0 +1,25 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractExtension', 'loadTypes', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractExtension', 'loadTypeGuesser', new UnionType([new NullType(), new ObjectType('Symfony\\Component\\Form\\FormTypeGuesserInterface')])), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractRendererEngine', 'loadResourceForBlockName', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractType', 'getBlockPrefix', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\AbstractType', 'getParent', $nullableStringType), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\DataTransformerInterface', 'transform', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\DataTransformerInterface', 'reverseTransform', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormRendererEngineInterface', 'renderBlock', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessType', new UnionType([new NullType(), $typeGuessType])), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessRequired', $nullableValueGuessType), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessMaxLength', $nullableValueGuessType), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeGuesserInterface', 'guessPattern', $nullableValueGuessType), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'getBlockPrefix', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'getParent', $nullableStringType), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'buildForm', new VoidType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\FormTypeInterface', 'configureOptions', new VoidType())]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-framework-bundle.php new file mode 100644 index 000000000..361c8c046 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-framework-bundle.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(AddParamTypeDeclarationRector::class, [new AddParamTypeDeclaration('Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait', 'configureRoutes', 0, new ObjectType('Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator'))]); + $rectorConfig->rule(GetHelperControllerToServiceRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-http-kernel.php new file mode 100644 index 000000000..842ce271e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-http-kernel.php @@ -0,0 +1,23 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\KernelInterface', 'registerBundles', $iterableType), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface', 'isOptional', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface', 'warmUp', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector', 'getCasters', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface', 'getName', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache', 'forward', $httpFoundationResponseType), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\HttpKernelBrowser', 'doRequest', $httpFoundationResponseType), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\HttpKernelBrowser', 'getScript', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface', 'getLogs', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface', 'countErrors', new IntegerType())]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-options-resolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-options-resolver.php new file mode 100644 index 000000000..860e020cd --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-options-resolver.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'setNormalizer', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'setAllowedValues', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'addAllowedValues', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'setAllowedTypes', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver')), new AddReturnTypeDeclaration('Symfony\\Component\\OptionsResolver\\OptionsResolver', 'addAllowedTypes', new SimpleStaticType('Symfony\\Component\\OptionsResolver\\OptionsResolver'))]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-access.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-access.php new file mode 100644 index 000000000..31df4ef02 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-access.php @@ -0,0 +1,22 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getLength', new IntegerType()), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getParent', new UnionType([new NullType(), new ObjectType('Symfony\\Component\\PropertyAccess\\PropertyPathInterface')])), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getElements', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'getElement', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'isProperty', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyAccess\\PropertyPathInterface', 'isIndex', new BooleanType())]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-info.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-info.php new file mode 100644 index 000000000..900e1dcd1 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-property-info.php @@ -0,0 +1,21 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface', 'isReadable', $nullableBooleanType), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface', 'isWritable', $nullableBooleanType), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyListExtractorInterface', 'getProperties', $nullableArrayType), new AddReturnTypeDeclaration('Symfony\\Component\\PropertyInfo\\PropertyTypeExtractorInterface', 'getTypes', $nullableArrayType)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-routing.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-routing.php new file mode 100644 index 000000000..7b92155e7 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-routing.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader', 'getDefaultRouteName', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\Routing\\Router', 'getRouteCollection', $routeCollectionType), new AddReturnTypeDeclaration('Symfony\\Component\\Routing\\RouterInterface', 'getRouteCollection', $routeCollectionType)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-core.php new file mode 100644 index 000000000..84438dfed --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-core.php @@ -0,0 +1,32 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + new MethodCallRename('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface', 'loadUserByUsername', 'loadUserByIdentifier'), + // @see https://github.com/rectorphp/rector-symfony/issues/112 + new MethodCallRename('Symfony\\Component\\Security\\Core\\User\\UserInterface', 'getUsername', 'getUserIdentifier'), + ]); + $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [ + // @see https://wouterj.nl/2021/09/symfony-6-native-typing#when-upgrading-to-symfony-54 + new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\User\\UserInterface', 'getRoles', new ArrayType(new MixedType(), new MixedType())), + new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\TokenProviderInterface', 'loadTokenBySeries', new ObjectType('Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentTokenInterface')), + new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface', 'vote', new IntegerType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException', 'getMessageKey', new StringType()), + new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface', 'refreshUser', new ObjectType('Symfony\\Component\\Security\\Core\\User\\UserInterface')), + new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface', 'supportsClass', new BooleanType()), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-http.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-http.php new file mode 100644 index 000000000..669cc03c4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-security-http.php @@ -0,0 +1,18 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\EntryPoint\\AuthenticationEntryPointInterface', 'start', $httpFoundationResponseType), new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\Firewall', 'getSubscribedEvents', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\FirewallMapInterface', 'getListeners', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\Security\\Http\\Authenticator\\AuthenticatorInterface', 'authenticate', new ObjectType('Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Passport'))]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-serializer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-serializer.php new file mode 100644 index 000000000..a00d8863f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-serializer.php @@ -0,0 +1,33 @@ +newInstanceWithoutConstructor(); + $privatesAccessor = new PrivatesAccessor(); + $privatesAccessor->setPrivateProperty($scalarArrayObjectUnionType, 'types', $scalarArrayObjectUnionedTypes); + $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Encoder\\DecoderInterface', 'decode', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Encoder\\DecoderInterface', 'supportsDecoding', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer', 'getAllowedAttributes', new UnionType([$arrayType, new BooleanType()])), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer', 'isAllowedAttribute', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer', 'instantiateObject', new ObjectWithoutClassType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'supportsNormalization', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'instantiateObject', new ObjectWithoutClassType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'extractAttributes', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'getAttributeValue', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'supportsDenormalization', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'denormalize', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface', 'denormalize', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface', 'supportsDenormalization', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', 'supportsNormalization', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer', 'normalize', $scalarArrayObjectUnionType), new AddReturnTypeDeclaration('Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', 'normalize', $scalarArrayObjectUnionType)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-templating.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-templating.php new file mode 100644 index 000000000..f570d7a4b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-templating.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Templating\\Helper\\HelperInterface', 'getName', new StringType())]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-translation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-translation.php new file mode 100644 index 000000000..bb1e7f046 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-translation.php @@ -0,0 +1,17 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor', 'canBeExtracted', new BooleanType()), new AddReturnTypeDeclaration('Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor', 'extractFromDirectory', $iterableType)]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-validator.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-validator.php new file mode 100644 index 000000000..56ddee3f4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony60/symfony60-validator.php @@ -0,0 +1,20 @@ +ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'getDefaultOption', $nullableStringType), new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'getRequiredOptions', $arrayType), new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'validatedBy', new StringType()), new AddReturnTypeDeclaration('Symfony\\Component\\Validator\\Constraint', 'getTargets', new UnionType([new StringType(), $arrayType]))]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61.php new file mode 100644 index 000000000..b68ccaa11 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61.php @@ -0,0 +1,13 @@ +import(__DIR__ . '/symfony61/symfony61-serializer.php'); + $rectorConfig->import(__DIR__ . '/symfony61/symfony61-validator.php'); + $rectorConfig->import(__DIR__ . '/symfony61/symfony61-console.php'); + $rectorConfig->import(__DIR__ . '/symfony61/symfony61-twig-bridge.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-console.php new file mode 100644 index 000000000..c49325501 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-console.php @@ -0,0 +1,11 @@ +rules([CommandConfigureToAttributeRector::class, CommandPropertyToAttributeRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-serializer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-serializer.php new file mode 100644 index 000000000..efcee5a6b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-serializer.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/43982 + 'Symfony\\Component\\Serializer\\Normalizer\\ContextAwareDenormalizerInterface' => 'Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface', + 'Symfony\\Component\\Serializer\\Normalizer\\ContextAwareNormalizerInterface' => 'Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-twig-bridge.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-twig-bridge.php new file mode 100644 index 000000000..77dd9c643 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-twig-bridge.php @@ -0,0 +1,10 @@ +rule(MagicClosureTwigExtensionToNativeMethodsRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-validator.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-validator.php new file mode 100644 index 000000000..529f0ac89 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony61/symfony61-validator.php @@ -0,0 +1,16 @@ +rule(ErrorNamesPropertyToConstantRector::class); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/45623 + 'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntax' => 'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntax', + 'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntaxValidator' => 'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntaxValidator', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62.php new file mode 100644 index 000000000..d54d7588a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62.php @@ -0,0 +1,32 @@ +ruleWithConfiguration(AnnotationToAttributeRector::class, [ + // @see https://github.com/symfony/symfony/pull/46907 + new AnnotationToAttribute('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\IsGranted'), + // @see https://github.com/symfony/symfony/pull/46880 + new AnnotationToAttribute('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Cache'), + // @see https://github.com/symfony/symfony/pull/46906 + new AnnotationToAttribute('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Template'), + ]); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-security-core.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-security-http.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-mime.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-http-kernel.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-framework-bundle.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-twig-bridge.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-translation.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-doctrine-bridge.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-messenger.php'); + $rectorConfig->import(__DIR__ . '/symfony62/symfony62-mail-pace-mailer.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-doctrine-bridge.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-doctrine-bridge.php new file mode 100644 index 000000000..ea5cbe583 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-doctrine-bridge.php @@ -0,0 +1,10 @@ +rule(ParamConverterAttributeToMapEntityAttributeRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-framework-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-framework-bundle.php new file mode 100644 index 000000000..66741ee71 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-framework-bundle.php @@ -0,0 +1,16 @@ +rule(SimplifyFormRenderingRector::class); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ + // @see https://github.com/symfony/symfony/pull/46854 + new MethodCallRename('Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController', 'renderForm', 'render'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-foundation.php new file mode 100644 index 000000000..9a9b33b59 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-foundation.php @@ -0,0 +1,21 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/47595 + 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => 'Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher', + 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => 'Symfony\\Component\\HttpFoundation\\ChainRequestMatcher', + ]); + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ + // @see https://github.com/symfony/symfony/pull/45034 + new MethodCallRename('Symfony\\Component\\HttpFoundation\\Request', 'getContentType', 'getContentTypeFormat'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-kernel.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-kernel.php new file mode 100644 index 000000000..a4599c8f3 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-http-kernel.php @@ -0,0 +1,21 @@ +rules([ + // @see https://github.com/symfony/symfony/pull/47363 + ArgumentValueResolverToValueResolverRector::class, + ]); + // https://symfony.com/blog/new-in-symfony-6-2-built-in-cache-security-template-and-doctrine-attributes + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/46880 + 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Cache' => 'Symfony\\Component\\HttpKernel\\Attribute\\Cache', + // @see https://github.com/symfony/symfony/pull/47363 + 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => 'Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mail-pace-mailer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mail-pace-mailer.php new file mode 100644 index 000000000..ef946442f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mail-pace-mailer.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/46714 + 'Symfony\\Component\\Mailer\\Bridge\\OhMySmtp\\Transport\\OhMySmtpApiTransport' => 'Symfony\\Component\\Mailer\\Bridge\\MailPace\\Transport\\MailPaceApiTransport', + 'Symfony\\Component\\Mailer\\Bridge\\OhMySmtp\\Transport\\OhMySmtpSmtpTransport' => 'Symfony\\Component\\Mailer\\Bridge\\MailPace\\Transport\\MailPaceSmtpTransport', + 'Symfony\\Component\\Mailer\\Bridge\\OhMySmtp\\Transport\\OhMySmtpTransportFactory' => 'Symfony\\Component\\Mailer\\Bridge\\MailPace\\Transport\\MailPaceTransportFactory', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-messenger.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-messenger.php new file mode 100644 index 000000000..3bb0bde9a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-messenger.php @@ -0,0 +1,15 @@ +rules([ + // @see https://github.com/symfony/symfony/pull/47068, #[AsMessageHandler] attribute + MessageHandlerInterfaceToAttributeRector::class, + MessageSubscriberInterfaceToAttributeRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mime.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mime.php new file mode 100644 index 000000000..974053543 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-mime.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + // @see https://github.com/symfony/symfony/pull/47711 + new MethodCallRename('Symfony\\Component\\Mime\\Email', 'attachPart', 'addPart'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-core.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-core.php new file mode 100644 index 000000000..789934324 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-core.php @@ -0,0 +1,19 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/46094 + 'Symfony\\Component\\Security\\Core\\Security' => 'Symfony\\Bundle\\SecurityBundle\\Security', + ]); + // @see https://github.com/symfony/symfony/pull/46094 + // @see https://github.com/symfony/symfony/pull/48554 + $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'ACCESS_DENIED_ERROR', 'Symfony\\Component\\Security\\Http\\SecurityRequestAttributes', 'ACCESS_DENIED_ERROR'), new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'AUTHENTICATION_ERROR', 'Symfony\\Component\\Security\\Http\\SecurityRequestAttributes', 'AUTHENTICATION_ERROR'), new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'LAST_USERNAME', 'Symfony\\Component\\Security\\Http\\SecurityRequestAttributes', 'LAST_USERNAME'), new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'MAX_USERNAME_LENGTH', 'Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\UserBadge', 'MAX_USERNAME_LENGTH')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-http.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-http.php new file mode 100644 index 000000000..08cda8794 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-security-http.php @@ -0,0 +1,16 @@ +rule(SecurityAttributeToIsGrantedAttributeRector::class); + // https://symfony.com/blog/new-in-symfony-6-2-built-in-cache-security-template-and-doctrine-attributes + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/46907 + 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\IsGranted' => 'Symfony\\Component\\Security\\Http\\Attribute\\IsGranted', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-translation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-translation.php new file mode 100644 index 000000000..c212e9ff7 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-translation.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/46161 + 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-twig-bridge.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-twig-bridge.php new file mode 100644 index 000000000..4fd74260a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony62/symfony62-twig-bridge.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/pull/46906 + 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Template' => 'Symfony\\Bridge\\Twig\\Attribute\\Template', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63.php new file mode 100644 index 000000000..9cfea6894 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63.php @@ -0,0 +1,14 @@ +import(__DIR__ . '/symfony63/symfony63-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony63/symfony63-http-client.php'); + $rectorConfig->import(__DIR__ . '/symfony63/symfony63-messenger.php'); + $rectorConfig->import(__DIR__ . '/symfony63/symfony63-console.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-console.php new file mode 100644 index 000000000..81acb6259 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-console.php @@ -0,0 +1,13 @@ +rules([ + // @see https://github.com/symfony/symfony/commit/1650e3861b5fcd931e5d3eb1dd84bad764020d8e + SignalableCommandInterfaceReturnTypeRector::class, + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-dependency-injection.php new file mode 100644 index 000000000..d7fd78f0c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-dependency-injection.php @@ -0,0 +1,18 @@ +rules([ + // @see https://symfony.com/blog/new-in-symfony-6-3-dependency-injection-improvements#new-options-for-autowire-attribute + ParamAndEnvAttributeRector::class, + ]); + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/commit/b653adf426aedc66d16c5fc1cf71e261f20b9638 + 'Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated' => 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-http-client.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-http-client.php new file mode 100644 index 000000000..71acd90db --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-http-client.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/commit/20ab567385e3812ef661dae01a1fdc5d1bde2666 + 'Http\\Client\\HttpClient' => 'Psr\\Http\\Client\\ClientInterface', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-messenger.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-messenger.php new file mode 100644 index 000000000..09ff8fafb --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony63/symfony63-messenger.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/commit/9415b438b75204c72ff66b838307b73646393cbf + 'Symfony\\Component\\Messenger\\EventListener\\StopWorkerOnSigtermSignalListener' => 'Symfony\\Component\\Messenger\\EventListener\\StopWorkerOnSignalsListener', + // @see https://github.com/symfony/symfony/commit/a7926b2d83f35fe53c41a28d8055490cc1955928 + 'Symfony\\Component\\Messenger\\Transport\\InMemoryTransport' => 'Symfony\\Component\\Messenger\\Transport\\InMemory\\InMemoryTransport', + 'Symfony\\Component\\Messenger\\Transport\\InMemoryTransportFactory' => 'Symfony\\Component\\Messenger\\Transport\\InMemory\\InMemoryTransportFactory', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64.php new file mode 100644 index 000000000..0304e4bfe --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64.php @@ -0,0 +1,13 @@ +import(__DIR__ . '/symfony64/symfony64-routing.php'); + $rectorConfig->import(__DIR__ . '/symfony64/symfony64-form.php'); + $rectorConfig->import(__DIR__ . '/symfony64/symfony64-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony64/symfony64-error-handler.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-error-handler.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-error-handler.php new file mode 100644 index 000000000..dcf931356 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-error-handler.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony64.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-form.php similarity index 50% rename from vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony64.php rename to vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-form.php index 90b75112a..58b971932 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony64.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-form.php @@ -1,18 +1,13 @@ ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\HttpKernel\\UriSigner' => 'Symfony\\Component\\HttpFoundation\\UriSigner', 'Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter']); - $rectorConfig->ruleWithConfiguration(RenameAttributeRector::class, [new RenameAttribute('Symfony\\Component\\Routing\\Annotation\\Route', 'Symfony\\Component\\Routing\\Attribute\\Route')]); $rectorConfig->ruleWithConfiguration(AddReturnTypeDeclarationRector::class, [new AddReturnTypeDeclaration('Symfony\\Component\\Form\\DataTransformerInterface', 'transform', new MixedType()), new AddReturnTypeDeclaration('Symfony\\Component\\Form\\DataTransformerInterface', 'reverseTransform', new MixedType())]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-http-foundation.php new file mode 100644 index 000000000..2da4ff10f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-http-foundation.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameClassRector::class, ['Symfony\\Component\\HttpKernel\\UriSigner' => 'Symfony\\Component\\HttpFoundation\\UriSigner']); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-routing.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-routing.php new file mode 100644 index 000000000..477337e4a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony6/symfony64/symfony64-routing.php @@ -0,0 +1,11 @@ +ruleWithConfiguration(RenameAttributeRector::class, [new RenameAttribute('Symfony\\Component\\Routing\\Annotation\\Route', 'Symfony\\Component\\Routing\\Attribute\\Route')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony60.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony60.php deleted file mode 100644 index 30622fe2f..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony60.php +++ /dev/null @@ -1,37 +0,0 @@ -sets([SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES]); - $rectorConfig->import(__DIR__ . '/symfony6/symfony-return-types.php'); - $rectorConfig->ruleWithConfiguration(ReplaceServiceArgumentRector::class, [new ReplaceServiceArgument('Psr\\Container\\ContainerInterface', new String_('service_container')), new ReplaceServiceArgument('Symfony\\Component\\DependencyInjection\\ContainerInterface', new String_('service_container'))]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - // @see https://github.com/symfony/symfony/pull/39484 - 'Symfony\\Contracts\\HttpClient\\HttpClientInterface\\RemoteJsonManifestVersionStrategy' => 'Symfony\\Component\\Asset\\VersionStrategy\\JsonManifestVersionStrategy', - ]); - $rectorConfig->ruleWithConfiguration(AddParamTypeDeclarationRector::class, [new AddParamTypeDeclaration('Symfony\\Component\\Config\\Loader\\LoaderInterface', 'load', 0, new MixedType(\true)), new AddParamTypeDeclaration('Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait', 'configureRoutes', 0, new ObjectType('Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator'))]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - // @see https://github.com/symfony/symfony/pull/40403 - new MethodCallRename('Symfony\\Bridge\\Doctrine\\Security\\User\\UserLoaderInterface', 'loadUserByUsername', 'loadUserByIdentifier'), - new MethodCallRename('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface', 'loadUserByUsername', 'loadUserByIdentifier'), - // @see https://github.com/rectorphp/rector-symfony/issues/112 - new MethodCallRename('Symfony\\Component\\Security\\Core\\User\\UserInterface', 'getUsername', 'getUserIdentifier'), - ]); - $rectorConfig->rule(GetHelperControllerToServiceRector::class); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony61.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony61.php deleted file mode 100644 index f31a9aff2..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony61.php +++ /dev/null @@ -1,23 +0,0 @@ -rules([CommandConfigureToAttributeRector::class, CommandPropertyToAttributeRector::class, ErrorNamesPropertyToConstantRector::class, MagicClosureTwigExtensionToNativeMethodsRector::class]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - // @see https://github.com/symfony/symfony/pull/43982 - 'Symfony\\Component\\Serializer\\Normalizer\\ContextAwareDenormalizerInterface' => 'Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface', - 'Symfony\\Component\\Serializer\\Normalizer\\ContextAwareNormalizerInterface' => 'Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', - // @see https://github.com/symfony/symfony/pull/45623 - 'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntax' => 'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntax', - 'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntaxValidator' => 'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntaxValidator', - ]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony62.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony62.php deleted file mode 100644 index bc806c50c..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony62.php +++ /dev/null @@ -1,75 +0,0 @@ -rules([ - SimplifyFormRenderingRector::class, - SecurityAttributeToIsGrantedAttributeRector::class, - ParamConverterAttributeToMapEntityAttributeRector::class, - // @see https://github.com/symfony/symfony/pull/47068, #[AsMessageHandler] attribute - MessageHandlerInterfaceToAttributeRector::class, - MessageSubscriberInterfaceToAttributeRector::class, - // @see https://github.com/symfony/symfony/pull/47363 - ArgumentValueResolverToValueResolverRector::class, - ]); - // change to attribute before rename - // https://symfony.com/blog/new-in-symfony-6-2-built-in-cache-security-template-and-doctrine-attributes - // @see https://github.com/rectorphp/rector-symfony/issues/535#issuecomment-1783983383 - $rectorConfig->ruleWithConfiguration(AnnotationToAttributeRector::class, [ - // @see https://github.com/symfony/symfony/pull/46907 - new AnnotationToAttribute('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\IsGranted'), - // @see https://github.com/symfony/symfony/pull/46880 - new AnnotationToAttribute('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Cache'), - // @see https://github.com/symfony/symfony/pull/46906 - new AnnotationToAttribute('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Template'), - ]); - // https://symfony.com/blog/new-in-symfony-6-2-built-in-cache-security-template-and-doctrine-attributes - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - // @see https://github.com/symfony/symfony/pull/46907 - 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\IsGranted' => 'Symfony\\Component\\Security\\Http\\Attribute\\IsGranted', - // @see https://github.com/symfony/symfony/pull/46880 - 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Cache' => 'Symfony\\Component\\HttpKernel\\Attribute\\Cache', - // @see https://github.com/symfony/symfony/pull/46906 - 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Template' => 'Symfony\\Bridge\\Twig\\Attribute\\Template', - // @see https://github.com/symfony/symfony/pull/46714 - 'Symfony\\Component\\Mailer\\Bridge\\OhMySmtp\\Transport\\OhMySmtpApiTransport' => 'Symfony\\Component\\Mailer\\Bridge\\MailPace\\Transport\\MailPaceApiTransport', - 'Symfony\\Component\\Mailer\\Bridge\\OhMySmtp\\Transport\\OhMySmtpSmtpTransport' => 'Symfony\\Component\\Mailer\\Bridge\\MailPace\\Transport\\MailPaceSmtpTransport', - 'Symfony\\Component\\Mailer\\Bridge\\OhMySmtp\\Transport\\OhMySmtpTransportFactory' => 'Symfony\\Component\\Mailer\\Bridge\\MailPace\\Transport\\MailPaceTransportFactory', - // @see https://github.com/symfony/symfony/pull/47363 - 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => 'Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface', - // @see https://github.com/symfony/symfony/pull/46094 - 'Symfony\\Component\\Security\\Core\\Security' => 'Symfony\\Bundle\\SecurityBundle\\Security', - // @see https://github.com/symfony/symfony/pull/46161 - 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor', - // @see https://github.com/symfony/symfony/pull/47595 - 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => 'Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher', - 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => 'Symfony\\Component\\HttpFoundation\\ChainRequestMatcher', - ]); - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ - // @see https://github.com/symfony/symfony/pull/46854 - new MethodCallRename('Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController', 'renderForm', 'render'), - // @see https://github.com/symfony/symfony/pull/45034 - new MethodCallRename('Symfony\\Component\\HttpFoundation\\Request', 'getContentType', 'getContentTypeFormat'), - // @see https://github.com/symfony/symfony/pull/47711 - new MethodCallRename('Symfony\\Component\\Mime\\Email', 'attachPart', 'addPart'), - ]); - // @see https://github.com/symfony/symfony/pull/46094 - // @see https://github.com/symfony/symfony/pull/48554 - $rectorConfig->ruleWithConfiguration(RenameClassConstFetchRector::class, [new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'ACCESS_DENIED_ERROR', 'Symfony\\Component\\Security\\Http\\SecurityRequestAttributes', 'ACCESS_DENIED_ERROR'), new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'AUTHENTICATION_ERROR', 'Symfony\\Component\\Security\\Http\\SecurityRequestAttributes', 'AUTHENTICATION_ERROR'), new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'LAST_USERNAME', 'Symfony\\Component\\Security\\Http\\SecurityRequestAttributes', 'LAST_USERNAME'), new RenameClassAndConstFetch('Symfony\\Component\\Security\\Core\\Security', 'MAX_USERNAME_LENGTH', 'Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\UserBadge', 'MAX_USERNAME_LENGTH')]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony63.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony63.php deleted file mode 100644 index 1165378df..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony63.php +++ /dev/null @@ -1,30 +0,0 @@ -ruleWithConfiguration(RenameClassRector::class, [ - // @see https://github.com/symfony/symfony/commit/b653adf426aedc66d16c5fc1cf71e261f20b9638 - 'Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated' => 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated', - // @see https://github.com/symfony/symfony/commit/20ab567385e3812ef661dae01a1fdc5d1bde2666 - 'Http\\Client\\HttpClient' => 'Psr\\Http\\Client\\ClientInterface', - // @see https://github.com/symfony/symfony/commit/9415b438b75204c72ff66b838307b73646393cbf - 'Symfony\\Component\\Messenger\\EventListener\\StopWorkerOnSigtermSignalListener' => 'Symfony\\Component\\Messenger\\EventListener\\StopWorkerOnSignalsListener', - // @see https://github.com/symfony/symfony/commit/a7926b2d83f35fe53c41a28d8055490cc1955928 - 'Symfony\\Component\\Messenger\\Transport\\InMemoryTransport' => 'Symfony\\Component\\Messenger\\Transport\\InMemory\\InMemoryTransport', - 'Symfony\\Component\\Messenger\\Transport\\InMemoryTransportFactory' => 'Symfony\\Component\\Messenger\\Transport\\InMemory\\InMemoryTransportFactory', - ]); - $rectorConfig->rules([ - // @see https://github.com/symfony/symfony/commit/1650e3861b5fcd931e5d3eb1dd84bad764020d8e - SignalableCommandInterfaceReturnTypeRector::class, - // @see https://symfony.com/blog/new-in-symfony-6-3-dependency-injection-improvements#new-options-for-autowire-attribute - ParamAndEnvAttributeRector::class, - ]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70.php new file mode 100644 index 000000000..f645ca3e8 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70.php @@ -0,0 +1,13 @@ +import(__DIR__ . '/symfony70/symfony70-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony70/symfony70-serializer.php'); + $rectorConfig->import(__DIR__ . '/symfony70/symfony70-http-foundation.php'); + $rectorConfig->import(__DIR__ . '/symfony70/symfony70-contracts.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-contracts.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-contracts.php new file mode 100644 index 000000000..8f639ede0 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-contracts.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(AnnotationToAttributeRector::class, [new AnnotationToAttribute('required', 'Symfony\\Contracts\\Service\\Attribute\\Required')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-dependency-injection.php new file mode 100644 index 000000000..79a40d672 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-dependency-injection.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(RenameAttributeRector::class, [new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-http-foundation.php new file mode 100644 index 000000000..4750183aa --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-http-foundation.php @@ -0,0 +1,18 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/blob/7.0/UPGRADE-7.0.md#httpfoundation + 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => 'Symfony\\Component\\HttpFoundation\\ChainRequestMatcher', + 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => 'Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher', + ]); + // @see https://github.com/symfony/symfony/pull/50826 + $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\HttpFoundation\\Request', 'getContentType', 'getContentTypeFormat')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-serializer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-serializer.php new file mode 100644 index 000000000..cf1b2d134 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony70/symfony70-serializer.php @@ -0,0 +1,14 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/blob/7.0/UPGRADE-7.0.md#frameworkbundle + 'Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer' => 'Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', + 'Symfony\\Component\\Serializer\\Normalizer\\PropertyNormalizer' => 'Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71.php new file mode 100644 index 000000000..83c79c38d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71.php @@ -0,0 +1,11 @@ +import(__DIR__ . '/symfony71/symfony71-dependency-injection.php'); + $rectorConfig->import(__DIR__ . '/symfony71/symfony71-serializer.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-dependency-injection.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-dependency-injection.php new file mode 100644 index 000000000..80caffb5c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-dependency-injection.php @@ -0,0 +1,12 @@ +ruleWithConfiguration(RenameAttributeRector::class, [new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireIterator'), new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireLocator')]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-serializer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-serializer.php new file mode 100644 index 000000000..6ccbc56ac --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony71/symfony71-serializer.php @@ -0,0 +1,15 @@ +ruleWithConfiguration(RenameMethodRector::class, [ + // typo fix + new MethodCallRename('Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractNormalizerContextBuilder', 'withDefaultContructorArguments', 'withDefaultConstructorArguments'), + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72.php new file mode 100644 index 000000000..bb714db66 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72.php @@ -0,0 +1,11 @@ +import(__DIR__ . '/symfony72/symfony72-serializer.php'); + $rectorConfig->import(__DIR__ . '/symfony72/symfony72-http-foundation.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-http-foundation.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-http-foundation.php new file mode 100644 index 000000000..2b533265c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-http-foundation.php @@ -0,0 +1,10 @@ +rules([PushRequestToRequestStackConstructorRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-serializer.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-serializer.php new file mode 100644 index 000000000..d38b4d1b4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony72/symfony72-serializer.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(RenameClassRector::class, [ + // @see https://github.com/symfony/symfony/blob/7.2/UPGRADE-7.2.md#serializer + 'Symfony\\Component\\Serializer\\NameConverter\\AdvancedNameConverterInterface' => 'Symfony\\Component\\Serializer\\NameConverter\\NameConverterInterface', + ]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73.php new file mode 100644 index 000000000..5381365eb --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73.php @@ -0,0 +1,11 @@ +import(__DIR__ . '/symfony73/symfony73-console.php'); + $rectorConfig->import(__DIR__ . '/symfony73/symfony73-twig-bundle.php'); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-console.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-console.php new file mode 100644 index 000000000..63d1d3e5c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-console.php @@ -0,0 +1,11 @@ +rules([CommandHelpToAttributeRector::class, InvokableCommandInputAttributeRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-twig-bundle.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-twig-bundle.php new file mode 100644 index 000000000..8b534b2f0 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony7/symfony73/symfony73-twig-bundle.php @@ -0,0 +1,11 @@ +rules([GetFiltersToAsTwigFilterAttributeRector::class, GetFunctionsToAsTwigFunctionAttributeRector::class]); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony70.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony70.php deleted file mode 100644 index 975fa8320..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony70.php +++ /dev/null @@ -1,30 +0,0 @@ -ruleWithConfiguration(RenameAttributeRector::class, [new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated')]); - $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ - // @see https://github.com/symfony/symfony/blob/7.0/UPGRADE-7.0.md#frameworkbundle - 'Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer' => 'Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', - 'Symfony\\Component\\Serializer\\Normalizer\\PropertyNormalizer' => 'Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface', - // @see https://github.com/symfony/symfony/blob/7.0/UPGRADE-7.0.md#httpfoundation - 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => 'Symfony\\Component\\HttpFoundation\\ChainRequestMatcher', - 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => 'Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher', - ]); - // @see https://github.com/symfony/symfony/pull/50826 - $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('Symfony\\Component\\HttpFoundation\\Request', 'getContentType', 'getContentTypeFormat')]); - // the "@required" was dropped, use attribute instead - $rectorConfig->ruleWithConfiguration(AnnotationToAttributeRector::class, [new AnnotationToAttribute('required', 'Symfony\\Contracts\\Service\\Attribute\\Required')]); -}; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony71.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony71.php deleted file mode 100644 index dba9ba5a4..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony71.php +++ /dev/null @@ -1,15 +0,0 @@ -withConfiguredRule(RenameAttributeRector::class, [new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireIterator'), new RenameAttribute('Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator', 'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireLocator')])->withConfiguredRule(RenameMethodRector::class, [ - // typo fix - new MethodCallRename('Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractNormalizerContextBuilder', 'withDefaultContructorArguments', 'withDefaultConstructorArguments'), -]); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php index ff5bd4119..e867933fc 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig-underscore-to-namespace.php @@ -1,7 +1,7 @@ withSets([__DIR__ . '/twig-underscore-to-namespace.php']); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php index 410cb0ad5..209dc7f10 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/twig/twig20.php @@ -1,7 +1,7 @@ withSets([__DIR__ . '/twig-underscore-to-namespace.php']); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeAnalyzer/AttributePresenceDetector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeAnalyzer/AttributePresenceDetector.php new file mode 100644 index 000000000..0f1f5c76d --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeAnalyzer/AttributePresenceDetector.php @@ -0,0 +1,27 @@ +reflectionProvider = $reflectionProvider; + } + public function detect(string $attributeClass) : bool + { + // run only if the sensio attribute is available + if (!$this->reflectionProvider->hasClass($attributeClass)) { + return \false; + } + // must be attribute, not just annotation + $securityClassReflection = $this->reflectionProvider->getClass($attributeClass); + return $securityClassReflection->isAttributeClass(); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php index a05d23386..6fcceb60a 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php @@ -13,9 +13,8 @@ final class SymfonyClosureFactory { /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; public function __construct(PropertyNaming $propertyNaming) { $this->propertyNaming = $propertyNaming; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/AttributeGroup/SingleConditionSecurityAttributeToIsGrantedRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/AttributeGroup/SingleConditionSecurityAttributeToIsGrantedRector.php new file mode 100644 index 000000000..c2df1d7ce --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/AttributeGroup/SingleConditionSecurityAttributeToIsGrantedRector.php @@ -0,0 +1,83 @@ +attributePresenceDetector = $attributePresenceDetector; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Narrow #[Security] attribute with inner sigle "is_granted/has_role" condition string to #[IsGranted] attribute', [new CodeSample(<<<'CODE_SAMPLE' +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; + +#[Security("is_granted('ROLE_USER')")] +class SomeClass +{ +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Component\Security\Http\Attribute\IsGranted; + +#[IsGranted('ROLE_USER')] +class SomeClass +{ +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [AttributeGroup::class]; + } + /** + * @param AttributeGroup $node + */ + public function refactor(Node $node) : ?AttributeGroup + { + if (!$this->attributePresenceDetector->detect(SensioAttribute::SECURITY)) { + return null; + } + foreach ($node->attrs as $attr) { + if (!$this->isName($attr->name, SensioAttribute::SECURITY)) { + continue; + } + $firstArgValue = $attr->args[0]->value; + if (!$firstArgValue instanceof String_) { + continue; + } + $matches = Strings::match($firstArgValue->value, '#^(is_granted|has_role)\\(\'(?[A-Za-z_]+)\'\\)$#'); + if (!isset($matches['access_right'])) { + continue; + } + $attr->name = new FullyQualified(SensioAttribute::IS_GRANTED); + $attr->args = [new Arg(new String_($matches['access_right']))]; + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/RequestIsMainRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/RequestIsMainRector.php new file mode 100644 index 000000000..a4e5ba3a9 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/RequestIsMainRector.php @@ -0,0 +1,101 @@ +reflectionProvider = $reflectionProvider; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Turns status code numbers to constants', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernel; + +class SomeController +{ + public function index(Request $request): bool + { + return $request->getRequestType() === HttpKernel::MASTER_REQUEST; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernel; + +class SomeController +{ + public function index(Request $request): bool + { + return $request->isMasterRequestType(); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [BinaryOp::class]; + } + /** + * @param BinaryOp $node + */ + public function refactor(Node $node) : ?Node + { + if (!$node->left instanceof MethodCall) { + return null; + } + $methodCall = $node->left; + if (!$this->isRequestGetRequestType($methodCall)) { + return null; + } + if (!$this->isHttpKernelMainRequestClassConstFetch($node->right)) { + return null; + } + $requestClassReflection = $this->reflectionProvider->getClass(SymfonyClass::REQUEST); + $methodName = $requestClassReflection->hasMethod('isMainRequest') ? 'isMainRequest' : 'isMasterRequest'; + return new MethodCall($methodCall->var, $methodName); + } + private function isRequestGetRequestType(MethodCall $methodCall) : bool + { + if (!$this->isName($methodCall->name, 'getRequestType')) { + return \false; + } + return $this->isObjectType($methodCall->var, new ObjectType(SymfonyClass::REQUEST)); + } + private function isHttpKernelMainRequestClassConstFetch(Expr $expr) : bool + { + if (!$expr instanceof ClassConstFetch) { + return \false; + } + if (!$this->isNames($expr->class, [SymfonyClass::HTTP_KERNEL_INTERFACE, SymfonyClass::HTTP_KERNEL])) { + return \false; + } + return $this->isNames($expr->name, ['MASTER_REQUEST', 'MAIN_REQUEST']); + } +} 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 38db46b27..c6130f7bd 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,7 @@ use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Rector\Symfony\CodeQuality\Enum\ResponseClass; @@ -25,19 +25,16 @@ final class ResponseStatusCodeRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\LiteralCallLikeConstFetchReplacer */ - private $literalCallLikeConstFetchReplacer; + private LiteralCallLikeConstFetchReplacer $literalCallLikeConstFetchReplacer; /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $responseObjectType; + private ObjectType $responseObjectType; public function __construct(ControllerAnalyzer $controllerAnalyzer, LiteralCallLikeConstFetchReplacer $literalCallLikeConstFetchReplacer) { $this->controllerAnalyzer = $controllerAnalyzer; @@ -100,7 +97,7 @@ public function refactor(Node $node) : ?Node } private function processMethodCall(MethodCall $methodCall) : ?\PhpParser\Node\Expr\CallLike { - $methodCallName = $this->nodeNameResolver->getName($methodCall->name); + $methodCallName = $this->getName($methodCall->name); if (!\is_string($methodCallName)) { return null; } @@ -123,11 +120,11 @@ private function processBinaryOp(BinaryOp $binaryOp) : ?BinaryOp if (!$this->isGetStatusMethod($binaryOp->left) && !$this->isGetStatusMethod($binaryOp->right)) { return null; } - if ($binaryOp->right instanceof LNumber && $this->isGetStatusMethod($binaryOp->left)) { + if ($binaryOp->right instanceof Int_ && $this->isGetStatusMethod($binaryOp->left)) { $binaryOp->right = $this->convertNumberToConstant($binaryOp->right); return $binaryOp; } - if ($binaryOp->left instanceof LNumber && $this->isGetStatusMethod($binaryOp->right)) { + if ($binaryOp->left instanceof Int_ && $this->isGetStatusMethod($binaryOp->right)) { $binaryOp->left = $this->convertNumberToConstant($binaryOp->left); return $binaryOp; } @@ -144,14 +141,14 @@ private function isGetStatusMethod(Node $node) : bool return $this->isObjectType($node->var, $this->responseObjectType); } /** - * @return \PhpParser\Node\Expr\ClassConstFetch|\PhpParser\Node\Scalar\LNumber + * @return \PhpParser\Node\Expr\ClassConstFetch|\PhpParser\Node\Scalar\Int_ */ - private function convertNumberToConstant(LNumber $lNumber) + private function convertNumberToConstant(Int_ $int) { - if (!isset(SymfonyResponseConstantMap::CODE_TO_CONST[$lNumber->value])) { - return $lNumber; + if (!isset(SymfonyResponseConstantMap::CODE_TO_CONST[$int->value])) { + return $int; } - return $this->nodeFactory->createClassConstFetch($this->responseObjectType->getClassName(), SymfonyResponseConstantMap::CODE_TO_CONST[$lNumber->value]); + return $this->nodeFactory->createClassConstFetch($this->responseObjectType->getClassName(), SymfonyResponseConstantMap::CODE_TO_CONST[$int->value]); } private function processAssertMethodCall(MethodCall $methodCall) : ?\PhpParser\Node\Expr\MethodCall { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php index 33630fb0f..bb29f0060 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\CodeQuality\Rector\ClassMethod; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\ClassMethod; @@ -18,9 +18,8 @@ final class ActionSuffixRemoverRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\Bridge\NodeAnalyzer\ControllerMethodAnalyzer */ - private $controllerMethodAnalyzer; + private ControllerMethodAnalyzer $controllerMethodAnalyzer; public function __construct(ControllerMethodAnalyzer $controllerMethodAnalyzer) { $this->controllerMethodAnalyzer = $controllerMethodAnalyzer; @@ -63,13 +62,16 @@ public function refactor(Node $node) : ?Node if ($node->name->toString() === 'getAction') { return null; } - $this->removeSuffix($node, 'Action'); - return $node; + return $this->removeSuffix($node, 'Action'); } - private function removeSuffix(ClassMethod $classMethod, string $suffixToRemove) : void + private function removeSuffix(ClassMethod $classMethod, string $suffixToRemove) : ?ClassMethod { - $name = $this->nodeNameResolver->getName($classMethod); + $name = $this->getName($classMethod); $newName = Strings::replace($name, \sprintf('#%s$#', $suffixToRemove), ''); + if ($newName === $name) { + return null; + } $classMethod->name = new Identifier($newName); + return $classMethod; } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ParamTypeFromRouteRequiredRegexRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ParamTypeFromRouteRequiredRegexRector.php index 462adc3b0..ba27c06fb 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ParamTypeFromRouteRequiredRegexRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ParamTypeFromRouteRequiredRegexRector.php @@ -20,19 +20,16 @@ final class ParamTypeFromRouteRequiredRegexRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\RouteRequiredParamNameToTypesResolver */ - private $routeRequiredParamNameToTypesResolver; + private RouteRequiredParamNameToTypesResolver $routeRequiredParamNameToTypesResolver; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ControllerAnalyzer $controllerAnalyzer, RouteRequiredParamNameToTypesResolver $routeRequiredParamNameToTypesResolver, StaticTypeMapper $staticTypeMapper) { $this->controllerAnalyzer = $controllerAnalyzer; @@ -103,7 +100,7 @@ public function refactor(Node $node) : ?Node if (!$param instanceof Param) { continue; } - if ($param->type !== null) { + if ($param->type instanceof Node) { continue; } $param->type = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($paramType, TypeKind::PARAM); 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 78b91676c..adfd563a0 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 @@ -7,13 +7,13 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer; use Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\Symfony\TypeAnalyzer\ControllerAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -21,33 +21,28 @@ /** * @see \Rector\Symfony\Tests\CodeQuality\Rector\ClassMethod\RemoveUnusedRequestParamRector\RemoveUnusedRequestParamRectorTest */ -final class RemoveUnusedRequestParamRector extends AbstractScopeAwareRector +final class RemoveUnusedRequestParamRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer */ - private $classChildAnalyzer; + private ClassChildAnalyzer $classChildAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer */ - private $isClassMethodUsedAnalyzer; + private IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer; public function __construct(ControllerAnalyzer $controllerAnalyzer, ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, BetterNodeFinder $betterNodeFinder, IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer) { $this->controllerAnalyzer = $controllerAnalyzer; @@ -94,7 +89,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { if (!$this->controllerAnalyzer->isInsideController($node)) { return null; @@ -129,6 +124,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node if ($requestVariable instanceof Variable) { continue 2; } + $scope = ScopeFetcher::fetch($node); if ($this->isClassMethodUsedAnalyzer->isClassMethodUsed($node, $classMethod, $scope)) { continue 2; } 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 add543c1c..a52d1dc5a 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 @@ -38,34 +38,28 @@ final class ResponseReturnTypeControllerActionRector extends AbstractRector impl { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttrinationFinder */ - private $attrinationFinder; + private AttrinationFinder $attrinationFinder; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer */ - private $returnAnalyzer; + private ReturnAnalyzer $returnAnalyzer; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ - private $returnTypeInferer; + private ReturnTypeInferer $returnTypeInferer; public function __construct(ControllerAnalyzer $controllerAnalyzer, AttrinationFinder $attrinationFinder, BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer, StaticTypeMapper $staticTypeMapper, ReturnTypeInferer $returnTypeInferer) { $this->controllerAnalyzer = $controllerAnalyzer; 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 a393b796d..6a5e0f524 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 @@ -4,6 +4,7 @@ namespace Rector\Symfony\CodeQuality\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\Attribute; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; @@ -13,16 +14,20 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; +use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; +use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\Type\ArrayType; use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; 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\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Doctrine\NodeAnalyzer\AttrinationFinder; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Rector\AbstractRector; use Rector\Symfony\Annotation\AnnotationAnalyzer; @@ -35,8 +40,8 @@ use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @changelog https://github.com/symfony/symfony-docs/pull/12387#discussion_r329551967 - * @changelog https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/view.html + * @see https://github.com/symfony/symfony-docs/pull/12387#discussion_r329551967 + * @see https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/view.html * * @see \Rector\Symfony\Tests\CodeQuality\Rector\ClassMethod\TemplateAnnotationToThisRenderRector\TemplateAnnotationToThisRenderRectorTest */ @@ -44,50 +49,45 @@ final class TemplateAnnotationToThisRenderRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ArrayUnionResponseTypeAnalyzer */ - private $arrayUnionResponseTypeAnalyzer; + private ArrayUnionResponseTypeAnalyzer $arrayUnionResponseTypeAnalyzer; /** * @readonly - * @var \Rector\Symfony\TypeDeclaration\ReturnTypeDeclarationUpdater */ - private $returnTypeDeclarationUpdater; + private ReturnTypeDeclarationUpdater $returnTypeDeclarationUpdater; /** * @readonly - * @var \Rector\Symfony\NodeFactory\ThisRenderFactory */ - private $thisRenderFactory; + private ThisRenderFactory $thisRenderFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Symfony\NodeFinder\EmptyReturnNodeFinder */ - private $emptyReturnNodeFinder; + private EmptyReturnNodeFinder $emptyReturnNodeFinder; /** * @readonly - * @var \Rector\Symfony\Annotation\AnnotationAnalyzer */ - private $annotationAnalyzer; + private AnnotationAnalyzer $annotationAnalyzer; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $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) + private PhpDocInfoFactory $phpDocInfoFactory; + /** + * @readonly + */ + private AttrinationFinder $attrinationFinder; + public function __construct(ArrayUnionResponseTypeAnalyzer $arrayUnionResponseTypeAnalyzer, ReturnTypeDeclarationUpdater $returnTypeDeclarationUpdater, ThisRenderFactory $thisRenderFactory, PhpDocTagRemover $phpDocTagRemover, EmptyReturnNodeFinder $emptyReturnNodeFinder, AnnotationAnalyzer $annotationAnalyzer, DocBlockUpdater $docBlockUpdater, BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory, AttrinationFinder $attrinationFinder) { $this->arrayUnionResponseTypeAnalyzer = $arrayUnionResponseTypeAnalyzer; $this->returnTypeDeclarationUpdater = $returnTypeDeclarationUpdater; @@ -98,6 +98,7 @@ public function __construct(ArrayUnionResponseTypeAnalyzer $arrayUnionResponseTy $this->docBlockUpdater = $docBlockUpdater; $this->betterNodeFinder = $betterNodeFinder; $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->attrinationFinder = $attrinationFinder; } public function getRuleDefinition() : RuleDefinition { @@ -142,14 +143,10 @@ public function refactor(Node $node) : ?Node if (!$this->annotationAnalyzer->hasClassMethodWithTemplateAnnotation($node)) { return null; } - $this->decorateAbstractControllerParentClass($node); $hasChanged = \false; - $classDoctrineAnnotationTagValueNode = $this->annotationAnalyzer->getDoctrineAnnotationTagValueNode($node, SymfonyAnnotation::TEMPLATE); + $classTemplateTagValueNodeOrAttribute = $this->attrinationFinder->getByOne($node, SymfonyAnnotation::TEMPLATE); foreach ($node->getMethods() as $classMethod) { - if (!$classMethod->isPublic()) { - continue; - } - $hasClassMethodChanged = $this->replaceTemplateAnnotation($classMethod, $classDoctrineAnnotationTagValueNode); + $hasClassMethodChanged = $this->replaceTemplateAnnotation($classMethod, $classTemplateTagValueNodeOrAttribute); if ($hasClassMethodChanged) { $hasChanged = \true; } @@ -157,9 +154,10 @@ public function refactor(Node $node) : ?Node if (!$hasChanged) { return null; } - // cleanup Class_ @Template annotaion - if ($classDoctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) { - $this->removeDoctrineAnnotationTagValueNode($node, $classDoctrineAnnotationTagValueNode); + $this->decorateAbstractControllerParentClass($node); + // cleanup Class_ @Template annotation + if ($classTemplateTagValueNodeOrAttribute instanceof DoctrineAnnotationTagValueNode) { + $this->removeDoctrineAnnotationTagValueNode($node, $classTemplateTagValueNodeOrAttribute); } return $node; } @@ -169,44 +167,54 @@ private function decorateAbstractControllerParentClass(Class_ $class) : void return; } // this will make $this->render() method available - $class->extends = new FullyQualified('Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController'); + $class->extends = new FullyQualified(SymfonyClass::ABSTRACT_CONTROLLER); } - private function replaceTemplateAnnotation(ClassMethod $classMethod, ?DoctrineAnnotationTagValueNode $classDoctrineAnnotationTagValueNode) : bool + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute|null $classTagValueNodeOrAttribute + */ + private function replaceTemplateAnnotation(ClassMethod $classMethod, $classTagValueNodeOrAttribute) : bool { if (!$classMethod->isPublic()) { return \false; } - $doctrineAnnotationTagValueNode = $this->annotationAnalyzer->getDoctrineAnnotationTagValueNode($classMethod, SymfonyAnnotation::TEMPLATE); - if ($doctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) { - return $this->refactorClassMethod($classMethod, $doctrineAnnotationTagValueNode); + $methodTemplateTagValueNodeOrAttribute = $this->attrinationFinder->getByOne($classMethod, SymfonyAnnotation::TEMPLATE); + if ($methodTemplateTagValueNodeOrAttribute !== null) { + return $this->refactorClassMethod($classMethod, $methodTemplateTagValueNodeOrAttribute); } - // global @Template access - if ($classDoctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) { - return $this->refactorClassMethod($classMethod, $classDoctrineAnnotationTagValueNode); + // fallback to global @Template/#[Template] access + if ($classTagValueNodeOrAttribute instanceof DoctrineAnnotationTagValueNode || $classTagValueNodeOrAttribute instanceof Attribute) { + return $this->refactorClassMethod($classMethod, $classTagValueNodeOrAttribute); } return \false; } - private function refactorClassMethod(ClassMethod $classMethod, DoctrineAnnotationTagValueNode $templateDoctrineAnnotationTagValueNode) : bool + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $templateTagValueNodeOrAttribute + */ + private function refactorClassMethod(ClassMethod $classMethod, $templateTagValueNodeOrAttribute) : bool { $hasThisRenderOrReturnsResponse = $this->hasLastReturnResponse($classMethod); $hasChanged = \false; - $this->traverseNodesWithCallable($classMethod, function (Node $node) use($templateDoctrineAnnotationTagValueNode, $hasThisRenderOrReturnsResponse, $classMethod, &$hasChanged) : ?int { + $this->traverseNodesWithCallable($classMethod, function (Node $node) use($templateTagValueNodeOrAttribute, $hasThisRenderOrReturnsResponse, $classMethod, &$hasChanged) : ?int { // keep as similar type if ($node instanceof Closure || $node instanceof Function_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof StmtsAwareInterface) { return null; } - $this->refactorStmtsAwareNode($node, $templateDoctrineAnnotationTagValueNode, $hasThisRenderOrReturnsResponse, $classMethod); - $hasChanged = \true; + $hasChangedNode = $this->refactorStmtsAwareNode($node, $templateTagValueNodeOrAttribute, $hasThisRenderOrReturnsResponse, $classMethod); + if ($hasChangedNode) { + $hasChanged = \true; + } return null; }); + // remove return array shape details + $this->removeReturnArrayShapeDocblock($classMethod); if (!$this->emptyReturnNodeFinder->hasNoOrEmptyReturns($classMethod)) { return $hasChanged; } - $thisRenderMethodCall = $this->thisRenderFactory->create(null, $templateDoctrineAnnotationTagValueNode, $classMethod); - $this->refactorNoReturn($classMethod, $thisRenderMethodCall, $templateDoctrineAnnotationTagValueNode); + $thisRenderMethodCall = $this->thisRenderFactory->create(null, $templateTagValueNodeOrAttribute, $classMethod); + $this->refactorNoReturn($classMethod, $thisRenderMethodCall, $templateTagValueNodeOrAttribute); return \true; } private function hasLastReturnResponse(ClassMethod $classMethod) : bool @@ -224,15 +232,18 @@ private function hasLastReturnResponse(ClassMethod $classMethod) : bool $returnType = $this->getType($lastReturn->expr); return $responseObjectType->isSuperTypeOf($returnType)->yes(); } - private function refactorReturn(Return_ $return, DoctrineAnnotationTagValueNode $templateDoctrineAnnotationTagValueNode, bool $hasThisRenderOrReturnsResponse, ClassMethod $classMethod) : void + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $templateTagValueNodeOrAttribute + */ + private function refactorReturn(Return_ $return, $templateTagValueNodeOrAttribute, bool $hasThisRenderOrReturnsResponse, ClassMethod $classMethod) : bool { // nothing we can do if (!$return->expr instanceof Expr) { - return; + return \false; } // create "$this->render('template.file.twig.html', ['key' => 'value']);" method call - $thisRenderMethodCall = $this->thisRenderFactory->create($return, $templateDoctrineAnnotationTagValueNode, $classMethod); - $this->refactorReturnWithValue($return, $hasThisRenderOrReturnsResponse, $thisRenderMethodCall, $classMethod, $templateDoctrineAnnotationTagValueNode); + $thisRenderMethodCall = $this->thisRenderFactory->create($return, $templateTagValueNodeOrAttribute, $classMethod); + return $this->refactorReturnWithValue($return, $hasThisRenderOrReturnsResponse, $thisRenderMethodCall, $classMethod, $templateTagValueNodeOrAttribute); } private function refactorNoReturn(ClassMethod $classMethod, MethodCall $thisRenderMethodCall, DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode) : void { @@ -240,53 +251,101 @@ private function refactorNoReturn(ClassMethod $classMethod, MethodCall $thisRend $this->returnTypeDeclarationUpdater->updateClassMethod($classMethod, SymfonyClass::RESPONSE); $this->removeDoctrineAnnotationTagValueNode($classMethod, $doctrineAnnotationTagValueNode); } - private function refactorReturnWithValue(Return_ $return, bool $hasThisRenderOrReturnsResponse, MethodCall $thisRenderMethodCall, ClassMethod $classMethod, DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode) : void + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $doctrineTagValueNodeOrAttribute + */ + private function refactorReturnWithValue(Return_ $return, bool $hasThisRenderOrReturnsResponse, MethodCall $thisRenderMethodCall, ClassMethod $classMethod, $doctrineTagValueNodeOrAttribute) : bool { /** @var Expr $lastReturnExpr */ $lastReturnExpr = $return->expr; $returnStaticType = $this->getType($lastReturnExpr); - if (!$return->expr instanceof MethodCall) { - if (!$hasThisRenderOrReturnsResponse || $returnStaticType instanceof ConstantArrayType) { + $responseObjectType = new ObjectType(SymfonyClass::RESPONSE); + // change contents only if the value is not Response yet + if (!$responseObjectType->isSuperTypeOf($returnStaticType)->yes()) { + if (!$return->expr instanceof MethodCall) { + if (!$hasThisRenderOrReturnsResponse || $returnStaticType instanceof ConstantArrayType) { + $return->expr = $thisRenderMethodCall; + } + } elseif ($returnStaticType instanceof ArrayType) { $return->expr = $thisRenderMethodCall; + } elseif ($returnStaticType instanceof MixedType) { + // nothing we can do + return \false; + } + $isArrayOrResponseType = $this->arrayUnionResponseTypeAnalyzer->isArrayUnionResponseType($returnStaticType, SymfonyClass::RESPONSE); + // skip as the original class method has to change first + if ($isArrayOrResponseType) { + return \false; } - } elseif ($returnStaticType instanceof ArrayType) { - $return->expr = $thisRenderMethodCall; - } elseif ($returnStaticType instanceof MixedType) { - // nothing we can do - return; - } - $isArrayOrResponseType = $this->arrayUnionResponseTypeAnalyzer->isArrayUnionResponseType($returnStaticType, SymfonyClass::RESPONSE); - // skip as the original class method has to change first - if ($isArrayOrResponseType) { - return; } // already response - $this->removeDoctrineAnnotationTagValueNode($classMethod, $doctrineAnnotationTagValueNode); + $this->removeDoctrineAnnotationTagValueNode($classMethod, $doctrineTagValueNodeOrAttribute); $this->returnTypeDeclarationUpdater->updateClassMethod($classMethod, SymfonyClass::RESPONSE); + return \true; } /** * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod $node + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $doctrineTagValueNodeOrAttribute */ - private function removeDoctrineAnnotationTagValueNode($node, DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode) : void + private function removeDoctrineAnnotationTagValueNode($node, $doctrineTagValueNodeOrAttribute) : void { - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); - $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $doctrineAnnotationTagValueNode); - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + if ($doctrineTagValueNodeOrAttribute instanceof DoctrineAnnotationTagValueNode) { + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $doctrineTagValueNodeOrAttribute); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return; + } + foreach ($node->attrGroups as $attrGroupKey => $attrGroup) { + foreach ($attrGroup->attrs as $attributeKey => $attribute) { + if ($attribute === $doctrineTagValueNodeOrAttribute) { + unset($attrGroup->attrs[$attributeKey]); + } + } + // no attributes left? remove the whole dgroup + if ($attrGroup->attrs === []) { + unset($node->attrGroups[$attrGroupKey]); + } + } } - private function refactorStmtsAwareNode(StmtsAwareInterface $stmtsAware, DoctrineAnnotationTagValueNode $templateDoctrineAnnotationTagValueNode, bool $hasThisRenderOrReturnsResponse, ClassMethod $classMethod) : void + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $templateTagValueNodeOrAttribute + */ + private function refactorStmtsAwareNode(StmtsAwareInterface $stmtsAware, $templateTagValueNodeOrAttribute, bool $hasThisRenderOrReturnsResponse, ClassMethod $classMethod) : bool { if ($stmtsAware->stmts === null) { - return; + return \false; } + $hasChanged = \false; foreach ($stmtsAware->stmts as $stmt) { if (!$stmt instanceof Return_) { continue; } - // just created node, skip it + // just created class, skip it if ($stmt->getAttributes() === []) { - return; + return \false; } - $this->refactorReturn($stmt, $templateDoctrineAnnotationTagValueNode, $hasThisRenderOrReturnsResponse, $classMethod); + $hasChangedReturn = $this->refactorReturn($stmt, $templateTagValueNodeOrAttribute, $hasThisRenderOrReturnsResponse, $classMethod); + if ($hasChangedReturn) { + $hasChanged = \true; + } + } + return $hasChanged; + } + private function removeReturnArrayShapeDocblock(ClassMethod $classMethod) : void + { + $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod); + if (!$classMethodPhpDocInfo instanceof PhpDocInfo) { + return; + } + $returnTagValueNode = $classMethodPhpDocInfo->getReturnTagValue(); + if (!$returnTagValueNode instanceof ReturnTagValueNode) { + return; + } + if (!$returnTagValueNode->type instanceof ArrayShapeNode) { + return; + } + if ($classMethodPhpDocInfo->removeByName('@return')) { + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); } } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php index 850800a19..1a5448d5e 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/EventListenerToEventSubscriberRector.php @@ -3,14 +3,17 @@ declare (strict_types=1); namespace Rector\Symfony\CodeQuality\Rector\Class_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; +use Rector\CodingStyle\Naming\ClassNaming; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Rector\Rector\AbstractRector; use Rector\Symfony\ApplicationMetadata\ListenerServiceDefinitionProvider; +use Rector\Symfony\Enum\SymfonyAttribute; +use Rector\Symfony\Enum\SymfonyClass; use Rector\Symfony\NodeAnalyzer\ClassAnalyzer; use Rector\Symfony\NodeFactory\GetSubscribedEventsClassMethodFactory; use Rector\Symfony\ValueObject\EventNameToClassAndConstant; @@ -24,40 +27,24 @@ final class EventListenerToEventSubscriberRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\ApplicationMetadata\ListenerServiceDefinitionProvider */ - private $listenerServiceDefinitionProvider; + private ListenerServiceDefinitionProvider $listenerServiceDefinitionProvider; /** * @readonly - * @var \Rector\Symfony\NodeFactory\GetSubscribedEventsClassMethodFactory */ - private $getSubscribedEventsClassMethodFactory; + private GetSubscribedEventsClassMethodFactory $getSubscribedEventsClassMethodFactory; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** - * @var string - */ - private const EVENT_SUBSCRIBER_INTERFACE = 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface'; - /** - * @var string - */ - private const EVENT_LISTENER_ATTRIBUTE = 'Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener'; - /** - * @var string - */ - private const KERNEL_EVENTS_CLASS = 'Symfony\\Component\\HttpKernel\\KernelEvents'; - /** - * @var string + * @readonly */ - private const CONSOLE_EVENTS_CLASS = 'Symfony\\Component\\Console\\ConsoleEvents'; + private ClassNaming $classNaming; /** * @var string * @changelog https://regex101.com/r/qiHZ4T/1 @@ -66,27 +53,28 @@ final class EventListenerToEventSubscriberRector extends AbstractRector /** * @var EventNameToClassAndConstant[] */ - private $eventNamesToClassConstants = []; - public function __construct(ListenerServiceDefinitionProvider $listenerServiceDefinitionProvider, GetSubscribedEventsClassMethodFactory $getSubscribedEventsClassMethodFactory, ClassAnalyzer $classAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer) + private array $eventNamesToClassConstants = []; + public function __construct(ListenerServiceDefinitionProvider $listenerServiceDefinitionProvider, GetSubscribedEventsClassMethodFactory $getSubscribedEventsClassMethodFactory, ClassAnalyzer $classAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer, ClassNaming $classNaming) { $this->listenerServiceDefinitionProvider = $listenerServiceDefinitionProvider; $this->getSubscribedEventsClassMethodFactory = $getSubscribedEventsClassMethodFactory; $this->classAnalyzer = $classAnalyzer; $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; + $this->classNaming = $classNaming; $this->eventNamesToClassConstants = [ // kernel events - new EventNameToClassAndConstant('kernel.request', self::KERNEL_EVENTS_CLASS, 'REQUEST'), - new EventNameToClassAndConstant('kernel.exception', self::KERNEL_EVENTS_CLASS, 'EXCEPTION'), - new EventNameToClassAndConstant('kernel.view', self::KERNEL_EVENTS_CLASS, 'VIEW'), - new EventNameToClassAndConstant('kernel.controller', self::KERNEL_EVENTS_CLASS, 'CONTROLLER'), - new EventNameToClassAndConstant('kernel.controller_arguments', self::KERNEL_EVENTS_CLASS, 'CONTROLLER_ARGUMENTS'), - new EventNameToClassAndConstant('kernel.response', self::KERNEL_EVENTS_CLASS, 'RESPONSE'), - new EventNameToClassAndConstant('kernel.terminate', self::KERNEL_EVENTS_CLASS, 'TERMINATE'), - new EventNameToClassAndConstant('kernel.finish_request', self::KERNEL_EVENTS_CLASS, 'FINISH_REQUEST'), + new EventNameToClassAndConstant('kernel.request', SymfonyClass::KERNEL_EVENTS_CLASS, 'REQUEST'), + new EventNameToClassAndConstant('kernel.exception', SymfonyClass::KERNEL_EVENTS_CLASS, 'EXCEPTION'), + new EventNameToClassAndConstant('kernel.view', SymfonyClass::KERNEL_EVENTS_CLASS, 'VIEW'), + new EventNameToClassAndConstant('kernel.controller', SymfonyClass::KERNEL_EVENTS_CLASS, 'CONTROLLER'), + new EventNameToClassAndConstant('kernel.controller_arguments', SymfonyClass::KERNEL_EVENTS_CLASS, 'CONTROLLER_ARGUMENTS'), + new EventNameToClassAndConstant('kernel.response', SymfonyClass::KERNEL_EVENTS_CLASS, 'RESPONSE'), + new EventNameToClassAndConstant('kernel.terminate', SymfonyClass::KERNEL_EVENTS_CLASS, 'TERMINATE'), + new EventNameToClassAndConstant('kernel.finish_request', SymfonyClass::KERNEL_EVENTS_CLASS, 'FINISH_REQUEST'), // console events - new EventNameToClassAndConstant('console.command', self::CONSOLE_EVENTS_CLASS, 'COMMAND'), - new EventNameToClassAndConstant('console.terminate', self::CONSOLE_EVENTS_CLASS, 'TERMINATE'), - new EventNameToClassAndConstant('console.error', self::CONSOLE_EVENTS_CLASS, 'ERROR'), + new EventNameToClassAndConstant('console.command', SymfonyClass::CONSOLE_EVENTS_CLASS, 'COMMAND'), + new EventNameToClassAndConstant('console.terminate', SymfonyClass::CONSOLE_EVENTS_CLASS, 'TERMINATE'), + new EventNameToClassAndConstant('console.error', SymfonyClass::CONSOLE_EVENTS_CLASS, 'ERROR'), ]; } public function getRuleDefinition() : RuleDefinition @@ -137,15 +125,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - // anonymous class - if (!$node->name instanceof Identifier) { - return null; - } - // is already a subscriber - if ($this->classAnalyzer->hasImplements($node, 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface')) { - return null; - } - if ($this->hasAsListenerAttribute($node)) { + if ($this->shouldSkipClass($node)) { return null; } // there must be event dispatcher in the application @@ -165,8 +145,8 @@ public function refactor(Node $node) : ?Node */ private function changeListenerToSubscriberWithMethods(Class_ $class, array $eventsToMethods) : void { - $class->implements[] = new FullyQualified(self::EVENT_SUBSCRIBER_INTERFACE); - $classShortName = $this->nodeNameResolver->getShortName($class); + $class->implements[] = new FullyQualified(SymfonyClass::EVENT_SUBSCRIBER_INTERFACE); + $classShortName = $this->classNaming->getShortName($class); // remove suffix $classShortName = Strings::replace($classShortName, self::LISTENER_MATCH_REGEX, '$1'); $class->name = new Identifier($classShortName . 'EventSubscriber'); @@ -178,17 +158,29 @@ private function changeListenerToSubscriberWithMethods(Class_ $class, array $eve */ private function hasAsListenerAttribute(Class_ $class) : bool { - if ($this->phpAttributeAnalyzer->hasPhpAttribute($class, self::EVENT_LISTENER_ATTRIBUTE)) { + if ($this->phpAttributeAnalyzer->hasPhpAttribute($class, SymfonyAttribute::AS_EVENT_LISTENER)) { return \true; } foreach ($class->getMethods() as $classMethod) { if (!$classMethod->isPublic()) { continue; } - if ($this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, self::EVENT_LISTENER_ATTRIBUTE)) { + if ($this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, SymfonyAttribute::AS_EVENT_LISTENER)) { return \true; } } return \false; } + private function shouldSkipClass(Class_ $class) : bool + { + // anonymous class + if ($class->isAnonymous()) { + return \true; + } + // is already a subscriber + if ($this->classAnalyzer->hasImplements($class, SymfonyClass::EVENT_SUBSCRIBER_INTERFACE)) { + return \true; + } + return $this->hasAsListenerAttribute($class); + } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php new file mode 100644 index 000000000..446c73381 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php @@ -0,0 +1,258 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->phpDocTagRemover = $phpDocTagRemover; + $this->docBlockUpdater = $docBlockUpdater; + $this->controllerAnalyzer = $controllerAnalyzer; + $this->attrinationFinder = $attrinationFinder; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Inline class route prefix to all method routes, to make single explicit source for route paths', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Component\Routing\Annotation\Route; + +/** + * @Route("/api") + */ +class SomeController +{ + /** + * @Route("/action") + */ + public function action() + { + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Component\Routing\Annotation\Route; + +class SomeController +{ + /** + * @Route("/api/action") + */ + public function action() + { + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if ($this->shouldSkipClass($node)) { + return null; + } + $classRoutePath = null; + $classRouteName = null; + // 1. detect attribute + $routeAttributeOrAnnotation = $this->attrinationFinder->getByMany($node, [SymfonyAttribute::ROUTE, SymfonyAnnotation::ROUTE]); + if ($routeAttributeOrAnnotation instanceof DoctrineAnnotationTagValueNode) { + $classRoutePath = $this->resolveRoutePath($routeAttributeOrAnnotation); + $classRouteName = $this->resolveRouteName($routeAttributeOrAnnotation); + } elseif ($routeAttributeOrAnnotation instanceof Attribute) { + $classRoutePath = $this->resolveRoutePathFromAttribute($routeAttributeOrAnnotation); + $classRouteName = $this->resolveRouteNameFromAttribute($routeAttributeOrAnnotation); + } + if ($classRoutePath === null) { + return null; + } + // 2. inline prefix to all method routes + $hasChanged = \false; + foreach ($node->getMethods() as $classMethod) { + if (!$classMethod->isPublic() || $classMethod->isMagic()) { + continue; + } + // can be route method + $methodRouteAnnotationOrAttributes = $this->attrinationFinder->findManyByMany($classMethod, [SymfonyAttribute::ROUTE, SymfonyAnnotation::ROUTE]); + foreach ($methodRouteAnnotationOrAttributes as $methodRouteAnnotationOrAttribute) { + if ($methodRouteAnnotationOrAttribute instanceof DoctrineAnnotationTagValueNode) { + $routePathArrayItemNode = $methodRouteAnnotationOrAttribute->getSilentValue() ?? $methodRouteAnnotationOrAttribute->getValue(self::PATH); + if (!$routePathArrayItemNode instanceof ArrayItemNode) { + continue; + } + if (!$routePathArrayItemNode->value instanceof StringNode) { + continue; + } + $methodPrefix = $routePathArrayItemNode->value; + $newMethodPath = $classRoutePath . $methodPrefix->value; + $routePathArrayItemNode->value = new StringNode($newMethodPath); + foreach ($methodRouteAnnotationOrAttribute->values as $value) { + if ($value->key === 'name' && $value->value instanceof StringNode && \is_string($classRouteName)) { + $value->value->value = $classRouteName . $value->value->value; + } + } + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); + $hasChanged = \true; + } elseif ($methodRouteAnnotationOrAttribute instanceof Attribute) { + foreach ($methodRouteAnnotationOrAttribute->args as $methodRouteArg) { + if ($methodRouteArg->name === null || $methodRouteArg->name->toString() === self::PATH) { + if (!$methodRouteArg->value instanceof String_) { + continue; + } + $methodRouteString = $methodRouteArg->value; + $methodRouteArg->value = new String_(\sprintf('%s%s', $classRoutePath, $methodRouteString->value)); + $hasChanged = \true; + continue; + } + if ($methodRouteArg->name->toString() === 'name') { + if (!$methodRouteArg->value instanceof String_) { + continue; + } + $methodRouteString = $methodRouteArg->value; + $methodRouteArg->value = new String_(\sprintf('%s%s', $classRouteName, $methodRouteString->value)); + $hasChanged = \true; + } + } + } + } + } + if (!$hasChanged) { + return null; + } + if ($routeAttributeOrAnnotation instanceof DoctrineAnnotationTagValueNode) { + $classPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $this->phpDocTagRemover->removeTagValueFromNode($classPhpDocInfo, $routeAttributeOrAnnotation); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + } else { + foreach ($node->attrGroups as $attrGroupKey => $attrGroup) { + foreach ($attrGroup->attrs as $attribute) { + if ($attribute === $routeAttributeOrAnnotation) { + unset($node->attrGroups[$attrGroupKey]); + } + } + } + } + return $node; + } + private function shouldSkipClass(Class_ $class) : bool + { + if (!$this->controllerAnalyzer->isController($class)) { + return \true; + } + foreach ($class->getMethods() as $classMethod) { + if (!$classMethod->isPublic() || $classMethod->isMagic()) { + continue; + } + // special cases for FOS rest that should be skipped + if ($this->attrinationFinder->hasByMany($class, self::FOS_REST_ANNOTATIONS)) { + return \true; + } + } + return \false; + } + private function resolveRoutePath(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode) : ?string + { + $classRoutePathNode = $doctrineAnnotationTagValueNode->getSilentValue() ?: $doctrineAnnotationTagValueNode->getValue(self::PATH); + if (!$classRoutePathNode instanceof ArrayItemNode) { + return null; + } + if (!$classRoutePathNode->value instanceof StringNode) { + return null; + } + return $classRoutePathNode->value->value; + } + private function resolveRouteName(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode) : ?string + { + $classRouteNameNode = $doctrineAnnotationTagValueNode->getValue('name'); + if (!$classRouteNameNode instanceof ArrayItemNode) { + return null; + } + if (!$classRouteNameNode->value instanceof StringNode) { + return null; + } + return $classRouteNameNode->value->value; + } + private function resolveRoutePathFromAttribute(Attribute $attribute) : ?string + { + foreach ($attribute->args as $arg) { + // silent or "path" + if ($arg->name === null || $arg->name->toString() === self::PATH) { + $routeExpr = $arg->value; + if ($routeExpr instanceof String_) { + return $routeExpr->value; + } + } + } + return null; + } + private function resolveRouteNameFromAttribute(Attribute $attribute) : ?string + { + foreach ($attribute->args as $arg) { + if ($arg->name === null) { + continue; + } + if ($arg->name->toString() === 'name') { + $routeExpr = $arg->value; + if ($routeExpr instanceof String_) { + return $routeExpr->value; + } + } + } + return null; + } +} 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 50f9390e5..9a177c6e0 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 @@ -29,29 +29,24 @@ final class LoadValidatorMetadataToAnnotationRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\Annotations\MethodCallAnnotationAssertResolver */ - private $methodCallAnnotationAssertResolver; + private MethodCallAnnotationAssertResolver $methodCallAnnotationAssertResolver; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\Annotations\PropertyAnnotationAssertResolver */ - private $propertyAnnotationAssertResolver; + private PropertyAnnotationAssertResolver $propertyAnnotationAssertResolver; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\Annotations\ClassAnnotationAssertResolver */ - private $classAnnotationAssertResolver; + private ClassAnnotationAssertResolver $classAnnotationAssertResolver; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(MethodCallAnnotationAssertResolver $methodCallAnnotationAssertResolver, PropertyAnnotationAssertResolver $propertyAnnotationAssertResolver, ClassAnnotationAssertResolver $classAnnotationAssertResolver, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->methodCallAnnotationAssertResolver = $methodCallAnnotationAssertResolver; 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 deleted file mode 100644 index fa2609428..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php +++ /dev/null @@ -1,68 +0,0 @@ -setName('sunshine'); - } -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use Symfony\Component\Console\Command\Command - -final class SunshineCommand extends Command -{ - protected static $defaultName = 'sunshine'; - public function configure() - { - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Class_::class]; - } - /** - * @param Class_ $node - */ - public function refactor(Node $node) : ?Node - { - if ($this->hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated, as its only dead middle step before more solid PHP attributes.', self::class)); - \sleep(3); - $this->hasWarned = \true; - return null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/SplitAndSecurityAttributeToIsGrantedRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/SplitAndSecurityAttributeToIsGrantedRector.php new file mode 100644 index 000000000..aa3700cd1 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/SplitAndSecurityAttributeToIsGrantedRector.php @@ -0,0 +1,95 @@ +attrGroups as $key => $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + if (!$this->isName($attr->name, Security::class)) { + continue; + } + $firstArgValue = $attr->args[0]->value; + if (!$firstArgValue instanceof String_) { + continue; + } + $content = $firstArgValue->value; + // unable to resolve with pure attributes + if (\strpos($content, ' or ') !== \false) { + continue; + } + // we look for "and"s + if (\strpos($content, ' and ') === \false && \strpos($content, ' && ') === \false) { + continue; + } + // split by && and "and" + $andItems = \strpos($content, ' && ') !== \false ? \explode(' && ', $content) : \explode(' and ', $content); + $accessRights = []; + foreach ($andItems as $andItem) { + $matches = Strings::match($andItem, '#^(is_granted|has_role)\\(\'(?[A-Za-z_]+)\'\\)$#'); + if (!isset($matches['access_right'])) { + // all or nothing + return null; + } + $accessRights[] = $matches['access_right']; + } + unset($node->attrGroups[$key]); + $hasChanged = \true; + foreach ($accessRights as $accessRight) { + $attributeGroup = new AttributeGroup([new Attribute(new FullyQualified(IsGranted::class), [new Arg(new String_($accessRight))])]); + $node->attrGroups[] = $attributeGroup; + } + } + } + if ($hasChanged) { + return $node; + } + return null; + } +} 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 67e492ec0..234e05cf1 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 @@ -8,7 +8,6 @@ use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Param; use PhpParser\Node\Stmt\Expression; use Rector\Exception\NotImplementedYetException; use Rector\Naming\Naming\PropertyNaming; @@ -25,7 +24,7 @@ use Rector\Symfony\ValueObject\ExtensionKeyAndConfiguration; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @changelog https://symfony.com/blog/new-in-symfony-5-3-config-builder-classes * @@ -35,43 +34,51 @@ final class StringExtensionToConfigBuilderRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ - private $symfonyPhpClosureDetector; + private SymfonyPhpClosureDetector $symfonyPhpClosureDetector; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyClosureExtensionMatcher */ - private $symfonyClosureExtensionMatcher; + private SymfonyClosureExtensionMatcher $symfonyClosureExtensionMatcher; /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Symfony\Configs\ConfigArrayHandler\NestedConfigCallsFactory */ - private $nestedConfigCallsFactory; + private NestedConfigCallsFactory $nestedConfigCallsFactory; /** * @readonly - * @var \Rector\Symfony\Configs\ConfigArrayHandler\SecurityAccessDecisionManagerConfigArrayHandler */ - private $securityAccessDecisionManagerConfigArrayHandler; + private SecurityAccessDecisionManagerConfigArrayHandler $securityAccessDecisionManagerConfigArrayHandler; /** * @readonly - * @var \Rector\Symfony\CodeQuality\NodeFactory\SymfonyClosureFactory */ - private $symfonyClosureFactory; + private SymfonyClosureFactory $symfonyClosureFactory; /** * @var array */ - private const EXTENSION_KEY_TO_CLASS_MAP = ['security' => 'Symfony\\Config\\SecurityConfig', 'framework' => 'Symfony\\Config\\FrameworkConfig', 'monolog' => 'Symfony\\Config\\MonologConfig', 'twig' => 'Symfony\\Config\\TwigConfig', 'doctrine' => 'Symfony\\Config\\DoctrineConfig', 'doctrine_migrations' => 'Symfony\\Config\\DoctrineMigrationsConfig', 'sentry' => 'Symfony\\Config\\SentryConfig', 'web_profiler' => 'Symfony\\Config\\WebProfilerConfig', 'debug' => 'Symfony\\Config\\DebugConfig', 'maker' => 'Symfony\\Config\\MakerConfig', 'nelmio_cors' => 'Symfony\\Config\\NelmioCorsConfig', 'api_platform' => 'Symfony\\Config\\ApiPlatformConfig']; + private const EXTENSION_KEY_TO_CLASS_MAP = [ + 'security' => 'Symfony\\Config\\SecurityConfig', + 'framework' => 'Symfony\\Config\\FrameworkConfig', + 'monolog' => 'Symfony\\Config\\MonologConfig', + 'twig' => 'Symfony\\Config\\TwigConfig', + 'doctrine' => 'Symfony\\Config\\DoctrineConfig', + 'doctrine_migrations' => 'Symfony\\Config\\DoctrineMigrationsConfig', + 'sentry' => 'Symfony\\Config\\SentryConfig', + 'web_profiler' => 'Symfony\\Config\\WebProfilerConfig', + 'debug' => 'Symfony\\Config\\DebugConfig', + 'maker' => 'Symfony\\Config\\MakerConfig', + 'nelmio_cors' => 'Symfony\\Config\\NelmioCorsConfig', + 'api_platform' => 'Symfony\\Config\\ApiPlatformConfig', + // @see https://github.com/thephpleague/flysystem-bundle/blob/3.x/src/DependencyInjection/Configuration.php + 'flysystem' => 'Symfony\\Config\\FlysystemConfig', + ]; public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, SymfonyClosureExtensionMatcher $symfonyClosureExtensionMatcher, PropertyNaming $propertyNaming, ValueResolver $valueResolver, NestedConfigCallsFactory $nestedConfigCallsFactory, SecurityAccessDecisionManagerConfigArrayHandler $securityAccessDecisionManagerConfigArrayHandler, SymfonyClosureFactory $symfonyClosureFactory) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php index 4e69ad8ea..5336bfdab 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php @@ -21,9 +21,8 @@ final class AssertSameResponseCodeWithDebugContentsRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php index fbc10c013..0f50e550a 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php @@ -20,14 +20,12 @@ final class LiteralGetToRequestClassConstantRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\LiteralCallLikeConstFetchReplacer */ - private $literalCallLikeConstFetchReplacer; + private LiteralCallLikeConstFetchReplacer $literalCallLikeConstFetchReplacer; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(LiteralCallLikeConstFetchReplacer $literalCallLikeConstFetchReplacer, ReflectionProvider $reflectionProvider) { $this->literalCallLikeConstFetchReplacer = $literalCallLikeConstFetchReplacer; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php index 9da4a7012..be92af526 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php @@ -23,14 +23,12 @@ final class AddTraitGetterReturnTypeBasedOnSetterRequiredRector extends Abstract { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php index 5120f3506..80e4cbb91 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php @@ -10,14 +10,13 @@ use Rector\Symfony\Configs\Enum\GroupingMethods; use Rector\Symfony\Configs\Enum\SecurityConfigKey; use Rector\Symfony\Utils\StringUtils; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class NestedConfigCallsFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php index 324adbc85..f1fec39ff 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php @@ -4,8 +4,8 @@ namespace Rector\Symfony\Configs\ConfigArrayHandler; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php index 3852bc766..c17f8ead6 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeAnalyser/ConfigServiceArgumentsResolver.php @@ -7,24 +7,21 @@ use Rector\Symfony\Configs\NodeVisitor\CollectServiceArgumentsNodeVisitor; use Rector\Symfony\Configs\ValueObject\ServiceArguments; use Rector\Symfony\PhpParser\NamedSimplePhpParser; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; final class ConfigServiceArgumentsResolver { /** * @readonly - * @var \Rector\Symfony\PhpParser\NamedSimplePhpParser */ - private $namedSimplePhpParser; + private NamedSimplePhpParser $namedSimplePhpParser; /** * @readonly - * @var \PhpParser\NodeTraverser */ - private $nodeTraverser; + private NodeTraverser $nodeTraverser; /** * @readonly - * @var \Rector\Symfony\Configs\NodeVisitor\CollectServiceArgumentsNodeVisitor */ - private $collectServiceArgumentsNodeVisitor; + private CollectServiceArgumentsNodeVisitor $collectServiceArgumentsNodeVisitor; public function __construct(NamedSimplePhpParser $namedSimplePhpParser) { $this->namedSimplePhpParser = $namedSimplePhpParser; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php index f57902496..a2320a5db 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/NodeVisitor/CollectServiceArgumentsNodeVisitor.php @@ -3,16 +3,15 @@ declare (strict_types=1); namespace Rector\Symfony\Configs\NodeVisitor; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; -use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt; use PhpParser\NodeVisitorAbstract; @@ -32,12 +31,11 @@ final class CollectServiceArgumentsNodeVisitor extends NodeVisitorAbstract /** * @var array>> */ - private $servicesArgumentsByClass = []; + private array $servicesArgumentsByClass = []; /** * @readonly - * @var \Rector\Symfony\Configs\NodeAnalyser\SetServiceClassNameResolver */ - private $setServiceClassNameResolver; + private SetServiceClassNameResolver $setServiceClassNameResolver; public function __construct() { $this->setServiceClassNameResolver = new SetServiceClassNameResolver(); @@ -63,7 +61,7 @@ public function enterNode(Node $node) : ?Node } // 1. detect arg name + value $firstArg = $argMethodCall->getArgs()[0]; - if ($firstArg->value instanceof String_ || $firstArg->value instanceof LNumber) { + if ($firstArg->value instanceof String_ || $firstArg->value instanceof Int_) { $argumentLocation = $firstArg->value->value; if (\is_string($argumentLocation)) { // remove $ prefix 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 a335823a0..06492710d 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 @@ -28,29 +28,24 @@ final class AddRouteAnnotationRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\Contract\Bridge\Symfony\Routing\SymfonyRoutesProviderInterface */ - private $symfonyRoutesProvider; + private SymfonyRoutesProviderInterface $symfonyRoutesProvider; /** * @readonly - * @var \Rector\Symfony\PhpDocNode\SymfonyRouteTagValueNodeFactory */ - private $symfonyRouteTagValueNodeFactory; + private SymfonyRouteTagValueNodeFactory $symfonyRouteTagValueNodeFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser */ - private $arrayParser; + private ArrayParser $arrayParser; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(SymfonyRoutesProviderInterface $symfonyRoutesProvider, SymfonyRouteTagValueNodeFactory $symfonyRouteTagValueNodeFactory, ArrayParser $arrayParser, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) { $this->symfonyRoutesProvider = $symfonyRoutesProvider; @@ -142,8 +137,8 @@ public function index() } private function resolveControllerReference(Class_ $class, ClassMethod $classMethod) : ?string { - $className = $this->nodeNameResolver->getName($class); - $methodName = $this->nodeNameResolver->getName($classMethod); + $className = $this->getName($class); + $methodName = $this->getName($classMethod); if ($methodName === '__invoke') { return $className; } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php index e3a440da4..8ef513ef7 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/AutowireAttributeRector.php @@ -20,11 +20,11 @@ use Rector\Symfony\Configs\NodeAnalyser\ConfigServiceArgumentsResolver; use Rector\Symfony\Enum\SymfonyAttribute; use Rector\ValueObject\MethodName; -use RectorPrefix202411\Symfony\Component\Finder\Finder; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Finder\Finder; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * The param/env is only available since Symfony 6.3 * @see https://symfony.com/blog/new-in-symfony-6-3-dependency-injection-improvements#new-options-for-autowire-attribute @@ -35,17 +35,13 @@ final class AutowireAttributeRector extends AbstractRector implements Configurab { /** * @readonly - * @var \Rector\Symfony\Configs\NodeAnalyser\ConfigServiceArgumentsResolver */ - private $configServiceArgumentsResolver; + private ConfigServiceArgumentsResolver $configServiceArgumentsResolver; /** * @var string */ public const CONFIGS_DIRECTORY = 'configs_directory'; - /** - * @var string|null - */ - private $configsDirectory; + private ?string $configsDirectory = null; public function __construct(ConfigServiceArgumentsResolver $configServiceArgumentsResolver) { $this->configServiceArgumentsResolver = $configServiceArgumentsResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/ParameterBagToAutowireAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/ParameterBagToAutowireAttributeRector.php index 4b6e05344..956b489bd 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/ParameterBagToAutowireAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Class_/ParameterBagToAutowireAttributeRector.php @@ -28,9 +28,8 @@ final class ParameterBagToAutowireAttributeRector extends AbstractRector impleme { /** * @readonly - * @var \Rector\Symfony\Configs\NodeFactory\AutowiredParamFactory */ - private $autowiredParamFactory; + private AutowiredParamFactory $autowiredParamFactory; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/MergeServiceNameTypeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/MergeServiceNameTypeRector.php index f5fed8f95..0c7a40f0b 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/MergeServiceNameTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/MergeServiceNameTypeRector.php @@ -7,7 +7,6 @@ use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; -use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; @@ -16,22 +15,17 @@ /** * @see \Rector\Symfony\Tests\Configs\Rector\Closure\MergeServiceNameTypeRector\MergeServiceNameTypeRectorTest */ -final class MergeServiceNameTypeRector extends AbstractRector implements DeprecatedInterface +final class MergeServiceNameTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ - private $symfonyPhpClosureDetector; + private SymfonyPhpClosureDetector $symfonyPhpClosureDetector; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - /** - * @var bool - */ - private $hasChanged = \false; + private ValueResolver $valueResolver; + private bool $hasChanged = \false; public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; 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 419f19645..51a7f217e 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 @@ -5,9 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; @@ -28,19 +28,16 @@ final class ServiceArgsToServiceNamedArgRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ - private $symfonyPhpClosureDetector; + private SymfonyPhpClosureDetector $symfonyPhpClosureDetector; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ReflectionProvider $reflectionProvider, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; @@ -143,8 +140,8 @@ private function resolveConstructorParameterNames(string $serviceClass) : array } $constructorParameterNames = []; $extendedMethodReflection = $serviceClassReflection->getConstructor(); - $parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); - foreach ($parametersAcceptorWithPhpDocs->getParameters() as $parameterReflectionWithPhpDoc) { + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($extendedMethodReflection->getVariants()); + foreach ($extendedParametersAcceptor->getParameters() as $parameterReflectionWithPhpDoc) { /** @var PhpParameterReflection $parameterReflectionWithPhpDoc */ $constructorParameterNames[] = '$' . $parameterReflectionWithPhpDoc->getName(); } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSetStringNameToClassNameRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSetStringNameToClassNameRector.php index 2483e6b0b..ab981d661 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSetStringNameToClassNameRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSetStringNameToClassNameRector.php @@ -18,14 +18,12 @@ final class ServiceSetStringNameToClassNameRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ - private $symfonyPhpClosureDetector; + private SymfonyPhpClosureDetector $symfonyPhpClosureDetector; /** * @readonly - * @var \Rector\Symfony\DataProvider\ServiceNameToTypeUniqueProvider */ - private $serviceNameToTypeUniqueProvider; + private ServiceNameToTypeUniqueProvider $serviceNameToTypeUniqueProvider; public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ServiceNameToTypeUniqueProvider $serviceNameToTypeUniqueProvider) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; 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 5e83c6c00..4915977ae 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 @@ -23,7 +23,7 @@ use Rector\Symfony\MinimalSharedStringSolver; use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; use Rector\Symfony\ValueObject\ClassNameAndFilePath; -use RectorPrefix202411\Symfony\Component\Filesystem\Filesystem; +use RectorPrefix202506\Symfony\Component\Filesystem\Filesystem; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -33,29 +33,24 @@ final class ServiceSettersToSettersAutodiscoveryRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ - private $symfonyPhpClosureDetector; + private SymfonyPhpClosureDetector $symfonyPhpClosureDetector; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Symfony\Component\Filesystem\Filesystem */ - private $filesystem; + private Filesystem $filesystem; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Symfony\MinimalSharedStringSolver */ - private $minimalSharedStringSolver; + private MinimalSharedStringSolver $minimalSharedStringSolver; public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ReflectionProvider $reflectionProvider, Filesystem $filesystem, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; @@ -115,9 +110,7 @@ public function refactor(Node $node) : ?Node return null; } $classNamesAndFilesPaths = $this->createClassNamesAndFilePaths($bareServicesSetMethodCallExpressions); - $classNames = \array_map(static function (ClassNameAndFilePath $classNameAndFilePath) : string { - return $classNameAndFilePath->getClassName(); - }, $classNamesAndFilesPaths); + $classNames = \array_map(static fn(ClassNameAndFilePath $classNameAndFilePath): string => $classNameAndFilePath->getClassName(), $classNamesAndFilesPaths); $sharedNamespace = $this->minimalSharedStringSolver->solve(...$classNames); $firstClassNameAndFilePath = $classNamesAndFilesPaths[0]; $classFilePath = $firstClassNameAndFilePath->getFilePath(); 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 e56776c76..7ca377291 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 @@ -22,14 +22,12 @@ final class ServiceTagsToDefaultsAutoconfigureRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ - private $symfonyPhpClosureDetector; + private SymfonyPhpClosureDetector $symfonyPhpClosureDetector; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var string[] */ 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 deleted file mode 100644 index 66a9b7162..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php +++ /dev/null @@ -1,53 +0,0 @@ -set("name_type", SomeType::class) to bare type, useful since Symfony 3.4', [new CodeSample(<<<'CODE_SAMPLE' -use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; - -return static function (ContainerConfigurator $containerConfigurator): void { - $services = $containerConfigurator->services(); - - $services->set('some_name', App\SomeClass::class); -}; -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; - -return static function (ContainerConfigurator $containerConfigurator): void { - $services = $containerConfigurator->services(); - - $services->set(App\SomeClass::class); -}; -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Closure::class]; - } - /** - * @param Closure $node - */ - public function refactor(Node $node) : ?Node - { - return null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ValueObject/ServiceArguments.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ValueObject/ServiceArguments.php index 7d6a5340d..f5ef3f983 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ValueObject/ServiceArguments.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/ValueObject/ServiceArguments.php @@ -8,19 +8,18 @@ final class ServiceArguments { /** * @readonly - * @var string */ - private $className; + private string $className; /** - * @var array<(string | int), (string | Expr)> + * @var array * @readonly */ - private $params; + private array $params; /** - * @var array<(string | int), (string | Expr)> + * @var array * @readonly */ - private $envs; + private array $envs; /** * @param array $params * @param array $envs diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeDecorator/CommandConstructorDecorator.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeDecorator/CommandConstructorDecorator.php new file mode 100644 index 000000000..c3eb70a6a --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeDecorator/CommandConstructorDecorator.php @@ -0,0 +1,40 @@ +nodeTypeResolver = $nodeTypeResolver; + } + public function decorate(Class_ $class) : void + { + // special case for command to keep parent constructor call + if (!$this->nodeTypeResolver->isObjectType($class, new ObjectType('Symfony\\Component\\Console\\Command\\Command'))) { + return; + } + $constuctClassMethod = $class->getMethod(MethodName::CONSTRUCT); + if (!$constuctClassMethod instanceof ClassMethod) { + return; + } + // empty stmts? add parent::__construct() to setup command + if ((array) $constuctClassMethod->stmts === []) { + $parentConstructStaticCall = new StaticCall(new Name('parent'), '__construct'); + $constuctClassMethod->stmts[] = new Expression($parentConstructStaticCall); + } + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeFactory/AutowireClassMethodFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeFactory/AutowireClassMethodFactory.php new file mode 100644 index 000000000..c57cf5eec --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/NodeFactory/AutowireClassMethodFactory.php @@ -0,0 +1,59 @@ +nodeNameResolver = $nodeNameResolver; + } + /** + * @param PropertyMetadata[] $propertyMetadatas + */ + public function create(Trait_ $trait, array $propertyMetadatas) : ClassMethod + { + $traitName = $this->nodeNameResolver->getShortName($trait); + $autowireClassMethod = new ClassMethod('autowire' . $traitName); + $autowireClassMethod->flags |= Modifiers::PUBLIC; + $autowireClassMethod->returnType = new Identifier('void'); + $autowireClassMethod->setDocComment(new Doc("/**\n * @required\n */")); + foreach ($propertyMetadatas as $propertyMetadata) { + $param = $this->createAutowiredParam($propertyMetadata); + $autowireClassMethod->params[] = $param; + $createPropertyAssign = new Assign(new PropertyFetch(new Variable('this'), new Identifier($propertyMetadata->getName())), new Variable($propertyMetadata->getName())); + $autowireClassMethod->stmts[] = new Expression($createPropertyAssign); + } + return $autowireClassMethod; + } + private function createAutowiredParam(PropertyMetadata $propertyMetadata) : Param + { + $param = new Param(new Variable($propertyMetadata->getName())); + $objectType = $propertyMetadata->getType(); + if (!$objectType instanceof ObjectType) { + throw new ShouldNotHappenException(); + } + $param->type = new FullyQualified($objectType->getClassName()); + return $param; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/CommandGetByTypeToConstructorInjectionRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/CommandGetByTypeToConstructorInjectionRector.php new file mode 100644 index 000000000..7a7d520fe --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/CommandGetByTypeToConstructorInjectionRector.php @@ -0,0 +1,130 @@ +classDependencyManipulator = $classDependencyManipulator; + $this->propertyNaming = $propertyNaming; + $this->commandConstructorDecorator = $commandConstructorDecorator; + $this->thisGetTypeMatcher = $thisGetTypeMatcher; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('From `$container->get(SomeType::class)` in commands to constructor injection (step 2/x)', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; + +final class SomeCommand extends ContainerAwareCommand +{ + public function someMethod() + { + $someType = $this->get(SomeType::class); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; + +final class SomeCommand extends ContainerAwareCommand +{ + public function __construct(private SomeType $someType) + { + } + + public function someMethod() + { + $someType = $this->someType; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if ($this->shouldSkipClass($node)) { + return null; + } + $propertyMetadatas = []; + $this->traverseNodesWithCallable($node, function (Node $node) use(&$propertyMetadatas) : ?Node { + if (!$node instanceof MethodCall) { + return null; + } + $className = $this->thisGetTypeMatcher->match($node); + if (!\is_string($className)) { + return null; + } + $propertyName = $this->propertyNaming->fqnToVariableName($className); + $propertyMetadata = new PropertyMetadata($propertyName, new FullyQualifiedObjectType($className)); + $propertyMetadatas[] = $propertyMetadata; + return $this->nodeFactory->createPropertyFetch('this', $propertyMetadata->getName()); + }); + if ($propertyMetadatas === []) { + return null; + } + foreach ($propertyMetadatas as $propertyMetadata) { + $this->classDependencyManipulator->addConstructorDependency($node, $propertyMetadata); + } + $this->commandConstructorDecorator->decorate($node); + return $node; + } + private function shouldSkipClass(Class_ $class) : bool + { + // keep it safe + if ($class->isAbstract()) { + return \true; + } + $scope = ScopeFetcher::fetch($class); + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \true; + } + return !$classReflection->is(SymfonyClass::CONTAINER_AWARE_COMMAND); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/ControllerGetByTypeToConstructorInjectionRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/ControllerGetByTypeToConstructorInjectionRector.php new file mode 100644 index 000000000..29593b1d1 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/ControllerGetByTypeToConstructorInjectionRector.php @@ -0,0 +1,123 @@ +classDependencyManipulator = $classDependencyManipulator; + $this->propertyNaming = $propertyNaming; + $this->thisGetTypeMatcher = $thisGetTypeMatcher; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('From `$container->get(SomeType::class)` in controllers to constructor injection (step 1/x)', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Bundle\FrameworkBundle\Controller\Controller; + +final class SomeCommand extends Controller +{ + public function someMethod() + { + $someType = $this->get(SomeType::class); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Bundle\FrameworkBundle\Controller\Controller; + +final class SomeCommand extends Controller +{ + public function __construct(private SomeType $someType) + { + } + + public function someMethod() + { + $someType = $this->someType; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if ($this->shouldSkipClass($node)) { + return null; + } + $propertyMetadatas = []; + $this->traverseNodesWithCallable($node, function (Node $node) use(&$propertyMetadatas) : ?Node { + if (!$node instanceof MethodCall) { + return null; + } + $className = $this->thisGetTypeMatcher->match($node); + if (!\is_string($className)) { + return null; + } + $propertyName = $this->propertyNaming->fqnToVariableName($className); + $propertyMetadata = new PropertyMetadata($propertyName, new FullyQualifiedObjectType($className)); + $propertyMetadatas[] = $propertyMetadata; + return $this->nodeFactory->createPropertyFetch('this', $propertyMetadata->getName()); + }); + if ($propertyMetadatas === []) { + return null; + } + foreach ($propertyMetadatas as $propertyMetadata) { + $this->classDependencyManipulator->addConstructorDependency($node, $propertyMetadata); + } + return $node; + } + private function shouldSkipClass(Class_ $class) : bool + { + // keep it safe + if (!$class->isFinal()) { + return \true; + } + $scope = ScopeFetcher::fetch($class); + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \true; + } + return !$classReflection->is(SymfonyClass::CONTROLLER); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/GetBySymfonyStringToConstructorInjectionRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/GetBySymfonyStringToConstructorInjectionRector.php new file mode 100644 index 000000000..b5781ace4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Class_/GetBySymfonyStringToConstructorInjectionRector.php @@ -0,0 +1,129 @@ + + */ + private const SYMFONY_NAME_TO_TYPE_MAP = ['validator' => SymfonyClass::VALIDATOR_INTERFACE, 'event_dispatcher' => SymfonyClass::EVENT_DISPATCHER_INTERFACE, 'logger' => SymfonyClass::LOGGER_INTERFACE, 'jms_serializer' => SymfonyClass::JMS_SERIALIZER_INTERFACE, 'translator' => SymfonyClass::TRANSLATOR_INTERFACE, 'session' => SymfonyClass::SESSION_INTERFACRE, 'security.token_storage' => SymfonyClass::TOKEN_STORAGE_INTERFACE, 'router' => 'Symfony\\Component\\Routing\\RouterInterface', 'request_stack' => 'Symfony\\Component\\HttpFoundation\\RequestStack', 'http_kernel' => 'Symfony\\Component\\HttpKernel\\HttpKernelInterface', 'serializer' => 'Symfony\\Component\\Serializer\\SerializerInterface', 'security.authorization_checker' => 'Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationCheckerInterface', 'templating' => 'Symfony\\Component\\Templating\\EngineInterface', 'twig' => 'Twig\\Environment', 'doctrine' => 'Doctrine\\Persistence\\ManagerRegistry', 'form.factory' => 'Symfony\\Component\\Form\\FormFactoryInterface', 'security.csrf.token_manager' => 'Symfony\\Component\\Security\\Core\\Authorization\\CsrfTokenManagerInterface', 'parameter_bag' => 'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface', 'message_bus' => 'Symfony\\Component\\Messenger\\MessageBusInterface', 'messenger.default_bus' => 'Symfony\\Component\\Messenger\\MessageBusInterface']; + public function __construct(ClassDependencyManipulator $classDependencyManipulator, ThisGetTypeMatcher $thisGetTypeMatcher, PropertyNaming $propertyNaming) + { + $this->classDependencyManipulator = $classDependencyManipulator; + $this->thisGetTypeMatcher = $thisGetTypeMatcher; + $this->propertyNaming = $propertyNaming; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Converts typical Symfony services like $this->get("validator") in commands/controllers to constructor injection (step 3/x)', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Bundle\FrameworkBundle\Controller\Controller; + +final class SomeController extends Controller +{ + public function someMethod() + { + $someType = $this->get('validator'); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use Symfony\Component\Validator\Validator\ValidatorInterface; + +final class SomeController extends Controller +{ + public function __construct(private ValidatorInterface $validator) + + public function someMethod() + { + $someType = $this->validator; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if ($this->shouldSkipClass($node)) { + return null; + } + $propertyMetadatas = []; + $this->traverseNodesWithCallable($node, function (Node $node) use(&$propertyMetadatas) : ?Node { + if (!$node instanceof MethodCall) { + return null; + } + $serviceName = $this->thisGetTypeMatcher->matchString($node); + if (!\is_string($serviceName)) { + return null; + } + $serviceType = self::SYMFONY_NAME_TO_TYPE_MAP[$serviceName] ?? null; + if ($serviceType === null) { + return null; + } + $propertyName = $this->propertyNaming->fqnToVariableName($serviceType); + $propertyMetadata = new PropertyMetadata($propertyName, new FullyQualifiedObjectType($serviceType)); + $propertyMetadatas[] = $propertyMetadata; + return $this->nodeFactory->createPropertyFetch('this', $propertyMetadata->getName()); + }); + if ($propertyMetadatas === []) { + return null; + } + foreach ($propertyMetadatas as $propertyMetadata) { + $this->classDependencyManipulator->addConstructorDependency($node, $propertyMetadata); + } + return $node; + } + private function shouldSkipClass(Class_ $class) : bool + { + $scope = ScopeFetcher::fetch($class); + $classReflection = $scope->getClassReflection(); + if (!$classReflection instanceof ClassReflection) { + return \true; + } + if ($classReflection->is(SymfonyClass::CONTAINER_AWARE_COMMAND)) { + return \false; + } + return !$classReflection->is(SymfonyClass::CONTROLLER); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Trait_/TraitGetByTypeToInjectRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Trait_/TraitGetByTypeToInjectRector.php new file mode 100644 index 000000000..2cbc09b37 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/Rector/Trait_/TraitGetByTypeToInjectRector.php @@ -0,0 +1,131 @@ +propertyNaming = $propertyNaming; + $this->thisGetTypeMatcher = $thisGetTypeMatcher; + $this->autowireClassMethodFactory = $autowireClassMethodFactory; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('From `$this->get(SomeType::class)` in traits, to autowired method with @required', [new CodeSample(<<<'CODE_SAMPLE' +// must be used in old Controller class +trait SomeInjects +{ + public function someMethod() + { + return $this->get(SomeType::class); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +trait SomeInjects +{ + private SomeType $someType; + + /** + * @required + */ + public function autowireSomeInjects(SomeType $someType): void + { + $this->someType = $someType; + } + + public function someMethod() + { + return $this->someType; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Trait_::class]; + } + /** + * @param Trait_ $node + */ + public function refactor(Node $node) : ?Node + { + $propertyMetadatas = []; + $this->traverseNodesWithCallable($node, function (Node $node) use(&$propertyMetadatas) : ?Node { + if (!$node instanceof MethodCall) { + return null; + } + $className = $this->thisGetTypeMatcher->match($node); + if (!\is_string($className)) { + return null; + } + $propertyName = $this->propertyNaming->fqnToVariableName($className); + $propertyMetadata = new PropertyMetadata($propertyName, new FullyQualifiedObjectType($className)); + $propertyMetadatas[] = $propertyMetadata; + return $this->nodeFactory->createPropertyFetch('this', $propertyMetadata->getName()); + }); + if ($propertyMetadatas === []) { + return null; + } + // create local properties + $autowiredProperties = $this->createAutowiredProperties($propertyMetadatas); + $autowireClassMethod = $this->autowireClassMethodFactory->create($node, $propertyMetadatas); + $node->stmts = \array_merge($autowiredProperties, [$autowireClassMethod], $node->stmts); + return $node; + } + /** + * @param PropertyMetadata[] $propertyMetadatas + * @return Property[] + */ + private function createAutowiredProperties(array $propertyMetadatas) : array + { + $autowiredProperties = []; + foreach ($propertyMetadatas as $propertyMetadata) { + $propertyType = $propertyMetadata->getType(); + if (!$propertyType instanceof ObjectType) { + throw new ShouldNotHappenException(); + } + // create property + $autowiredProperties[] = new Property(Modifiers::PRIVATE, [new PropertyItem($propertyMetadata->getName())], [], new FullyQualified($propertyType->getClassName())); + } + return $autowiredProperties; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/ThisGetTypeMatcher.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/ThisGetTypeMatcher.php new file mode 100644 index 000000000..40a1d553f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DependencyInjection/ThisGetTypeMatcher.php @@ -0,0 +1,70 @@ +nodeNameResolver = $nodeNameResolver; + } + public function matchString(MethodCall $methodCall) : ?string + { + $getExpr = $this->matchGetExpr($methodCall); + if (!$getExpr instanceof String_) { + return null; + } + return $getExpr->value; + } + public function match(MethodCall $methodCall) : ?string + { + $getExpr = $this->matchGetExpr($methodCall); + if (!$getExpr instanceof ClassConstFetch) { + return null; + } + // must be class const fetch + if (!$this->nodeNameResolver->isName($getExpr->name, 'class')) { + return null; + } + return $this->nodeNameResolver->getName($getExpr->class); + } + private function isValidContainerCall(MethodCall $methodCall) : bool + { + if ($methodCall->var instanceof MethodCall && $this->nodeNameResolver->isName($methodCall->var->name, 'getContainer')) { + return \true; + } + if ($methodCall->var instanceof Variable && $this->nodeNameResolver->isName($methodCall->var, 'this')) { + return \true; + } + return $methodCall->var instanceof PropertyFetch && $this->nodeNameResolver->isName($methodCall->var->var, 'this') && $this->nodeNameResolver->isName($methodCall->var->name, 'container'); + } + private function matchGetExpr(MethodCall $methodCall) : ?Expr + { + if ($methodCall->isFirstClassCallable()) { + return null; + } + if (!$this->nodeNameResolver->isName($methodCall->name, 'get')) { + return null; + } + if (!$this->isValidContainerCall($methodCall)) { + return null; + } + if (\count($methodCall->getArgs()) !== 1) { + return null; + } + $firstArg = $methodCall->getArgs()[0]; + return $firstArg->value; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DowngradeSymfony70/Rector/Class_/DowngradeSymfonyCommandAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DowngradeSymfony70/Rector/Class_/DowngradeSymfonyCommandAttributeRector.php index 01a7d3c5a..d89b16927 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/DowngradeSymfony70/Rector/Class_/DowngradeSymfonyCommandAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/DowngradeSymfony70/Rector/Class_/DowngradeSymfonyCommandAttributeRector.php @@ -25,9 +25,8 @@ final class DowngradeSymfonyCommandAttributeRector extends AbstractRector { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; @@ -69,7 +68,7 @@ public function refactor(Node $node) : ?Node if (!$classReflection instanceof ClassReflection) { return null; } - if (!$classReflection->isSubClassOf('Symfony\\Component\\Console\\Command\\Command')) { + if (!$classReflection->is('Symfony\\Component\\Console\\Command\\Command')) { return null; } $resolveNameAndDescription = $this->resolveNameAndDescription($node); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/ClassMethod/SwiftMessageToEmailRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/ClassMethod/SwiftMessageToEmailRector.php index d088087ac..2c0dd7f36 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/ClassMethod/SwiftMessageToEmailRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/ClassMethod/SwiftMessageToEmailRector.php @@ -5,8 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\StaticCall; @@ -35,11 +36,11 @@ final class SwiftMessageToEmailRector extends AbstractRector /** * @var array */ - private $basicMapping = ['setSubject' => 'subject', 'setPriority' => 'priority']; + private array $basicMapping = ['setSubject' => 'subject', 'setPriority' => 'priority']; /** * @var array */ - private $addressesMapping = ['addBcc' => null, 'addCc' => null, 'addFrom' => null, 'addReplyTo' => null, 'addTo' => null, 'setBcc' => 'bcc', 'setCc' => 'cc', 'setFrom' => 'from', 'setReplyTo' => 'replyTo', 'setTo' => 'to']; + private array $addressesMapping = ['addBcc' => null, 'addCc' => null, 'addFrom' => null, 'addReplyTo' => null, 'addTo' => null, 'setBcc' => 'bcc', 'setCc' => 'cc', 'setFrom' => 'from', 'setReplyTo' => 'replyTo', 'setTo' => 'to']; public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Convert \\Swift_Message into an \\Symfony\\Component\\Mime\\Email', [new CodeSample(<<<'CODE_SAMPLE' @@ -76,12 +77,15 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - $this->traverseNodesWithCallable($node, function (Node $node) : ?Node { + $hasChanged = \false; + $this->traverseNodesWithCallable($node, function (Node $node) use(&$hasChanged) : ?Node { if ($node instanceof ClassMethod && $node->returnType instanceof FullyQualified && $this->isName($node->returnType, self::SWIFT_MESSAGE_FQN)) { $node->returnType = new FullyQualified(self::EMAIL_FQN); + $hasChanged = \true; } if ($node instanceof Param && $node->type instanceof FullyQualified && $this->isName($node->type, self::SWIFT_MESSAGE_FQN)) { $node->type = new FullyQualified(self::EMAIL_FQN); + $hasChanged = \true; } if ($node instanceof New_) { if (!$this->isName($node->class, self::SWIFT_MESSAGE_FQN)) { @@ -93,6 +97,7 @@ public function refactor(Node $node) : ?Node } else { $node->class = new FullyQualified(self::EMAIL_FQN); } + $hasChanged = \true; } if ($node instanceof MethodCall) { $name = $this->getName($node->name); @@ -104,6 +109,7 @@ public function refactor(Node $node) : ?Node if (!$objectType->isInstanceOf(self::SWIFT_MESSAGE_FQN)->yes() && !$objectType->isInstanceOf(self::EMAIL_FQN)->yes()) { return null; } + $hasChanged = \true; $this->handleBasicMapping($node, $name); $this->handleAddressMapping($node, $name); $this->handleBody($node, $name); @@ -117,6 +123,9 @@ public function refactor(Node $node) : ?Node } return $node; }); + if (!$hasChanged) { + return null; + } return $node; } private function handleBasicMapping(MethodCall $methodCall, string $name) : void @@ -141,7 +150,7 @@ private function handleAddressMapping(MethodCall $methodCall, string $name) : vo $newArgs = []; foreach ($firstArg->value->items as $item) { if ($item instanceof ArrayItem) { - $newArgs[] = $this->nodeFactory->createArg($this->createAddress($item->key === null ? [new Arg($item->value)] : [new Arg($item->key), new Arg($item->value)])); + $newArgs[] = $this->nodeFactory->createArg($this->createAddress($item->key instanceof Expr ? [new Arg($item->key), new Arg($item->value)] : [new Arg($item->value)])); } } $methodCall->args = $newArgs; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php index b5bb4a340..d15251348 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/SwiftMailer/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php @@ -21,9 +21,8 @@ final class SwiftSetBodyToHtmlPlainMethodCallRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/AddViolationToBuildViolationRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/AddViolationToBuildViolationRector.php index 2f1dba36d..ab725c08f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/AddViolationToBuildViolationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/AddViolationToBuildViolationRector.php @@ -5,9 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; use PHPStan\Type\ObjectType; @@ -56,7 +56,7 @@ public function refactor(Node $node) : ?MethodCall if (!$executionContext->isSuperTypeOf($objectType)->yes()) { return null; } - if (!$this->nodeNameResolver->isName($node->name, 'addViolationAt')) { + if (!$this->isName($node->name, 'addViolationAt')) { return null; } $args = $node->getArgs(); 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 1b5a755aa..af5f984dd 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 @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use PHPStan\Type\ObjectType; @@ -26,9 +26,8 @@ final class MaxLengthSymfonyFormOptionToAttrRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; 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 bd315beaf..00a390177 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 @@ -5,11 +5,10 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; -use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\Symfony\TypeAnalyzer\ControllerAnalyzer; -use RectorPrefix202411\Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -19,18 +18,11 @@ final class RedirectToRouteRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; - /** - * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver - */ - private $valueResolver; - public function __construct(ControllerAnalyzer $controllerAnalyzer, ValueResolver $valueResolver) + private ControllerAnalyzer $controllerAnalyzer; + public function __construct(ControllerAnalyzer $controllerAnalyzer) { $this->controllerAnalyzer = $controllerAnalyzer; - $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { @@ -85,7 +77,13 @@ private function isDefaultReferenceType(MethodCall $methodCall) : bool if (!$refTypeArg instanceof Arg) { return \false; } - return $this->valueResolver->isValue($refTypeArg->value, UrlGeneratorInterface::ABSOLUTE_PATH); + if (!$refTypeArg->value instanceof ClassConstFetch) { + return \false; + } + if (!$this->isName($refTypeArg->value->class, 'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface')) { + return \false; + } + return $this->isName($refTypeArg->value->name, 'ABSOLUTE_PATH'); } /** * @return mixed[] 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 0d8d965c7..fd415eeb1 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 @@ -4,9 +4,9 @@ namespace Rector\Symfony\Symfony27\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use Rector\PhpParser\Node\Value\ValueResolver; @@ -25,24 +25,20 @@ final class ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector extends Abst { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer */ - private $formAddMethodCallAnalyzer; + private FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormOptionsArrayMatcher */ - private $formOptionsArrayMatcher; + private FormOptionsArrayMatcher $formOptionsArrayMatcher; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormCollectionAnalyzer */ - private $formCollectionAnalyzer; + private FormCollectionAnalyzer $formCollectionAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var array */ @@ -114,11 +110,15 @@ public function refactor(Node $node) : ?Node if (!$optionsArray instanceof Array_) { return null; } - $this->refactorOptionsArray($optionsArray); + $hasChanged = $this->refactorOptionsArray($optionsArray); + if (!$hasChanged) { + return null; + } return $node; } - private function refactorOptionsArray(Array_ $optionsArray) : void + private function refactorOptionsArray(Array_ $optionsArray) : bool { + $hasChanged = \false; foreach ($optionsArray->items as $arrayItem) { if (!$arrayItem instanceof ArrayItem) { continue; @@ -131,7 +131,9 @@ private function refactorOptionsArray(Array_ $optionsArray) : void continue; } $arrayItem->key = new String_($newName); + $hasChanged = \true; } } + return $hasChanged; } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/MethodCall/GetToConstructorInjectionRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/MethodCall/GetToConstructorInjectionRector.php index 03bf46d99..bae905215 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/MethodCall/GetToConstructorInjectionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/MethodCall/GetToConstructorInjectionRector.php @@ -20,19 +20,16 @@ final class GetToConstructorInjectionRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\DependencyInjectionMethodCallAnalyzer */ - private $dependencyInjectionMethodCallAnalyzer; + private DependencyInjectionMethodCallAnalyzer $dependencyInjectionMethodCallAnalyzer; /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ContainerAwareAnalyzer */ - private $containerAwareAnalyzer; + private ContainerAwareAnalyzer $containerAwareAnalyzer; /** * @readonly - * @var \Rector\NodeManipulator\ClassDependencyManipulator */ - private $classDependencyManipulator; + private ClassDependencyManipulator $classDependencyManipulator; public function __construct(DependencyInjectionMethodCallAnalyzer $dependencyInjectionMethodCallAnalyzer, ContainerAwareAnalyzer $containerAwareAnalyzer, ClassDependencyManipulator $classDependencyManipulator) { $this->dependencyInjectionMethodCallAnalyzer = $dependencyInjectionMethodCallAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php index 0c671fe10..a11a0a676 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony28/Rector/StaticCall/ParseFileRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony28\Rector\StaticCall; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\StaticCall; @@ -23,9 +23,8 @@ final class ParseFileRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Printer\BetterStandardPrinter */ - private $betterStandardPrinter; + private BetterStandardPrinter $betterStandardPrinter; /** * @var string * @changelog https://regex101.com/r/ZaY42i/1 diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/FormTypeGetParentRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/FormTypeGetParentRector.php index 1a45b45cc..bb2268e36 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/FormTypeGetParentRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/FormTypeGetParentRector.php @@ -21,9 +21,8 @@ final class FormTypeGetParentRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\FormHelper\FormTypeStringToTypeProvider */ - private $formTypeStringToTypeProvider; + private FormTypeStringToTypeProvider $formTypeStringToTypeProvider; public function __construct(FormTypeStringToTypeProvider $formTypeStringToTypeProvider) { $this->formTypeStringToTypeProvider = $formTypeStringToTypeProvider; 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 aadc273be..a09552af4 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 @@ -25,27 +25,21 @@ final class GetRequestRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\Bridge\NodeAnalyzer\ControllerMethodAnalyzer */ - private $controllerMethodAnalyzer; + private ControllerMethodAnalyzer $controllerMethodAnalyzer; /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @var string */ private const REQUEST_CLASS = 'Symfony\\Component\\HttpFoundation\\Request'; - /** - * @var string|null - */ - private $requestVariableAndParamName; + private ?string $requestVariableAndParamName = null; public function __construct(ControllerMethodAnalyzer $controllerMethodAnalyzer, ControllerAnalyzer $controllerAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->controllerMethodAnalyzer = $controllerMethodAnalyzer; @@ -133,7 +127,7 @@ private function isActionWithGetRequestInBody(ClassMethod $classMethod) : bool if (!$node->var instanceof Variable) { return \false; } - return $this->nodeNameResolver->isName($node->name, 'get'); + return $this->isName($node->name, 'get'); }); foreach ($getMethodCalls as $getMethodCall) { if ($this->isGetMethodCallWithRequestParameters($getMethodCall)) { @@ -148,7 +142,7 @@ private function isGetRequestInAction(ClassMethod $classMethod, MethodCall $meth if (!$methodCall->var instanceof Variable) { return \false; } - if (!$this->nodeNameResolver->isName($methodCall->var, 'this')) { + if (!$this->isName($methodCall->var, 'this')) { return \false; } if (!$this->isName($methodCall->name, 'getRequest') && !$this->isGetMethodCallWithRequestParameters($methodCall)) { @@ -168,7 +162,7 @@ private function containsGetRequestMethod(ClassMethod $classMethod) : bool if (!$this->isName($node->var, 'this')) { return \false; } - return $this->nodeNameResolver->isName($node->name, 'getRequest'); + return $this->isName($node->name, 'getRequest'); }); } private function isGetMethodCallWithRequestParameters(MethodCall $methodCall) : bool 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 361e58bbc..f2be45646 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 @@ -3,13 +3,14 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony30\Rector\ClassMethod; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; +use Rector\CodingStyle\Naming\ClassNaming; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -23,12 +24,16 @@ final class RemoveDefaultGetBlockPrefixRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - public function __construct(ValueResolver $valueResolver) + private ValueResolver $valueResolver; + /** + * @readonly + */ + private ClassNaming $classNaming; + public function __construct(ValueResolver $valueResolver, ClassNaming $classNaming) { $this->valueResolver = $valueResolver; + $this->classNaming = $classNaming; } public function getRuleDefinition() : RuleDefinition { @@ -62,7 +67,7 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactor(Node $node) + public function refactor(Node $node) : ?Class_ { if (!$node->extends instanceof Name) { return null; @@ -83,11 +88,11 @@ public function refactor(Node $node) return null; } $returnedValue = $this->valueResolver->getValue($returnedExpr); - $className = $this->nodeNameResolver->getName($node); + $className = $this->getName($node); if (!\is_string($className)) { continue; } - $shortClassName = $this->nodeNameResolver->getShortName($className); + $shortClassName = $this->classNaming->getShortName($className); if (\substr_compare($shortClassName, 'Type', -\strlen('Type')) === 0) { $shortClassName = (string) Strings::before($shortClassName, 'Type'); } 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 43961c728..e419e583b 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 @@ -4,9 +4,9 @@ namespace Rector\Symfony\Symfony30\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use Rector\PhpParser\Node\Value\ValueResolver; @@ -28,29 +28,24 @@ final class ChangeStringCollectionOptionToConstantRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer */ - private $formAddMethodCallAnalyzer; + private FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormOptionsArrayMatcher */ - private $formOptionsArrayMatcher; + private FormOptionsArrayMatcher $formOptionsArrayMatcher; /** * @readonly - * @var \Rector\Symfony\FormHelper\FormTypeStringToTypeProvider */ - private $formTypeStringToTypeProvider; + private FormTypeStringToTypeProvider $formTypeStringToTypeProvider; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormCollectionAnalyzer */ - private $formCollectionAnalyzer; + private FormCollectionAnalyzer $formCollectionAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormTypeStringToTypeProvider $formTypeStringToTypeProvider, FormCollectionAnalyzer $formCollectionAnalyzer, ValueResolver $valueResolver) { $this->formAddMethodCallAnalyzer = $formAddMethodCallAnalyzer; 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 8d103dfa2..dd8b3c16a 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 @@ -4,9 +4,9 @@ namespace Rector\Symfony\Symfony30\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name; @@ -34,34 +34,28 @@ final class FormTypeInstanceToClassConstRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormInstanceToFormClassConstFetchConverter */ - private $formInstanceToFormClassConstFetchConverter; + private FormInstanceToFormClassConstFetchConverter $formInstanceToFormClassConstFetchConverter; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer */ - private $formAddMethodCallAnalyzer; + private FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormOptionsArrayMatcher */ - private $formOptionsArrayMatcher; + private FormOptionsArrayMatcher $formOptionsArrayMatcher; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormCollectionAnalyzer */ - private $formCollectionAnalyzer; + private FormCollectionAnalyzer $formCollectionAnalyzer; /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(FormInstanceToFormClassConstFetchConverter $formInstanceToFormClassConstFetchConverter, FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormCollectionAnalyzer $formCollectionAnalyzer, ControllerAnalyzer $controllerAnalyzer, ValueResolver $valueResolver) { $this->formInstanceToFormClassConstFetchConverter = $formInstanceToFormClassConstFetchConverter; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/OptionNameRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/OptionNameRector.php index d15c1c39a..3df433a01 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/OptionNameRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/OptionNameRector.php @@ -4,8 +4,8 @@ namespace Rector\Symfony\Symfony30\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use Rector\Rector\AbstractRector; @@ -20,14 +20,12 @@ final class OptionNameRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer */ - private $formAddMethodCallAnalyzer; + private FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormOptionsArrayMatcher */ - private $formOptionsArrayMatcher; + private FormOptionsArrayMatcher $formOptionsArrayMatcher; /** * @var array */ @@ -40,12 +38,16 @@ public function __construct(FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Turns old option names to new ones in FormTypes in Form in Symfony', [new CodeSample(<<<'CODE_SAMPLE' -$builder = new FormBuilder; -$builder->add("...", ["precision" => "...", "virtual" => "..."]; +use Symfony\Component\Form\FormBuilder; + +$formBuilder = new FormBuilder; +$formBuilder->add("...", ["precision" => "...", "virtual" => "..."]; CODE_SAMPLE , <<<'CODE_SAMPLE' -$builder = new FormBuilder; -$builder->add("...", ["scale" => "...", "inherit_data" => "..."]; +use Symfony\Component\Form\FormBuilder; + +$formBuilder = new FormBuilder; +$formBuilder->add("...", ["scale" => "...", "inherit_data" => "..."]; CODE_SAMPLE )]); } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ReadOnlyOptionToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ReadOnlyOptionToAttributeRector.php index 18c1b8bc1..3d464af68 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ReadOnlyOptionToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ReadOnlyOptionToAttributeRector.php @@ -4,8 +4,8 @@ namespace Rector\Symfony\Symfony30\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use Rector\Rector\AbstractRector; @@ -21,19 +21,16 @@ final class ReadOnlyOptionToAttributeRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeManipulator\ArrayManipulator */ - private $arrayManipulator; + private ArrayManipulator $arrayManipulator; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer */ - private $formAddMethodCallAnalyzer; + private FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormOptionsArrayMatcher */ - private $formOptionsArrayMatcher; + private FormOptionsArrayMatcher $formOptionsArrayMatcher; public function __construct(ArrayManipulator $arrayManipulator, FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher) { $this->arrayManipulator = $arrayManipulator; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/StringFormTypeToClassRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/StringFormTypeToClassRector.php index 57ff25d70..cecadc213 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/StringFormTypeToClassRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/StringFormTypeToClassRector.php @@ -21,14 +21,12 @@ final class StringFormTypeToClassRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer */ - private $formAddMethodCallAnalyzer; + private FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer; /** * @readonly - * @var \Rector\Symfony\FormHelper\FormTypeStringToTypeProvider */ - private $formTypeStringToTypeProvider; + private FormTypeStringToTypeProvider $formTypeStringToTypeProvider; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony33/Rector/ClassConstFetch/ConsoleExceptionToErrorEventConstantRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony33/Rector/ClassConstFetch/ConsoleExceptionToErrorEventConstantRector.php index cc63c1557..e2004c2c7 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony33/Rector/ClassConstFetch/ConsoleExceptionToErrorEventConstantRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony33/Rector/ClassConstFetch/ConsoleExceptionToErrorEventConstantRector.php @@ -21,9 +21,8 @@ final class ConsoleExceptionToErrorEventConstantRector extends AbstractRector { /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $consoleEventsObjectType; + private ObjectType $consoleEventsObjectType; public function __construct() { $this->consoleEventsObjectType = new ObjectType('Symfony\\Component\\Console\\ConsoleEvents'); 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 2dfb684ba..d08871b65 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 @@ -27,19 +27,16 @@ final class MergeMethodAnnotationToRouteAnnotationRector extends AbstractRector { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTagRemover = $phpDocTagRemover; 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 51e64e0d6..7a9b7871f 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 @@ -20,14 +20,12 @@ final class RemoveServiceFromSensioRouteRector extends AbstractRector { /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; public function __construct(DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->docBlockUpdater = $docBlockUpdater; 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 464dc02b3..bf41af63d 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 @@ -28,29 +28,24 @@ final class ReplaceSensioRouteAnnotationWithSymfonyRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\PhpDocNode\SymfonyRouteTagValueNodeFactory */ - private $symfonyRouteTagValueNodeFactory; + private SymfonyRouteTagValueNodeFactory $symfonyRouteTagValueNodeFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover */ - private $phpDocTagRemover; + private PhpDocTagRemover $phpDocTagRemover; /** * @readonly - * @var \Rector\Configuration\RenamedClassesDataCollector */ - private $renamedClassesDataCollector; + private RenamedClassesDataCollector $renamedClassesDataCollector; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/Closure/ContainerGetNameToTypeInTestsRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/Closure/ContainerGetNameToTypeInTestsRector.php index 43ae6c3d3..aeda32ed2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/Closure/ContainerGetNameToTypeInTestsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/Closure/ContainerGetNameToTypeInTestsRector.php @@ -22,14 +22,12 @@ final class ContainerGetNameToTypeInTestsRector extends AbstractRector { /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ServiceTypeMethodCallResolver */ - private $serviceTypeMethodCallResolver; + private ServiceTypeMethodCallResolver $serviceTypeMethodCallResolver; public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ServiceTypeMethodCallResolver $serviceTypeMethodCallResolver) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; @@ -37,7 +35,7 @@ public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ServiceTypeMet } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Change $container->get("some_name") to bare type, useful since Symfony 3.4', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Change $container->get("some_name") in tests to bare type, useful since Symfony 3.4', [new CodeSample(<<<'CODE_SAMPLE' use PHPUnit\Framework\TestCase; final class SomeTest extends TestCase 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 4e1a77685..dcfd6ef33 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 @@ -4,9 +4,9 @@ namespace Rector\Symfony\Symfony40\Rector\ConstFetch; use PhpParser\Node; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\New_; use PHPStan\Type\ObjectType; use Rector\PhpParser\Node\Value\ValueResolver; @@ -22,9 +22,8 @@ final class ConstraintUrlOptionRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ProcessBuilderGetProcessRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ProcessBuilderGetProcessRector.php deleted file mode 100644 index e2b8e6e03..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/MethodCall/ProcessBuilderGetProcessRector.php +++ /dev/null @@ -1,58 +0,0 @@ -getProcess()` calls to $processBuilder in Process in Symfony, because ProcessBuilder was removed. This is part of multi-step Rector and has very narrow focus.', [new CodeSample(<<<'CODE_SAMPLE' -$processBuilder = new Symfony\Component\Process\ProcessBuilder; -$process = $processBuilder->getProcess(); -$commamdLine = $processBuilder->getProcess()->getCommandLine(); -CODE_SAMPLE -, <<<'CODE_SAMPLE' -$processBuilder = new Symfony\Component\Process\ProcessBuilder; -$process = $processBuilder; -$commamdLine = $processBuilder->getCommandLine(); -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [MethodCall::class]; - } - /** - * @param MethodCall $node - */ - public function refactor(Node $node) : ?Node - { - if ($this->hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated, as it cannot change fluent code builder in a reliable way.', self::class)); - \sleep(3); - $this->hasWarned = \true; - return null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/StaticCall/ProcessBuilderInstanceRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/StaticCall/ProcessBuilderInstanceRector.php deleted file mode 100644 index e8cc04305..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/StaticCall/ProcessBuilderInstanceRector.php +++ /dev/null @@ -1,48 +0,0 @@ -> - */ - public function getNodeTypes() : array - { - return [StaticCall::class]; - } - /** - * @param StaticCall $node - */ - public function refactor(Node $node) : ?Node - { - if ($this->hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated, as it cannot change fluent code builder in a reliable way.', self::class)); - \sleep(3); - $this->hasWarned = \true; - return null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/MethodCall/ContainerGetToConstructorInjectionRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/MethodCall/ContainerGetToConstructorInjectionRector.php index a85d84e78..0368e31ae 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/MethodCall/ContainerGetToConstructorInjectionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/MethodCall/ContainerGetToConstructorInjectionRector.php @@ -4,50 +4,19 @@ namespace Rector\Symfony\Symfony42\Rector\MethodCall; use PhpParser\Node; -use PhpParser\Node\Expr\ClassConstFetch; -use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Expression; -use PHPStan\Type\ObjectType; -use Rector\NodeManipulator\ClassDependencyManipulator; -use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; -use Rector\PostRector\ValueObject\PropertyMetadata; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\Symfony\NodeAnalyzer\DependencyInjectionMethodCallAnalyzer; -use Rector\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * Ref: https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md#console * - * @see \Rector\Symfony\Tests\Symfony42\Rector\MethodCall\ContainerGetToConstructorInjectionRector\ContainerGetToConstructorInjectionRectorTest + * @deprecated This rule is deprecated as too vague and causing too many changes. Use more granular @see \Rector\Symfony\Set\SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION instead */ -final class ContainerGetToConstructorInjectionRector extends AbstractRector +final class ContainerGetToConstructorInjectionRector extends AbstractRector implements DeprecatedInterface { - /** - * @readonly - * @var \Rector\Symfony\NodeAnalyzer\DependencyInjectionMethodCallAnalyzer - */ - private $dependencyInjectionMethodCallAnalyzer; - /** - * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer - */ - private $testsNodeAnalyzer; - /** - * @readonly - * @var \Rector\NodeManipulator\ClassDependencyManipulator - */ - private $classDependencyManipulator; - public function __construct(DependencyInjectionMethodCallAnalyzer $dependencyInjectionMethodCallAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ClassDependencyManipulator $classDependencyManipulator) - { - $this->dependencyInjectionMethodCallAnalyzer = $dependencyInjectionMethodCallAnalyzer; - $this->testsNodeAnalyzer = $testsNodeAnalyzer; - $this->classDependencyManipulator = $classDependencyManipulator; - } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Turns fetching of dependencies via `$container->get()` in ContainerAware to constructor injection in Command and Controller in Symfony', [new CodeSample(<<<'CODE_SAMPLE' @@ -91,58 +60,6 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if ($this->testsNodeAnalyzer->isInTestClass($node)) { - return null; - } - $class = $node; - $propertyMetadatas = []; - $this->traverseNodesWithCallable($class, function (Node $node) use($class, &$propertyMetadatas) : ?Node { - if (!$node instanceof MethodCall) { - return null; - } - if (!$this->isName($node->name, 'get')) { - return null; - } - if (!$this->isObjectType($node->var, new ObjectType('Symfony\\Component\\DependencyInjection\\ContainerInterface'))) { - return null; - } - if ($node->isFirstClassCallable()) { - return null; - } - $args = $node->getArgs(); - if (\count($args) === 1 && $args[0]->value instanceof ClassConstFetch) { - return null; - } - $propertyMetadata = $this->dependencyInjectionMethodCallAnalyzer->replaceMethodCallWithPropertyFetchAndDependency($class, $node); - if (!$propertyMetadata instanceof PropertyMetadata) { - return null; - } - $propertyMetadatas[] = $propertyMetadata; - return $this->nodeFactory->createPropertyFetch('this', $propertyMetadata->getName()); - }); - if ($propertyMetadatas === []) { - return null; - } - foreach ($propertyMetadatas as $propertyMetadata) { - $this->classDependencyManipulator->addConstructorDependency($class, $propertyMetadata); - } - $this->decorateCommandConstructor($class); - return $node; - } - private function decorateCommandConstructor(Class_ $class) : void - { - // special case for command to keep parent constructor call - if (!$this->isObjectType($class, new ObjectType('Symfony\\Component\\Console\\Command\\Command'))) { - return; - } - $constuctClassMethod = $class->getMethod(MethodName::CONSTRUCT); - if (!$constuctClassMethod instanceof ClassMethod) { - return; - } - // empty stmts? add parent::__construct() to setup command - if ((array) $constuctClassMethod->stmts === []) { - $parentConstructStaticCall = new StaticCall(new Name('parent'), '__construct'); - $constuctClassMethod->stmts[] = new Expression($parentConstructStaticCall); - } + throw new ShouldNotHappenException(\sprintf('The %s rule is deprecated. Use more reliable set \\Rector\\Symfony\\Set\\SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION instead', self::class)); } } 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 cc6be73f9..659ed9da0 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 @@ -25,9 +25,8 @@ final class RootNodeTreeBuilderRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(BetterNodeFinder $betterNodeFinder) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php index 86c4b9e34..abea229c0 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/StringToArrayArgumentProcessRector.php @@ -17,7 +17,7 @@ use Rector\PhpParser\NodeTransformer; use Rector\Rector\AbstractRector; use Rector\Util\Reflection\PrivatesAccessor; -use RectorPrefix202411\Symfony\Component\Console\Input\StringInput; +use RectorPrefix202506\Symfony\Component\Console\Input\StringInput; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -29,9 +29,8 @@ final class StringToArrayArgumentProcessRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\NodeTransformer */ - private $nodeTransformer; + private NodeTransformer $nodeTransformer; /** * @var string[] */ @@ -97,34 +96,41 @@ private function processArgumentPosition($node, int $argumentPosition) : ?Node if (!$activeValueType instanceof StringType) { return null; } - $this->processStringType($node, $argumentPosition, $activeArgValue); + $hasChanged = $this->processStringType($node, $argumentPosition, $activeArgValue); + if (!$hasChanged) { + return null; + } return $node; } private function shouldSkipProcessMethodCall(MethodCall $methodCall) : bool { - $methodName = (string) $this->nodeNameResolver->getName($methodCall->name); + $methodName = (string) $this->getName($methodCall->name); return \in_array($methodName, self::EXCLUDED_PROCESS_METHOD_CALLS, \true); } /** * @param \PhpParser\Node\Expr\New_|\PhpParser\Node\Expr\MethodCall $expr */ - private function processStringType($expr, int $argumentPosition, Expr $firstArgumentExpr) : void + private function processStringType($expr, int $argumentPosition, Expr $firstArgumentExpr) : bool { if ($firstArgumentExpr instanceof Concat) { $arrayNode = $this->nodeTransformer->transformConcatToStringArray($firstArgumentExpr); $expr->args[$argumentPosition] = new Arg($arrayNode); - return; + return \true; } $args = $expr->getArgs(); + $hasChanged = \false; if ($firstArgumentExpr instanceof FuncCall && $this->isName($firstArgumentExpr, 'sprintf')) { $arrayNode = $this->nodeTransformer->transformSprintfToArray($firstArgumentExpr); if ($arrayNode instanceof Array_) { $args[$argumentPosition]->value = $arrayNode; + $hasChanged = \true; } } elseif ($firstArgumentExpr instanceof String_) { $parts = $this->splitProcessCommandToItems($firstArgumentExpr->value); $args[$argumentPosition]->value = $this->nodeFactory->createArray($parts); + $hasChanged = \true; } + return $hasChanged; } /** * @return string[] 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 271e00794..06b537e9f 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 @@ -7,24 +7,23 @@ 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\Enum\ObjectReference; use Rector\PhpParser\Node\BetterNodeFinder; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Symfony\Tests\Symfony43\Rector\ClassMethod\EventDispatcherParentConstructRector\EventDispatcherParentConstructRectorTest */ -final class EventDispatcherParentConstructRector extends AbstractScopeAwareRector +final class EventDispatcherParentConstructRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(BetterNodeFinder $betterNodeFinder) { $this->betterNodeFinder = $betterNodeFinder; @@ -67,8 +66,9 @@ public function getNodeTypes() : array /** * @param ClassMethod $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { + $scope = ScopeFetcher::fetch($node); if (!$scope->isInClass()) { return null; } @@ -76,7 +76,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node return null; } $classReflection = $scope->getClassReflection(); - if (!$classReflection->isSubclassOf('Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface')) { + if (!$classReflection->is('Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface')) { return null; } if (!$classReflection->getParentClass() instanceof ClassReflection) { 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 2e563fcbd..a7d4e9300 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 @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony43\Rector\MethodCall; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; @@ -12,11 +12,13 @@ use PHPStan\Type\ThisType; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; +use Rector\Symfony\Enum\SymfonyClass; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @changelog https://github.com/symfony/symfony/pull/21035 * @changelog https://github.com/symfony/symfony/blob/4.4/src/Symfony/Bundle/FrameworkBundle/Templating/TemplateNameParser.php + * * @changelog https://symfony.com/doc/4.4/templates.html#bundle-templates * * @see \Rector\Symfony\Tests\Symfony43\Rector\MethodCall\ConvertRenderTemplateShortNotationToBundleSyntaxRector\ConvertRenderTemplateShortNotationToBundleSyntaxRectorTest @@ -25,9 +27,8 @@ final class ConvertRenderTemplateShortNotationToBundleSyntaxRector extends Abstr { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; @@ -35,7 +36,10 @@ public function __construct(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' -class BaseController extends Controller { +use Symfony\Bundle\FrameworkBundle\Controller\Controller; + +class BaseController extends Controller +{ function indexAction() { $this->render('appBundle:Landing\Main:index.html.twig'); @@ -43,7 +47,10 @@ function indexAction() } CODE_SAMPLE , <<<'CODE_SAMPLE' -class BaseController extends Controller { +use Symfony\Bundle\FrameworkBundle\Controller\Controller; + +class BaseController extends Controller +{ function indexAction() { $this->render('@app/Landing/Main/index.html.twig'); @@ -64,11 +71,11 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if (!$this->nodeNameResolver->isName($node->name, 'render') && !$this->nodeNameResolver->isName($node->name, 'renderView')) { + if (!$this->isName($node->name, 'render') && !$this->isName($node->name, 'renderView')) { return null; } $objectType = $this->nodeTypeResolver->getType($node->var); - $controllerType = new ObjectType('Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller'); + $controllerType = new ObjectType(SymfonyClass::CONTROLLER); if (!$controllerType->isSuperTypeOf($objectType)->yes()) { return null; } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/GetCurrencyBundleMethodCallsToIntlRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/GetCurrencyBundleMethodCallsToIntlRector.php index dde2de15d..b8ee92770 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/GetCurrencyBundleMethodCallsToIntlRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/GetCurrencyBundleMethodCallsToIntlRector.php @@ -23,7 +23,7 @@ final class GetCurrencyBundleMethodCallsToIntlRector extends AbstractRector /** * @var IntlBundleClassToNewClass[] */ - private $intlBundleClassesToNewClasses = []; + private array $intlBundleClassesToNewClasses = []; public function __construct() { $this->intlBundleClassesToNewClasses[] = new IntlBundleClassToNewClass('Symfony\\Component\\Intl\\ResourceBundle\\LanguageBundleInterface', 'Symfony\\Component\\Intl\\Languages', ['getLanguageNames' => 'getNames', 'getLanguageName' => 'getName']); 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 2b5d02856..db55e1dcd 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 @@ -24,14 +24,12 @@ final class MakeDispatchFirstArgumentEventRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer */ - private $stringTypeAnalyzer; + private StringTypeAnalyzer $stringTypeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(StringTypeAnalyzer $stringTypeAnalyzer, ValueResolver $valueResolver) { $this->stringTypeAnalyzer = $stringTypeAnalyzer; 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 f9ea30bb2..d4f0a20e0 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 @@ -25,24 +25,20 @@ final class WebTestCaseAssertIsSuccessfulRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyTestCaseAnalyzer */ - private $symfonyTestCaseAnalyzer; + private SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer, ValueResolver $valueResolver) { $this->symfonyTestCaseAnalyzer = $symfonyTestCaseAnalyzer; 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 36c84dd35..fc433d917 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 @@ -26,24 +26,20 @@ final class WebTestCaseAssertResponseCodeRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyTestCaseAnalyzer */ - private $symfonyTestCaseAnalyzer; + private SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer; /** * @readonly - * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ - private $testsNodeAnalyzer; + private TestsNodeAnalyzer $testsNodeAnalyzer; /** * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer */ - private $exprAnalyzer; + private ExprAnalyzer $exprAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer, ValueResolver $valueResolver) { $this->symfonyTestCaseAnalyzer = $symfonyTestCaseAnalyzer; @@ -135,7 +131,7 @@ private function processAssertResponseStatusCodeSame($methodCall) return null; } $nestedMethodCall = $secondArg->value; - if (!$this->nodeNameResolver->isName($nestedMethodCall->name, 'getStatusCode')) { + if (!$this->isName($nestedMethodCall->name, 'getStatusCode')) { return null; } // caller must be a response object 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 deleted file mode 100644 index 3ace3018b..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php +++ /dev/null @@ -1,72 +0,0 @@ -assertContains('Hello World', $crawler->filter('h1')->text()); - } -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; -use Symfony\Component\DomCrawler\Crawler; - -final class SomeTest extends WebTestCase -{ - public function testContains() - { - $crawler = new Symfony\Component\DomCrawler\Crawler(); - $this->assertSelectorTextContains('h1', 'Hello World'); - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [MethodCall::class, StaticCall::class]; - } - /** - * @param MethodCall|StaticCall $node - */ - public function refactor(Node $node) : ?Node - { - if ($this->hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated, as it does not upgrade to valid code.', self::class)); - \sleep(3); - $this->hasWarned = \true; - return null; - } -} 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 0e1eb4605..a0d12318a 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 @@ -10,11 +10,10 @@ use PhpParser\Node\Expr\Ternary; use PhpParser\Node\FunctionLike; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use PHPStan\Type\IntegerType; use PHPStan\Type\ObjectType; use Rector\NodeAnalyzer\TerminatedNodeAnalyzer; @@ -30,18 +29,13 @@ final class ConsoleExecuteReturnIntRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\TerminatedNodeAnalyzer */ - private $terminatedNodeAnalyzer; + private TerminatedNodeAnalyzer $terminatedNodeAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - /** - * @var bool - */ - private $hasChanged = \false; + private ValueResolver $valueResolver; + private bool $hasChanged = \false; public function __construct(TerminatedNodeAnalyzer $terminatedNodeAnalyzer, ValueResolver $valueResolver) { $this->terminatedNodeAnalyzer = $terminatedNodeAnalyzer; @@ -92,6 +86,7 @@ public function refactor(Node $node) : ?Node if (!$executeClassMethod instanceof ClassMethod) { return null; } + $this->hasChanged = \false; $this->refactorReturnTypeDeclaration($executeClassMethod); $this->addReturn0ToExecuteClassMethod($executeClassMethod); if ($this->hasChanged) { @@ -102,7 +97,7 @@ public function refactor(Node $node) : ?Node private function refactorReturnTypeDeclaration(ClassMethod $classMethod) : void { // already set - if ($classMethod->returnType !== null && $this->isName($classMethod->returnType, 'int')) { + if ($classMethod->returnType instanceof Node && $this->isName($classMethod->returnType, 'int')) { return; } $classMethod->returnType = new Identifier('int'); @@ -116,7 +111,7 @@ private function addReturn0ToExecuteClassMethod(ClassMethod $classMethod) : void $this->traverseNodesWithCallable($classMethod->stmts, function (Node $node) : ?int { // skip anonymous class/function if ($node instanceof FunctionLike || $node instanceof Class_) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Return_) { return null; @@ -160,11 +155,8 @@ private function isIntegerTernaryIfElse(Ternary $ternary) : bool } private function processReturn0ToMethod(ClassMethod $classMethod) : void { - $stmts = (array) $classMethod->stmts; - \end($stmts); - $lastKey = \key($stmts); - \reset($stmts); - $return = new Return_(new LNumber(0)); + $lastKey = \array_key_last((array) $classMethod->stmts); + $return = new Return_(new \PhpParser\Node\Scalar\Int_(0)); if ($lastKey !== null && (isset($classMethod->stmts[$lastKey]) && $this->terminatedNodeAnalyzer->isAlwaysTerminated($classMethod, $classMethod->stmts[$lastKey], $return))) { return; } @@ -173,15 +165,15 @@ private function processReturn0ToMethod(ClassMethod $classMethod) : void private function setReturnTo0InsteadOfNull(Return_ $return) : void { if (!$return->expr instanceof Expr) { - $return->expr = new LNumber(0); + $return->expr = new \PhpParser\Node\Scalar\Int_(0); return; } if ($this->valueResolver->isNull($return->expr)) { - $return->expr = new LNumber(0); + $return->expr = new \PhpParser\Node\Scalar\Int_(0); return; } if ($return->expr instanceof Coalesce && $this->valueResolver->isNull($return->expr->right)) { - $return->expr->right = new LNumber(0); + $return->expr->right = new \PhpParser\Node\Scalar\Int_(0); return; } if ($return->expr instanceof Ternary) { @@ -199,11 +191,11 @@ private function isSuccessfulRefactorTernaryReturn(Ternary $ternary) : bool { $hasChanged = \false; if ($ternary->if instanceof Expr && $this->valueResolver->isNull($ternary->if)) { - $ternary->if = new LNumber(0); + $ternary->if = new \PhpParser\Node\Scalar\Int_(0); $hasChanged = \true; } if ($this->valueResolver->isNull($ternary->else)) { - $ternary->else = new LNumber(0); + $ternary->else = new \PhpParser\Node\Scalar\Int_(0); $hasChanged = \true; } return $hasChanged; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php index 6d46687c1..a08b947cc 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php @@ -5,13 +5,14 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; use Rector\NodeAnalyzer\ArgsAnalyzer; use Rector\Rector\AbstractRector; +use Rector\Symfony\Enum\SymfonyClass; use Rector\Symfony\TypeAnalyzer\ControllerAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -24,14 +25,12 @@ final class AuthorizationCheckerIsGrantedExtractorRector extends AbstractRector { /** * @readonly - * @var \Rector\NodeAnalyzer\ArgsAnalyzer */ - private $argsAnalyzer; + private ArgsAnalyzer $argsAnalyzer; /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; public function __construct(ArgsAnalyzer $argsAnalyzer, ControllerAnalyzer $controllerAnalyzer) { $this->argsAnalyzer = $argsAnalyzer; @@ -40,11 +39,43 @@ public function __construct(ArgsAnalyzer $argsAnalyzer, ControllerAnalyzer $cont public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change `$this->authorizationChecker->isGranted([$a, $b])` to `$this->authorizationChecker->isGranted($a) || $this->authorizationChecker->isGranted($b)`, also updates AbstractController usages', [new CodeSample(<<<'CODE_SAMPLE' -if ($this->authorizationChecker->isGranted(['ROLE_USER', 'ROLE_ADMIN'])) { +use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; + +final class SomeController +{ + public function __construct( + private AuthorizationCheckerInterface $authorizationChecker + ) { + } + + public function hasAccess(): bool + { + if ($this->authorizationChecker->isGranted(['ROLE_USER', 'ROLE_ADMIN'])) { + return true; + } + + return false; + } } CODE_SAMPLE , <<<'CODE_SAMPLE' -if ($this->authorizationChecker->isGranted('ROLE_USER') || $this->authorizationChecker->isGranted('ROLE_ADMIN')) { +use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; + +final class SomeController +{ + public function __construct( + private AuthorizationCheckerInterface $authorizationChecker + ) { + } + + public function hasAccess(): bool + { + if ($this->authorizationChecker->isGranted('ROLE_USER') || $this->authorizationChecker->isGranted('ROLE_ADMIN')) { + return true; + } + + return false; + } } CODE_SAMPLE )]); @@ -69,11 +100,11 @@ public function refactor(Node $node) if (!$objectType instanceof ObjectType) { return null; } - $authorizationChecker = new ObjectType('Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationCheckerInterface'); + $authorizationChecker = new ObjectType(SymfonyClass::AUTHORIZATION_CHECKER); if (!$authorizationChecker->isSuperTypeOf($objectType)->yes()) { return null; } - if (!$this->nodeNameResolver->isName($node->name, 'isGranted')) { + if (!$this->isName($node->name, 'isGranted')) { return null; } return $this->handleIsGranted($node); @@ -118,7 +149,7 @@ private function processExtractIsGranted(MethodCall $methodCall, Array_ $array, */ private function processControllerMethods(MethodCall $methodCall) { - if ($this->nodeNameResolver->isName($methodCall->name, 'isGranted')) { + if ($this->isName($methodCall->name, 'isGranted')) { return $this->handleIsGranted($methodCall); } return null; 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 6a4b874e6..94de8f013 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 @@ -5,7 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\ClassConstFetch; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use PHPStan\Reflection\ClassReflection; @@ -24,14 +24,12 @@ final class CommandConstantReturnCodeRector extends AbstractRector { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder) { $this->reflectionResolver = $reflectionResolver; @@ -77,17 +75,17 @@ public function refactor(Node $node) : ?Node if (!$classReflection instanceof ClassReflection) { return null; } - if (!$classReflection->isSubclassOf('Symfony\\Component\\Console\\Command\\Command')) { + if (!$classReflection->is('Symfony\\Component\\Console\\Command\\Command')) { return null; } - if (!$this->nodeNameResolver->isName($node, 'execute')) { + if (!$this->isName($node, 'execute')) { return null; } $hasChanged = \false; /** @var Return_[] $returns */ $returns = $this->betterNodeFinder->findInstancesOfInFunctionLikeScoped($node, [Return_::class]); foreach ($returns as $return) { - if (!$return->expr instanceof LNumber) { + if (!$return->expr instanceof Int_) { continue; } $classConstFetch = $this->convertNumberToConstant($return->expr); @@ -102,11 +100,11 @@ public function refactor(Node $node) : ?Node } return null; } - private function convertNumberToConstant(LNumber $lNumber) : ?ClassConstFetch + private function convertNumberToConstant(Int_ $int) : ?ClassConstFetch { - if (!isset(SymfonyCommandConstantMap::RETURN_TO_CONST[$lNumber->value])) { + if (!isset(SymfonyCommandConstantMap::RETURN_TO_CONST[$int->value])) { return null; } - return $this->nodeFactory->createClassConstFetch('Symfony\\Component\\Console\\Command\\Command', SymfonyCommandConstantMap::RETURN_TO_CONST[$lNumber->value]); + return $this->nodeFactory->createClassConstFetch('Symfony\\Component\\Console\\Command\\Command', SymfonyCommandConstantMap::RETURN_TO_CONST[$int->value]); } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutHandlerToLogoutEventSubscriberRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutHandlerToLogoutEventSubscriberRector.php index eac4fbe48..25e683454 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutHandlerToLogoutEventSubscriberRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutHandlerToLogoutEventSubscriberRector.php @@ -25,24 +25,20 @@ final class LogoutHandlerToLogoutEventSubscriberRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeFactory\OnLogoutClassMethodFactory */ - private $onLogoutClassMethodFactory; + private OnLogoutClassMethodFactory $onLogoutClassMethodFactory; /** * @readonly - * @var \Rector\Symfony\NodeFactory\GetSubscribedEventsClassMethodFactory */ - private $getSubscribedEventsClassMethodFactory; + private GetSubscribedEventsClassMethodFactory $getSubscribedEventsClassMethodFactory; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $logoutHandlerObjectType; + private ObjectType $logoutHandlerObjectType; public function __construct(OnLogoutClassMethodFactory $onLogoutClassMethodFactory, GetSubscribedEventsClassMethodFactory $getSubscribedEventsClassMethodFactory, ClassAnalyzer $classAnalyzer) { $this->onLogoutClassMethodFactory = $onLogoutClassMethodFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutSuccessHandlerToLogoutEventSubscriberRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutSuccessHandlerToLogoutEventSubscriberRector.php index 758d90f82..7db83fa0d 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutSuccessHandlerToLogoutEventSubscriberRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/Class_/LogoutSuccessHandlerToLogoutEventSubscriberRector.php @@ -24,24 +24,20 @@ final class LogoutSuccessHandlerToLogoutEventSubscriberRector extends AbstractRe { /** * @readonly - * @var \Rector\Symfony\NodeFactory\OnSuccessLogoutClassMethodFactory */ - private $onSuccessLogoutClassMethodFactory; + private OnSuccessLogoutClassMethodFactory $onSuccessLogoutClassMethodFactory; /** * @readonly - * @var \Rector\Symfony\NodeFactory\GetSubscribedEventsClassMethodFactory */ - private $getSubscribedEventsClassMethodFactory; + private GetSubscribedEventsClassMethodFactory $getSubscribedEventsClassMethodFactory; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $successHandlerObjectType; + private ObjectType $successHandlerObjectType; public function __construct(OnSuccessLogoutClassMethodFactory $onSuccessLogoutClassMethodFactory, GetSubscribedEventsClassMethodFactory $getSubscribedEventsClassMethodFactory, ClassAnalyzer $classAnalyzer) { $this->onSuccessLogoutClassMethodFactory = $onSuccessLogoutClassMethodFactory; 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 83230f93b..5c8abe495 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 @@ -20,13 +20,12 @@ final class DefinitionAliasSetPrivateToSetPublicRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var ObjectType[] */ - private $definitionObjectTypes = []; + private array $definitionObjectTypes = []; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/FormBuilderSetDataMapperRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/FormBuilderSetDataMapperRector.php index 28690a0f3..96a9affb7 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/FormBuilderSetDataMapperRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/FormBuilderSetDataMapperRector.php @@ -28,14 +28,12 @@ final class FormBuilderSetDataMapperRector extends AbstractRector private const DATAMAPPER_CLASS = 'Symfony\\Component\\Form\\Extension\\Core\\DataMapper\\DataMapper'; /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $objectType; + private ObjectType $objectType; /** * @readonly - * @var \PHPStan\Type\ObjectType */ - private $dataMapperObjectType; + private ObjectType $dataMapperObjectType; public function __construct() { $this->objectType = new ObjectType(self::DATAMAPPER_INTERFACE); 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 3dfa0ce1c..a4d333134 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 @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\BinaryOp\BitwiseOr; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; @@ -23,9 +23,8 @@ final class ReflectionExtractorEnableMagicCallExtractorRector extends AbstractRe { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var string */ 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 3ef004479..43abb33f7 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 @@ -19,9 +19,8 @@ final class ValidatorBuilderEnableAnnotationMappingRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; 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 0890b7919..2286bd5e8 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 @@ -21,9 +21,8 @@ final class PropertyAccessorCreationBooleanToFlagsRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; @@ -31,6 +30,8 @@ public function __construct(ValueResolver $valueResolver) public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes first argument of PropertyAccessor::__construct() to flags from boolean', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Component\PropertyAccess\PropertyAccessor; + class SomeClass { public function run() @@ -40,6 +41,8 @@ public function run() } CODE_SAMPLE , <<<'CODE_SAMPLE' +use Symfony\Component\PropertyAccess\PropertyAccessor; + class SomeClass { public function run() diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/Class_/CommandDescriptionToPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/Class_/CommandDescriptionToPropertyRector.php deleted file mode 100644 index 17535d9d4..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/Class_/CommandDescriptionToPropertyRector.php +++ /dev/null @@ -1,71 +0,0 @@ -setDescription('sunshine description'); - } -} -CODE_SAMPLE -, <<<'CODE_SAMPLE' -use Symfony\Component\Console\Command\Command - -final class SunshineCommand extends Command -{ - protected static $defaultDescription = 'sunshine description'; - - public function configure() - { - } -} -CODE_SAMPLE -)]); - } - /** - * @return array> - */ - public function getNodeTypes() : array - { - return [Class_::class]; - } - /** - * @param Class_ $node - */ - public function refactor(Node $node) : ?Node - { - if ($this->hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated, as its only dead middle step before more solid PHP attributes.', self::class)); - \sleep(3); - $this->hasWarned = \true; - return null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/StaticPropertyFetch/KernelTestCaseContainerPropertyDeprecationRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/StaticPropertyFetch/KernelTestCaseContainerPropertyDeprecationRector.php index 11db8ab67..9b2303600 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/StaticPropertyFetch/KernelTestCaseContainerPropertyDeprecationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/StaticPropertyFetch/KernelTestCaseContainerPropertyDeprecationRector.php @@ -17,9 +17,8 @@ final class KernelTestCaseContainerPropertyDeprecationRector extends AbstractRec { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\SymfonyTestCaseAnalyzer */ - private $symfonyTestCaseAnalyzer; + private SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer; public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer) { $this->symfonyTestCaseAnalyzer = $symfonyTestCaseAnalyzer; @@ -65,7 +64,7 @@ public function refactor(Node $node) : ?Node if (!$this->symfonyTestCaseAnalyzer->isInKernelTestCase($node)) { return null; } - if ($this->nodeNameResolver->getName($node->name) !== 'container') { + if ($this->getName($node->name) !== 'container') { return null; } if (!$node->class instanceof Name || (string) $node->class !== 'self') { 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 a952967d8..ba05ec3f9 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 @@ -13,7 +13,7 @@ use Rector\Symfony\ValueObject\ReplaceServiceArgument; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @see \Rector\Symfony\Tests\Symfony60\Rector\FuncCall\ReplaceServiceArgumentRector\ReplaceServiceArgumentRectorTest */ @@ -21,13 +21,12 @@ final class ReplaceServiceArgumentRector extends AbstractRector implements Confi { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @var ReplaceServiceArgument[] */ - private $replaceServiceArguments = []; + private array $replaceServiceArguments = []; public function __construct(ValueResolver $valueResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/MethodCall/GetHelperControllerToServiceRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/MethodCall/GetHelperControllerToServiceRector.php index 0d637f244..31612b7d4 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/MethodCall/GetHelperControllerToServiceRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/MethodCall/GetHelperControllerToServiceRector.php @@ -27,19 +27,16 @@ final class GetHelperControllerToServiceRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; /** * @readonly - * @var \Rector\NodeManipulator\ClassDependencyManipulator */ - private $classDependencyManipulator; + private ClassDependencyManipulator $classDependencyManipulator; /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; public function __construct(ControllerAnalyzer $controllerAnalyzer, ClassDependencyManipulator $classDependencyManipulator, PropertyNaming $propertyNaming) { $this->controllerAnalyzer = $controllerAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandConfigureToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandConfigureToAttributeRector.php index 942f90035..0d9801cdc 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandConfigureToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandConfigureToAttributeRector.php @@ -18,13 +18,14 @@ use PHPStan\Type\ObjectType; use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory; use Rector\Rector\AbstractRector; -use Rector\Symfony\Enum\SymfonyAnnotation; +use Rector\Symfony\Enum\SymfonyAttribute; +use Rector\Symfony\Enum\SymfonyClass; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @changelog https://symfony.com/doc/current/console.html#registering-the-command + * @see https://symfony.com/doc/current/console.html#registering-the-command * * @see \Rector\Symfony\Tests\Symfony61\Rector\Class_\CommandConfigureToAttributeRector\CommandConfigureToAttributeRectorTest */ @@ -32,14 +33,12 @@ final class CommandConfigureToAttributeRector extends AbstractRector implements { /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @var array */ @@ -94,10 +93,10 @@ public function refactor(Node $node) : ?Node if ($node->isAbstract()) { return null; } - if (!$this->reflectionProvider->hasClass(SymfonyAnnotation::AS_COMMAND)) { + if (!$this->reflectionProvider->hasClass(SymfonyAttribute::AS_COMMAND)) { return null; } - if (!$this->isObjectType($node, new ObjectType('Symfony\\Component\\Console\\Command\\Command'))) { + if (!$this->isObjectType($node, new ObjectType(SymfonyClass::COMMAND))) { return null; } $configureClassMethod = $node->getMethod('configure'); @@ -109,7 +108,7 @@ public function refactor(Node $node) : ?Node $attributeArgs = []; foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attribute) { - if (!$this->nodeNameResolver->isName($attribute->name, SymfonyAnnotation::AS_COMMAND)) { + if (!$this->isName($attribute->name, SymfonyAttribute::AS_COMMAND)) { continue; } $asCommandAttribute = $attribute; @@ -124,7 +123,7 @@ public function refactor(Node $node) : ?Node } } if (!$asCommandAttribute instanceof Attribute) { - $asCommandAttributeGroup = $this->phpAttributeGroupFactory->createFromClass(SymfonyAnnotation::AS_COMMAND); + $asCommandAttributeGroup = $this->phpAttributeGroupFactory->createFromClass(SymfonyAttribute::AS_COMMAND); $asCommandAttribute = $asCommandAttributeGroup->attrs[0]; $node->attrGroups[] = $asCommandAttributeGroup; } @@ -150,7 +149,7 @@ private function createNamedArg(string $name, Expr $expr) : Arg private function findAndRemoveMethodExpr(ClassMethod $classMethod, string $methodName) : ?Expr { $expr = null; - $this->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $node) use(&$expr, $methodName) { + $this->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $node) use(&$expr, $methodName) : ?Expr { // find setName() method call if (!$node instanceof MethodCall) { return null; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php index a578409e1..40e293279 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/CommandPropertyToAttributeRector.php @@ -16,13 +16,13 @@ use Rector\Doctrine\NodeAnalyzer\AttributeFinder; use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory; use Rector\Rector\AbstractRector; -use Rector\Symfony\Enum\SymfonyAnnotation; +use Rector\Symfony\Enum\SymfonyAttribute; use Rector\Symfony\Enum\SymfonyClass; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @changelog https://symfony.com/doc/current/console.html#registering-the-command * @@ -32,19 +32,16 @@ final class CommandPropertyToAttributeRector extends AbstractRector implements M { /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttributeFinder */ - private $attributeFinder; + private AttributeFinder $attributeFinder; public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, ReflectionProvider $reflectionProvider, AttributeFinder $attributeFinder) { $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; @@ -94,7 +91,7 @@ public function refactor(Node $node) : ?Node return null; } // does attribute already exist? - if (!$this->reflectionProvider->hasClass(SymfonyAnnotation::AS_COMMAND)) { + if (!$this->reflectionProvider->hasClass(SymfonyAttribute::AS_COMMAND)) { return null; } $defaultNameExpr = $this->resolvePropertyExpr($node, 'defaultName'); @@ -102,7 +99,7 @@ public function refactor(Node $node) : ?Node return null; } $defaultDescriptionExpr = $this->resolvePropertyExpr($node, 'defaultDescription'); - $existingAsCommandAttribute = $this->attributeFinder->findAttributeByClass($node, SymfonyAnnotation::AS_COMMAND); + $existingAsCommandAttribute = $this->attributeFinder->findAttributeByClass($node, SymfonyAttribute::AS_COMMAND); $attributeArgs = $this->createAttributeArgs($defaultNameExpr, $defaultDescriptionExpr); // already has attribute, only add "name" and optionally "description" if ($existingAsCommandAttribute instanceof Attribute) { @@ -118,7 +115,7 @@ public function refactor(Node $node) : ?Node private function createAttributeGroupAsCommand(array $args) : AttributeGroup { Assert::allIsInstanceOf($args, Arg::class); - $attributeGroup = $this->phpAttributeGroupFactory->createFromClass(SymfonyAnnotation::AS_COMMAND); + $attributeGroup = $this->phpAttributeGroupFactory->createFromClass(SymfonyAttribute::AS_COMMAND); $attributeGroup->attrs[0]->args = $args; return $attributeGroup; } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/MagicClosureTwigExtensionToNativeMethodsRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/MagicClosureTwigExtensionToNativeMethodsRector.php index 708638c81..9d48f5af4 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/MagicClosureTwigExtensionToNativeMethodsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/Class_/MagicClosureTwigExtensionToNativeMethodsRector.php @@ -13,7 +13,8 @@ use PHPStan\Type\ObjectType; use Rector\NodeCollector\NodeAnalyzer\ArrayCallableMethodMatcher; use Rector\NodeCollector\ValueObject\ArrayCallable; -use Rector\Rector\AbstractScopeAwareRector; +use Rector\PHPStan\ScopeFetcher; +use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersion; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -23,13 +24,12 @@ * * @see PHP 8.1 way to handle functions/filters https://github.com/symfony/symfony/blob/e0ad2eead3513a558c09d8aa3ae9e867fb10b419/src/Symfony/Bridge/Twig/Extension/CodeExtension.php#L41-L52 */ -final class MagicClosureTwigExtensionToNativeMethodsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface +final class MagicClosureTwigExtensionToNativeMethodsRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly - * @var \Rector\NodeCollector\NodeAnalyzer\ArrayCallableMethodMatcher */ - private $arrayCallableMethodMatcher; + private ArrayCallableMethodMatcher $arrayCallableMethodMatcher; public function __construct(ArrayCallableMethodMatcher $arrayCallableMethodMatcher) { $this->arrayCallableMethodMatcher = $arrayCallableMethodMatcher; @@ -86,12 +86,13 @@ public function getNodeTypes() : array /** * @param Class_ $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?Node + public function refactor(Node $node) : ?Node { if (!$this->nodeTypeResolver->isObjectTypes($node, [new ObjectType('Twig_ExtensionInterface'), new ObjectType('Twig\\Extension\\ExtensionInterface')])) { return null; } $hasFunctionsChanged = \false; + $scope = ScopeFetcher::fetch($node); $getFunctionsClassMethod = $node->getMethod('getFunctions'); if ($getFunctionsClassMethod instanceof ClassMethod) { $hasFunctionsChanged = $this->refactorClassMethod($getFunctionsClassMethod, $scope); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/StaticPropertyFetch/ErrorNamesPropertyToConstantRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/StaticPropertyFetch/ErrorNamesPropertyToConstantRector.php index fed106940..d4be49026 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/StaticPropertyFetch/ErrorNamesPropertyToConstantRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony61/Rector/StaticPropertyFetch/ErrorNamesPropertyToConstantRector.php @@ -20,9 +20,8 @@ final class ErrorNamesPropertyToConstantRector extends AbstractRector { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; @@ -65,10 +64,10 @@ public function refactor(Node $node) : ?Node if (!$classReflection instanceof ClassReflection) { return null; } - if (!$classReflection->isSubclassOf('Symfony\\Component\\Validator\\Constraint')) { + if (!$classReflection->is('Symfony\\Component\\Validator\\Constraint')) { return null; } - if (!$this->nodeNameResolver->isName($node->name, 'errorNames')) { + if (!$this->isName($node->name, 'errorNames')) { return null; } $parentClass = $classReflection->getParentClass(); 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 d52601b61..2785ce495 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 @@ -16,8 +16,8 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Rector\Rector\AbstractRector; -use RectorPrefix202411\Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; -use RectorPrefix202411\Symfony\Component\HttpKernel\Controller\ValueResolverInterface; +use RectorPrefix202506\Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use RectorPrefix202506\Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ParamConverterAttributeToMapEntityAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ParamConverterAttributeToMapEntityAttributeRector.php index 050fb97ac..cbfb2b273 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ParamConverterAttributeToMapEntityAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ParamConverterAttributeToMapEntityAttributeRector.php @@ -5,11 +5,11 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageHandlerInterfaceToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageHandlerInterfaceToAttributeRector.php index f3091b143..84533fb4c 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageHandlerInterfaceToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageHandlerInterfaceToAttributeRector.php @@ -5,10 +5,11 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; +use PHPStan\Reflection\ReflectionProvider; +use PHPStan\Type\ObjectType; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Rector\Rector\AbstractRector; use Rector\Symfony\Helper\MessengerHelper; -use Rector\Symfony\NodeAnalyzer\ClassAnalyzer; use Rector\Symfony\NodeManipulator\ClassManipulator; use Rector\Symfony\ValueObject\ServiceDefinition; use Rector\ValueObject\PhpVersionFeature; @@ -22,30 +23,26 @@ final class MessageHandlerInterfaceToAttributeRector extends AbstractRector impl { /** * @readonly - * @var \Rector\Symfony\Helper\MessengerHelper */ - private $messengerHelper; + private MessengerHelper $messengerHelper; /** * @readonly - * @var \Rector\Symfony\NodeManipulator\ClassManipulator */ - private $classManipulator; + private ClassManipulator $classManipulator; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private PhpAttributeAnalyzer $phpAttributeAnalyzer; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer */ - private $phpAttributeAnalyzer; - public function __construct(MessengerHelper $messengerHelper, ClassManipulator $classManipulator, ClassAnalyzer $classAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer) + private ReflectionProvider $reflectionProvider; + public function __construct(MessengerHelper $messengerHelper, ClassManipulator $classManipulator, PhpAttributeAnalyzer $phpAttributeAnalyzer, ReflectionProvider $reflectionProvider) { $this->messengerHelper = $messengerHelper; $this->classManipulator = $classManipulator; - $this->classAnalyzer = $classAnalyzer; $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; + $this->reflectionProvider = $reflectionProvider; } public function provideMinPhpVersion() : int { @@ -90,10 +87,15 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { + if (!$this->reflectionProvider->hasClass(MessengerHelper::AS_MESSAGE_HANDLER_ATTRIBUTE)) { + return null; + } if ($this->phpAttributeAnalyzer->hasPhpAttribute($node, MessengerHelper::AS_MESSAGE_HANDLER_ATTRIBUTE)) { return null; } - if (!$this->classAnalyzer->hasImplements($node, MessengerHelper::MESSAGE_HANDLER_INTERFACE)) { + $classType = $this->getType($node); + $messageHandlerObjectType = new ObjectType(MessengerHelper::MESSAGE_HANDLER_INTERFACE); + if (!$messageHandlerObjectType->isSuperTypeOf($classType)->yes()) { $handlers = $this->messengerHelper->getHandlersFromServices(); if ($handlers === []) { return null; @@ -101,6 +103,10 @@ public function refactor(Node $node) : ?Node return $this->checkForServices($node, $handlers); } $this->classManipulator->removeImplements($node, [MessengerHelper::MESSAGE_HANDLER_INTERFACE]); + // no need to add the attribute + if ($node->isAbstract()) { + return $node; + } return $this->messengerHelper->addAttribute($node); } /** 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 fdff74e4e..c9b56e117 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 @@ -6,7 +6,6 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\Yield_; use PhpParser\Node\Identifier; @@ -32,32 +31,22 @@ final class MessageSubscriberInterfaceToAttributeRector extends AbstractRector i { /** * @readonly - * @var \Rector\Symfony\Helper\MessengerHelper */ - private $messengerHelper; + private MessengerHelper $messengerHelper; /** * @readonly - * @var \Rector\Symfony\NodeManipulator\ClassManipulator */ - private $classManipulator; + private ClassManipulator $classManipulator; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; - /** - * @var \PhpParser\Node\Stmt\Class_ - */ - private $subscriberClass; - /** - * @var string - */ - private $newInvokeMethodName; + private ValueResolver $valueResolver; + private Class_ $subscriberClass; + private string $newInvokeMethodName; public function __construct(MessengerHelper $messengerHelper, ClassManipulator $classManipulator, ClassAnalyzer $classAnalyzer, ValueResolver $valueResolver) { $this->messengerHelper = $messengerHelper; @@ -186,7 +175,7 @@ private function handleYields(array $expressions) : void private function parseArguments(Array_ $array, string &$method) : array { foreach ($array->items as $item) { - if (!$item instanceof ArrayItem || !$item->key instanceof Expr || !$item->value instanceof Expr) { + if (!$item->value instanceof Expr) { continue; } $key = (string) $this->valueResolver->getValue($item->key); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php index 6174d82e4..3e9a71a75 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/SecurityAttributeToIsGrantedAttributeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony62\Rector\Class_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; @@ -13,7 +13,11 @@ use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use PHPStan\Reflection\ReflectionProvider; use Rector\Rector\AbstractRector; +use Rector\Symfony\CodeQuality\NodeAnalyzer\AttributePresenceDetector; +use Rector\Symfony\Enum\SensioAttribute; +use Rector\Symfony\Enum\SymfonyAttribute; use Rector\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -27,13 +31,13 @@ final class SecurityAttributeToIsGrantedAttributeRector extends AbstractRector implements MinPhpVersionInterface { /** - * @var string + * @readonly */ - private const SECURITY_ATTRIBUTE = 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Security'; + private ReflectionProvider $reflectionProvider; /** - * @var string + * @readonly */ - private const IS_GRANTED_ATTRIBUTE = 'Symfony\\Component\\Security\\Http\\Attribute\\IsGranted'; + private AttributePresenceDetector $attributePresenceDetector; /** * @var string * @see https://regex101.com/r/Si1sDz/1 @@ -44,6 +48,11 @@ final class SecurityAttributeToIsGrantedAttributeRector extends AbstractRector i * @see https://regex101.com/r/NYRPrx/1 */ private const IS_GRANTED_AND_SUBJECT_REGEX = '#^is_granted\\((\\"|\')(?[\\w]+)(\\"|\'),\\s+(?\\w+)\\)$#'; + public function __construct(ReflectionProvider $reflectionProvider, AttributePresenceDetector $attributePresenceDetector) + { + $this->reflectionProvider = $reflectionProvider; + $this->attributePresenceDetector = $attributePresenceDetector; + } public function provideMinPhpVersion() : int { return PhpVersionFeature::ATTRIBUTES; @@ -72,12 +81,12 @@ public function list() class PostController extends Controller { - #[IsGranted('ROLE_ADMIN')] + #[IsGranted(attribute: 'ROLE_ADMIN')] public function index() { } - #[IsGranted(new Expression("is_granted('ROLE_ADMIN') and is_granted('ROLE_FRIENDLY_USER')"))] + #[IsGranted(attribute: new Expression("is_granted('ROLE_ADMIN') and is_granted('ROLE_FRIENDLY_USER')"))] public function list() { } @@ -97,13 +106,18 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { + if (!$this->attributePresenceDetector->detect(SensioAttribute::SECURITY)) { + return null; + } $hasChanged = \false; foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attribute) { - if (!$this->isName($attribute->name, self::SECURITY_ATTRIBUTE)) { + if (!$this->isName($attribute->name, SensioAttribute::SECURITY)) { continue; } - $attribute->name = new FullyQualified(self::IS_GRANTED_ATTRIBUTE); + // 1. resolve closest existing name of IsGranted + $isGrantedName = $this->resolveIsGrantedAttributeName(); + $attribute->name = new FullyQualified($isGrantedName); $firstArg = $attribute->args[0]; $firstArg->name = new Identifier('attribute'); $firstValue = $firstArg->value; @@ -150,4 +164,12 @@ private function wrapToNewExpression(Expr $expr) $args = [new Arg($expr)]; return new New_(new FullyQualified('Symfony\\Component\\ExpressionLanguage\\Expression'), $args); } + private function resolveIsGrantedAttributeName() : string + { + if ($this->reflectionProvider->hasClass(SymfonyAttribute::IS_GRANTED)) { + return SymfonyAttribute::IS_GRANTED; + } + // fallback to "sensio" + return SensioAttribute::IS_GRANTED; + } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/MethodCall/SimplifyFormRenderingRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/MethodCall/SimplifyFormRenderingRector.php index b079fac27..4195941ac 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/MethodCall/SimplifyFormRenderingRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/MethodCall/SimplifyFormRenderingRector.php @@ -5,8 +5,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; @@ -20,9 +20,8 @@ final class SimplifyFormRenderingRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; public function __construct(ControllerAnalyzer $controllerAnalyzer) { $this->controllerAnalyzer = $controllerAnalyzer; @@ -94,17 +93,14 @@ public function refactor(Node $node) : ?Node return $node; } /** - * @param ArrayItem[]|null[] $arrayItems + * @param ArrayItem[]$arrayItems * - * @return array|null + * @return array<(ArrayItem)>|null */ private function processRemoveCreateView(array $arrayItems) : ?array { $replaced = \false; foreach ($arrayItems as $arrayItem) { - if (!$arrayItem instanceof ArrayItem) { - continue; - } if (!$arrayItem->value instanceof MethodCall) { continue; } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php index 67aca1d02..8d7eb65c2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/ParamAndEnvAttributeRector.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony63\Rector\Class_; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Identifier; 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 74459d70f..99ae89152 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 @@ -24,19 +24,16 @@ final class SignalableCommandInterfaceReturnTypeRector extends AbstractRector { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ClassAnalyzer */ - private $classAnalyzer; + private ClassAnalyzer $classAnalyzer; /** * @readonly - * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ - private $parentClassMethodTypeOverrideGuard; + private ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; public function __construct(ClassAnalyzer $classAnalyzer, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, StaticTypeMapper $staticTypeMapper) { $this->classAnalyzer = $classAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony64/Rector/Class_/ChangeRouteAttributeFromAnnotationSubnamespaceRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony64/Rector/Class_/ChangeRouteAttributeFromAnnotationSubnamespaceRector.php deleted file mode 100644 index e20e4a9ad..000000000 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony64/Rector/Class_/ChangeRouteAttributeFromAnnotationSubnamespaceRector.php +++ /dev/null @@ -1,57 +0,0 @@ -hasWarned) { - return null; - } - \trigger_error(\sprintf('The "%s" rule was deprecated. Use RenameAttributeRector rule instead', self::class)); - \sleep(3); - $this->hasWarned = \true; - return null; - } -} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony72/Rector/StmtsAwareInterface/PushRequestToRequestStackConstructorRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony72/Rector/StmtsAwareInterface/PushRequestToRequestStackConstructorRector.php new file mode 100644 index 000000000..0c96a7ad0 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony72/Rector/StmtsAwareInterface/PushRequestToRequestStackConstructorRector.php @@ -0,0 +1,124 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Move push(request) to "Symfony\\Component\\HttpFoundation\\RequestStack" constructor', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use PHPUnit\Framework\TestCase; + +final class SomeClass extends TestCase +{ + public function run() + { + $requestStack = new RequestStack(); + $request = new Request(); + $requestStack->push($request); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use PHPUnit\Framework\TestCase; + +class SomeClass extends TestCase +{ + public function run() + { + $request = new Request(); + $requestStack = new RequestStack([$request]); + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [StmtsAwareInterface::class]; + } + /** + * @param StmtsAwareInterface $node + */ + public function refactor(Node $node) : ?StmtsAwareInterface + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + $requestStack = null; + $hasChanged = \false; + foreach ($node->stmts as $key => $stmt) { + if (!$stmt instanceof Expression) { + continue; + } + if (!$requestStack instanceof New_) { + $requestStack = $this->matchRequestStackAssignExpr($stmt); + } elseif ($stmt->expr instanceof MethodCall) { + $pushMethodCall = $stmt->expr; + if ($this->isName($pushMethodCall->name, 'push')) { + // possibly request stack push + $array = new Array_([new ArrayItem($pushMethodCall->getArgs()[0]->value)]); + $requestStack->args[] = new Arg($array); + $hasChanged = \true; + unset($node->stmts[$key]); + } + } + } + if ($hasChanged) { + return $node; + } + return null; + } + private function matchRequestStackAssignExpr(Expression $expression) : ?New_ + { + // 1. find new RequestStack assign + if (!$expression->expr instanceof Assign) { + return null; + } + $assign = $expression->expr; + if (!$assign->expr instanceof New_) { + return null; + } + $new = $assign->expr; + if (!$this->isName($new->class, SymfonyClass::REQUEST_STACK)) { + return null; + } + // skip if already some args are filled + if ($new->getArgs() !== []) { + return null; + } + return $new; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/GetMethodToAsTwigAttributeTransformer.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/GetMethodToAsTwigAttributeTransformer.php new file mode 100644 index 000000000..6a9c01510 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/GetMethodToAsTwigAttributeTransformer.php @@ -0,0 +1,111 @@ +localArrayMethodCallableMatcher = $localArrayMethodCallableMatcher; + $this->returnEmptyArrayMethodRemover = $returnEmptyArrayMethodRemover; + $this->reflectionProvider = $reflectionProvider; + } + public function transformClassGetMethodToAttributeMarker(Class_ $class, string $methodName, string $attributeClass, ObjectType $objectType) : bool + { + // check if attribute even exists + if (!$this->reflectionProvider->hasClass($attributeClass)) { + return \false; + } + $getMethod = $class->getMethod($methodName); + if (!$getMethod instanceof ClassMethod) { + return \false; + } + $hasChanged = \false; + foreach ((array) $getMethod->stmts as $stmt) { + // handle return array simple case + if (!$stmt instanceof Return_) { + continue; + } + if (!$stmt->expr instanceof Array_) { + continue; + } + $returnArray = $stmt->expr; + foreach ($returnArray->items as $key => $arrayItem) { + if (!$arrayItem->value instanceof New_) { + continue; + } + if ($arrayItem->value->isFirstClassCallable()) { + continue; + } + $new = $arrayItem->value; + if (\count($new->getArgs()) !== 2) { + continue; + } + $nameArg = $new->getArgs()[0]; + if (!$nameArg->value instanceof String_) { + continue; + } + $secondArg = $new->getArgs()[1]; + if ($this->isLocalCallable($secondArg->value)) { + $localMethodName = $this->localArrayMethodCallableMatcher->match($secondArg->value, $objectType); + if (!\is_string($localMethodName)) { + continue; + } + $localMethod = $class->getMethod($localMethodName); + if (!$localMethod instanceof ClassMethod) { + continue; + } + $this->decorateMethodWithAttribute($localMethod, $attributeClass, $nameArg); + // remove old new fuction instance + unset($returnArray->items[$key]); + $hasChanged = \true; + } + } + $this->returnEmptyArrayMethodRemover->removeClassMethodIfArrayEmpty($class, $returnArray, $methodName); + } + return $hasChanged; + } + private function decorateMethodWithAttribute(ClassMethod $classMethod, string $attributeClass, Arg $name) : void + { + $classMethod->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified($attributeClass), [$name])]); + } + private function isLocalCallable(Expr $expr) : bool + { + if ($expr instanceof MethodCall && $expr->isFirstClassCallable()) { + return \true; + } + return $expr instanceof Array_ && \count($expr->items) === 2; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/CommandArgumentsAndOptionsResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/CommandArgumentsAndOptionsResolver.php new file mode 100644 index 000000000..04fe694ff --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/CommandArgumentsAndOptionsResolver.php @@ -0,0 +1,105 @@ +valueResolver = $valueResolver; + $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; + } + /** + * @return CommandArgument[] + */ + public function collectCommandArguments(ClassMethod $configureClassMethod) : array + { + $addArgumentMethodCalls = $this->findMethodCallsByName($configureClassMethod, 'addArgument'); + $commandArguments = []; + foreach ($addArgumentMethodCalls as $addArgumentMethodCall) { + // @todo extract name, type and requirements + $addArgumentArgs = $addArgumentMethodCall->getArgs(); + $optionName = $this->valueResolver->getValue($addArgumentArgs[0]->value); + if ($optionName === null) { + // we need string value, otherwise param will not have a name + throw new ShouldNotHappenException('Argument name is required'); + } + $mode = isset($addArgumentArgs[1]) ? $this->valueResolver->getValue($addArgumentArgs[1]->value) : null; + if ($mode !== null && !\is_numeric($mode)) { + // we need numeric value or null, otherwise param will not have a name + throw new ShouldNotHappenException('Argument mode is required to be null or numeric'); + } + $description = isset($addArgumentArgs[2]) ? $this->valueResolver->getValue($addArgumentArgs[2]->value) : null; + if (!\is_string($description)) { + // we need string value, otherwise param will not have a name + throw new ShouldNotHappenException('Argument description is required'); + } + $commandArguments[] = new CommandArgument($addArgumentArgs[0]->value, $addArgumentArgs[1]->value, $addArgumentArgs[2]->value); + } + return $commandArguments; + } + /** + * @return CommandOption[] + */ + public function collectCommandOptions(ClassMethod $configureClassMethod) : array + { + $addOptionMethodCalls = $this->findMethodCallsByName($configureClassMethod, 'addOption'); + $commandOptionMetadatas = []; + foreach ($addOptionMethodCalls as $addOptionMethodCall) { + // @todo extract name, type and requirements + $addOptionArgs = $addOptionMethodCall->getArgs(); + $nameArgValue = $addOptionArgs[0]->value; + if (!$nameArgValue instanceof String_) { + // we need string value, otherwise param will not have a name + throw new ShouldNotHappenException('Option name is required'); + } + $optionName = $nameArgValue->value; + $commandOptionMetadatas[] = new CommandOption($optionName); + } + return $commandOptionMetadatas; + } + /** + * @return MethodCall[] + */ + private function findMethodCallsByName(ClassMethod $classMethod, string $desiredMethodName) : array + { + $calls = []; + $shouldReverse = \false; + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (Node $node) use(&$calls, $desiredMethodName, &$shouldReverse) { + if (!$node instanceof MethodCall) { + return null; + } + if (!$node->name instanceof Identifier) { + return null; + } + if ($node->name->toString() === $desiredMethodName) { + if ($node->var instanceof MethodCall) { + $shouldReverse = \true; + } + $calls[] = $node; + } + return null; + }); + return $shouldReverse ? \array_reverse($calls) : $calls; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/LocalArrayMethodCallableMatcher.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/LocalArrayMethodCallableMatcher.php new file mode 100644 index 000000000..e090749c4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeAnalyzer/LocalArrayMethodCallableMatcher.php @@ -0,0 +1,46 @@ +nodeTypeResolver = $nodeTypeResolver; + } + public function match(Expr $expr, ObjectType $objectType) : ?string + { + if ($expr instanceof MethodCall) { + if (!$expr->name instanceof Identifier) { + return null; + } + if (!$this->nodeTypeResolver->isObjectType($expr->var, $objectType)) { + return null; + } + return $expr->name->toString(); + } + if ($expr instanceof Array_) { + if (!$this->nodeTypeResolver->isObjectType($expr->items[0]->value, $objectType)) { + return null; + } + $secondItem = $expr->items[1]; + if (!$secondItem->value instanceof String_) { + return null; + } + return $secondItem->value->value; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php new file mode 100644 index 000000000..f09f1d8d4 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php @@ -0,0 +1,79 @@ +valueResolver = $valueResolver; + } + /** + * @param CommandArgument[] $commandArguments + * @param CommandOption[] $commandOptions + * @return Param[] + */ + public function createParams(array $commandArguments, array $commandOptions) : array + { + $argumentParams = $this->createArgumentParams($commandArguments); + $optionParams = $this->createOptionParams($commandOptions); + return \array_merge($argumentParams, $optionParams); + } + /** + * @param CommandArgument[] $commandArguments + * @return Param[] + */ + private function createArgumentParams(array $commandArguments) : array + { + $argumentParams = []; + foreach ($commandArguments as $commandArgument) { + $argumentName = (string) $this->valueResolver->getValue($commandArgument->getName()); + $variableName = \str_replace('-', '_', $argumentName); + $argumentParam = new Param(new Variable($variableName)); + $argumentParam->type = new Identifier('string'); + $modeValue = $this->valueResolver->getValue($commandArgument->getMode()); + if ($modeValue === null || $modeValue === 2) { + $argumentParam->type = new NullableType($argumentParam->type); + } + // @todo fill type or default value + // @todo default string, multiple values array + $argumentParam->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified(SymfonyAttribute::COMMAND_ARGUMENT), [new Arg($commandArgument->getName(), \false, \false, [], new Identifier('name')), new Arg($commandArgument->getDescription(), \false, \false, [], new Identifier('description'))])]); + $argumentParams[] = $argumentParam; + } + return $argumentParams; + } + /** + * @param CommandOption[] $commandOptions + * @return Param[] + */ + private function createOptionParams(array $commandOptions) : array + { + $optionParams = []; + foreach ($commandOptions as $commandOption) { + $optionName = $commandOption->getName(); + $variableName = \str_replace('-', '_', $optionName); + $optionParam = new Param(new Variable($variableName)); + // @todo fill type or default value + $optionParam->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified(SymfonyAttribute::COMMAND_OPTION))]); + $optionParams[] = $optionParam; + } + return $optionParams; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeRemover/ReturnEmptyArrayMethodRemover.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeRemover/ReturnEmptyArrayMethodRemover.php new file mode 100644 index 000000000..a0db0d7c5 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/NodeRemover/ReturnEmptyArrayMethodRemover.php @@ -0,0 +1,26 @@ +items) !== 0) { + return; + } + foreach ($class->stmts as $key => $classStmt) { + if (!$classStmt instanceof ClassMethod) { + continue; + } + if ($classStmt->name->toString() !== $methodName) { + continue; + } + unset($class->stmts[$key]); + } + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/CommandHelpToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/CommandHelpToAttributeRector.php new file mode 100644 index 000000000..6c02f836e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/CommandHelpToAttributeRector.php @@ -0,0 +1,175 @@ +reflectionProvider = $reflectionProvider; + $this->attributeFinder = $attributeFinder; + } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::ATTRIBUTES; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Moves $this->setHelp() to the "help" named argument of #[AsCommand]', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; + +#[AsCommand(name: 'app:some')] +final class SomeCommand extends Command +{ + protected function configure(): void + { + $this->setHelp('Some help text'); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; + +#[AsCommand(name: 'app:some', help: <<<'TXT' +Some help text +TXT)] +final class SomeCommand extends Command +{ +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if ($node->isAbstract()) { + return null; + } + if (!$this->reflectionProvider->hasClass(SymfonyAttribute::AS_COMMAND)) { + return null; + } + if (!$this->isObjectType($node, new ObjectType(SymfonyClass::COMMAND))) { + return null; + } + $asCommandAttribute = $this->attributeFinder->findAttributeByClass($node, SymfonyAttribute::AS_COMMAND); + if (!$asCommandAttribute instanceof Attribute) { + return null; + } + foreach ($asCommandAttribute->args as $arg) { + if ((($nullsafeVariable1 = $arg->name) ? $nullsafeVariable1->toString() : null) === 'help') { + return null; + } + } + $configureClassMethod = $node->getMethod(CommandMethodName::CONFIGURE); + if (!$configureClassMethod instanceof ClassMethod) { + return null; + } + $helpExpr = $this->findAndRemoveSetHelpExpr($configureClassMethod); + if (!$helpExpr instanceof String_) { + return null; + } + $wrappedHelpString = new String_($helpExpr->value, [Attributekey::KIND => String_::KIND_NOWDOC, AttributeKey::DOC_LABEL => 'TXT']); + $asCommandAttribute->args[] = new Arg($wrappedHelpString, \false, \false, [], new Identifier('help')); + if ($configureClassMethod->stmts === []) { + unset($configureClassMethod); + } + return $node; + } + /** + * Returns the argument passed to setHelp() and removes the MethodCall node. + */ + private function findAndRemoveSetHelpExpr(ClassMethod $configureClassMethod) : ?String_ + { + $helpString = null; + $this->traverseNodesWithCallable((array) $configureClassMethod->stmts, function (Node $node) use(&$helpString) { + if ($node instanceof Class_ || $node instanceof Function_) { + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if (!$node instanceof MethodCall) { + return null; + } + if (!$this->isName($node->name, 'setHelp')) { + return null; + } + if ($node->isFirstClassCallable() || !isset($node->getArgs()[0])) { + return null; + } + $argExpr = $node->getArgs()[0]->value; + if ($argExpr instanceof String_) { + $helpString = $argExpr; + } + $parent = $node->getAttribute('parent'); + if ($parent instanceof Expression) { + unset($parent); + } + return $node->var; + }); + foreach ((array) $configureClassMethod->stmts as $key => $stmt) { + if ($this->isExpressionVariableThis($stmt)) { + unset($configureClassMethod->stmts[$key]); + } + } + return $helpString; + } + private function isExpressionVariableThis(Stmt $stmt) : bool + { + if (!$stmt instanceof Expression) { + return \false; + } + if (!$stmt->expr instanceof Variable) { + return \false; + } + return $this->isName($stmt->expr, 'this'); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFiltersToAsTwigFilterAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFiltersToAsTwigFilterAttributeRector.php new file mode 100644 index 000000000..6c9684c6e --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFiltersToAsTwigFilterAttributeRector.php @@ -0,0 +1,86 @@ +getMethodToAsTwigAttributeTransformer = $getMethodToAsTwigAttributeTransformer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Changes getFilters() in TwigExtension to #[TwigFilter] marker attribute above function', [new CodeSample(<<<'CODE_SAMPLE' +use Twig\Extension\AbstractExtension; + +class SomeClass extends AbstractExtension +{ + public function getFilters() + { + return [ + new \Twig\TwigFilter('filter_name', [$this, 'localMethod']), + ]; + } + + public function localMethod($value) + { + return $value; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Twig\Extension\AbstractExtension; +use Twig\Attribute\AsTwigFilter; + +class SomeClass extends AbstractExtension +{ + #[TwigFilter('filter_name')] + public function localMethod($value) + { + return $value; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if ($node->isAbstract() || $node->isAnonymous()) { + return null; + } + $twigExtensionObjectType = new ObjectType(TwigClass::TWIG_EXTENSION); + if (!$this->isObjectType($node, $twigExtensionObjectType)) { + return null; + } + $hasChanged = $this->getMethodToAsTwigAttributeTransformer->transformClassGetMethodToAttributeMarker($node, 'getFilters', TwigClass::AS_TWIG_FILTER_ATTRIBUTE, $twigExtensionObjectType); + if ($hasChanged) { + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFunctionsToAsTwigFunctionAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFunctionsToAsTwigFunctionAttributeRector.php new file mode 100644 index 000000000..de723d8f8 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/GetFunctionsToAsTwigFunctionAttributeRector.php @@ -0,0 +1,86 @@ +getMethodToAsTwigAttributeTransformer = $getMethodToAsTwigAttributeTransformer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Changes getFunctions() in TwigExtension to #[AsTwigFunction] marker attribute above local class method', [new CodeSample(<<<'CODE_SAMPLE' +use Twig\Extension\AbstractExtension; + +class SomeClass extends AbstractExtension +{ + public function getFunctions() + { + return [ + new \Twig\TwigFunction('function_name', [$this, 'localMethod']), + ]; + } + + public function localMethod($value) + { + return $value; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Twig\Extension\AbstractExtension; +use Twig\Attribute\AsTwigFunction; + +class SomeClass extends AbstractExtension +{ + #[AsTwigFunction('function_name')] + public function localMethod($value) + { + return $value; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if ($node->isAbstract() || $node->isAnonymous()) { + return null; + } + $twigExtensionObjectType = new ObjectType(TwigClass::TWIG_EXTENSION); + if (!$this->isObjectType($node, $twigExtensionObjectType)) { + return null; + } + $hasChanged = $this->getMethodToAsTwigAttributeTransformer->transformClassGetMethodToAttributeMarker($node, 'getFunctions', TwigClass::AS_TWIG_FUNCTION_ATTRIBUTE, $twigExtensionObjectType); + if (!$hasChanged) { + return null; + } + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector.php new file mode 100644 index 000000000..6f6883574 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector.php @@ -0,0 +1,266 @@ +attributeFinder = $attributeFinder; + $this->commandArgumentsAndOptionsResolver = $commandArgumentsAndOptionsResolver; + $this->commandInvokeParamsFactory = $commandInvokeParamsFactory; + $this->valueResolver = $valueResolver; + $this->visibilityManipulator = $visibilityManipulator; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change Symfony Command with execute() + configure() to __invoke() with attributes', [new CodeSample(<<<'CODE_SAMPLE' +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputOption; + +#[AsCommand(name: 'some_name')] +final class SomeCommand extends Command +{ + public function configure() + { + $this->addArgument('argument', InputArgument::REQUIRED, 'Argument description'); + $this->addOption('option', 'o', InputOption::VALUE_NONE, 'Option description'); + } + + public function execute(InputInterface $input, OutputInterface $output) + { + $someArgument = $input->getArgument('argument'); + $someOption = $input->getOption('option'); + + // ... + + return 1; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Argument; +use Symfony\Component\Console\Option; + +final class SomeCommand +{ + public function __invoke( + #[Argument(name: 'argument', description: 'Argument description')] + string $argument, + #[Option] + bool $option = false, + ) { + $someArgument = $argument; + $someOption = $option; + + // ... + + return 1; + } +} +CODE_SAMPLE +)]); + } + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Class_ + { + if (!$node->extends instanceof Name) { + return null; + } + // handle only direct child classes, to keep safe + if (!$this->isName($node->extends, SymfonyClass::COMMAND)) { + return null; + } + if ($this->isComplexCommand($node)) { + return null; + } + // as command attribute is required, its handled by previous symfony versions + // @todo possibly to add it here to handle multiple cases + if (!$this->attributeFinder->findAttributeByClass($node, SymfonyAttribute::AS_COMMAND) instanceof Attribute) { + return null; + } + // 1. rename execute to __invoke + $executeClassMethod = $node->getMethod(CommandMethodName::EXECUTE); + if (!$executeClassMethod instanceof ClassMethod) { + return null; + } + $executeClassMethod->name = new Identifier('__invoke'); + $this->visibilityManipulator->makePublic($executeClassMethod); + // 2. fetch configure method to get arguments and options metadata + $configureClassMethod = $node->getMethod(CommandMethodName::CONFIGURE); + if ($configureClassMethod instanceof ClassMethod) { + // 3. create arguments and options parameters + // @todo + $commandArguments = $this->commandArgumentsAndOptionsResolver->collectCommandArguments($configureClassMethod); + $commandOptions = $this->commandArgumentsAndOptionsResolver->collectCommandOptions($configureClassMethod); + // 4. remove configure() method + $this->removeConfigureClassMethod($node); + // 5. decorate __invoke method with attributes + $invokeParams = $this->commandInvokeParamsFactory->createParams($commandArguments, $commandOptions); + } else { + $invokeParams = []; + } + $executeClassMethod->params = \array_merge($invokeParams, [$executeClassMethod->params[1]]); + // 6. remove parent class + $node->extends = null; + foreach ($executeClassMethod->attrGroups as $attrGroupKey => $attrGroup) { + foreach ($attrGroup->attrs as $attributeKey => $attr) { + if ($this->isName($attr->name, 'Override')) { + unset($attrGroup->attrs[$attributeKey]); + } + } + if ($attrGroup->attrs === []) { + unset($executeClassMethod->attrGroups[$attrGroupKey]); + } + } + if ($configureClassMethod instanceof ClassMethod) { + // 7. replace input->getArgument() and input->getOption() calls with direct variable access + $this->replaceInputArgumentOptionFetchWithVariables($executeClassMethod); + } + return $node; + } + /** + * Skip commands with interact() or initialize() methods as modify the argument/option values + */ + private function isComplexCommand(Class_ $class) : bool + { + if ($class->getMethod(CommandMethodName::INTERACT) instanceof ClassMethod) { + return \true; + } + return $class->getMethod(CommandMethodName::INITIALIZE) instanceof ClassMethod; + } + private function removeConfigureClassMethod(Class_ $class) : void + { + foreach ($class->stmts as $key => $stmt) { + if (!$stmt instanceof ClassMethod) { + continue; + } + if (!$this->isName($stmt->name, CommandMethodName::CONFIGURE)) { + continue; + } + foreach ((array) $stmt->stmts as $innerKey => $innerStmt) { + if (!$innerStmt instanceof Expression) { + continue; + } + $expr = $innerStmt->expr; + if (!$expr instanceof MethodCall) { + continue; + } + if ($this->isFluentArgumentOptionChain($expr)) { + unset($stmt->stmts[$innerKey]); + continue; + } + if ($this->isName($expr->var, 'this') && $this->isNames($expr->name, self::MIGRATED_CONFIGURE_CALLS)) { + unset($stmt->stmts[$innerKey]); + } + } + // 2. if configure() has become empty → remove the method itself + if ($stmt->stmts === [] || $stmt->stmts === null) { + unset($class->stmts[$key]); + } + return; + } + } + private function replaceInputArgumentOptionFetchWithVariables(ClassMethod $executeClassMethod) : void + { + $this->traverseNodesWithCallable($executeClassMethod->stmts, function (Node $node) : ?Variable { + if (!$node instanceof MethodCall) { + return null; + } + if (!$this->isName($node->var, 'input')) { + return null; + } + if (!$this->isNames($node->name, ['getOption', 'getArgument'])) { + return null; + } + $firstArgValue = $node->getArgs()[0]->value; + if ($firstArgValue instanceof ClassConstFetch || $firstArgValue instanceof ConstFetch) { + $variableName = $this->valueResolver->getValue($firstArgValue); + return new Variable(\str_replace('-', '_', $variableName)); + } + if (!$firstArgValue instanceof String_) { + // unable to resolve argument/option name + throw new ShouldNotHappenException(); + } + $variableName = $firstArgValue->value; + return new Variable(\str_replace('-', '_', $variableName)); + }); + } + private function isFluentArgumentOptionChain(MethodCall $methodCall) : bool + { + $current = $methodCall; + while ($current instanceof MethodCall) { + // every link must be addArgument() or addOption() + if (!$this->isNames($current->name, self::MIGRATED_CONFIGURE_CALLS)) { + return \false; + } + $current = $current->var; + // go one step left + } + // the left-most var must be $this + return $current instanceof Variable && $this->isName($current, 'this'); + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandArgument.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandArgument.php new file mode 100644 index 000000000..920d32e60 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandArgument.php @@ -0,0 +1,39 @@ +name = $name; + $this->mode = $mode; + $this->description = $description; + } + public function getName() : Expr + { + return $this->name; + } + public function getMode() : Expr + { + return $this->mode; + } + public function getDescription() : Expr + { + return $this->description; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandOption.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandOption.php new file mode 100644 index 000000000..7c44bce9c --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony73/ValueObject/CommandOption.php @@ -0,0 +1,20 @@ +name = $name; + } + public function getName() : string + { + return $this->name; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Twig134/Rector/Return_/SimpleFunctionAndFilterRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Twig134/Rector/Return_/SimpleFunctionAndFilterRector.php index e0e31608c..7120c60b1 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Twig134/Rector/Return_/SimpleFunctionAndFilterRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Twig134/Rector/Return_/SimpleFunctionAndFilterRector.php @@ -5,9 +5,9 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; @@ -30,16 +30,14 @@ final class SimpleFunctionAndFilterRector extends AbstractRector { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** - * @var array> + * @var array */ private const OLD_TO_NEW_CLASSES = ['Twig_Function_Method' => 'Twig_SimpleFunction', 'Twig_Filter_Method' => 'Twig_SimpleFilter']; public function __construct(ReflectionResolver $reflectionResolver, ValueResolver $valueResolver) @@ -134,10 +132,10 @@ private function shouldSkip(ClassMethod $classMethod) : bool if (!$classReflection instanceof ClassReflection) { return \true; } - if (!$classReflection->isSubclassOf('Twig_Extension')) { + if (!$classReflection->is('Twig_Extension')) { return \true; } - return !$this->nodeNameResolver->isNames($classMethod, ['getFunctions', 'getFilters']); + return !$this->isNames($classMethod, ['getFunctions', 'getFilters']); } private function processArrayItem(ArrayItem $arrayItem, Type $newNodeType, bool &$hasChanged) : void { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Annotation/AnnotationAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Annotation/AnnotationAnalyzer.php index 2e8be3391..b3ae1ae19 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Annotation/AnnotationAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Annotation/AnnotationAnalyzer.php @@ -4,45 +4,28 @@ namespace Rector\Symfony\Annotation; 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\Doctrine\NodeAnalyzer\AttrinationFinder; use Rector\Symfony\Enum\SymfonyAnnotation; final class AnnotationAnalyzer { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; - public function __construct(PhpDocInfoFactory $phpDocInfoFactory) + private AttrinationFinder $attrinationFinder; + public function __construct(AttrinationFinder $attrinationFinder) { - $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->attrinationFinder = $attrinationFinder; } public function hasClassMethodWithTemplateAnnotation(Class_ $class) : bool { - $classTemplateAnnotation = $this->getDoctrineAnnotationTagValueNode($class, SymfonyAnnotation::TEMPLATE); - if ($classTemplateAnnotation instanceof DoctrineAnnotationTagValueNode) { + if ($this->attrinationFinder->hasByOne($class, SymfonyAnnotation::TEMPLATE)) { return \true; } foreach ($class->getMethods() as $classMethod) { - $classMethodTemplateAnnotation = $this->getDoctrineAnnotationTagValueNode($classMethod, SymfonyAnnotation::TEMPLATE); - if ($classMethodTemplateAnnotation instanceof DoctrineAnnotationTagValueNode) { + if ($this->attrinationFinder->hasByOne($classMethod, SymfonyAnnotation::TEMPLATE)) { return \true; } } return \false; } - /** - * @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod $node - */ - public function getDoctrineAnnotationTagValueNode($node, string $annotationClass) : ?DoctrineAnnotationTagValueNode - { - $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); - if (!$phpDocInfo instanceof PhpDocInfo) { - return null; - } - return $phpDocInfo->getByAnnotationClass($annotationClass); - } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ApplicationMetadata/ListenerServiceDefinitionProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ApplicationMetadata/ListenerServiceDefinitionProvider.php index 271c6dbd9..0a4f00059 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ApplicationMetadata/ListenerServiceDefinitionProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ApplicationMetadata/ListenerServiceDefinitionProvider.php @@ -11,22 +11,18 @@ final class ListenerServiceDefinitionProvider { /** * @readonly - * @var \Rector\Symfony\DataProvider\ServiceMapProvider */ - private $serviceMapProvider; + private ServiceMapProvider $serviceMapProvider; /** * @var string * @see https://regex101.com/r/j6SAga/1 */ private const SYMFONY_FAMILY_REGEX = '#^(Symfony|Sensio|Doctrine)\\b#'; - /** - * @var bool - */ - private $areListenerClassesLoaded = \false; + private bool $areListenerClassesLoaded = \false; /** * @var ServiceDefinition[][][] */ - private $listenerClassesToEvents = []; + private array $listenerClassesToEvents = []; public function __construct(ServiceMapProvider $serviceMapProvider) { $this->serviceMapProvider = $serviceMapProvider; @@ -51,6 +47,12 @@ public function extract() : array continue; } $eventName = $tag->getEvent(); + // fill method based on the event + if ($tag->getMethod() === '' && \strncmp($tag->getEvent(), 'kernel.', \strlen('kernel.')) === 0) { + [, $event] = \explode('.', $tag->getEvent()); + $methodName = 'onKernel' . \ucfirst($event); + $tag->changeMethod($methodName); + } $this->listenerClassesToEvents[$eventListener->getClass()][$eventName][] = $eventListener; } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/NodeAnalyzer/ControllerMethodAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/NodeAnalyzer/ControllerMethodAnalyzer.php index 54fe9a5ca..945e1fdd3 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/NodeAnalyzer/ControllerMethodAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/NodeAnalyzer/ControllerMethodAnalyzer.php @@ -9,9 +9,8 @@ final class ControllerMethodAnalyzer { /** * @readonly - * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ - private $controllerAnalyzer; + private ControllerAnalyzer $controllerAnalyzer; public function __construct(ControllerAnalyzer $controllerAnalyzer) { $this->controllerAnalyzer = $controllerAnalyzer; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php index b4474f071..c67b1e09d 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/ContainerServiceProvider.php @@ -6,14 +6,11 @@ use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Exception\ShouldNotHappenException; -use RectorPrefix202411\Symfony\Component\DependencyInjection\Container; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\DependencyInjection\Container; +use RectorPrefix202506\Webmozart\Assert\Assert; final class ContainerServiceProvider { - /** - * @var object|null - */ - private $container; + private ?object $container = null; public function provideByName(string $serviceName) : object { /** @var Container $symfonyContainer */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php index 7da3cb2bb..271935925 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Bridge/Symfony/Routing/SymfonyRoutesProvider.php @@ -6,8 +6,8 @@ use Rector\Symfony\Bridge\Symfony\ContainerServiceProvider; use Rector\Symfony\Contract\Bridge\Symfony\Routing\SymfonyRoutesProviderInterface; use Rector\Symfony\ValueObject\SymfonyRouteMetadata; -use RectorPrefix202411\Symfony\Component\Routing\RouterInterface; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Symfony\Component\Routing\RouterInterface; +use RectorPrefix202506\Webmozart\Assert\Assert; /** * @api part of AddRouteAnnotationRector */ @@ -15,13 +15,12 @@ final class SymfonyRoutesProvider implements SymfonyRoutesProviderInterface { /** * @readonly - * @var \Rector\Symfony\Bridge\Symfony\ContainerServiceProvider */ - private $containerServiceProvider; + private ContainerServiceProvider $containerServiceProvider; /** * @var SymfonyRouteMetadata[] */ - private $symfonyRouteMetadatas = []; + private array $symfonyRouteMetadatas = []; public function __construct(ContainerServiceProvider $containerServiceProvider) { $this->containerServiceProvider = $containerServiceProvider; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/BundleClassResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/BundleClassResolver.php index 1272adc20..953a2da50 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/BundleClassResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/BundleClassResolver.php @@ -15,24 +15,20 @@ final class BundleClassResolver { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Parser\RectorParser */ - private $rectorParser; + private RectorParser $rectorParser; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, RectorParser $rectorParser, ReflectionProvider $reflectionProvider) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceMapProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceMapProvider.php index b2ea9ec0a..0367ecc00 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceMapProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceMapProvider.php @@ -14,13 +14,9 @@ final class ServiceMapProvider { /** * @readonly - * @var \Rector\Symfony\ValueObjectFactory\ServiceMapFactory */ - private $serviceMapFactory; - /** - * @var \Rector\Symfony\ValueObject\ServiceMap\ServiceMap|null - */ - private $serviceMap; + private ServiceMapFactory $serviceMapFactory; + private ?ServiceMap $serviceMap = null; public function __construct(ServiceMapFactory $serviceMapFactory, ?ServiceMap $serviceMap = null) { $this->serviceMapFactory = $serviceMapFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceNameToTypeUniqueProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceNameToTypeUniqueProvider.php index 9bc22f6b5..279d58a3c 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceNameToTypeUniqueProvider.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/DataProvider/ServiceNameToTypeUniqueProvider.php @@ -7,9 +7,8 @@ final class ServiceNameToTypeUniqueProvider { /** * @readonly - * @var \Rector\Symfony\DataProvider\ServiceMapProvider */ - private $serviceMapProvider; + private \Rector\Symfony\DataProvider\ServiceMapProvider $serviceMapProvider; public function __construct(\Rector\Symfony\DataProvider\ServiceMapProvider $serviceMapProvider) { $this->serviceMapProvider = $serviceMapProvider; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Enum/CommandMethodName.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Enum/CommandMethodName.php new file mode 100644 index 000000000..207c673f0 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Enum/CommandMethodName.php @@ -0,0 +1,12 @@ + */ @@ -20,7 +19,7 @@ final class FormTypeStringToTypeProvider /** * @var array */ - private $customServiceFormTypeByAlias = []; + private array $customServiceFormTypeByAlias = []; public function __construct(ServiceMapProvider $serviceMapProvider) { $this->serviceMapProvider = $serviceMapProvider; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/MessengerHelper.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/MessengerHelper.php index 12141b90e..75a4161f2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/MessengerHelper.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/MessengerHelper.php @@ -16,26 +16,24 @@ final class MessengerHelper { /** * @readonly - * @var \Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory */ - private $phpAttributeGroupFactory; + private PhpAttributeGroupFactory $phpAttributeGroupFactory; /** * @readonly - * @var \Rector\PhpAttribute\AttributeArrayNameInliner */ - private $attributeArrayNameInliner; + private AttributeArrayNameInliner $attributeArrayNameInliner; /** * @readonly - * @var \Rector\Symfony\DataProvider\ServiceMapProvider */ - private $serviceMapProvider; + private ServiceMapProvider $serviceMapProvider; public const MESSAGE_HANDLER_INTERFACE = 'Symfony\\Component\\Messenger\\Handler\\MessageHandlerInterface'; public const MESSAGE_SUBSCRIBER_INTERFACE = 'Symfony\\Component\\Messenger\\Handler\\MessageSubscriberInterface'; public const AS_MESSAGE_HANDLER_ATTRIBUTE = 'Symfony\\Component\\Messenger\\Attribute\\AsMessageHandler'; + private string $messengerTagName = 'messenger.message_handler'; /** - * @var string + * @var ServiceDefinition[] */ - private $messengerTagName = 'messenger.message_handler'; + private array $handlersFromServices = []; public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, AttributeArrayNameInliner $attributeArrayNameInliner, ServiceMapProvider $serviceMapProvider) { $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; @@ -64,8 +62,12 @@ public function extractOptionsFromServiceDefinition(ServiceDefinition $serviceDe */ public function getHandlersFromServices() : array { + if ($this->handlersFromServices !== []) { + return $this->handlersFromServices; + } $serviceMap = $this->serviceMapProvider->provide(); - return $serviceMap->getServicesByTag($this->messengerTagName); + $this->handlersFromServices = $serviceMap->getServicesByTag($this->messengerTagName); + return $this->handlersFromServices; } /** * @param array $options diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php index f75e873ca..7ccd851f2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Helper/TemplateGuesser.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Symfony\Helper; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\Strings; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; @@ -18,14 +18,12 @@ final class TemplateGuesser { /** * @readonly - * @var \Rector\Symfony\BundleClassResolver */ - private $bundleClassResolver; + private BundleClassResolver $bundleClassResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @var string * @see https://regex101.com/r/yZAUAC/1 diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/ClassAnnotationAssertResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/ClassAnnotationAssertResolver.php index 258b0f893..0c2b0c415 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/ClassAnnotationAssertResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/ClassAnnotationAssertResolver.php @@ -13,14 +13,12 @@ final class ClassAnnotationAssertResolver { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher */ - private $stmtMethodCallMatcher; + private \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher $stmtMethodCallMatcher; /** * @readonly - * @var \Rector\Symfony\NodeFactory\Annotations\DoctrineAnnotationFromNewFactory */ - private $doctrineAnnotationFromNewFactory; + private DoctrineAnnotationFromNewFactory $doctrineAnnotationFromNewFactory; public function __construct(\Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher $stmtMethodCallMatcher, DoctrineAnnotationFromNewFactory $doctrineAnnotationFromNewFactory) { $this->stmtMethodCallMatcher = $stmtMethodCallMatcher; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/MethodCallAnnotationAssertResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/MethodCallAnnotationAssertResolver.php index 150b1b0fb..f0f99521e 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/MethodCallAnnotationAssertResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/MethodCallAnnotationAssertResolver.php @@ -13,19 +13,16 @@ final class MethodCallAnnotationAssertResolver { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Symfony\NodeFactory\Annotations\DoctrineAnnotationFromNewFactory */ - private $doctrineAnnotationFromNewFactory; + private DoctrineAnnotationFromNewFactory $doctrineAnnotationFromNewFactory; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher */ - private $stmtMethodCallMatcher; + private \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher $stmtMethodCallMatcher; public function __construct(ValueResolver $valueResolver, DoctrineAnnotationFromNewFactory $doctrineAnnotationFromNewFactory, \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher $stmtMethodCallMatcher) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/PropertyAnnotationAssertResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/PropertyAnnotationAssertResolver.php index 344b3f4c3..aee32dee2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/PropertyAnnotationAssertResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/PropertyAnnotationAssertResolver.php @@ -13,19 +13,16 @@ final class PropertyAnnotationAssertResolver { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Symfony\NodeFactory\Annotations\DoctrineAnnotationFromNewFactory */ - private $doctrineAnnotationFromNewFactory; + private DoctrineAnnotationFromNewFactory $doctrineAnnotationFromNewFactory; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher */ - private $stmtMethodCallMatcher; + private \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher $stmtMethodCallMatcher; public function __construct(ValueResolver $valueResolver, DoctrineAnnotationFromNewFactory $doctrineAnnotationFromNewFactory, \Rector\Symfony\NodeAnalyzer\Annotations\StmtMethodCallMatcher $stmtMethodCallMatcher) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/StmtMethodCallMatcher.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/StmtMethodCallMatcher.php index f5149dd7e..1d0c2e9b6 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/StmtMethodCallMatcher.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Annotations/StmtMethodCallMatcher.php @@ -11,9 +11,8 @@ final class StmtMethodCallMatcher { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ClassAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ClassAnalyzer.php index d1cd58006..1c7d27f77 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ClassAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ClassAnalyzer.php @@ -9,9 +9,8 @@ final class ClassAnalyzer { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/DependencyInjectionMethodCallAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/DependencyInjectionMethodCallAnalyzer.php index 5e6d890c8..376160514 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/DependencyInjectionMethodCallAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/DependencyInjectionMethodCallAnalyzer.php @@ -16,29 +16,24 @@ final class DependencyInjectionMethodCallAnalyzer { /** * @readonly - * @var \Rector\Naming\Naming\PropertyNaming */ - private $propertyNaming; + private PropertyNaming $propertyNaming; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\ServiceTypeMethodCallResolver */ - private $serviceTypeMethodCallResolver; + private \Rector\Symfony\NodeAnalyzer\ServiceTypeMethodCallResolver $serviceTypeMethodCallResolver; /** * @readonly - * @var \Rector\Php80\NodeAnalyzer\PromotedPropertyResolver */ - private $promotedPropertyResolver; + private PromotedPropertyResolver $promotedPropertyResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeManipulator\PropertyManipulator */ - private $propertyManipulator; + private PropertyManipulator $propertyManipulator; public function __construct(PropertyNaming $propertyNaming, \Rector\Symfony\NodeAnalyzer\ServiceTypeMethodCallResolver $serviceTypeMethodCallResolver, PromotedPropertyResolver $promotedPropertyResolver, NodeNameResolver $nodeNameResolver, PropertyManipulator $propertyManipulator) { $this->propertyNaming = $propertyNaming; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormAddMethodCallAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormAddMethodCallAnalyzer.php index 2105fe896..435803ddf 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormAddMethodCallAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormAddMethodCallAnalyzer.php @@ -12,18 +12,16 @@ final class FormAddMethodCallAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @var ObjectType[] */ - private $formObjectTypes = []; + private array $formObjectTypes = []; public function __construct(NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver) { $this->nodeTypeResolver = $nodeTypeResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormCollectionAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormCollectionAnalyzer.php index 270f3b955..6d5bcb4f9 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormCollectionAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormCollectionAnalyzer.php @@ -11,14 +11,12 @@ final class FormCollectionAnalyzer { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(ValueResolver $valueResolver, NodeNameResolver $nodeNameResolver) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormInstanceToFormClassConstFetchConverter.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormInstanceToFormClassConstFetchConverter.php index 01bfc73ad..95b1164f8 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormInstanceToFormClassConstFetchConverter.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormInstanceToFormClassConstFetchConverter.php @@ -18,24 +18,20 @@ final class FormInstanceToFormClassConstFetchConverter { /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormType\CreateFormTypeOptionsArgMover */ - private $createFormTypeOptionsArgMover; + private CreateFormTypeOptionsArgMover $createFormTypeOptionsArgMover; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\Symfony\NodeAnalyzer\FormType\FormTypeClassResolver */ - private $formTypeClassResolver; + private FormTypeClassResolver $formTypeClassResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(CreateFormTypeOptionsArgMover $createFormTypeOptionsArgMover, NodeFactory $nodeFactory, FormTypeClassResolver $formTypeClassResolver, NodeTypeResolver $nodeTypeResolver) { $this->createFormTypeOptionsArgMover = $createFormTypeOptionsArgMover; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/CreateFormTypeOptionsArgMover.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/CreateFormTypeOptionsArgMover.php index 8e86d1510..213b00077 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/CreateFormTypeOptionsArgMover.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/CreateFormTypeOptionsArgMover.php @@ -4,8 +4,8 @@ namespace Rector\Symfony\NodeAnalyzer\FormType; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use PHPStan\Reflection\ReflectionProvider; @@ -15,14 +15,12 @@ final class CreateFormTypeOptionsArgMover { /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(ReflectionProvider $reflectionProvider, NodeFactory $nodeFactory) { $this->reflectionProvider = $reflectionProvider; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/FormTypeClassResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/FormTypeClassResolver.php index 6e4443948..6c1252057 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/FormTypeClassResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/FormType/FormTypeClassResolver.php @@ -12,14 +12,12 @@ final class FormTypeClassResolver { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/LiteralCallLikeConstFetchReplacer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/LiteralCallLikeConstFetchReplacer.php index 3a4ed52f4..44eb1df54 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/LiteralCallLikeConstFetchReplacer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/LiteralCallLikeConstFetchReplacer.php @@ -7,16 +7,15 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\PhpParser\Node\NodeFactory; final class LiteralCallLikeConstFetchReplacer { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; public function __construct(NodeFactory $nodeFactory) { $this->nodeFactory = $nodeFactory; @@ -35,7 +34,7 @@ public function replaceArgOnPosition(CallLike $callLike, int $argPosition, strin return null; } $arg = $args[$argPosition]; - if (!$arg->value instanceof String_ && !$arg->value instanceof LNumber) { + if (!$arg->value instanceof String_ && !$arg->value instanceof Int_) { return null; } $scalar = $arg->value; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/RouteRequiredParamNameToTypesResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/RouteRequiredParamNameToTypesResolver.php index 9f8f39bbc..07e1e4dab 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/RouteRequiredParamNameToTypesResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/RouteRequiredParamNameToTypesResolver.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\Symfony\NodeAnalyzer; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Attribute; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Type\IntegerType; @@ -22,14 +22,12 @@ final class RouteRequiredParamNameToTypesResolver { /** * @readonly - * @var \Rector\Doctrine\NodeAnalyzer\AttrinationFinder */ - private $attrinationFinder; + private AttrinationFinder $attrinationFinder; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(AttrinationFinder $attrinationFinder, NodeNameResolver $nodeNameResolver) { $this->attrinationFinder = $attrinationFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ServiceTypeMethodCallResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ServiceTypeMethodCallResolver.php index 7ef123488..5645fc6c5 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ServiceTypeMethodCallResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/ServiceTypeMethodCallResolver.php @@ -16,14 +16,12 @@ final class ServiceTypeMethodCallResolver { /** * @readonly - * @var \Rector\Symfony\DataProvider\ServiceMapProvider */ - private $serviceMapProvider; + private ServiceMapProvider $serviceMapProvider; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(ServiceMapProvider $serviceMapProvider, NodeNameResolver $nodeNameResolver) { $this->serviceMapProvider = $serviceMapProvider; @@ -34,7 +32,8 @@ public function resolve(MethodCall $methodCall) : ?Type if (!isset($methodCall->args[0])) { return new MixedType(); } - $argument = $methodCall->getArgs()[0]->value; + $firstArg = $methodCall->getArgs()[0]; + $argument = $firstArg->value; $serviceMap = $this->serviceMapProvider->provide(); if ($argument instanceof String_) { return $serviceMap->getServiceType($argument->value); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyClosureExtensionMatcher.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyClosureExtensionMatcher.php index c25a1d76a..605bb7c31 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyClosureExtensionMatcher.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyClosureExtensionMatcher.php @@ -15,14 +15,12 @@ final class SymfonyClosureExtensionMatcher { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; public function __construct(NodeNameResolver $nodeNameResolver, ValueResolver $valueResolver) { $this->nodeNameResolver = $nodeNameResolver; @@ -35,6 +33,9 @@ public function match(Closure $closure) : ?ExtensionKeyAndConfiguration if (\count($extensionNames) > 2) { return null; } + if ($extensionNames === []) { + return null; + } // warn use early about it, to avoid silent skip $errorMessage = \sprintf('Split extensions "%s" to multiple separated files first', \implode('", "', $extensionNames)); throw new ShouldNotHappenException($errorMessage); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyPhpClosureDetector.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyPhpClosureDetector.php index 58d59ef5c..9569687bf 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyPhpClosureDetector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyPhpClosureDetector.php @@ -7,7 +7,7 @@ use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Name\FullyQualified; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Node\BetterNodeFinder; @@ -15,19 +15,16 @@ final class SymfonyPhpClosureDetector { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->nodeNameResolver = $nodeNameResolver; @@ -63,7 +60,7 @@ public function hasDefaultsAutoconfigure(Closure $closure) : bool continue; } $hasDefaultsAutoconfigure = \true; - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } return null; }); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyTestCaseAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyTestCaseAnalyzer.php index de3531d1e..08f15b93b 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyTestCaseAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/SymfonyTestCaseAnalyzer.php @@ -10,9 +10,8 @@ final class SymfonyTestCaseAnalyzer { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; @@ -23,7 +22,7 @@ public function isInWebTestCase(Node $node) : bool if (!$classReflection instanceof ClassReflection) { return \false; } - return $classReflection->isSubclassOf('Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase'); + return $classReflection->is('Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase'); } /** * @api @@ -34,6 +33,6 @@ public function isInKernelTestCase(Node $node) : bool if (!$classReflection instanceof ClassReflection) { return \false; } - return $classReflection->isSubclassOf('Symfony\\Bundle\\FrameworkBundle\\Test\\KernelTestCase'); + return $classReflection->is('Symfony\\Bundle\\FrameworkBundle\\Test\\KernelTestCase'); } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/AnnotationOrAttributeValueResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/AnnotationOrAttributeValueResolver.php new file mode 100644 index 000000000..df1341ebf --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/AnnotationOrAttributeValueResolver.php @@ -0,0 +1,62 @@ +getValue($desiredKey); + if ($templateParameter instanceof ArrayItemNode) { + $templateParameterValue = $templateParameter->value; + if ($templateParameterValue instanceof StringNode) { + $templateParameterValue = $templateParameterValue->value; + } + if (\is_string($templateParameterValue)) { + return $templateParameterValue; + } + } + $arrayItemNode = $tagValueNodeOrAttribute->getSilentValue(); + if ($arrayItemNode instanceof ArrayItemNode) { + $arrayItemNodeValue = $arrayItemNode->value; + if ($arrayItemNodeValue instanceof StringNode) { + $arrayItemNodeValue = $arrayItemNodeValue->value; + } + if (\is_string($arrayItemNodeValue)) { + return $arrayItemNodeValue; + } + } + return null; + } + foreach ($tagValueNodeOrAttribute->args as $attributeArg) { + if (!$this->isKeyEmptyOrMatch($attributeArg, $desiredKey)) { + continue; + } + if (!$attributeArg->value instanceof String_) { + continue; + } + return $attributeArg->value->value; + } + return null; + } + private function isKeyEmptyOrMatch(Arg $attributeArg, string $desiredKey) : bool + { + if (!$attributeArg->name instanceof Identifier) { + return \true; + } + return $attributeArg->name->toString() === $desiredKey; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationFromNewFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationFromNewFactory.php index f001f58f8..dbbca40b3 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationFromNewFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationFromNewFactory.php @@ -13,9 +13,8 @@ final class DoctrineAnnotationFromNewFactory { /** * @readonly - * @var \Rector\Symfony\NodeFactory\Annotations\DoctrineAnnotationKeyToValuesResolver */ - private $doctrineAnnotationKeyToValuesResolver; + private \Rector\Symfony\NodeFactory\Annotations\DoctrineAnnotationKeyToValuesResolver $doctrineAnnotationKeyToValuesResolver; public function __construct(\Rector\Symfony\NodeFactory\Annotations\DoctrineAnnotationKeyToValuesResolver $doctrineAnnotationKeyToValuesResolver) { $this->doctrineAnnotationKeyToValuesResolver = $doctrineAnnotationKeyToValuesResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationKeyToValuesResolver.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationKeyToValuesResolver.php index 0b9fbe3ad..9e697d7e2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationKeyToValuesResolver.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/DoctrineAnnotationKeyToValuesResolver.php @@ -3,22 +3,20 @@ declare (strict_types=1); namespace Rector\Symfony\NodeFactory\Annotations; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use Rector\PhpParser\Node\Value\ValueResolver; final class DoctrineAnnotationKeyToValuesResolver { /** * @readonly - * @var \Rector\PhpParser\Node\Value\ValueResolver */ - private $valueResolver; + private ValueResolver $valueResolver; /** * @readonly - * @var \Rector\Symfony\NodeFactory\Annotations\StringValueQuoteWrapper */ - private $stringValueQuoteWrapper; + private \Rector\Symfony\NodeFactory\Annotations\StringValueQuoteWrapper $stringValueQuoteWrapper; public function __construct(ValueResolver $valueResolver, \Rector\Symfony\NodeFactory\Annotations\StringValueQuoteWrapper $stringValueQuoteWrapper) { $this->valueResolver = $valueResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/StringValueQuoteWrapper.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/StringValueQuoteWrapper.php index 408a9a4e4..330c5203d 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/StringValueQuoteWrapper.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/Annotations/StringValueQuoteWrapper.php @@ -10,9 +10,8 @@ final class StringValueQuoteWrapper { /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser */ - private $arrayParser; + private ArrayParser $arrayParser; public function __construct(ArrayParser $arrayParser) { $this->arrayParser = $arrayParser; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ArrayFromCompactFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ArrayFromCompactFactory.php index 0ffd4b6bb..27fe83d97 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ArrayFromCompactFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ArrayFromCompactFactory.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Symfony\NodeFactory; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; @@ -13,9 +13,8 @@ final class ArrayFromCompactFactory { /** * @readonly - * @var \Rector\NodeManipulator\FuncCallManipulator */ - private $funcCallManipulator; + private FuncCallManipulator $funcCallManipulator; public function __construct(FuncCallManipulator $funcCallManipulator) { $this->funcCallManipulator = $funcCallManipulator; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/BareLogoutClassMethodFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/BareLogoutClassMethodFactory.php index 104ed6a56..f49c973e9 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/BareLogoutClassMethodFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/BareLogoutClassMethodFactory.php @@ -15,14 +15,12 @@ final class BareLogoutClassMethodFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; public function __construct(NodeFactory $nodeFactory, PhpVersionProvider $phpVersionProvider) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/EventReferenceFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/EventReferenceFactory.php index d01f982e3..42b94ffe9 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/EventReferenceFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/EventReferenceFactory.php @@ -13,14 +13,12 @@ final class EventReferenceFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \PHPStan\Reflection\ReflectionProvider */ - private $reflectionProvider; + private ReflectionProvider $reflectionProvider; public function __construct(NodeFactory $nodeFactory, ReflectionProvider $reflectionProvider) { $this->nodeFactory = $nodeFactory; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/GetSubscribedEventsClassMethodFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/GetSubscribedEventsClassMethodFactory.php index 337b052a4..52518f544 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/GetSubscribedEventsClassMethodFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/GetSubscribedEventsClassMethodFactory.php @@ -3,12 +3,12 @@ declare (strict_types=1); namespace Rector\Symfony\NodeFactory; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Identifier; -use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; @@ -32,34 +32,28 @@ final class GetSubscribedEventsClassMethodFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ - private $visibilityManipulator; + private VisibilityManipulator $visibilityManipulator; /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ - private $phpDocTypeChanger; + private PhpDocTypeChanger $phpDocTypeChanger; /** * @readonly - * @var \Rector\Symfony\NodeFactory\EventReferenceFactory */ - private $eventReferenceFactory; + private \Rector\Symfony\NodeFactory\EventReferenceFactory $eventReferenceFactory; /** * @var string */ @@ -119,7 +113,7 @@ private function createArrayItemFromMethodAndPriority(?int $priority, string $me if ($priority !== null && $priority !== 0) { $methodNameWithPriorityArray = new Array_(); $methodNameWithPriorityArray->items[] = new ArrayItem(new String_($methodName)); - $methodNameWithPriorityArray->items[] = new ArrayItem(new LNumber($priority)); + $methodNameWithPriorityArray->items[] = new ArrayItem(new Int_($priority)); return new ArrayItem($methodNameWithPriorityArray, $expr); } return new ArrayItem(new String_($methodName), $expr); @@ -214,7 +208,7 @@ private function createEventItem(EventListenerTag $eventListenerTag) : ArrayItem if ($eventListenerTag->getPriority() !== 0) { $methodNameWithPriorityArray = new Array_(); $methodNameWithPriorityArray->items[] = new ArrayItem(new String_($eventListenerTag->getMethod())); - $methodNameWithPriorityArray->items[] = new ArrayItem(new LNumber($eventListenerTag->getPriority())); + $methodNameWithPriorityArray->items[] = new ArrayItem(new Int_($eventListenerTag->getPriority())); return new ArrayItem($methodNameWithPriorityArray); } return new ArrayItem(new String_($eventListenerTag->getMethod())); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnLogoutClassMethodFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnLogoutClassMethodFactory.php index 0e62a3190..7d5183bb2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnLogoutClassMethodFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnLogoutClassMethodFactory.php @@ -16,19 +16,16 @@ final class OnLogoutClassMethodFactory { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\Symfony\NodeFactory\BareLogoutClassMethodFactory */ - private $bareLogoutClassMethodFactory; + private \Rector\Symfony\NodeFactory\BareLogoutClassMethodFactory $bareLogoutClassMethodFactory; /** * @readonly - * @var \Rector\NodeAnalyzer\ParamAnalyzer */ - private $paramAnalyzer; + private ParamAnalyzer $paramAnalyzer; /** * @var array */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnSuccessLogoutClassMethodFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnSuccessLogoutClassMethodFactory.php index ccaf27b4d..5832cfca9 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnSuccessLogoutClassMethodFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/OnSuccessLogoutClassMethodFactory.php @@ -13,7 +13,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; -use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PhpParser\Node\NodeFactory; @@ -21,24 +21,20 @@ final class OnSuccessLogoutClassMethodFactory { /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser */ - private $simpleCallableNodeTraverser; + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser; /** * @readonly - * @var \Rector\Symfony\NodeFactory\BareLogoutClassMethodFactory */ - private $bareLogoutClassMethodFactory; + private \Rector\Symfony\NodeFactory\BareLogoutClassMethodFactory $bareLogoutClassMethodFactory; /** * @var string */ @@ -82,7 +78,7 @@ private function replaceRequestWithGetRequest(ClassMethod $classMethod) : void { $this->simpleCallableNodeTraverser->traverseNodesWithCallable($classMethod, function (Node $node) { if ($node instanceof Param) { - return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$node instanceof Variable) { return null; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ThisRenderFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ThisRenderFactory.php index cbb862000..f1b4b8f5f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ThisRenderFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFactory/ThisRenderFactory.php @@ -4,9 +4,10 @@ namespace Rector\Symfony\NodeFactory; use PhpParser\Node\Arg; +use PhpParser\Node\ArrayItem; +use PhpParser\Node\Attribute; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; @@ -22,73 +23,93 @@ use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\NodeFactory; use Rector\Symfony\Helper\TemplateGuesser; +use Rector\Symfony\NodeFactory\Annotations\AnnotationOrAttributeValueResolver; final class ThisRenderFactory { /** * @readonly - * @var \Rector\Symfony\NodeFactory\ArrayFromCompactFactory */ - private $arrayFromCompactFactory; + private \Rector\Symfony\NodeFactory\ArrayFromCompactFactory $arrayFromCompactFactory; /** * @readonly - * @var \Rector\PhpParser\Node\NodeFactory */ - private $nodeFactory; + private NodeFactory $nodeFactory; /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @readonly - * @var \Rector\Symfony\Helper\TemplateGuesser */ - private $templateGuesser; - public function __construct(\Rector\Symfony\NodeFactory\ArrayFromCompactFactory $arrayFromCompactFactory, NodeFactory $nodeFactory, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, TemplateGuesser $templateGuesser) + private TemplateGuesser $templateGuesser; + /** + * @readonly + */ + private AnnotationOrAttributeValueResolver $annotationOrAttributeValueResolver; + public function __construct(\Rector\Symfony\NodeFactory\ArrayFromCompactFactory $arrayFromCompactFactory, NodeFactory $nodeFactory, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, TemplateGuesser $templateGuesser, AnnotationOrAttributeValueResolver $annotationOrAttributeValueResolver) { $this->arrayFromCompactFactory = $arrayFromCompactFactory; $this->nodeFactory = $nodeFactory; $this->nodeNameResolver = $nodeNameResolver; $this->nodeTypeResolver = $nodeTypeResolver; $this->templateGuesser = $templateGuesser; + $this->annotationOrAttributeValueResolver = $annotationOrAttributeValueResolver; } - public function create(?Return_ $return, DoctrineAnnotationTagValueNode $templateDoctrineAnnotationTagValueNode, ClassMethod $classMethod) : MethodCall + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $templateTagValueNodeOrAttribute + */ + public function create(?Return_ $return, $templateTagValueNodeOrAttribute, ClassMethod $classMethod) : MethodCall { - $renderArguments = $this->resolveRenderArguments($return, $templateDoctrineAnnotationTagValueNode, $classMethod); + $renderArguments = $this->resolveRenderArguments($return, $templateTagValueNodeOrAttribute, $classMethod); return $this->nodeFactory->createMethodCall('this', 'render', $renderArguments); } /** * @return Arg[] + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $templateTagValueNodeOrAttribute */ - private function resolveRenderArguments(?Return_ $return, DoctrineAnnotationTagValueNode $templateDoctrineAnnotationTagValueNode, ClassMethod $classMethod) : array + private function resolveRenderArguments(?Return_ $return, $templateTagValueNodeOrAttribute, ClassMethod $classMethod) : array { - $templateNameString = $this->resolveTemplateName($classMethod, $templateDoctrineAnnotationTagValueNode); + $templateNameString = $this->resolveTemplateName($classMethod, $templateTagValueNodeOrAttribute); $arguments = [$templateNameString]; - $parametersExpr = $this->resolveParametersExpr($return, $templateDoctrineAnnotationTagValueNode); + $parametersExpr = $this->resolveParametersExpr($return, $templateTagValueNodeOrAttribute); if ($parametersExpr instanceof Expr) { $arguments[] = new Arg($parametersExpr); } return $this->nodeFactory->createArgs($arguments); } - private function resolveTemplateName(ClassMethod $classMethod, DoctrineAnnotationTagValueNode $templateDoctrineAnnotationTagValueNode) : string + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $templateTagValueNodeOrAttribute + */ + private function resolveTemplateName(ClassMethod $classMethod, $templateTagValueNodeOrAttribute) : string { - $template = $this->resolveTemplate($templateDoctrineAnnotationTagValueNode); + $template = $this->annotationOrAttributeValueResolver->resolve($templateTagValueNodeOrAttribute, 'template'); if (\is_string($template)) { return $template; } return $this->templateGuesser->resolveFromClassMethod($classMethod); } - private function resolveParametersExpr(?Return_ $return, DoctrineAnnotationTagValueNode $templateDoctrineAnnotationTagValueNode) : ?Expr + /** + * @param \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute $templateTagValueNodeOrAttribute + */ + private function resolveParametersExpr(?Return_ $return, $templateTagValueNodeOrAttribute) : ?Expr { $vars = []; - $varsArrayItemNode = $templateDoctrineAnnotationTagValueNode->getValue('vars'); - if ($varsArrayItemNode instanceof ArrayItemNode && $varsArrayItemNode->value instanceof CurlyListNode) { - $vars = $varsArrayItemNode->value->getValues(); + if ($templateTagValueNodeOrAttribute instanceof DoctrineAnnotationTagValueNode) { + $varsArrayItemNode = $templateTagValueNodeOrAttribute->getValue('vars'); + if ($varsArrayItemNode instanceof ArrayItemNode && $varsArrayItemNode->value instanceof CurlyListNode) { + $vars = $varsArrayItemNode->value->getValues(); + } + } else { + foreach ($templateTagValueNodeOrAttribute->args as $arg) { + if ($arg->name !== null && $this->nodeNameResolver->isName($arg->name, 'vars')) { + // @todo might need more work + $vars = $arg->value; + } + } } if ($vars !== []) { return $this->createArrayFromArrayItemNodes($vars); @@ -96,7 +117,16 @@ private function resolveParametersExpr(?Return_ $return, DoctrineAnnotationTagVa if (!$return instanceof Return_) { return null; } - if ($return->expr instanceof Array_ && $return->expr->items !== []) { + if (!$return->expr instanceof Expr) { + return null; + } + $returnExprType = $this->nodeTypeResolver->getType($return->expr); + if ($return->expr instanceof Array_) { + $array = $return->expr; + // no point in returning empty items + if ($array->items === []) { + return null; + } return $return->expr; } if ($return->expr instanceof MethodCall) { @@ -106,6 +136,9 @@ private function resolveParametersExpr(?Return_ $return, DoctrineAnnotationTagVa $compactFunCall = $return->expr; return $this->arrayFromCompactFactory->createArrayFromCompactFuncCall($compactFunCall); } + if ($returnExprType->isArray()->yes()) { + return $return->expr; + } return null; } /** @@ -131,28 +164,4 @@ private function resolveMethodCall(MethodCall $methodCall) : ?Expr } return null; } - private function resolveTemplate(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode) : ?string - { - $templateParameter = $doctrineAnnotationTagValueNode->getValue('template'); - if ($templateParameter instanceof ArrayItemNode) { - $templateParameterValue = $templateParameter->value; - if ($templateParameterValue instanceof StringNode) { - $templateParameterValue = $templateParameterValue->value; - } - if (\is_string($templateParameterValue)) { - return $templateParameterValue; - } - } - $arrayItemNode = $doctrineAnnotationTagValueNode->getSilentValue(); - if ($arrayItemNode instanceof ArrayItemNode) { - $arrayItemNodeValue = $arrayItemNode->value; - if ($arrayItemNodeValue instanceof StringNode) { - $arrayItemNodeValue = $arrayItemNodeValue->value; - } - if (\is_string($arrayItemNodeValue)) { - return $arrayItemNodeValue; - } - } - return null; - } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFinder/EmptyReturnNodeFinder.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFinder/EmptyReturnNodeFinder.php index 93e9d5cda..75f61355b 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFinder/EmptyReturnNodeFinder.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeFinder/EmptyReturnNodeFinder.php @@ -11,9 +11,8 @@ final class EmptyReturnNodeFinder { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder */ - private $betterNodeFinder; + private BetterNodeFinder $betterNodeFinder; public function __construct(BetterNodeFinder $betterNodeFinder) { $this->betterNodeFinder = $betterNodeFinder; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ArrayManipulator.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ArrayManipulator.php index df7f91bee..082d91f52 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ArrayManipulator.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ArrayManipulator.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\Symfony\NodeManipulator; +use PhpParser\Node\ArrayItem; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Scalar\String_; final class ArrayManipulator { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ClassManipulator.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ClassManipulator.php index e9d6dc53e..f99a0e1c5 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ClassManipulator.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeManipulator/ClassManipulator.php @@ -9,9 +9,8 @@ final class ClassManipulator { /** * @readonly - * @var \Rector\NodeNameResolver\NodeNameResolver */ - private $nodeNameResolver; + private NodeNameResolver $nodeNameResolver; public function __construct(NodeNameResolver $nodeNameResolver) { $this->nodeNameResolver = $nodeNameResolver; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/PhpParser/NamedSimplePhpParser.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/PhpParser/NamedSimplePhpParser.php index 348458db8..d0193bba7 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/PhpParser/NamedSimplePhpParser.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/PhpParser/NamedSimplePhpParser.php @@ -12,13 +12,12 @@ final class NamedSimplePhpParser { /** * @readonly - * @var \PhpParser\Parser */ - private $phpParser; + private Parser $phpParser; public function __construct() { $parserFactory = new ParserFactory(); - $this->phpParser = $parserFactory->create(ParserFactory::ONLY_PHP7); + $this->phpParser = $parserFactory->createForNewestSupportedVersion(); } /** * @return Stmt[] diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/FOSRestSetList.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/FOSRestSetList.php index c17bb227b..26d8cbc4c 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/FOSRestSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/FOSRestSetList.php @@ -3,11 +3,12 @@ declare (strict_types=1); namespace Rector\Symfony\Set; -use Rector\Set\Contract\SetListInterface; /** + * @deprecated Use ->withAttributesSets(symfony: true) in rector.php config instead + * * @api used in public */ -final class FOSRestSetList implements SetListInterface +final class FOSRestSetList { /** * @var string diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/JMSSetList.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/JMSSetList.php index 99c3e40af..d30cac89f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/JMSSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/JMSSetList.php @@ -3,11 +3,12 @@ declare (strict_types=1); namespace Rector\Symfony\Set; -use Rector\Set\Contract\SetListInterface; /** + * @deprecated Use ->withAttributesSets(symfony: true) in rector.php config instead + * * @api */ -final class JMSSetList implements SetListInterface +final class JMSSetList { /** * @var string diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SensiolabsSetList.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SensiolabsSetList.php index 0076ff3f8..17797cd2b 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SensiolabsSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SensiolabsSetList.php @@ -3,11 +3,12 @@ declare (strict_types=1); namespace Rector\Symfony\Set; -use Rector\Set\Contract\SetListInterface; /** + * @deprecated Use ->withAttributesSets(symfony: true) in rector.php config instead + * * @api */ -final class SensiolabsSetList implements SetListInterface +final class SensiolabsSetList { /** * @var string diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony3SetProvider.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony3SetProvider.php new file mode 100644 index 000000000..9198c65a3 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/SetProvider/Symfony3SetProvider.php @@ -0,0 +1,19 @@ +withComposerBased(symfony: true) instead + * * @api */ -final class SymfonySetList implements SetListInterface +final class SymfonySetList { /** * @var string @@ -32,99 +33,108 @@ final class SymfonySetList implements SetListInterface /** * @var string */ - public const SYMFONY_30 = __DIR__ . '/../../config/sets/symfony/symfony30.php'; + public const SYMFONY_30 = __DIR__ . '/../../config/sets/symfony/symfony3/symfony30.php'; /** * @var string */ - public const SYMFONY_31 = __DIR__ . '/../../config/sets/symfony/symfony31.php'; + public const SYMFONY_31 = __DIR__ . '/../../config/sets/symfony/symfony3/symfony31.php'; /** * @var string */ - public const SYMFONY_32 = __DIR__ . '/../../config/sets/symfony/symfony32.php'; + public const SYMFONY_32 = __DIR__ . '/../../config/sets/symfony/symfony3/symfony32.php'; /** * @var string */ - public const SYMFONY_33 = __DIR__ . '/../../config/sets/symfony/symfony33.php'; + public const SYMFONY_33 = __DIR__ . '/../../config/sets/symfony/symfony3/symfony33.php'; /** * @var string */ - public const SYMFONY_34 = __DIR__ . '/../../config/sets/symfony/symfony34.php'; + public const SYMFONY_34 = __DIR__ . '/../../config/sets/symfony/symfony3/symfony34.php'; /** * @var string */ - public const SYMFONY_40 = __DIR__ . '/../../config/sets/symfony/symfony40.php'; + public const SYMFONY_40 = __DIR__ . '/../../config/sets/symfony/symfony4/symfony40.php'; /** * @var string */ - public const SYMFONY_41 = __DIR__ . '/../../config/sets/symfony/symfony41.php'; + public const SYMFONY_41 = __DIR__ . '/../../config/sets/symfony/symfony4/symfony41.php'; /** * @var string */ - public const SYMFONY_42 = __DIR__ . '/../../config/sets/symfony/symfony42.php'; + public const SYMFONY_42 = __DIR__ . '/../../config/sets/symfony/symfony4/symfony42.php'; /** * @var string */ - public const SYMFONY_43 = __DIR__ . '/../../config/sets/symfony/symfony43.php'; + public const SYMFONY_43 = __DIR__ . '/../../config/sets/symfony/symfony4/symfony43.php'; /** * @var string */ - public const SYMFONY_44 = __DIR__ . '/../../config/sets/symfony/symfony44.php'; + public const SYMFONY_44 = __DIR__ . '/../../config/sets/symfony/symfony4/symfony44.php'; /** * @var string */ - public const SYMFONY_50 = __DIR__ . '/../../config/sets/symfony/symfony50.php'; + public const SYMFONY_50 = __DIR__ . '/../../config/sets/symfony/symfony5/symfony50.php'; /** * @var string */ - public const SYMFONY_50_TYPES = __DIR__ . '/../../config/sets/symfony/symfony50-types.php'; + public const SYMFONY_50_TYPES = __DIR__ . '/../../config/sets/symfony/symfony5/symfony50/symfony50-types.php'; /** * @var string */ - public const SYMFONY_51 = __DIR__ . '/../../config/sets/symfony/symfony51.php'; + public const SYMFONY_51 = __DIR__ . '/../../config/sets/symfony/symfony5/symfony51.php'; /** * @var string */ - public const SYMFONY_52 = __DIR__ . '/../../config/sets/symfony/symfony52.php'; + public const SYMFONY_52 = __DIR__ . '/../../config/sets/symfony/symfony5/symfony52.php'; /** * @var string */ - public const SYMFONY_53 = __DIR__ . '/../../config/sets/symfony/symfony53.php'; + public const SYMFONY_53 = __DIR__ . '/../../config/sets/symfony/symfony5/symfony53.php'; /** * @var string */ - public const SYMFONY_54 = __DIR__ . '/../../config/sets/symfony/symfony54.php'; + public const SYMFONY_54 = __DIR__ . '/../../config/sets/symfony/symfony5/symfony54.php'; /** + * @deprecated Use ->withAttributesSets(symfony: true) in rector.php config instead * @var string */ - public const SYMFONY_52_VALIDATOR_ATTRIBUTES = __DIR__ . '/../../config/sets/symfony/symfony52-validator-attributes.php'; + public const SYMFONY_52_VALIDATOR_ATTRIBUTES = __DIR__ . '/../../config/sets/symfony/symfony5/symfony52-validator-attributes.php'; /** * @var string */ - public const SYMFONY_60 = __DIR__ . '/../../config/sets/symfony/symfony60.php'; + public const SYMFONY_60 = __DIR__ . '/../../config/sets/symfony/symfony6/symfony60.php'; /** * @var string */ - public const SYMFONY_61 = __DIR__ . '/../../config/sets/symfony/symfony61.php'; + public const SYMFONY_61 = __DIR__ . '/../../config/sets/symfony/symfony6/symfony61.php'; /** * @var string */ - public const SYMFONY_62 = __DIR__ . '/../../config/sets/symfony/symfony62.php'; + public const SYMFONY_62 = __DIR__ . '/../../config/sets/symfony/symfony6/symfony62.php'; /** * @var string */ - public const SYMFONY_63 = __DIR__ . '/../../config/sets/symfony/symfony63.php'; + public const SYMFONY_63 = __DIR__ . '/../../config/sets/symfony/symfony6/symfony63.php'; /** * @var string */ - public const SYMFONY_64 = __DIR__ . '/../../config/sets/symfony/symfony64.php'; + public const SYMFONY_64 = __DIR__ . '/../../config/sets/symfony/symfony6/symfony64.php'; /** * @var string */ - public const SYMFONY_70 = __DIR__ . '/../../config/sets/symfony/symfony70.php'; + public const SYMFONY_70 = __DIR__ . '/../../config/sets/symfony/symfony7/symfony70.php'; /** * @var string */ - public const SYMFONY_71 = __DIR__ . '/../../config/sets/symfony/symfony71.php'; + public const SYMFONY_71 = __DIR__ . '/../../config/sets/symfony/symfony7/symfony71.php'; + /** + * @var string + */ + public const SYMFONY_72 = __DIR__ . '/../../config/sets/symfony/symfony7/symfony72.php'; + /** + * @var string + */ + public const SYMFONY_73 = __DIR__ . '/../../config/sets/symfony/symfony7/symfony73.php'; /** * @var string */ @@ -134,6 +144,7 @@ final class SymfonySetList implements SetListInterface */ public const SYMFONY_CONSTRUCTOR_INJECTION = __DIR__ . '/../../config/sets/symfony/symfony-constructor-injection.php'; /** + * @deprecated Use ->withAttributesSets(symfony: true) in rector.php config instead * @var string */ public const ANNOTATIONS_TO_ATTRIBUTES = __DIR__ . '/../../config/sets/symfony/annotations-to-attributes.php'; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/TwigSetList.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/TwigSetList.php index 2df51128f..a1e2a774c 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/TwigSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/Set/TwigSetList.php @@ -3,11 +3,10 @@ declare (strict_types=1); namespace Rector\Symfony\Set; -use Rector\Set\Contract\SetListInterface; /** * @api */ -final class TwigSetList implements SetListInterface +final class TwigSetList { /** * @var string @@ -32,7 +31,7 @@ final class TwigSetList implements SetListInterface /** * @var string */ - public const TWIG_240 = __DIR__ . '/../../config/sets/twig/twig240.php'; + public const TWIG_24 = __DIR__ . '/../../config/sets/twig/twig24.php'; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ContainerAwareAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ContainerAwareAnalyzer.php index 62648d964..32004772e 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ContainerAwareAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ContainerAwareAnalyzer.php @@ -6,21 +6,21 @@ use PhpParser\Node\Expr; use PHPStan\Type\ObjectType; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\Symfony\Enum\SymfonyClass; final class ContainerAwareAnalyzer { /** * @readonly - * @var \Rector\NodeTypeResolver\NodeTypeResolver */ - private $nodeTypeResolver; + private NodeTypeResolver $nodeTypeResolver; /** * @var ObjectType[] */ - private $getMethodAwareObjectTypes = []; + private array $getMethodAwareObjectTypes = []; public function __construct(NodeTypeResolver $nodeTypeResolver) { $this->nodeTypeResolver = $nodeTypeResolver; - $this->getMethodAwareObjectTypes = [new ObjectType('Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController'), new ObjectType('Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller'), new ObjectType('Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerTrait')]; + $this->getMethodAwareObjectTypes = [new ObjectType(SymfonyClass::ABSTRACT_CONTROLLER), new ObjectType(SymfonyClass::CONTROLLER), new ObjectType(SymfonyClass::CONTROLLER_TRAIT)]; } public function isGetMethodAwareType(Expr $expr) : bool { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ControllerAnalyzer.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ControllerAnalyzer.php index e0ea804e1..2189eb84e 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ControllerAnalyzer.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeAnalyzer/ControllerAnalyzer.php @@ -13,13 +13,13 @@ use PHPStan\Type\TypeWithClassName; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Reflection\ReflectionResolver; +use Rector\Symfony\Enum\SymfonyClass; final class ControllerAnalyzer { /** * @readonly - * @var \Rector\Reflection\ReflectionResolver */ - private $reflectionResolver; + private ReflectionResolver $reflectionResolver; public function __construct(ReflectionResolver $reflectionResolver) { $this->reflectionResolver = $reflectionResolver; @@ -63,10 +63,10 @@ public function isInsideController(Node $node) : bool } private function isControllerClassReflection(ClassReflection $classReflection) : bool { - if ($classReflection->isSubclassOf('Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller')) { + if ($classReflection->is(SymfonyClass::CONTROLLER)) { return \true; } - return $classReflection->isSubclassOf('Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController'); + return $classReflection->is(SymfonyClass::ABSTRACT_CONTROLLER); } private function isControllerClass(Class_ $class) : bool { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeDeclaration/ReturnTypeDeclarationUpdater.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeDeclaration/ReturnTypeDeclarationUpdater.php index 0d9652cad..912becbf6 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeDeclaration/ReturnTypeDeclarationUpdater.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/TypeDeclaration/ReturnTypeDeclarationUpdater.php @@ -3,14 +3,12 @@ declare (strict_types=1); namespace Rector\Symfony\TypeDeclaration; +use PhpParser\Node; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; -use PHPStan\Type\ArrayType; use PHPStan\Type\ObjectType; -use PHPStan\Type\UnionType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\BetterPhpDocParser\ValueObject\Type\FullyQualifiedIdentifierTypeNode; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Php\PhpVersionProvider; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -19,24 +17,20 @@ final class ReturnTypeDeclarationUpdater { /** * @readonly - * @var \Rector\Php\PhpVersionProvider */ - private $phpVersionProvider; + private PhpVersionProvider $phpVersionProvider; /** * @readonly - * @var \Rector\StaticTypeMapper\StaticTypeMapper */ - private $staticTypeMapper; + private StaticTypeMapper $staticTypeMapper; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory */ - private $phpDocInfoFactory; + private PhpDocInfoFactory $phpDocInfoFactory; /** * @readonly - * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ - private $docBlockUpdater; + private DocBlockUpdater $docBlockUpdater; public function __construct(PhpVersionProvider $phpVersionProvider, StaticTypeMapper $staticTypeMapper, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) { $this->phpVersionProvider = $phpVersionProvider; @@ -49,23 +43,13 @@ public function __construct(PhpVersionProvider $phpVersionProvider, StaticTypeMa */ public function updateClassMethod(ClassMethod $classMethod, string $className) : void { - $this->updatePhpDoc($classMethod, $className); + $this->removeReturnDocBlocks($classMethod); $this->updatePhp($classMethod, $className); } - /** - * @param class-string $className - */ - private function updatePhpDoc(ClassMethod $classMethod, string $className) : void + private function removeReturnDocBlocks(ClassMethod $classMethod) : void { $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); - $returnTagValueNode = $phpDocInfo->getReturnTagValue(); - if (!$returnTagValueNode instanceof ReturnTagValueNode) { - return; - } - $returnStaticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($returnTagValueNode->type, $classMethod); - if ($returnStaticType instanceof ArrayType || $returnStaticType instanceof UnionType) { - $returnTagValueNode->type = new FullyQualifiedIdentifierTypeNode($className); - } + $phpDocInfo->removeByType(ReturnTagValueNode::class); $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod); } /** @@ -78,7 +62,7 @@ private function updatePhp(ClassMethod $classMethod, string $className) : void } $objectType = new ObjectType($className); // change return type - if ($classMethod->returnType !== null) { + if ($classMethod->returnType instanceof Node) { $returnType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($classMethod->returnType); if ($objectType->isSuperTypeOf($returnType)->yes()) { return; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ClassNameAndFilePath.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ClassNameAndFilePath.php index 19cdd6e55..962ff65ac 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ClassNameAndFilePath.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ClassNameAndFilePath.php @@ -7,14 +7,12 @@ final class ClassNameAndFilePath { /** * @readonly - * @var string */ - private $className; + private string $className; /** * @readonly - * @var string */ - private $filePath; + private string $filePath; public function __construct(string $className, string $filePath) { $this->className = $className; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventNameToClassAndConstant.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventNameToClassAndConstant.php index 512143744..362d30bf2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventNameToClassAndConstant.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventNameToClassAndConstant.php @@ -7,19 +7,16 @@ final class EventNameToClassAndConstant { /** * @readonly - * @var string */ - private $eventName; + private string $eventName; /** * @readonly - * @var string */ - private $eventClass; + private string $eventClass; /** * @readonly - * @var string */ - private $eventConstant; + private string $eventConstant; public function __construct(string $eventName, string $eventClass, string $eventConstant) { $this->eventName = $eventName; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodName.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodName.php index e371f9386..5aafae70f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodName.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodName.php @@ -9,14 +9,12 @@ final class EventReferenceToMethodName implements EventReferenceToMethodNameInte { /** * @readonly - * @var \PhpParser\Node\Expr\ClassConstFetch */ - private $classConstFetch; + private ClassConstFetch $classConstFetch; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; public function __construct(ClassConstFetch $classConstFetch, string $methodName) { $this->classConstFetch = $classConstFetch; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodNameWithPriority.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodNameWithPriority.php index 14baaa54f..3643416b7 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodNameWithPriority.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/EventReferenceToMethodNameWithPriority.php @@ -9,19 +9,16 @@ final class EventReferenceToMethodNameWithPriority implements EventReferenceToMe { /** * @readonly - * @var \PhpParser\Node\Expr\ClassConstFetch */ - private $classConstFetch; + private ClassConstFetch $classConstFetch; /** * @readonly - * @var string */ - private $methodName; + private string $methodName; /** * @readonly - * @var int */ - private $priority; + private int $priority; public function __construct(ClassConstFetch $classConstFetch, string $methodName, int $priority) { $this->classConstFetch = $classConstFetch; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ExtensionKeyAndConfiguration.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ExtensionKeyAndConfiguration.php index 3c1ceaf12..82d078022 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ExtensionKeyAndConfiguration.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ExtensionKeyAndConfiguration.php @@ -8,14 +8,12 @@ final class ExtensionKeyAndConfiguration { /** * @readonly - * @var string */ - private $key; + private string $key; /** * @readonly - * @var \PhpParser\Node\Expr\Array_ */ - private $array; + private Array_ $array; public function __construct(string $key, Array_ $array) { $this->key = $key; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php index 54a27c814..64eae67e5 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/IntlBundleClassToNewClass.php @@ -4,24 +4,22 @@ namespace Rector\Symfony\ValueObject; use Rector\Validation\RectorAssert; -use RectorPrefix202411\Webmozart\Assert\Assert; +use RectorPrefix202506\Webmozart\Assert\Assert; final class IntlBundleClassToNewClass { /** * @readonly - * @var string */ - private $oldClass; + private string $oldClass; /** * @readonly - * @var string */ - private $newClass; + private string $newClass; /** * @var array * @readonly */ - private $oldToNewMethods; + private array $oldToNewMethods; /** * @param array $oldToNewMethods */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ReplaceServiceArgument.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ReplaceServiceArgument.php index e8aa1783f..c5ff47dab 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ReplaceServiceArgument.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ReplaceServiceArgument.php @@ -13,9 +13,8 @@ final class ReplaceServiceArgument private $oldValue; /** * @readonly - * @var \PhpParser\Node\Expr */ - private $newValueExpr; + private Expr $newValueExpr; /** * @param mixed $oldValue */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceDefinition.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceDefinition.php index 9b401c596..f6a1025df 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceDefinition.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceDefinition.php @@ -8,34 +8,29 @@ final class ServiceDefinition { /** * @readonly - * @var string */ - private $id; + private string $id; /** * @readonly - * @var string|null */ - private $class; + private ?string $class; /** * @readonly - * @var bool */ - private $isPublic; + private bool $isPublic; /** * @readonly - * @var bool */ - private $isSynthetic; + private bool $isSynthetic; /** * @readonly - * @var string|null */ - private $alias; + private ?string $alias; /** * @var TagInterface[] * @readonly */ - private $tags; + private array $tags; /** * @param TagInterface[] $tags */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceMap/ServiceMap.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceMap/ServiceMap.php index 57643f497..2d6eb580a 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceMap/ServiceMap.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ServiceMap/ServiceMap.php @@ -12,7 +12,7 @@ final class ServiceMap * @var ServiceDefinition[] * @readonly */ - private $services; + private array $services; /** * @param ServiceDefinition[] $services */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/SymfonyRouteMetadata.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/SymfonyRouteMetadata.php index 98ddb8f7c..79895cdcf 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/SymfonyRouteMetadata.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/SymfonyRouteMetadata.php @@ -7,55 +7,50 @@ final class SymfonyRouteMetadata { /** * @readonly - * @var string */ - private $name; + private string $name; /** * @readonly - * @var string */ - private $path; + private string $path; /** * @var array * @readonly */ - private $defaults; + private array $defaults; /** * @var array * @readonly */ - private $requirements; + private array $requirements; /** * @readonly - * @var string */ - private $host; + private string $host; /** * @var string[] * @readonly */ - private $schemes; + private array $schemes; /** * @var string[] * @readonly */ - private $methods; + private array $methods; /** * @readonly - * @var string */ - private $condition; + private string $condition; /** * @var array * @readonly */ - private $options; + private array $options; /** * Format :: * @readonly - * @var string|null */ - private $controllerReference; + private ?string $controllerReference; /** * @param array $defaults * @param array $requirements diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag.php index d391fa342..79bdd290e 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag.php @@ -8,14 +8,13 @@ final class Tag implements TagInterface { /** * @readonly - * @var string */ - private $name; + private string $name; /** * @var array * @readonly */ - private $data = []; + private array $data = []; /** * @param array $data */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag/EventListenerTag.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag/EventListenerTag.php index 28b64bc05..61ab2c6e6 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag/EventListenerTag.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/Tag/EventListenerTag.php @@ -8,19 +8,13 @@ final class EventListenerTag implements TagInterface { /** * @readonly - * @var string */ - private $event; + private string $event; + private string $method; /** * @readonly - * @var string */ - private $method; - /** - * @readonly - * @var int - */ - private $priority; + private int $priority; public function __construct(string $event, string $method, int $priority) { $this->event = $event; @@ -50,4 +44,8 @@ public function getData() : array { return ['method' => $this->method, 'priority' => $this->priority, 'event' => $this->event]; } + public function changeMethod(string $methodName) : void + { + $this->method = $methodName; + } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/ClassMethodAndAnnotation.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/ClassMethodAndAnnotation.php index c6870fd6d..88b1d8d24 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/ClassMethodAndAnnotation.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/ClassMethodAndAnnotation.php @@ -10,12 +10,11 @@ final class ClassMethodAndAnnotation * @var string[] * @readonly */ - private $possibleMethodNames; + private array $possibleMethodNames; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode */ - private $doctrineAnnotationTagValueNode; + private DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode; /** * @param string[] $possibleMethodNames */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/PropertyAndAnnotation.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/PropertyAndAnnotation.php index 45fd6fab2..ee2d6dc61 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/PropertyAndAnnotation.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObject/ValidatorAssert/PropertyAndAnnotation.php @@ -8,14 +8,12 @@ final class PropertyAndAnnotation { /** * @readonly - * @var string */ - private $property; + private string $property; /** * @readonly - * @var \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode */ - private $doctrineAnnotationTagValueNode; + private DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode; public function __construct(string $property, DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode) { $this->property = $property; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php index a8ce89a08..c822ba409 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/ValueObjectFactory/ServiceMapFactory.php @@ -3,9 +3,9 @@ declare (strict_types=1); namespace Rector\Symfony\ValueObjectFactory; -use RectorPrefix202411\Nette\Utils\FileSystem; -use RectorPrefix202411\Nette\Utils\Json; -use RectorPrefix202411\Nette\Utils\Strings; +use RectorPrefix202506\Nette\Utils\FileSystem; +use RectorPrefix202506\Nette\Utils\Json; +use RectorPrefix202506\Nette\Utils\Strings; use Rector\Symfony\Exception\XmlContainerNotExistsException; use Rector\Symfony\ValueObject\ServiceDefinition; use Rector\Symfony\ValueObject\ServiceMap\ServiceMap; @@ -38,6 +38,9 @@ public function createFromFileContent(string $configFilePath) : ServiceMap } $def = $this->convertXmlToArray($def); $tags = $this->createTagFromXmlElement($def); + if (\in_array('container.excluded', \array_column($tags, 'name'), \true)) { + continue; + } $service = $this->createServiceFromXmlAndTagsData($attrs, $tags); if ($service->getAlias() !== null) { $aliases[] = $service; diff --git a/vendor/rector/rector/vendor/scoper-autoload.php b/vendor/rector/rector/vendor/scoper-autoload.php index 649b05f47..02354d22a 100644 --- a/vendor/rector/rector/vendor/scoper-autoload.php +++ b/vendor/rector/rector/vendor/scoper-autoload.php @@ -29,64 +29,64 @@ function humbug_phpscoper_expose_class($exposed, $prefixed) { } } } -humbug_phpscoper_expose_class('AutoloadIncluder', 'RectorPrefix202411\AutoloadIncluder'); -humbug_phpscoper_expose_class('ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7', 'RectorPrefix202411\ComposerAutoloaderInit4d4c37b878ce01a3ff505ba7def6aac7'); -humbug_phpscoper_expose_class('Product', 'RectorPrefix202411\Product'); -humbug_phpscoper_expose_class('SomeTest', 'RectorPrefix202411\SomeTest'); +humbug_phpscoper_expose_class('AutoloadIncluder', 'RectorPrefix202506\AutoloadIncluder'); +humbug_phpscoper_expose_class('ComposerAutoloaderInit78fb90a05527c4e1e3e0271783524c1e', 'RectorPrefix202506\ComposerAutoloaderInit78fb90a05527c4e1e3e0271783524c1e'); +humbug_phpscoper_expose_class('Product', 'RectorPrefix202506\Product'); +humbug_phpscoper_expose_class('SomeTest', 'RectorPrefix202506\SomeTest'); // Function aliases. For more information see: // https://github.com/humbug/php-scoper/blob/master/docs/further-reading.md#function-aliases -if (!function_exists('dump_node')) { function dump_node() { return \RectorPrefix202411\dump_node(...func_get_args()); } } -if (!function_exists('formatErrorMessage')) { function formatErrorMessage() { return \RectorPrefix202411\formatErrorMessage(...func_get_args()); } } -if (!function_exists('includeIfExists')) { function includeIfExists() { return \RectorPrefix202411\includeIfExists(...func_get_args()); } } -if (!function_exists('mb_check_encoding')) { function mb_check_encoding() { return \RectorPrefix202411\mb_check_encoding(...func_get_args()); } } -if (!function_exists('mb_chr')) { function mb_chr() { return \RectorPrefix202411\mb_chr(...func_get_args()); } } -if (!function_exists('mb_convert_case')) { function mb_convert_case() { return \RectorPrefix202411\mb_convert_case(...func_get_args()); } } -if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding() { return \RectorPrefix202411\mb_convert_encoding(...func_get_args()); } } -if (!function_exists('mb_convert_variables')) { function mb_convert_variables() { return \RectorPrefix202411\mb_convert_variables(...func_get_args()); } } -if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader() { return \RectorPrefix202411\mb_decode_mimeheader(...func_get_args()); } } -if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity() { return \RectorPrefix202411\mb_decode_numericentity(...func_get_args()); } } -if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding() { return \RectorPrefix202411\mb_detect_encoding(...func_get_args()); } } -if (!function_exists('mb_detect_order')) { function mb_detect_order() { return \RectorPrefix202411\mb_detect_order(...func_get_args()); } } -if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader() { return \RectorPrefix202411\mb_encode_mimeheader(...func_get_args()); } } -if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity() { return \RectorPrefix202411\mb_encode_numericentity(...func_get_args()); } } -if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases() { return \RectorPrefix202411\mb_encoding_aliases(...func_get_args()); } } -if (!function_exists('mb_get_info')) { function mb_get_info() { return \RectorPrefix202411\mb_get_info(...func_get_args()); } } -if (!function_exists('mb_http_input')) { function mb_http_input() { return \RectorPrefix202411\mb_http_input(...func_get_args()); } } -if (!function_exists('mb_http_output')) { function mb_http_output() { return \RectorPrefix202411\mb_http_output(...func_get_args()); } } -if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding() { return \RectorPrefix202411\mb_internal_encoding(...func_get_args()); } } -if (!function_exists('mb_language')) { function mb_language() { return \RectorPrefix202411\mb_language(...func_get_args()); } } -if (!function_exists('mb_lcfirst')) { function mb_lcfirst() { return \RectorPrefix202411\mb_lcfirst(...func_get_args()); } } -if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return \RectorPrefix202411\mb_list_encodings(...func_get_args()); } } -if (!function_exists('mb_ltrim')) { function mb_ltrim() { return \RectorPrefix202411\mb_ltrim(...func_get_args()); } } -if (!function_exists('mb_ord')) { function mb_ord() { return \RectorPrefix202411\mb_ord(...func_get_args()); } } -if (!function_exists('mb_output_handler')) { function mb_output_handler() { return \RectorPrefix202411\mb_output_handler(...func_get_args()); } } -if (!function_exists('mb_parse_str')) { function mb_parse_str() { return \RectorPrefix202411\mb_parse_str(...func_get_args()); } } -if (!function_exists('mb_rtrim')) { function mb_rtrim() { return \RectorPrefix202411\mb_rtrim(...func_get_args()); } } -if (!function_exists('mb_scrub')) { function mb_scrub() { return \RectorPrefix202411\mb_scrub(...func_get_args()); } } -if (!function_exists('mb_str_pad')) { function mb_str_pad() { return \RectorPrefix202411\mb_str_pad(...func_get_args()); } } -if (!function_exists('mb_str_split')) { function mb_str_split() { return \RectorPrefix202411\mb_str_split(...func_get_args()); } } -if (!function_exists('mb_stripos')) { function mb_stripos() { return \RectorPrefix202411\mb_stripos(...func_get_args()); } } -if (!function_exists('mb_stristr')) { function mb_stristr() { return \RectorPrefix202411\mb_stristr(...func_get_args()); } } -if (!function_exists('mb_strlen')) { function mb_strlen() { return \RectorPrefix202411\mb_strlen(...func_get_args()); } } -if (!function_exists('mb_strpos')) { function mb_strpos() { return \RectorPrefix202411\mb_strpos(...func_get_args()); } } -if (!function_exists('mb_strrchr')) { function mb_strrchr() { return \RectorPrefix202411\mb_strrchr(...func_get_args()); } } -if (!function_exists('mb_strrichr')) { function mb_strrichr() { return \RectorPrefix202411\mb_strrichr(...func_get_args()); } } -if (!function_exists('mb_strripos')) { function mb_strripos() { return \RectorPrefix202411\mb_strripos(...func_get_args()); } } -if (!function_exists('mb_strrpos')) { function mb_strrpos() { return \RectorPrefix202411\mb_strrpos(...func_get_args()); } } -if (!function_exists('mb_strstr')) { function mb_strstr() { return \RectorPrefix202411\mb_strstr(...func_get_args()); } } -if (!function_exists('mb_strtolower')) { function mb_strtolower() { return \RectorPrefix202411\mb_strtolower(...func_get_args()); } } -if (!function_exists('mb_strtoupper')) { function mb_strtoupper() { return \RectorPrefix202411\mb_strtoupper(...func_get_args()); } } -if (!function_exists('mb_strwidth')) { function mb_strwidth() { return \RectorPrefix202411\mb_strwidth(...func_get_args()); } } -if (!function_exists('mb_substitute_character')) { function mb_substitute_character() { return \RectorPrefix202411\mb_substitute_character(...func_get_args()); } } -if (!function_exists('mb_substr')) { function mb_substr() { return \RectorPrefix202411\mb_substr(...func_get_args()); } } -if (!function_exists('mb_substr_count')) { function mb_substr_count() { return \RectorPrefix202411\mb_substr_count(...func_get_args()); } } -if (!function_exists('mb_trim')) { function mb_trim() { return \RectorPrefix202411\mb_trim(...func_get_args()); } } -if (!function_exists('mb_ucfirst')) { function mb_ucfirst() { return \RectorPrefix202411\mb_ucfirst(...func_get_args()); } } -if (!function_exists('parseArgs')) { function parseArgs() { return \RectorPrefix202411\parseArgs(...func_get_args()); } } -if (!function_exists('print_node')) { function print_node() { return \RectorPrefix202411\print_node(...func_get_args()); } } -if (!function_exists('showHelp')) { function showHelp() { return \RectorPrefix202411\showHelp(...func_get_args()); } } -if (!function_exists('trigger_deprecation')) { function trigger_deprecation() { return \RectorPrefix202411\trigger_deprecation(...func_get_args()); } } -if (!function_exists('uv_poll_init_socket')) { function uv_poll_init_socket() { return \RectorPrefix202411\uv_poll_init_socket(...func_get_args()); } } +if (!function_exists('dump_node')) { function dump_node() { return \RectorPrefix202506\dump_node(...func_get_args()); } } +if (!function_exists('formatErrorMessage')) { function formatErrorMessage() { return \RectorPrefix202506\formatErrorMessage(...func_get_args()); } } +if (!function_exists('includeIfExists')) { function includeIfExists() { return \RectorPrefix202506\includeIfExists(...func_get_args()); } } +if (!function_exists('mb_check_encoding')) { function mb_check_encoding() { return \RectorPrefix202506\mb_check_encoding(...func_get_args()); } } +if (!function_exists('mb_chr')) { function mb_chr() { return \RectorPrefix202506\mb_chr(...func_get_args()); } } +if (!function_exists('mb_convert_case')) { function mb_convert_case() { return \RectorPrefix202506\mb_convert_case(...func_get_args()); } } +if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding() { return \RectorPrefix202506\mb_convert_encoding(...func_get_args()); } } +if (!function_exists('mb_convert_variables')) { function mb_convert_variables() { return \RectorPrefix202506\mb_convert_variables(...func_get_args()); } } +if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader() { return \RectorPrefix202506\mb_decode_mimeheader(...func_get_args()); } } +if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity() { return \RectorPrefix202506\mb_decode_numericentity(...func_get_args()); } } +if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding() { return \RectorPrefix202506\mb_detect_encoding(...func_get_args()); } } +if (!function_exists('mb_detect_order')) { function mb_detect_order() { return \RectorPrefix202506\mb_detect_order(...func_get_args()); } } +if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader() { return \RectorPrefix202506\mb_encode_mimeheader(...func_get_args()); } } +if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity() { return \RectorPrefix202506\mb_encode_numericentity(...func_get_args()); } } +if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases() { return \RectorPrefix202506\mb_encoding_aliases(...func_get_args()); } } +if (!function_exists('mb_get_info')) { function mb_get_info() { return \RectorPrefix202506\mb_get_info(...func_get_args()); } } +if (!function_exists('mb_http_input')) { function mb_http_input() { return \RectorPrefix202506\mb_http_input(...func_get_args()); } } +if (!function_exists('mb_http_output')) { function mb_http_output() { return \RectorPrefix202506\mb_http_output(...func_get_args()); } } +if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding() { return \RectorPrefix202506\mb_internal_encoding(...func_get_args()); } } +if (!function_exists('mb_language')) { function mb_language() { return \RectorPrefix202506\mb_language(...func_get_args()); } } +if (!function_exists('mb_lcfirst')) { function mb_lcfirst() { return \RectorPrefix202506\mb_lcfirst(...func_get_args()); } } +if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return \RectorPrefix202506\mb_list_encodings(...func_get_args()); } } +if (!function_exists('mb_ltrim')) { function mb_ltrim() { return \RectorPrefix202506\mb_ltrim(...func_get_args()); } } +if (!function_exists('mb_ord')) { function mb_ord() { return \RectorPrefix202506\mb_ord(...func_get_args()); } } +if (!function_exists('mb_output_handler')) { function mb_output_handler() { return \RectorPrefix202506\mb_output_handler(...func_get_args()); } } +if (!function_exists('mb_parse_str')) { function mb_parse_str() { return \RectorPrefix202506\mb_parse_str(...func_get_args()); } } +if (!function_exists('mb_rtrim')) { function mb_rtrim() { return \RectorPrefix202506\mb_rtrim(...func_get_args()); } } +if (!function_exists('mb_scrub')) { function mb_scrub() { return \RectorPrefix202506\mb_scrub(...func_get_args()); } } +if (!function_exists('mb_str_pad')) { function mb_str_pad() { return \RectorPrefix202506\mb_str_pad(...func_get_args()); } } +if (!function_exists('mb_str_split')) { function mb_str_split() { return \RectorPrefix202506\mb_str_split(...func_get_args()); } } +if (!function_exists('mb_stripos')) { function mb_stripos() { return \RectorPrefix202506\mb_stripos(...func_get_args()); } } +if (!function_exists('mb_stristr')) { function mb_stristr() { return \RectorPrefix202506\mb_stristr(...func_get_args()); } } +if (!function_exists('mb_strlen')) { function mb_strlen() { return \RectorPrefix202506\mb_strlen(...func_get_args()); } } +if (!function_exists('mb_strpos')) { function mb_strpos() { return \RectorPrefix202506\mb_strpos(...func_get_args()); } } +if (!function_exists('mb_strrchr')) { function mb_strrchr() { return \RectorPrefix202506\mb_strrchr(...func_get_args()); } } +if (!function_exists('mb_strrichr')) { function mb_strrichr() { return \RectorPrefix202506\mb_strrichr(...func_get_args()); } } +if (!function_exists('mb_strripos')) { function mb_strripos() { return \RectorPrefix202506\mb_strripos(...func_get_args()); } } +if (!function_exists('mb_strrpos')) { function mb_strrpos() { return \RectorPrefix202506\mb_strrpos(...func_get_args()); } } +if (!function_exists('mb_strstr')) { function mb_strstr() { return \RectorPrefix202506\mb_strstr(...func_get_args()); } } +if (!function_exists('mb_strtolower')) { function mb_strtolower() { return \RectorPrefix202506\mb_strtolower(...func_get_args()); } } +if (!function_exists('mb_strtoupper')) { function mb_strtoupper() { return \RectorPrefix202506\mb_strtoupper(...func_get_args()); } } +if (!function_exists('mb_strwidth')) { function mb_strwidth() { return \RectorPrefix202506\mb_strwidth(...func_get_args()); } } +if (!function_exists('mb_substitute_character')) { function mb_substitute_character() { return \RectorPrefix202506\mb_substitute_character(...func_get_args()); } } +if (!function_exists('mb_substr')) { function mb_substr() { return \RectorPrefix202506\mb_substr(...func_get_args()); } } +if (!function_exists('mb_substr_count')) { function mb_substr_count() { return \RectorPrefix202506\mb_substr_count(...func_get_args()); } } +if (!function_exists('mb_trim')) { function mb_trim() { return \RectorPrefix202506\mb_trim(...func_get_args()); } } +if (!function_exists('mb_ucfirst')) { function mb_ucfirst() { return \RectorPrefix202506\mb_ucfirst(...func_get_args()); } } +if (!function_exists('parseArgs')) { function parseArgs() { return \RectorPrefix202506\parseArgs(...func_get_args()); } } +if (!function_exists('print_node')) { function print_node() { return \RectorPrefix202506\print_node(...func_get_args()); } } +if (!function_exists('showHelp')) { function showHelp() { return \RectorPrefix202506\showHelp(...func_get_args()); } } +if (!function_exists('trigger_deprecation')) { function trigger_deprecation() { return \RectorPrefix202506\trigger_deprecation(...func_get_args()); } } +if (!function_exists('uv_poll_init_socket')) { function uv_poll_init_socket() { return \RectorPrefix202506\uv_poll_init_socket(...func_get_args()); } } return $loader; diff --git a/vendor/rector/rector/vendor/sebastian/diff/ChangeLog.md b/vendor/rector/rector/vendor/sebastian/diff/ChangeLog.md index 10c545290..b12b9932f 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/ChangeLog.md +++ b/vendor/rector/rector/vendor/sebastian/diff/ChangeLog.md @@ -2,6 +2,27 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [6.0.2] - 2024-07-03 + +### Changed + +* This project now uses PHPStan instead of Psalm for static analysis + +## [6.0.1] - 2024-03-02 + +### Changed + +* Do not use implicitly nullable parameters + +## [6.0.0] - 2024-02-02 + +### Removed + +* `SebastianBergmann\Diff\Chunk::getStart()`, `SebastianBergmann\Diff\Chunk::getStartRange()`, `SebastianBergmann\Diff\Chunk::getEnd()`, `SebastianBergmann\Diff\Chunk::getEndRange()`, and `SebastianBergmann\Diff\Chunk::getLines()` +* `SebastianBergmann\Diff\Diff::getFrom()`, `SebastianBergmann\Diff\Diff::getTo()`, and `SebastianBergmann\Diff\Diff::getChunks()` +* `SebastianBergmann\Diff\Line::getContent()` and `SebastianBergmann\Diff\Diff::getType()` +* Removed support for PHP 8.1 + ## [5.1.1] - 2024-03-02 ### Changed @@ -130,6 +151,9 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * This component is no longer supported on PHP 5.6 +[6.0.2]: https://github.com/sebastianbergmann/diff/compare/6.0.1...6.0.2 +[6.0.1]: https://github.com/sebastianbergmann/diff/compare/6.0.0...6.0.1 +[6.0.0]: https://github.com/sebastianbergmann/diff/compare/5.1...6.0.0 [5.1.1]: https://github.com/sebastianbergmann/diff/compare/5.1.0...5.1.1 [5.1.0]: https://github.com/sebastianbergmann/diff/compare/5.0.3...5.1.0 [5.0.3]: https://github.com/sebastianbergmann/diff/compare/5.0.2...5.0.3 diff --git a/vendor/rector/rector/vendor/sebastian/diff/README.md b/vendor/rector/rector/vendor/sebastian/diff/README.md index 539dc59ed..7b710249a 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/README.md +++ b/vendor/rector/rector/vendor/sebastian/diff/README.md @@ -1,6 +1,5 @@ [![Latest Stable Version](https://poser.pugx.org/sebastian/diff/v/stable.png)](https://packagist.org/packages/sebastian/diff) [![CI Status](https://github.com/sebastianbergmann/diff/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/diff/actions) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/diff/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/diff) [![codecov](https://codecov.io/gh/sebastianbergmann/diff/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/diff) # sebastian/diff diff --git a/vendor/rector/rector/vendor/sebastian/diff/composer.json b/vendor/rector/rector/vendor/sebastian/diff/composer.json index 88211193b..84a36d7e7 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/composer.json +++ b/vendor/rector/rector/vendor/sebastian/diff/composer.json @@ -26,17 +26,17 @@ "prefer-stable": true, "config": { "platform": { - "php": "8.1.0" + "php": "8.2.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit\/phpunit": "^10.0", - "symfony\/process": "^6.4" + "phpunit\/phpunit": "^11.0", + "symfony\/process": "^4.2 || ^5" }, "autoload": { "classmap": [ @@ -50,7 +50,7 @@ }, "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } } } \ No newline at end of file diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php b/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php index 0452dbdea..a111c3f37 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Chunk.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use ArrayIterator; use IteratorAggregate; @@ -19,26 +19,17 @@ */ final class Chunk implements IteratorAggregate { + private int $start; + private int $startRange; + private int $end; + private int $endRange; /** - * @var int + * @var list */ - private $start; + private array $lines; /** - * @var int + * @param list $lines */ - private $startRange; - /** - * @var int - */ - private $end; - /** - * @var int - */ - private $endRange; - /** - * @var mixed[] - */ - private $lines; public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = []) { $this->start = $start; @@ -64,14 +55,14 @@ public function endRange() : int return $this->endRange; } /** - * @psalm-return list + * @return list */ public function lines() : array { return $this->lines; } /** - * @psalm-param list $lines + * @param list $lines */ public function setLines(array $lines) : void { @@ -82,43 +73,6 @@ public function setLines(array $lines) : void } $this->lines = $lines; } - /** - * @deprecated Use start() instead - */ - public function getStart() : int - { - return $this->start; - } - /** - * @deprecated Use startRange() instead - */ - public function getStartRange() : int - { - return $this->startRange; - } - /** - * @deprecated Use end() instead - */ - public function getEnd() : int - { - return $this->end; - } - /** - * @deprecated Use endRange() instead - */ - public function getEndRange() : int - { - return $this->endRange; - } - /** - * @psalm-return list - * - * @deprecated Use lines() instead - */ - public function getLines() : array - { - return $this->lines; - } public function getIterator() : Traversable { return new ArrayIterator($this->lines); diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php b/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php index a2ef00e09..0e785d388 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Diff.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use ArrayIterator; use IteratorAggregate; @@ -20,24 +20,21 @@ final class Diff implements IteratorAggregate { /** - * @psalm-var non-empty-string - * @var string + * @var non-empty-string */ - private $from; + private string $from; /** - * @psalm-var non-empty-string - * @var string + * @var non-empty-string */ - private $to; + private string $to; /** - * @psalm-var list - * @var mixed[] + * @var list */ - private $chunks; + private array $chunks; /** - * @psalm-param non-empty-string $from - * @psalm-param non-empty-string $to - * @psalm-param list $chunks + * @param non-empty-string $from + * @param non-empty-string $to + * @param list $chunks */ public function __construct(string $from, string $to, array $chunks = []) { @@ -46,60 +43,33 @@ public function __construct(string $from, string $to, array $chunks = []) $this->chunks = $chunks; } /** - * @psalm-return non-empty-string + * @return non-empty-string */ public function from() : string { return $this->from; } /** - * @psalm-return non-empty-string + * @return non-empty-string */ public function to() : string { return $this->to; } /** - * @psalm-return list + * @return list */ public function chunks() : array { return $this->chunks; } /** - * @psalm-param list $chunks + * @param list $chunks */ public function setChunks(array $chunks) : void { $this->chunks = $chunks; } - /** - * @psalm-return non-empty-string - * - * @deprecated - */ - public function getFrom() : string - { - return $this->from; - } - /** - * @psalm-return non-empty-string - * - * @deprecated - */ - public function getTo() : string - { - return $this->to; - } - /** - * @psalm-return list - * - * @deprecated - */ - public function getChunks() : array - { - return $this->chunks; - } public function getIterator() : Traversable { return new ArrayIterator($this->chunks); diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php b/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php index e00ae91c3..cf3e3234c 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Differ.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use const PHP_INT_SIZE; use const PREG_SPLIT_DELIM_CAPTURE; @@ -28,7 +28,7 @@ use function reset; use function str_ends_with; use function substr; -use RectorPrefix202411\SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; +use RectorPrefix202506\SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; final class Differ { public const OLD = 0; @@ -36,17 +36,14 @@ final class Differ public const REMOVED = 2; public const DIFF_LINE_END_WARNING = 3; public const NO_LINE_END_EOF_WARNING = 4; - /** - * @var \SebastianBergmann\Diff\Output\DiffOutputBuilderInterface - */ - private $outputBuilder; + private DiffOutputBuilderInterface $outputBuilder; public function __construct(DiffOutputBuilderInterface $outputBuilder) { $this->outputBuilder = $outputBuilder; } /** - * @param mixed[]|string $from - * @param mixed[]|string $to + * @param list|string $from + * @param list|string $to */ public function diff($from, $to, ?LongestCommonSubsequenceCalculator $lcs = null) : string { @@ -54,8 +51,8 @@ public function diff($from, $to, ?LongestCommonSubsequenceCalculator $lcs = null return $this->outputBuilder->getDiff($diff); } /** - * @param mixed[]|string $from - * @param mixed[]|string $to + * @param list|string $from + * @param list|string $to */ public function diffToArray($from, $to, ?LongestCommonSubsequenceCalculator $lcs = null) : array { diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php index 5906ae725..411713529 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/ConfigurationException.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use function gettype; use function is_object; @@ -17,6 +17,9 @@ use Exception; final class ConfigurationException extends InvalidArgumentException { + /** + * @param mixed $value + */ public function __construct(string $option, string $expected, $value, int $code = 0, ?Exception $previous = null) { parent::__construct(sprintf('Option "%s" must be %s, got "%s".', $option, $expected, is_object($value) ? \get_class($value) : (null === $value ? '' : gettype($value) . '#' . $value)), $code, $previous); diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php index a823a0246..2751cc89e 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/Exception.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use Throwable; interface Exception extends Throwable diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php index 0b11514dc..172e9803d 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; class InvalidArgumentException extends \InvalidArgumentException implements Exception { diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Line.php b/vendor/rector/rector/vendor/sebastian/diff/src/Line.php index b589f35b4..16cb089b3 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Line.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Line.php @@ -9,21 +9,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; final class Line { public const ADDED = 1; public const REMOVED = 2; public const UNCHANGED = 3; - /** - * @var int - */ - private $type; - /** - * @var string - */ - private $content; + private int $type; + private string $content; public function __construct(int $type = self::UNCHANGED, string $content = '') { $this->type = $type; @@ -49,18 +43,4 @@ public function isUnchanged() : bool { return $this->type === self::UNCHANGED; } - /** - * @deprecated - */ - public function getContent() : string - { - return $this->content; - } - /** - * @deprecated - */ - public function getType() : int - { - return $this->type; - } } diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php b/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php index 67cbb4a48..447b9809e 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; interface LongestCommonSubsequenceCalculator { diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php index 4a683914a..32f2ee7f0 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use function array_fill; use function array_merge; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php index f4a0b8162..47d2ce21d 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff\Output; +namespace RectorPrefix202506\SebastianBergmann\Diff\Output; use function count; abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php index 3d77f2854..8b7ec472f 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff\Output; +namespace RectorPrefix202506\SebastianBergmann\Diff\Output; use function fclose; use function fopen; @@ -17,17 +17,14 @@ use function str_ends_with; use function stream_get_contents; use function substr; -use RectorPrefix202411\SebastianBergmann\Diff\Differ; +use RectorPrefix202506\SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in a loose unified diff format * listing only changes lines. Does not include line numbers. */ final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface { - /** - * @var string - */ - private $header; + private string $header; public function __construct(string $header = "--- Original\n+++ New\n") { $this->header = $header; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php index 2902a0fab..c38a7e7da 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff\Output; +namespace RectorPrefix202506\SebastianBergmann\Diff\Output; /** * Defines how an output builder should take a generated diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php index b624ea54e..1d94dabd8 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff\Output; +namespace RectorPrefix202506\SebastianBergmann\Diff\Output; use function array_merge; use function array_splice; @@ -25,8 +25,8 @@ use function sprintf; use function stream_get_contents; use function substr; -use RectorPrefix202411\SebastianBergmann\Diff\ConfigurationException; -use RectorPrefix202411\SebastianBergmann\Diff\Differ; +use RectorPrefix202506\SebastianBergmann\Diff\ConfigurationException; +use RectorPrefix202506\SebastianBergmann\Diff\Differ; /** * Strict Unified diff output builder. * @@ -34,10 +34,7 @@ */ final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface { - /** - * @var mixed[] - */ - private static $default = [ + private static array $default = [ 'collapseRanges' => \true, // ranges of length one are rendered with the trailing `,1` 'commonLineThreshold' => 6, @@ -49,28 +46,17 @@ final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface 'toFile' => null, 'toFileDate' => null, ]; + private bool $changed; + private bool $collapseRanges; /** - * @var bool - */ - private $changed; - /** - * @var bool - */ - private $collapseRanges; - /** - * @psalm-var positive-int - * @var int - */ - private $commonLineThreshold; - /** - * @var string + * @var positive-int */ - private $header; + private int $commonLineThreshold; + private string $header; /** - * @psalm-var positive-int - * @var int + * @var positive-int */ - private $contextLines; + private int $contextLines; public function __construct(array $options = []) { $options = array_merge(self::$default, $options); diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php b/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php index a67863b6d..49d2cde44 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff\Output; +namespace RectorPrefix202506\SebastianBergmann\Diff\Output; use function array_splice; use function count; @@ -21,33 +21,20 @@ use function str_ends_with; use function stream_get_contents; use function substr; -use RectorPrefix202411\SebastianBergmann\Diff\Differ; +use RectorPrefix202506\SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in unified diff format in chunks. */ final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder { + private bool $collapseRanges = \true; + private int $commonLineThreshold = 6; /** - * @var bool + * @var positive-int */ - private $collapseRanges = \true; - /** - * @var int - */ - private $commonLineThreshold = 6; - /** - * @psalm-var positive-int - * @var int - */ - private $contextLines = 3; - /** - * @var string - */ - private $header; - /** - * @var bool - */ - private $addLineNumbers; + private int $contextLines = 3; + private string $header; + private bool $addLineNumbers; public function __construct(string $header = "--- Original\n+++ New\n", bool $addLineNumbers = \false) { $this->header = $header; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php b/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php index af2cf273f..0ce226838 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/Parser.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use function array_pop; use function assert; diff --git a/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php index 59664c7d7..70b8c4b91 100644 --- a/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php +++ b/vendor/rector/rector/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @@ -9,7 +9,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\SebastianBergmann\Diff; +namespace RectorPrefix202506\SebastianBergmann\Diff; use function array_reverse; use function count; diff --git a/vendor/rector/rector/vendor/symfony/console/Application.php b/vendor/rector/rector/vendor/symfony/console/Application.php index e806dd2a7..379db3769 100644 --- a/vendor/rector/rector/vendor/symfony/console/Application.php +++ b/vendor/rector/rector/vendor/symfony/console/Application.php @@ -8,51 +8,51 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console; +namespace RectorPrefix202506\Symfony\Component\Console; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Command\CompleteCommand; -use RectorPrefix202411\Symfony\Component\Console\Command\DumpCompletionCommand; -use RectorPrefix202411\Symfony\Component\Console\Command\HelpCommand; -use RectorPrefix202411\Symfony\Component\Console\Command\LazyCommand; -use RectorPrefix202411\Symfony\Component\Console\Command\ListCommand; -use RectorPrefix202411\Symfony\Component\Console\Command\SignalableCommandInterface; -use RectorPrefix202411\Symfony\Component\Console\CommandLoader\CommandLoaderInterface; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleCommandEvent; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleErrorEvent; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleSignalEvent; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleTerminateEvent; -use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; -use RectorPrefix202411\Symfony\Component\Console\Exception\ExceptionInterface; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Console\Exception\NamespaceNotFoundException; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Helper\DebugFormatterHelper; -use RectorPrefix202411\Symfony\Component\Console\Helper\DescriptorHelper; -use RectorPrefix202411\Symfony\Component\Console\Helper\FormatterHelper; -use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202411\Symfony\Component\Console\Helper\ProcessHelper; -use RectorPrefix202411\Symfony\Component\Console\Helper\QuestionHelper; -use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202411\Symfony\Component\Console\Input\ArrayInput; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputAwareInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutput; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\SignalRegistry\SignalRegistry; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202411\Symfony\Component\ErrorHandler\ErrorHandler; -use RectorPrefix202411\Symfony\Contracts\EventDispatcher\EventDispatcherInterface; -use RectorPrefix202411\Symfony\Contracts\Service\ResetInterface; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Command\CompleteCommand; +use RectorPrefix202506\Symfony\Component\Console\Command\DumpCompletionCommand; +use RectorPrefix202506\Symfony\Component\Console\Command\HelpCommand; +use RectorPrefix202506\Symfony\Component\Console\Command\LazyCommand; +use RectorPrefix202506\Symfony\Component\Console\Command\ListCommand; +use RectorPrefix202506\Symfony\Component\Console\Command\SignalableCommandInterface; +use RectorPrefix202506\Symfony\Component\Console\CommandLoader\CommandLoaderInterface; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleCommandEvent; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleErrorEvent; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleSignalEvent; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleTerminateEvent; +use RectorPrefix202506\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202506\Symfony\Component\Console\Exception\ExceptionInterface; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Exception\NamespaceNotFoundException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Helper\DebugFormatterHelper; +use RectorPrefix202506\Symfony\Component\Console\Helper\DescriptorHelper; +use RectorPrefix202506\Symfony\Component\Console\Helper\FormatterHelper; +use RectorPrefix202506\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202506\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202506\Symfony\Component\Console\Helper\ProcessHelper; +use RectorPrefix202506\Symfony\Component\Console\Helper\QuestionHelper; +use RectorPrefix202506\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202506\Symfony\Component\Console\Input\ArrayInput; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputAwareInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutput; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\SignalRegistry\SignalRegistry; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\ErrorHandler\ErrorHandler; +use RectorPrefix202506\Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use RectorPrefix202506\Symfony\Contracts\Service\ResetInterface; /** * An Application is the container for a collection of commands. * @@ -70,78 +70,24 @@ */ class Application implements ResetInterface { - /** - * @var mixed[] - */ - private $commands = []; - /** - * @var bool - */ - private $wantHelps = \false; - /** - * @var \Symfony\Component\Console\Command\Command|null - */ - private $runningCommand; - /** - * @var string - */ - private $name; - /** - * @var string - */ - private $version; - /** - * @var \Symfony\Component\Console\CommandLoader\CommandLoaderInterface|null - */ - private $commandLoader; - /** - * @var bool - */ - private $catchExceptions = \true; - /** - * @var bool - */ - private $catchErrors = \false; - /** - * @var bool - */ - private $autoExit = \true; - /** - * @var \Symfony\Component\Console\Input\InputDefinition - */ - private $definition; - /** - * @var \Symfony\Component\Console\Helper\HelperSet - */ - private $helperSet; - /** - * @var \Symfony\Contracts\EventDispatcher\EventDispatcherInterface|null - */ - private $dispatcher; - /** - * @var \Symfony\Component\Console\Terminal - */ - private $terminal; - /** - * @var string - */ - private $defaultCommand; - /** - * @var bool - */ - private $singleCommand = \false; - /** - * @var bool - */ - private $initialized = \false; - /** - * @var \Symfony\Component\Console\SignalRegistry\SignalRegistry|null - */ - private $signalRegistry; - /** - * @var mixed[] - */ - private $signalsToDispatchEvent = []; + private array $commands = []; + private bool $wantHelps = \false; + private ?Command $runningCommand = null; + private string $name; + private string $version; + private ?CommandLoaderInterface $commandLoader = null; + private bool $catchExceptions = \true; + private bool $catchErrors = \false; + private bool $autoExit = \true; + private InputDefinition $definition; + private HelperSet $helperSet; + private ?EventDispatcherInterface $dispatcher = null; + private Terminal $terminal; + private string $defaultCommand; + private bool $singleCommand = \false; + private bool $initialized = \false; + private ?SignalRegistry $signalRegistry = null; + private array $signalsToDispatchEvent = []; public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN') { $this->name = $name; @@ -194,8 +140,8 @@ public function run(?InputInterface $input = null, ?OutputInterface $output = nu @\putenv('LINES=' . $this->terminal->getHeight()); @\putenv('COLUMNS=' . $this->terminal->getWidth()); } - $input = $input ?? new ArgvInput(); - $output = $output ?? new ConsoleOutput(); + $input ??= new ArgvInput(); + $output ??= new ConsoleOutput(); $renderException = function (\Throwable $e) use($output) { if ($output instanceof ConsoleOutputInterface) { $this->renderThrowable($e, $output->getErrorOutput()); @@ -352,7 +298,7 @@ public function setHelperSet(HelperSet $helperSet) */ public function getHelperSet() : HelperSet { - return $this->helperSet = $this->helperSet ?? $this->getDefaultHelperSet(); + return $this->helperSet ??= $this->getDefaultHelperSet(); } /** * @return void @@ -366,7 +312,7 @@ public function setDefinition(InputDefinition $definition) */ public function getDefinition() : InputDefinition { - $this->definition = $this->definition ?? $this->getDefaultInputDefinition(); + $this->definition ??= $this->getDefaultInputDefinition(); if ($this->singleCommand) { $inputDefinition = $this->definition; $inputDefinition->setArguments(); @@ -663,9 +609,7 @@ public function find(string $name) $message = \sprintf('Command "%s" is not defined.', $name); if ($alternatives = $this->findAlternatives($name, $allCommands)) { // remove hidden commands - $alternatives = \array_filter($alternatives, function ($name) { - return !$this->get($name)->isHidden(); - }); + $alternatives = \array_filter($alternatives, fn($name) => !$this->get($name)->isHidden()); if (1 == \count($alternatives)) { $message .= "\n\nDid you mean this?\n "; } else { @@ -787,9 +731,7 @@ protected function doRenderThrowable(\Throwable $e, OutputInterface $output) : v $len = 0; } if (\strpos($message, "@anonymous\x00") !== \false) { - $message = \preg_replace_callback('/[a-zA-Z_\\x7f-\\xff][\\\\a-zA-Z0-9_\\x7f-\\xff]*+@anonymous\\x00.*?\\.php(?:0x?|:[0-9]++\\$)?[0-9a-fA-F]++/', function ($m) { - return \class_exists($m[0], \false) ? ((\get_parent_class($m[0]) ?: \key(\class_implements($m[0]))) ?: 'class') . '@anonymous' : $m[0]; - }, $message); + $message = \preg_replace_callback('/[a-zA-Z_\\x7f-\\xff][\\\\a-zA-Z0-9_\\x7f-\\xff]*+@anonymous\\x00.*?\\.php(?:0x?|:[0-9]++\\$)?[0-9a-fA-F]++/', fn($m) => \class_exists($m[0], \false) ? ((\get_parent_class($m[0]) ?: \key(\class_implements($m[0]))) ?: 'class') . '@anonymous' : $m[0], $message); } $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX; $lines = []; @@ -911,9 +853,7 @@ protected function doRunCommand(Command $command, InputInterface $input, OutputI if (Terminal::hasSttyAvailable()) { $sttyMode = \shell_exec('stty -g'); foreach ([\SIGINT, \SIGTERM] as $signal) { - $this->signalRegistry->register($signal, static function () use($sttyMode) { - return \shell_exec('stty ' . $sttyMode); - }); + $this->signalRegistry->register($signal, static fn() => \shell_exec('stty ' . $sttyMode)); } } if ($this->dispatcher) { @@ -1074,9 +1014,7 @@ private function findAlternatives(string $name, iterable $collection) : array $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; } } - $alternatives = \array_filter($alternatives, function ($lev) use($threshold) { - return $lev < 2 * $threshold; - }); + $alternatives = \array_filter($alternatives, fn($lev) => $lev < 2 * $threshold); \ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE); return \array_keys($alternatives); } diff --git a/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php b/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php index ca2070741..96c677a50 100644 --- a/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Attribute/AsCommand.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Attribute; +namespace RectorPrefix202506\Symfony\Component\Console\Attribute; /** * Service tag to autoconfigure commands. @@ -16,14 +16,8 @@ #[\Attribute(\Attribute::TARGET_CLASS)] class AsCommand { - /** - * @var string - */ - public $name; - /** - * @var string|null - */ - public $description; + public string $name; + public ?string $description = null; public function __construct(string $name, ?string $description = null, array $aliases = [], bool $hidden = \false) { $this->name = $name; diff --git a/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php b/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php index d4b8c18d7..991bf6357 100644 --- a/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php +++ b/vendor/rector/rector/vendor/symfony/console/CI/GithubActionReporter.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\CI; +namespace RectorPrefix202506\Symfony\Component\Console\CI; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Utility class for Github actions. * @@ -18,10 +18,7 @@ */ class GithubActionReporter { - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; + private OutputInterface $output; /** * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L80-L85 */ diff --git a/vendor/rector/rector/vendor/symfony/console/Color.php b/vendor/rector/rector/vendor/symfony/console/Color.php index f6dd50df6..a96588c21 100644 --- a/vendor/rector/rector/vendor/symfony/console/Color.php +++ b/vendor/rector/rector/vendor/symfony/console/Color.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console; +namespace RectorPrefix202506\Symfony\Component\Console; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Fabien Potencier */ @@ -19,18 +19,9 @@ final class Color private const COLORS = ['black' => 0, 'red' => 1, 'green' => 2, 'yellow' => 3, 'blue' => 4, 'magenta' => 5, 'cyan' => 6, 'white' => 7, 'default' => 9]; private const BRIGHT_COLORS = ['gray' => 0, 'bright-red' => 1, 'bright-green' => 2, 'bright-yellow' => 3, 'bright-blue' => 4, 'bright-magenta' => 5, 'bright-cyan' => 6, 'bright-white' => 7]; private const AVAILABLE_OPTIONS = ['bold' => ['set' => 1, 'unset' => 22], 'underscore' => ['set' => 4, 'unset' => 24], 'blink' => ['set' => 5, 'unset' => 25], 'reverse' => ['set' => 7, 'unset' => 27], 'conceal' => ['set' => 8, 'unset' => 28]]; - /** - * @var string - */ - private $foreground; - /** - * @var string - */ - private $background; - /** - * @var mixed[] - */ - private $options = []; + private string $foreground; + private string $background; + private array $options = []; public function __construct(string $foreground = '', string $background = '', array $options = []) { $this->foreground = $this->parseColor($foreground); diff --git a/vendor/rector/rector/vendor/symfony/console/Command/Command.php b/vendor/rector/rector/vendor/symfony/console/Command/Command.php index 381f988c5..11b74ba23 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/Command.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/Command.php @@ -8,23 +8,23 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202411\Symfony\Component\Console\Exception\ExceptionInterface; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Console\Helper\HelperInterface; -use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202506\Symfony\Component\Console\Exception\ExceptionInterface; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Helper\HelperInterface; +use RectorPrefix202506\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Base class for all commands. * @@ -48,62 +48,20 @@ class Command * @deprecated since Symfony 6.1, use the AsCommand attribute instead */ protected static $defaultDescription; - /** - * @var \Symfony\Component\Console\Application|null - */ - private $application; - /** - * @var string|null - */ - private $name; - /** - * @var string|null - */ - private $processTitle; - /** - * @var mixed[] - */ - private $aliases = []; - /** - * @var \Symfony\Component\Console\Input\InputDefinition - */ - private $definition; - /** - * @var bool - */ - private $hidden = \false; - /** - * @var string - */ - private $help = ''; - /** - * @var string - */ - private $description = ''; - /** - * @var \Symfony\Component\Console\Input\InputDefinition|null - */ - private $fullDefinition; - /** - * @var bool - */ - private $ignoreValidationErrors = \false; - /** - * @var \Closure|null - */ - private $code; - /** - * @var mixed[] - */ - private $synopsis = []; - /** - * @var mixed[] - */ - private $usages = []; - /** - * @var \Symfony\Component\Console\Helper\HelperSet|null - */ - private $helperSet; + private ?Application $application = null; + private ?string $name = null; + private ?string $processTitle = null; + private array $aliases = []; + private InputDefinition $definition; + private bool $hidden = \false; + private string $help = ''; + private string $description = ''; + private ?InputDefinition $fullDefinition = null; + private bool $ignoreValidationErrors = \false; + private ?\Closure $code = null; + private array $synopsis = []; + private array $usages = []; + private ?HelperSet $helperSet = null; public static function getDefaultName() : ?string { $class = static::class; diff --git a/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php index 76ca835cf..001d01608 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/CompleteCommand.php @@ -8,20 +8,20 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; -use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Completion\Output\BashCompletionOutput; -use RectorPrefix202411\Symfony\Component\Console\Completion\Output\CompletionOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Completion\Output\FishCompletionOutput; -use RectorPrefix202411\Symfony\Component\Console\Completion\Output\ZshCompletionOutput; -use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; -use RectorPrefix202411\Symfony\Component\Console\Exception\ExceptionInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Completion\Output\BashCompletionOutput; +use RectorPrefix202506\Symfony\Component\Console\Completion\Output\CompletionOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Completion\Output\FishCompletionOutput; +use RectorPrefix202506\Symfony\Component\Console\Completion\Output\ZshCompletionOutput; +use RectorPrefix202506\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202506\Symfony\Component\Console\Exception\ExceptionInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Responsible for providing the values to the shell completion. * @@ -38,14 +38,8 @@ final class CompleteCommand extends Command * @deprecated since Symfony 6.1 */ protected static $defaultDescription = 'Internal command to provide shell completion suggestions'; - /** - * @var mixed[] - */ - private $completionOutputs; - /** - * @var bool - */ - private $isDebug = \false; + private array $completionOutputs; + private bool $isDebug = \false; /** * @param array> $completionOutputs A list of additional completion outputs, with shell name as key and FQCN as value */ @@ -110,9 +104,7 @@ protected function execute(InputInterface $input, OutputInterface $output) : int $completionOutput = new $completionOutput(); $this->log('Suggestions:'); if ($options = $suggestions->getOptionSuggestions()) { - $this->log(' --' . \implode(' --', \array_map(function ($o) { - return $o->getName(); - }, $options))); + $this->log(' --' . \implode(' --', \array_map(fn($o) => $o->getName(), $options))); } elseif ($values = $suggestions->getValueSuggestions()) { $this->log(' ' . \implode(' ', $values)); } else { diff --git a/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php index eff8e22a4..0c95c835e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/DumpCompletionCommand.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; -use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * Dumps the completion script for the current shell. * @@ -32,10 +32,7 @@ final class DumpCompletionCommand extends Command * @deprecated since Symfony 6.1 */ protected static $defaultDescription = 'Dump the shell completion script'; - /** - * @var mixed[] - */ - private $supportedShells; + private array $supportedShells; protected function configure() : void { $fullCommand = $_SERVER['PHP_SELF']; diff --git a/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php index 3a6c5c59a..30dd641ed 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/HelpCommand.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; -use RectorPrefix202411\Symfony\Component\Console\Descriptor\ApplicationDescription; -use RectorPrefix202411\Symfony\Component\Console\Helper\DescriptorHelper; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Descriptor\ApplicationDescription; +use RectorPrefix202506\Symfony\Component\Console\Helper\DescriptorHelper; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * HelpCommand displays the help for a given command. * @@ -23,21 +23,14 @@ */ class HelpCommand extends Command { - /** - * @var \Symfony\Component\Console\Command\Command - */ - private $command; + private Command $command; /** * @return void */ protected function configure() { $this->ignoreValidationErrors(); - $this->setName('help')->setDefinition([new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', function () { - return \array_keys((new ApplicationDescription($this->getApplication()))->getCommands()); - }), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { - return (new DescriptorHelper())->getFormats(); - }), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help')])->setDescription('Display help for a command')->setHelp(<<<'EOF' + $this->setName('help')->setDefinition([new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', fn() => \array_keys((new ApplicationDescription($this->getApplication()))->getCommands())), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn() => (new DescriptorHelper())->getFormats()), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help')])->setDescription('Display help for a command')->setHelp(<<<'EOF' The %command.name% command displays help for a given command: %command.full_name% list @@ -59,7 +52,7 @@ public function setCommand(Command $command) } protected function execute(InputInterface $input, OutputInterface $output) : int { - $this->command = $this->command ?? $this->getApplication()->find($input->getArgument('command_name')); + $this->command ??= $this->getApplication()->find($input->getArgument('command_name')); $helper = new DescriptorHelper(); $helper->describe($output, $this->command, ['format' => $input->getOption('format'), 'raw_text' => $input->getOption('raw')]); unset($this->command); diff --git a/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php index ea0860957..7dfcbc903 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/LazyCommand.php @@ -8,17 +8,17 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202411\Symfony\Component\Console\Helper\HelperInterface; -use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202506\Symfony\Component\Console\Helper\HelperInterface; +use RectorPrefix202506\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Nicolas Grekas */ @@ -28,10 +28,7 @@ final class LazyCommand extends Command * @var \Closure|\Symfony\Component\Console\Command\Command */ private $command; - /** - * @var bool|null - */ - private $isEnabled; + private ?bool $isEnabled; public function __construct(string $name, array $aliases, string $description, bool $isHidden, \Closure $commandFactory, ?bool $isEnabled = \true) { $this->setName($name)->setAliases($aliases)->setHidden($isHidden)->setDescription($description); diff --git a/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php index 10c8a094e..d428f7644 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/ListCommand.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; - -use RectorPrefix202411\Symfony\Component\Console\Descriptor\ApplicationDescription; -use RectorPrefix202411\Symfony\Component\Console\Helper\DescriptorHelper; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +namespace RectorPrefix202506\Symfony\Component\Console\Command; + +use RectorPrefix202506\Symfony\Component\Console\Descriptor\ApplicationDescription; +use RectorPrefix202506\Symfony\Component\Console\Helper\DescriptorHelper; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * ListCommand displays the list of all available commands for the application. * @@ -28,11 +28,7 @@ class ListCommand extends Command */ protected function configure() { - $this->setName('list')->setDefinition([new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, function () { - return \array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces()); - }), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { - return (new DescriptorHelper())->getFormats(); - }), new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments')])->setDescription('List commands')->setHelp(<<<'EOF' + $this->setName('list')->setDefinition([new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, fn() => \array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces())), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn() => (new DescriptorHelper())->getFormats()), new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments')])->setDescription('List commands')->setHelp(<<<'EOF' The %command.name% command lists all commands: %command.full_name% diff --git a/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php b/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php index d1785fc58..9d8215d61 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/LockableTrait.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Lock\LockFactory; -use RectorPrefix202411\Symfony\Component\Lock\LockInterface; -use RectorPrefix202411\Symfony\Component\Lock\Store\FlockStore; -use RectorPrefix202411\Symfony\Component\Lock\Store\SemaphoreStore; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Lock\LockFactory; +use RectorPrefix202506\Symfony\Component\Lock\LockInterface; +use RectorPrefix202506\Symfony\Component\Lock\Store\FlockStore; +use RectorPrefix202506\Symfony\Component\Lock\Store\SemaphoreStore; /** * Basic lock feature for commands. * @@ -22,10 +22,7 @@ */ trait LockableTrait { - /** - * @var \Symfony\Component\Lock\LockInterface|null - */ - private $lock; + private ?LockInterface $lock = null; /** * Locks a command. */ diff --git a/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php b/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php index 1321e295f..9d817627c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/SignalableCommandInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; /** * Interface for command reacting to signal. diff --git a/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php b/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php index 6eb8e3d22..e1aa154c5 100644 --- a/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php +++ b/vendor/rector/rector/vendor/symfony/console/Command/TraceableCommand.php @@ -8,18 +8,18 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Command; +namespace RectorPrefix202506\Symfony\Component\Console\Command; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Helper\HelperInterface; -use RectorPrefix202411\Symfony\Component\Console\Helper\HelperSet; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Stopwatch\Stopwatch; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Helper\HelperInterface; +use RectorPrefix202506\Symfony\Component\Console\Helper\HelperSet; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Stopwatch\Stopwatch; /** * @internal * @@ -29,56 +29,27 @@ final class TraceableCommand extends Command implements SignalableCommandInterfa { /** * @readonly - * @var \Symfony\Component\Stopwatch\Stopwatch */ - private $stopwatch; + private Stopwatch $stopwatch; /** * @readonly - * @var \Symfony\Component\Console\Command\Command */ - public $command; - /** - * @var int - */ - public $exitCode; - /** - * @var int|null - */ - public $interruptedBySignal; - /** - * @var bool - */ - public $ignoreValidation; - /** - * @var bool - */ - public $isInteractive = \false; - /** - * @var string - */ - public $duration = 'n/a'; - /** - * @var string - */ - public $maxMemoryUsage = 'n/a'; - /** - * @var \Symfony\Component\Console\Input\InputInterface - */ - public $input; - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - public $output; + public Command $command; + public int $exitCode; + public ?int $interruptedBySignal = null; + public bool $ignoreValidation; + public bool $isInteractive = \false; + public string $duration = 'n/a'; + public string $maxMemoryUsage = 'n/a'; + public InputInterface $input; + public OutputInterface $output; /** @var array */ - public $arguments; + public array $arguments; /** @var array */ - public $options; + public array $options; /** @var array */ - public $interactiveInputs = []; - /** - * @var mixed[] - */ - public $handledSignals = []; + public array $interactiveInputs = []; + public array $handledSignals = []; public function __construct(Command $command, Stopwatch $stopwatch) { $this->stopwatch = $stopwatch; diff --git a/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php b/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php index 95c4262c1..9dc752aec 100644 --- a/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\CommandLoader; +namespace RectorPrefix202506\Symfony\Component\Console\CommandLoader; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Exception\CommandNotFoundException; /** * @author Robin Chalas */ diff --git a/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php b/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php index 2e15cbb8f..2c4309b9e 100644 --- a/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php +++ b/vendor/rector/rector/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\CommandLoader; +namespace RectorPrefix202506\Symfony\Component\Console\CommandLoader; -use RectorPrefix202411\Psr\Container\ContainerInterface; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202506\Psr\Container\ContainerInterface; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Exception\CommandNotFoundException; /** * Loads commands from a PSR-11 container. * @@ -20,14 +20,8 @@ */ class ContainerCommandLoader implements CommandLoaderInterface { - /** - * @var \Psr\Container\ContainerInterface - */ - private $container; - /** - * @var mixed[] - */ - private $commandMap; + private ContainerInterface $container; + private array $commandMap; /** * @param array $commandMap An array with command names as keys and service ids as values */ diff --git a/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php b/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php index 59d29f02e..571947442 100644 --- a/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php +++ b/vendor/rector/rector/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\CommandLoader; +namespace RectorPrefix202506\Symfony\Component\Console\CommandLoader; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Exception\CommandNotFoundException; /** * A simple command loader using factories to instantiate commands lazily. * @@ -19,10 +19,7 @@ */ class FactoryCommandLoader implements CommandLoaderInterface { - /** - * @var mixed[] - */ - private $factories; + private array $factories; /** * @param callable[] $factories Indexed by command names */ diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php index ea1dd6c3f..d7d4c5951 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionInput.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Completion; +namespace RectorPrefix202506\Symfony\Component\Console\Completion; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Console\Input\ArgvInput; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Input\ArgvInput; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; /** * An input specialized for shell completion. * @@ -28,26 +28,11 @@ final class CompletionInput extends ArgvInput public const TYPE_OPTION_VALUE = 'option_value'; public const TYPE_OPTION_NAME = 'option_name'; public const TYPE_NONE = 'none'; - /** - * @var mixed[] - */ - private $tokens; - /** - * @var int - */ - private $currentIndex; - /** - * @var string - */ - private $completionType; - /** - * @var string|null - */ - private $completionName; - /** - * @var string - */ - private $completionValue = ''; + private array $tokens; + private int $currentIndex; + private string $completionType; + private ?string $completionName = null; + private string $completionValue = ''; /** * Converts a terminal string into tokens. * @@ -111,9 +96,7 @@ public function bind(InputDefinition $definition) : void $argumentValue = $this->arguments[$argumentName]; $this->completionName = $argumentName; if (\is_array($argumentValue)) { - \end($argumentValue); - $this->completionValue = $argumentValue ? $argumentValue[\key($argumentValue)] : null; - \reset($argumentValue); + $this->completionValue = $argumentValue ? $argumentValue[\array_key_last($argumentValue)] : null; } else { $this->completionValue = $argumentValue; } diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php index bf862445f..0c81c16ab 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/CompletionSuggestions.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Completion; +namespace RectorPrefix202506\Symfony\Component\Console\Completion; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; /** * Stores all completion suggestions for the current input. * @@ -18,14 +18,8 @@ */ final class CompletionSuggestions { - /** - * @var mixed[] - */ - private $valueSuggestions = []; - /** - * @var mixed[] - */ - private $optionSuggestions = []; + private array $valueSuggestions = []; + private array $optionSuggestions = []; /** * Add a suggested value for an input option or argument. * diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php index 94d2e9d73..ddc2c8b09 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/BashCompletionOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Completion\Output; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Wouter de Jong */ diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php index 76442724c..bdcba2c97 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Completion\Output; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Transforms the {@see CompletionSuggestions} object into output readable by the shell completion. * diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php index 5fdc93a94..365f52a1c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/FishCompletionOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Completion\Output; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Guillaume Aveline */ diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php b/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php index 1a7fa94db..42d2f4664 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Completion\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Completion\Output; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Jitendra A */ diff --git a/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php b/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php index 49a2a744b..a2c2b56b2 100644 --- a/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php +++ b/vendor/rector/rector/vendor/symfony/console/Completion/Suggestion.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Completion; +namespace RectorPrefix202506\Symfony\Component\Console\Completion; /** * Represents a single suggested value. @@ -19,14 +19,12 @@ class Suggestion { /** * @readonly - * @var string */ - private $value; + private string $value; /** * @readonly - * @var string */ - private $description = ''; + private string $description = ''; public function __construct(string $value, string $description = '') { $this->value = $value; diff --git a/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php b/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php index f42b186f0..ef2eb35dc 100644 --- a/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php +++ b/vendor/rector/rector/vendor/symfony/console/ConsoleEvents.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console; +namespace RectorPrefix202506\Symfony\Component\Console; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleCommandEvent; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleErrorEvent; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleSignalEvent; -use RectorPrefix202411\Symfony\Component\Console\Event\ConsoleTerminateEvent; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleCommandEvent; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleErrorEvent; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleSignalEvent; +use RectorPrefix202506\Symfony\Component\Console\Event\ConsoleTerminateEvent; /** * Contains all events dispatched by an Application. * diff --git a/vendor/rector/rector/vendor/symfony/console/Cursor.php b/vendor/rector/rector/vendor/symfony/console/Cursor.php index 7c9d35bb8..5f3a65921 100644 --- a/vendor/rector/rector/vendor/symfony/console/Cursor.php +++ b/vendor/rector/rector/vendor/symfony/console/Cursor.php @@ -8,18 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console; +namespace RectorPrefix202506\Symfony\Component\Console; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Pierre du Plessis */ final class Cursor { - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; + private OutputInterface $output; /** @var resource */ private $input; /** @@ -154,7 +151,7 @@ public function clearScreen() public function getCurrentPosition() : array { static $isTtySupported; - if (!($isTtySupported = $isTtySupported ?? '/' === \DIRECTORY_SEPARATOR && \stream_isatty(\STDOUT))) { + if (!($isTtySupported ??= '/' === \DIRECTORY_SEPARATOR && \stream_isatty(\STDOUT))) { return [1, 1]; } $sttyMode = \shell_exec('stty -g'); diff --git a/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php b/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php index 1882b6dd1..ecfa40c72 100644 --- a/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php +++ b/vendor/rector/rector/vendor/symfony/console/DataCollector/CommandDataCollector.php @@ -8,16 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\DataCollector; +namespace RectorPrefix202506\Symfony\Component\Console\DataCollector; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Debug\CliRequest; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\SignalRegistry\SignalMap; -use RectorPrefix202411\Symfony\Component\HttpFoundation\Request; -use RectorPrefix202411\Symfony\Component\HttpFoundation\Response; -use RectorPrefix202411\Symfony\Component\HttpKernel\DataCollector\DataCollector; -use RectorPrefix202411\Symfony\Component\VarDumper\Cloner\Data; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Debug\CliRequest; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\SignalRegistry\SignalMap; +use RectorPrefix202506\Symfony\Component\HttpFoundation\Request; +use RectorPrefix202506\Symfony\Component\HttpFoundation\Response; +use RectorPrefix202506\Symfony\Component\HttpKernel\DataCollector\DataCollector; +use RectorPrefix202506\Symfony\Component\VarDumper\Cloner\Data; /** * @internal * @@ -157,15 +157,11 @@ public function getInteractiveInputs() : array } public function getSignalable() : array { - return \array_map(static function (int $signal) : string { - return \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal); - }, $this->data['signalable']); + return \array_map(static fn(int $signal): string => \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal), $this->data['signalable']); } public function getHandledSignals() : array { - $keys = \array_map(static function (int $signal) : string { - return \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal); - }, \array_keys($this->data['handled_signals'])); + $keys = \array_map(static fn(int $signal): string => \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal), \array_keys($this->data['handled_signals'])); return \array_combine($keys, \array_values($this->data['handled_signals'])); } /** diff --git a/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php b/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php index 6d22a589c..af8d7c1a8 100644 --- a/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php +++ b/vendor/rector/rector/vendor/symfony/console/Debug/CliRequest.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Debug; +namespace RectorPrefix202506\Symfony\Component\Console\Debug; -use RectorPrefix202411\Symfony\Component\Console\Command\TraceableCommand; -use RectorPrefix202411\Symfony\Component\HttpFoundation\Request; -use RectorPrefix202411\Symfony\Component\HttpFoundation\Response; +use RectorPrefix202506\Symfony\Component\Console\Command\TraceableCommand; +use RectorPrefix202506\Symfony\Component\HttpFoundation\Request; +use RectorPrefix202506\Symfony\Component\HttpFoundation\Response; /** * @internal */ @@ -20,9 +20,8 @@ final class CliRequest extends Request { /** * @readonly - * @var \Symfony\Component\Console\Command\TraceableCommand */ - public $command; + public TraceableCommand $command; public function __construct(TraceableCommand $command) { $this->command = $command; @@ -48,9 +47,8 @@ public function getResponse() : Response { /** * @readonly - * @var int */ - private $exitCode; + private int $exitCode; public function __construct(int $exitCode) { $this->exitCode = $exitCode; diff --git a/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php index 58335bc4e..a880d2b9a 100644 --- a/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +++ b/vendor/rector/rector/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php @@ -8,18 +8,18 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\DependencyInjection; +namespace RectorPrefix202506\Symfony\Component\Console\DependencyInjection; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Command\LazyCommand; -use RectorPrefix202411\Symfony\Component\Console\CommandLoader\ContainerCommandLoader; -use RectorPrefix202411\Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use RectorPrefix202411\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use RectorPrefix202411\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; -use RectorPrefix202411\Symfony\Component\DependencyInjection\ContainerBuilder; -use RectorPrefix202411\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\DependencyInjection\Reference; -use RectorPrefix202411\Symfony\Component\DependencyInjection\TypedReference; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Command\LazyCommand; +use RectorPrefix202506\Symfony\Component\Console\CommandLoader\ContainerCommandLoader; +use RectorPrefix202506\Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; +use RectorPrefix202506\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use RectorPrefix202506\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use RectorPrefix202506\Symfony\Component\DependencyInjection\ContainerBuilder; +use RectorPrefix202506\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\DependencyInjection\Reference; +use RectorPrefix202506\Symfony\Component\DependencyInjection\TypedReference; /** * Registers console commands. * @@ -77,7 +77,7 @@ public function process(ContainerBuilder $container) $aliases[] = $tag['command']; $lazyCommandMap[$tag['command']] = $id; } - $description = $description ?? $tag['description'] ?? null; + $description ??= $tag['description'] ?? null; } $definition->addMethodCall('setName', [$commandName]); if ($aliases) { diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php index 2bde48b4b..5755c6cd0 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/ApplicationDescription.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Exception\CommandNotFoundException; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Exception\CommandNotFoundException; /** * @author Jean-François Simon * @@ -21,30 +21,18 @@ class ApplicationDescription { public const GLOBAL_NAMESPACE = '_global'; - /** - * @var \Symfony\Component\Console\Application - */ - private $application; - /** - * @var string|null - */ - private $namespace; - /** - * @var bool - */ - private $showHidden; - /** - * @var mixed[] - */ - private $namespaces; + private Application $application; + private ?string $namespace; + private bool $showHidden; + private array $namespaces; /** * @var array */ - private $commands; + private array $commands; /** * @var array */ - private $aliases = []; + private array $aliases = []; public function __construct(Application $application, ?string $namespace = null, bool $showHidden = \false) { $this->application = $application; diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php index 1c2f5c016..954594f18 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/Descriptor.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Jean-François Simon * @@ -24,10 +24,7 @@ */ abstract class Descriptor implements DescriptorInterface { - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - protected $output; + protected OutputInterface $output; public function describe(OutputInterface $output, object $object, array $options = []) : void { $this->output = $output; diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php index 777465324..5a0b5adee 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/DescriptorInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Descriptor interface. * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php index 69c751f7a..bd113be69 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/JsonDescriptor.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; /** * JSON descriptor. * diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php index 6419ab188..3271cae98 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/MarkdownDescriptor.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Markdown descriptor. * @@ -75,15 +75,11 @@ protected function describeInputDefinition(InputDefinition $definition, array $o protected function describeCommand(Command $command, array $options = []) : void { if ($options['short'] ?? \false) { - $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce($command->getAliases(), function ($carry, $usage) { - return $carry . '* `' . $usage . '`' . "\n"; - })); + $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce($command->getAliases(), fn($carry, $usage) => $carry . '* `' . $usage . '`' . "\n")); return; } $command->mergeApplicationDefinition(\false); - $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) { - return $carry . '* `' . $usage . '`' . "\n"; - })); + $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), fn($carry, $usage) => $carry . '* `' . $usage . '`' . "\n")); if ($help = $command->getProcessedHelp()) { $this->write("\n"); $this->write($help); @@ -106,9 +102,7 @@ protected function describeApplication(Application $application, array $options $this->write('**' . $namespace['id'] . ':**'); } $this->write("\n\n"); - $this->write(\implode("\n", \array_map(function ($commandName) use($description) { - return \sprintf('* [`%s`](#%s)', $commandName, \str_replace(':', '', $description->getCommand($commandName)->getName())); - }, $namespace['commands']))); + $this->write(\implode("\n", \array_map(fn($commandName) => \sprintf('* [`%s`](#%s)', $commandName, \str_replace(':', '', $description->getCommand($commandName)->getName())), $namespace['commands']))); } foreach ($description->getCommands() as $command) { $this->write("\n\n"); diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php index ff2a35a1f..a6c151ee4 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php @@ -8,52 +8,31 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\String\UnicodeString; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\String\UnicodeString; class ReStructuredTextDescriptor extends Descriptor { //

- /** - * @var string - */ - private $partChar = '='; + private string $partChar = '='; //

- /** - * @var string - */ - private $chapterChar = '-'; + private string $chapterChar = '-'; //

- /** - * @var string - */ - private $sectionChar = '~'; + private string $sectionChar = '~'; //

- /** - * @var string - */ - private $subsectionChar = '.'; + private string $subsectionChar = '.'; //

- /** - * @var string - */ - private $subsubsectionChar = '^'; + private string $subsubsectionChar = '^'; //
- /** - * @var string - */ - private $paragraphsChar = '"'; - /** - * @var mixed[] - */ - private $visibleNamespaces = []; + private string $paragraphsChar = '"'; + private array $visibleNamespaces = []; public function describe(OutputInterface $output, object $object, array $options = []) : void { $decorated = $output->isDecorated(); @@ -108,18 +87,14 @@ protected function describeInputDefinition(InputDefinition $definition, array $o protected function describeCommand(Command $command, array $options = []) : void { if ($options['short'] ?? \false) { - $this->write('``' . $command->getName() . "``\n" . \str_repeat($this->subsectionChar, Helper::width($command->getName())) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . "Usage\n" . \str_repeat($this->paragraphsChar, 5) . "\n\n" . \array_reduce($command->getAliases(), static function ($carry, $usage) { - return $carry . '- ``' . $usage . '``' . "\n"; - })); + $this->write('``' . $command->getName() . "``\n" . \str_repeat($this->subsectionChar, Helper::width($command->getName())) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . "Usage\n" . \str_repeat($this->paragraphsChar, 5) . "\n\n" . \array_reduce($command->getAliases(), static fn($carry, $usage) => $carry . '- ``' . $usage . '``' . "\n")); return; } $command->mergeApplicationDefinition(\false); foreach ($command->getAliases() as $alias) { $this->write('.. _' . $alias . ":\n\n"); } - $this->write($command->getName() . "\n" . \str_repeat($this->subsectionChar, Helper::width($command->getName())) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . "Usage\n" . \str_repeat($this->subsubsectionChar, 5) . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static function ($carry, $usage) { - return $carry . '- ``' . $usage . '``' . "\n"; - })); + $this->write($command->getName() . "\n" . \str_repeat($this->subsectionChar, Helper::width($command->getName())) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . "Usage\n" . \str_repeat($this->subsubsectionChar, 5) . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static fn($carry, $usage) => $carry . '- ``' . $usage . '``' . "\n")); if ($help = $command->getProcessedHelp()) { $this->write("\n"); $this->write($help); @@ -181,9 +156,7 @@ private function createTableOfContents(ApplicationDescription $description, Appl } $commands = $this->removeAliasesAndHiddenCommands($commands); $this->write("\n\n"); - $this->write(\implode("\n", \array_map(static function ($commandName) { - return \sprintf('- `%s`_', $commandName); - }, \array_keys($commands)))); + $this->write(\implode("\n", \array_map(static fn($commandName) => \sprintf('- `%s`_', $commandName), \array_keys($commands)))); } } private function getNonDefaultOptions(InputDefinition $definition) : array diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php index b1bfc0bcf..29b8a4383 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/TextDescriptor.php @@ -8,15 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; /** * Text descriptor. * @@ -164,18 +164,14 @@ protected function describeApplication(Application $application, array $options } } // calculate max. width based on available commands per namespace - $width = $this->getColumnWidth(\array_merge(...\array_values(\array_map(function ($namespace) use($commands) { - return \array_intersect($namespace['commands'], \array_keys($commands)); - }, \array_values($namespaces))))); + $width = $this->getColumnWidth(\array_merge(...\array_values(\array_map(fn($namespace) => \array_intersect($namespace['commands'], \array_keys($commands)), \array_values($namespaces))))); if ($describedNamespace) { $this->writeText(\sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); } else { $this->writeText('Available commands:', $options); } foreach ($namespaces as $namespace) { - $namespace['commands'] = \array_filter($namespace['commands'], function ($name) use($commands) { - return isset($commands[$name]); - }); + $namespace['commands'] = \array_filter($namespace['commands'], fn($name) => isset($commands[$name])); if (!$namespace['commands']) { continue; } diff --git a/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php b/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php index 8760d717c..d7d2f0f94 100644 --- a/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php +++ b/vendor/rector/rector/vendor/symfony/console/Descriptor/XmlDescriptor.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Descriptor; +namespace RectorPrefix202506\Symfony\Component\Console\Descriptor; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputDefinition; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputDefinition; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; /** * XML descriptor. * diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php b/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php index 4af29ce06..bb1d4a115 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/CommandNotFoundException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * Represents an incorrect command name typed in the console. @@ -17,10 +17,7 @@ */ class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface { - /** - * @var mixed[] - */ - private $alternatives; + private array $alternatives; /** * @param string $message Exception message to throw * @param string[] $alternatives List of similar defined names diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php b/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php index 8f206d6ba..8ac639c6c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/ExceptionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * ExceptionInterface. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php index 184a3fba2..ee82133f4 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidArgumentException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php index 22299b70d..e8fa840cb 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/InvalidOptionException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * Represents an incorrect option name or value typed in the console. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php b/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php index 999549f9b..cdaa03128 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/LogicException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php b/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php index d478e4c7e..b8f6c23f4 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/MissingInputException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * Represents failure to read input from stdin. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php b/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php index 1a6c58f2d..71cfbf377 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/NamespaceNotFoundException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * Represents an incorrect namespace typed in the console. diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php b/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php index e72fb3343..344850755 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/RunCommandFailedException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; -use RectorPrefix202411\Symfony\Component\Console\Messenger\RunCommandContext; +use RectorPrefix202506\Symfony\Component\Console\Messenger\RunCommandContext; /** * @author Kevin Bond */ @@ -18,9 +18,8 @@ final class RunCommandFailedException extends RuntimeException { /** * @readonly - * @var \Symfony\Component\Console\Messenger\RunCommandContext */ - public $context; + public RunCommandContext $context; /** * @param \Throwable|string $exception */ diff --git a/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php index cf53f0e31..1211fde5c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/console/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Exception; +namespace RectorPrefix202506\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php index 24abc9dbf..88c5e88c8 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatter.php @@ -8,17 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; /** * @author Tien Xuan Vo */ final class NullOutputFormatter implements OutputFormatterInterface { - /** - * @var \Symfony\Component\Console\Formatter\NullOutputFormatterStyle - */ - private $style; + private NullOutputFormatterStyle $style; public function format(?string $message) : ?string { return null; @@ -26,7 +23,7 @@ public function format(?string $message) : ?string public function getStyle(string $name) : OutputFormatterStyleInterface { // to comply with the interface we must return a OutputFormatterStyleInterface - return $this->style = $this->style ?? new NullOutputFormatterStyle(); + return $this->style ??= new NullOutputFormatterStyle(); } public function hasStyle(string $name) : bool { diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php index 8190f899f..4b155e927 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; /** * @author Tien Xuan Vo diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php index 2e634fc72..e37a2ac6f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatter.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use function RectorPrefix202411\Symfony\Component\String\b; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use function RectorPrefix202506\Symfony\Component\String\b; /** * Formatter class for console output. * @@ -20,18 +20,9 @@ */ class OutputFormatter implements WrappableOutputFormatterInterface { - /** - * @var bool - */ - private $decorated; - /** - * @var mixed[] - */ - private $styles = []; - /** - * @var \Symfony\Component\Console\Formatter\OutputFormatterStyleStack - */ - private $styleStack; + private bool $decorated; + private array $styles = []; + private OutputFormatterStyleStack $styleStack; public function __clone() { $this->styleStack = clone $this->styleStack; diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php index 5861884a8..a8c37c871 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; /** * Formatter interface for console output. diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php index b449e74c5..68f8c989d 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyle.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; -use RectorPrefix202411\Symfony\Component\Console\Color; +use RectorPrefix202506\Symfony\Component\Console\Color; /** * Formatter style class for defining styles. * @@ -18,30 +18,12 @@ */ class OutputFormatterStyle implements OutputFormatterStyleInterface { - /** - * @var \Symfony\Component\Console\Color - */ - private $color; - /** - * @var string - */ - private $foreground; - /** - * @var string - */ - private $background; - /** - * @var mixed[] - */ - private $options; - /** - * @var string|null - */ - private $href; - /** - * @var bool - */ - private $handlesHrefGracefully; + private Color $color; + private string $foreground; + private string $background; + private array $options; + private ?string $href = null; + private bool $handlesHrefGracefully; /** * Initializes output formatter style. * @@ -104,7 +86,7 @@ public function setOptions(array $options) } public function apply(string $text) : string { - $this->handlesHrefGracefully = $this->handlesHrefGracefully ?? 'JetBrains-JediTerm' !== \getenv('TERMINAL_EMULATOR') && (!\getenv('KONSOLE_VERSION') || (int) \getenv('KONSOLE_VERSION') > 201100) && !isset($_SERVER['IDEA_INITIAL_DIRECTORY']); + $this->handlesHrefGracefully ??= 'JetBrains-JediTerm' !== \getenv('TERMINAL_EMULATOR') && (!\getenv('KONSOLE_VERSION') || (int) \getenv('KONSOLE_VERSION') > 201100) && !isset($_SERVER['IDEA_INITIAL_DIRECTORY']); if (null !== $this->href && $this->handlesHrefGracefully) { $text = "\x1b]8;;{$this->href}\x1b\\{$text}\x1b]8;;\x1b\\"; } diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php index fb441251d..927622ad2 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; /** * Formatter style interface for defining styles. diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php index 21e632809..d3c5be4e8 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Contracts\Service\ResetInterface; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Contracts\Service\ResetInterface; /** * @author Jean-François Simon */ @@ -20,11 +20,8 @@ class OutputFormatterStyleStack implements ResetInterface /** * @var OutputFormatterStyleInterface[] */ - private $styles = []; - /** - * @var \Symfony\Component\Console\Formatter\OutputFormatterStyleInterface - */ - private $emptyStyle; + private array $styles = []; + private OutputFormatterStyleInterface $emptyStyle; public function __construct(?OutputFormatterStyleInterface $emptyStyle = null) { $this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle(); diff --git a/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php b/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php index 9f96a8430..080550a1c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Formatter; +namespace RectorPrefix202506\Symfony\Component\Console\Formatter; /** * Formatter interface for console output that supports word wrapping. diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php index 7d90acdb7..30b06f9bf 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/DebugFormatterHelper.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; /** * Helps outputting debug information when running an external program from a command. @@ -20,14 +20,8 @@ class DebugFormatterHelper extends Helper { private const COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default']; - /** - * @var mixed[] - */ - private $started = []; - /** - * @var int - */ - private $count = -1; + private array $started = []; + private int $count = -1; /** * Starts a debug formatting session. */ diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php index 3db8ec92a..33f5b1792 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/DescriptorHelper.php @@ -8,16 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Descriptor\DescriptorInterface; -use RectorPrefix202411\Symfony\Component\Console\Descriptor\JsonDescriptor; -use RectorPrefix202411\Symfony\Component\Console\Descriptor\MarkdownDescriptor; -use RectorPrefix202411\Symfony\Component\Console\Descriptor\ReStructuredTextDescriptor; -use RectorPrefix202411\Symfony\Component\Console\Descriptor\TextDescriptor; -use RectorPrefix202411\Symfony\Component\Console\Descriptor\XmlDescriptor; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Descriptor\DescriptorInterface; +use RectorPrefix202506\Symfony\Component\Console\Descriptor\JsonDescriptor; +use RectorPrefix202506\Symfony\Component\Console\Descriptor\MarkdownDescriptor; +use RectorPrefix202506\Symfony\Component\Console\Descriptor\ReStructuredTextDescriptor; +use RectorPrefix202506\Symfony\Component\Console\Descriptor\TextDescriptor; +use RectorPrefix202506\Symfony\Component\Console\Descriptor\XmlDescriptor; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * This class adds helper method to describe objects in various formats. * @@ -28,7 +28,7 @@ class DescriptorHelper extends Helper /** * @var DescriptorInterface[] */ - private $descriptors = []; + private array $descriptors = []; public function __construct() { $this->register('txt', new TextDescriptor())->register('xml', new XmlDescriptor())->register('json', new JsonDescriptor())->register('md', new MarkdownDescriptor())->register('rst', new ReStructuredTextDescriptor()); diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php b/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php index d5a34600b..b6ae10c51 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/Dumper.php @@ -8,33 +8,21 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\VarDumper\Cloner\ClonerInterface; -use RectorPrefix202411\Symfony\Component\VarDumper\Cloner\VarCloner; -use RectorPrefix202411\Symfony\Component\VarDumper\Dumper\CliDumper; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\VarDumper\Cloner\ClonerInterface; +use RectorPrefix202506\Symfony\Component\VarDumper\Cloner\VarCloner; +use RectorPrefix202506\Symfony\Component\VarDumper\Dumper\CliDumper; /** * @author Roland Franssen */ final class Dumper { - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; - /** - * @var \Symfony\Component\VarDumper\Dumper\CliDumper|null - */ - private $dumper; - /** - * @var \Symfony\Component\VarDumper\Cloner\ClonerInterface|null - */ - private $cloner; - /** - * @var \Closure - */ - private $handler; + private OutputInterface $output; + private ?CliDumper $dumper; + private ?ClonerInterface $cloner; + private \Closure $handler; public function __construct(OutputInterface $output, ?CliDumper $dumper = null, ?ClonerInterface $cloner = null) { $this->output = $output; @@ -42,9 +30,9 @@ public function __construct(OutputInterface $output, ?CliDumper $dumper = null, $this->cloner = $cloner; if (\class_exists(CliDumper::class)) { $this->handler = function ($var) : string { - $dumper = $this->dumper = $this->dumper ?? new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR); + $dumper = $this->dumper ??= new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR); $dumper->setColors($this->output->isDecorated()); - return \rtrim($dumper->dump(($this->cloner = $this->cloner ?? new VarCloner())->cloneVar($var)->withRefHandles(\false), \true)); + return \rtrim($dumper->dump(($this->cloner ??= new VarCloner())->cloneVar($var)->withRefHandles(\false), \true)); }; } else { $this->handler = function ($var) : string { diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php index a071ec188..ce0f55327 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/FormatterHelper.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; /** * The Formatter class provides helpers to format messages. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php b/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php index 23231a5cd..01e94e547 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/Helper.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; -use RectorPrefix202411\Symfony\Component\String\UnicodeString; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\String\UnicodeString; /** * Helper is the base class for all helper classes. * @@ -40,7 +40,7 @@ public function getHelperSet() : ?HelperSet */ public static function width(?string $string) : int { - $string = $string ?? ''; + $string ??= ''; return \mb_strlen($string); if (\preg_match('//u', $string)) { return (new UnicodeString($string))->width(\false); @@ -56,7 +56,7 @@ public static function width(?string $string) : int */ public static function length(?string $string) : int { - $string = $string ?? ''; + $string ??= ''; return \mb_strlen($string); if (\preg_match('//u', $string)) { return (new UnicodeString($string))->length(); @@ -71,7 +71,7 @@ public static function length(?string $string) : int */ public static function substr(?string $string, int $from, ?int $length = null) : string { - $string = $string ?? ''; + $string ??= ''; if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { return \substr($string, $from, $length); } diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php b/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php index 9e802d471..a057782ff 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/HelperInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; /** * HelperInterface is the interface all helpers must implement. diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php b/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php index 05c687023..37f3d77d1 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/HelperSet.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; /** * HelperSet represents a set of helpers to be used with a command. * @@ -21,7 +21,7 @@ class HelperSet implements \IteratorAggregate { /** @var array */ - private $helpers = []; + private array $helpers = []; /** * @param HelperInterface[] $helpers */ diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php index cc739c8cf..aa6791207 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/InputAwareHelper.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Input\InputAwareInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputAwareInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; /** * An implementation of InputAwareInterface for Helpers. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php b/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php index e5175cd99..9dd786dbf 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/OutputWrapper.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; /** * Simple output wrapper for "tagged outputs" instead of wordwrap(). This solution is based on a StackOverflow @@ -43,10 +43,7 @@ */ final class OutputWrapper { - /** - * @var bool - */ - private $allowCutUrls = \false; + private bool $allowCutUrls = \false; private const TAG_OPEN_REGEX_SEGMENT = '[a-z](?:[^\\\\<>]*+ | \\\\.)*'; private const TAG_CLOSE_REGEX_SEGMENT = '[a-z][^<>]*+'; private const URL_PATTERN = 'https?://\\S+'; diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php index c9e3f0533..568e11551 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/ProcessHelper.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessFailedException; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Process\Exception\ProcessFailedException; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * The ProcessHelper class provides helpers to run external processes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php index b97670fc0..b6954241c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressBar.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Cursor; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Terminal; +use RectorPrefix202506\Symfony\Component\Console\Cursor; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Terminal; /** * The ProgressBar provides helpers to display progress output. * @@ -32,110 +32,32 @@ final class ProgressBar private const FORMAT_VERY_VERBOSE_NOMAX = 'very_verbose_nomax'; private const FORMAT_DEBUG_NOMAX = 'debug_nomax'; private const FORMAT_NORMAL_NOMAX = 'normal_nomax'; - /** - * @var int - */ - private $barWidth = 28; - /** - * @var string - */ - private $barChar; - /** - * @var string - */ - private $emptyBarChar = '-'; - /** - * @var string - */ - private $progressChar = '>'; - /** - * @var string|null - */ - private $format; - /** - * @var string|null - */ - private $internalFormat; - /** - * @var int|null - */ - private $redrawFreq = 1; - /** - * @var int - */ - private $writeCount = 0; - /** - * @var float - */ - private $lastWriteTime = 0; - /** - * @var float - */ - private $minSecondsBetweenRedraws = 0; - /** - * @var float - */ - private $maxSecondsBetweenRedraws = 1; - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; - /** - * @var int - */ - private $step = 0; - /** - * @var int - */ - private $startingStep = 0; - /** - * @var int|null - */ - private $max; - /** - * @var int - */ - private $startTime; - /** - * @var int - */ - private $stepWidth; - /** - * @var float - */ - private $percent = 0.0; - /** - * @var mixed[] - */ - private $messages = []; - /** - * @var bool - */ - private $overwrite = \true; - /** - * @var \Symfony\Component\Console\Terminal - */ - private $terminal; - /** - * @var string|null - */ - private $previousMessage; - /** - * @var \Symfony\Component\Console\Cursor - */ - private $cursor; - /** - * @var mixed[] - */ - private $placeholders = []; - /** - * @var mixed[] - */ - private static $formatters; - /** - * @var mixed[] - */ - private static $formats; + private int $barWidth = 28; + private string $barChar; + private string $emptyBarChar = '-'; + private string $progressChar = '>'; + private ?string $format = null; + private ?string $internalFormat = null; + private ?int $redrawFreq = 1; + private int $writeCount = 0; + private float $lastWriteTime = 0; + private float $minSecondsBetweenRedraws = 0; + private float $maxSecondsBetweenRedraws = 1; + private OutputInterface $output; + private int $step = 0; + private int $startingStep = 0; + private ?int $max = null; + private int $startTime; + private int $stepWidth; + private float $percent = 0.0; + private array $messages = []; + private bool $overwrite = \true; + private Terminal $terminal; + private ?string $previousMessage = null; + private Cursor $cursor; + private array $placeholders = []; + private static array $formatters; + private static array $formats; /** * @param int $max Maximum steps (0 if unknown) */ @@ -170,7 +92,7 @@ public function __construct(OutputInterface $output, int $max = 0, float $minSec */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable) : void { - self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + self::$formatters ??= self::initPlaceholderFormatters(); self::$formatters[$name] = $callable; } /** @@ -180,7 +102,7 @@ public static function setPlaceholderFormatterDefinition(string $name, callable */ public static function getPlaceholderFormatterDefinition(string $name) : ?callable { - self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + self::$formatters ??= self::initPlaceholderFormatters(); return self::$formatters[$name] ?? null; } /** @@ -211,7 +133,7 @@ public function getPlaceholderFormatter(string $name) : ?callable */ public static function setFormatDefinition(string $name, string $format) : void { - self::$formats = self::$formats ?? self::initFormats(); + self::$formats ??= self::initFormats(); self::$formats[$name] = $format; } /** @@ -221,7 +143,7 @@ public static function setFormatDefinition(string $name, string $format) : void */ public static function getFormatDefinition(string $name) : ?string { - self::$formats = self::$formats ?? self::initFormats(); + self::$formats ??= self::initFormats(); return self::$formats[$name] ?? null; } /** @@ -275,7 +197,7 @@ public function getEstimated() : float } public function getRemaining() : float { - if (!$this->step) { + if (0 === $this->step || $this->step === $this->startingStep) { return 0; } return \round((\time() - $this->startTime) / ($this->step - $this->startingStep) * ($this->max - $this->step)); @@ -347,7 +269,7 @@ public function maxSecondsBetweenRedraws(float $seconds) : void */ public function iterate(iterable $iterable, ?int $max = null) : iterable { - $this->start($max ?? (\is_array($iterable) || $iterable instanceof \Countable ? \count($iterable) : 0)); + $this->start($max ?? (\is_countable($iterable) ? \count($iterable) : 0)); foreach ($iterable as $key => $value) { (yield $key => $value); $this->advance(); @@ -489,6 +411,11 @@ private function overwrite(string $message) : void if ($this->output instanceof ConsoleSectionOutput) { $messageLines = \explode("\n", $this->previousMessage); $lineCount = \count($messageLines); + $lastLineWithoutDecoration = Helper::removeDecoration($this->output->getFormatter(), \end($messageLines) ?? ''); + // When the last previous line is empty (without formatting) it is already cleared by the section output, so we don't need to clear it again + if ('' === $lastLineWithoutDecoration) { + --$lineCount; + } foreach ($messageLines as $messageLine) { $messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine)); if ($messageLineLength > $this->terminal->getWidth()) { @@ -538,9 +465,7 @@ private static function initPlaceholderFormatters() : array $display .= $bar->getProgressCharacter() . \str_repeat($bar->getEmptyBarCharacter(), $emptyBars); } return $display; - }, 'elapsed' => function (self $bar) { - return Helper::formatTime(\time() - $bar->getStartTime(), 2); - }, 'remaining' => function (self $bar) { + }, 'elapsed' => fn(self $bar) => Helper::formatTime(\time() - $bar->getStartTime(), 2), 'remaining' => function (self $bar) { if (!$bar->getMaxSteps()) { throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.'); } @@ -550,15 +475,7 @@ private static function initPlaceholderFormatters() : array throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.'); } return Helper::formatTime($bar->getEstimated(), 2); - }, 'memory' => function (self $bar) { - return Helper::formatMemory(\memory_get_usage(\true)); - }, 'current' => function (self $bar) { - return \str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT); - }, 'max' => function (self $bar) { - return $bar->getMaxSteps(); - }, 'percent' => function (self $bar) { - return \floor($bar->getProgressPercent() * 100); - }]; + }, 'memory' => fn(self $bar) => Helper::formatMemory(\memory_get_usage(\true)), 'current' => fn(self $bar) => \str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT), 'max' => fn(self $bar) => $bar->getMaxSteps(), 'percent' => fn(self $bar) => \floor($bar->getProgressPercent() * 100)]; } private static function initFormats() : array { @@ -583,9 +500,7 @@ private function buildLine() : string }; $line = \preg_replace_callback($regex, $callback, $this->format); // gets string length for each sub line with multiline format - $linesLength = \array_map(function ($subLine) { - return Helper::width(Helper::removeDecoration($this->output->getFormatter(), \rtrim($subLine, "\r"))); - }, \explode("\n", $line)); + $linesLength = \array_map(fn($subLine) => Helper::width(Helper::removeDecoration($this->output->getFormatter(), \rtrim($subLine, "\r"))), \explode("\n", $line)); $linesWidth = \max($linesLength); $terminalWidth = $this->terminal->getWidth(); if ($linesWidth <= $terminalWidth) { diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php index 1a85e306a..bbfbdf20d 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/ProgressIndicator.php @@ -8,57 +8,30 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Kevin Bond */ class ProgressIndicator { private const FORMATS = ['normal' => ' %indicator% %message%', 'normal_no_ansi' => ' %message%', 'verbose' => ' %indicator% %message% (%elapsed:6s%)', 'verbose_no_ansi' => ' %message% (%elapsed:6s%)', 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)', 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)']; - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; - /** - * @var int - */ - private $startTime; - /** - * @var string|null - */ - private $format; - /** - * @var string|null - */ - private $message; - /** - * @var mixed[] - */ - private $indicatorValues; - /** - * @var int - */ - private $indicatorCurrent; - /** - * @var int - */ - private $indicatorChangeInterval; - /** - * @var float - */ - private $indicatorUpdateTime; - /** - * @var bool - */ - private $started = \false; + private OutputInterface $output; + private int $startTime; + private ?string $format = null; + private ?string $message = null; + private array $indicatorValues; + private int $indicatorCurrent; + private int $indicatorChangeInterval; + private float $indicatorUpdateTime; + private bool $started = \false; /** * @var array */ - private static $formatters; + private static array $formatters; /** * @param int $indicatorChangeInterval Change interval in milliseconds * @param array|null $indicatorValues Animated indicator characters @@ -66,8 +39,8 @@ class ProgressIndicator public function __construct(OutputInterface $output, ?string $format = null, int $indicatorChangeInterval = 100, ?array $indicatorValues = null) { $this->output = $output; - $format = $format ?? $this->determineBestFormat(); - $indicatorValues = $indicatorValues ?? ['-', '\\', '|', '/']; + $format ??= $this->determineBestFormat(); + $indicatorValues ??= ['-', '\\', '|', '/']; $indicatorValues = \array_values($indicatorValues); if (2 > \count($indicatorValues)) { throw new InvalidArgumentException('Must have at least 2 indicator value characters.'); @@ -156,7 +129,7 @@ public static function getFormatDefinition(string $name) : ?string */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable) { - self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + self::$formatters ??= self::initPlaceholderFormatters(); self::$formatters[$name] = $callable; } /** @@ -164,7 +137,7 @@ public static function setPlaceholderFormatterDefinition(string $name, callable */ public static function getPlaceholderFormatterDefinition(string $name) : ?callable { - self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + self::$formatters ??= self::initPlaceholderFormatters(); return self::$formatters[$name] ?? null; } private function display() : void @@ -212,14 +185,6 @@ private function getCurrentTimeInMilliseconds() : float */ private static function initPlaceholderFormatters() : array { - return ['indicator' => function (self $indicator) { - return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)]; - }, 'message' => function (self $indicator) { - return $indicator->message; - }, 'elapsed' => function (self $indicator) { - return Helper::formatTime(\time() - $indicator->startTime, 2); - }, 'memory' => function () { - return Helper::formatMemory(\memory_get_usage(\true)); - }]; + return ['indicator' => fn(self $indicator) => $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)], 'message' => fn(self $indicator) => $indicator->message, 'elapsed' => fn(self $indicator) => Helper::formatTime(\time() - $indicator->startTime, 2), 'memory' => fn() => Helper::formatMemory(\memory_get_usage(\true))]; } } diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php index 160129d23..19d5f944f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/QuestionHelper.php @@ -8,22 +8,22 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Cursor; -use RectorPrefix202411\Symfony\Component\Console\Exception\MissingInputException; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterStyle; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\StreamableInputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Question\ChoiceQuestion; -use RectorPrefix202411\Symfony\Component\Console\Question\Question; -use RectorPrefix202411\Symfony\Component\Console\Terminal; -use function RectorPrefix202411\Symfony\Component\String\s; +use RectorPrefix202506\Symfony\Component\Console\Cursor; +use RectorPrefix202506\Symfony\Component\Console\Exception\MissingInputException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterStyle; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\StreamableInputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Question\ChoiceQuestion; +use RectorPrefix202506\Symfony\Component\Console\Question\Question; +use RectorPrefix202506\Symfony\Component\Console\Terminal; +use function RectorPrefix202506\Symfony\Component\String\s; /** * The QuestionHelper class provides helpers to interact with the user. * @@ -35,14 +35,8 @@ class QuestionHelper extends Helper * @var resource|null */ private $inputStream; - /** - * @var bool - */ - private static $stty = \true; - /** - * @var bool - */ - private static $stdinIsInteractive; + private static bool $stty = \true; + private static bool $stdinIsInteractive; /** * Asks a question to the user. * @@ -65,9 +59,7 @@ public function ask(InputInterface $input, OutputInterface $output, Question $qu if (!$question->getValidator()) { return $this->doAsk($output, $question); } - $interviewer = function () use($output, $question) { - return $this->doAsk($output, $question); - }; + $interviewer = fn() => $this->doAsk($output, $question); return $this->validateAttempts($interviewer, $output, $question); } catch (MissingInputException $exception) { $input->setInteractive(\false); @@ -281,9 +273,7 @@ private function autocomplete(OutputInterface $output, Question $question, $inpu $output->write($remainingCharacters); $fullChoice .= $remainingCharacters; $i = \false === ($encoding = \mb_detect_encoding($fullChoice, null, \true)) ? \strlen($fullChoice) : \mb_strlen($fullChoice, $encoding); - $matches = \array_filter($autocomplete($ret), function ($match) use($ret) { - return '' === $ret || \strncmp($match, $ret, \strlen($ret)) === 0; - }); + $matches = \array_filter($autocomplete($ret), fn($match) => '' === $ret || \strncmp($match, $ret, \strlen($ret)) === 0); $numMatches = \count($matches); $ofs = -1; } diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php index b854b2971..6fce0ade0 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/SymfonyQuestionHelper.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Question\ChoiceQuestion; -use RectorPrefix202411\Symfony\Component\Console\Question\ConfirmationQuestion; -use RectorPrefix202411\Symfony\Component\Console\Question\Question; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Question\ChoiceQuestion; +use RectorPrefix202506\Symfony\Component\Console\Question\ConfirmationQuestion; +use RectorPrefix202506\Symfony\Component\Console\Question\Question; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; /** * Symfony Style Guide compliant question helper. * diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/Table.php b/vendor/rector/rector/vendor/symfony/console/Helper/Table.php index 84c76164f..7b5c26341 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/Table.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/Table.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Provides helpers to display a table. * @@ -36,66 +36,24 @@ class Table private const DISPLAY_ORIENTATION_DEFAULT = 'default'; private const DISPLAY_ORIENTATION_HORIZONTAL = 'horizontal'; private const DISPLAY_ORIENTATION_VERTICAL = 'vertical'; - /** - * @var string|null - */ - private $headerTitle; - /** - * @var string|null - */ - private $footerTitle; - /** - * @var mixed[] - */ - private $headers = []; - /** - * @var mixed[] - */ - private $rows = []; - /** - * @var mixed[] - */ - private $effectiveColumnWidths = []; - /** - * @var int - */ - private $numberOfColumns; - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; - /** - * @var \Symfony\Component\Console\Helper\TableStyle - */ - private $style; - /** - * @var mixed[] - */ - private $columnStyles = []; - /** - * @var mixed[] - */ - private $columnWidths = []; - /** - * @var mixed[] - */ - private $columnMaxWidths = []; - /** - * @var bool - */ - private $rendered = \false; - /** - * @var string - */ - private $displayOrientation = self::DISPLAY_ORIENTATION_DEFAULT; - /** - * @var mixed[] - */ - private static $styles; + private ?string $headerTitle = null; + private ?string $footerTitle = null; + private array $headers = []; + private array $rows = []; + private array $effectiveColumnWidths = []; + private int $numberOfColumns; + private OutputInterface $output; + private TableStyle $style; + private array $columnStyles = []; + private array $columnWidths = []; + private array $columnMaxWidths = []; + private bool $rendered = \false; + private string $displayOrientation = self::DISPLAY_ORIENTATION_DEFAULT; + private static array $styles; public function __construct(OutputInterface $output) { $this->output = $output; - self::$styles = self::$styles ?? self::initStyles(); + self::$styles ??= self::initStyles(); $this->setStyle('default'); } /** @@ -105,7 +63,7 @@ public function __construct(OutputInterface $output) */ public static function setStyleDefinition(string $name, TableStyle $style) { - self::$styles = self::$styles ?? self::initStyles(); + self::$styles ??= self::initStyles(); self::$styles[$name] = $style; } /** @@ -113,7 +71,7 @@ public static function setStyleDefinition(string $name, TableStyle $style) */ public static function getStyleDefinition(string $name) : TableStyle { - self::$styles = self::$styles ?? self::initStyles(); + self::$styles ??= self::initStyles(); if (!isset(self::$styles[$name])) { throw new InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name)); } @@ -317,9 +275,7 @@ public function setVertical(bool $vertical = \true) public function render() { $divider = new TableSeparator(); - $isCellWithColspan = static function ($cell) { - return $cell instanceof TableCell && $cell->getColspan() >= 2; - }; + $isCellWithColspan = static fn($cell) => $cell instanceof TableCell && $cell->getColspan() >= 2; $horizontal = self::DISPLAY_ORIENTATION_HORIZONTAL === $this->displayOrientation; $vertical = self::DISPLAY_ORIENTATION_VERTICAL === $this->displayOrientation; $rows = []; @@ -341,9 +297,7 @@ public function render() } } elseif ($vertical) { $formatter = $this->output->getFormatter(); - $maxHeaderLength = \array_reduce($this->headers[0] ?? [], static function ($max, $header) use($formatter) { - return \max($max, Helper::width(Helper::removeDecoration($formatter, $header))); - }, 0); + $maxHeaderLength = \array_reduce($this->headers[0] ?? [], static fn($max, $header) => \max($max, Helper::width(Helper::removeDecoration($formatter, $header))), 0); foreach ($this->rows as $row) { if ($row instanceof TableSeparator) { continue; @@ -631,7 +585,7 @@ private function fillNextRows(array $rows, int $line) : array { $unmergedRows = []; foreach ($rows[$line] as $column => $cell) { - if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !$cell instanceof \Stringable) { + if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !(\is_object($cell) && \method_exists($cell, '__toString'))) { throw new InvalidArgumentException(\sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', \get_debug_type($cell))); } if ($cell instanceof TableCell && $cell->getRowspan() > 1) { diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php index e02c7476c..9ea4209ec 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableCell.php @@ -8,22 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Abdellatif Ait boudad */ class TableCell { - /** - * @var string - */ - private $value; - /** - * @var mixed[] - */ - private $options = ['rowspan' => 1, 'colspan' => 1, 'style' => null]; + private string $value; + private array $options = ['rowspan' => 1, 'colspan' => 1, 'style' => null]; public function __construct(string $value = '', array $options = []) { $this->value = $value; diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php index 77c459b29..552562289 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableCellStyle.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Yewhen Khoptynskyi */ @@ -19,10 +19,7 @@ class TableCellStyle public const DEFAULT_ALIGN = 'left'; private const TAG_OPTIONS = ['fg', 'bg', 'options']; private const ALIGN_MAP = ['left' => \STR_PAD_RIGHT, 'center' => \STR_PAD_BOTH, 'right' => \STR_PAD_LEFT]; - /** - * @var mixed[] - */ - private $options = ['fg' => 'default', 'bg' => 'default', 'options' => null, 'align' => self::DEFAULT_ALIGN, 'cellFormat' => null]; + private array $options = ['fg' => 'default', 'bg' => 'default', 'options' => null, 'align' => self::DEFAULT_ALIGN, 'cellFormat' => null]; public function __construct(array $options = []) { if ($diff = \array_diff(\array_keys($options), \array_keys($this->options))) { @@ -44,9 +41,7 @@ public function getOptions() : array */ public function getTagOptions() : array { - return \array_filter($this->getOptions(), function ($key) { - return \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]); - }, \ARRAY_FILTER_USE_KEY); + return \array_filter($this->getOptions(), fn($key) => \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]), \ARRAY_FILTER_USE_KEY); } public function getPadByAlign() : int { diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php index 5254f307e..3bf8def30 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableRows.php @@ -8,17 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; /** * @internal */ class TableRows implements \IteratorAggregate { - /** - * @var \Closure - */ - private $generator; + private \Closure $generator; public function __construct(\Closure $generator) { $this->generator = $generator; diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php index 5974741ea..75740dec6 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableSeparator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; /** * Marks a row as being a separator. diff --git a/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php b/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php index 53e8a1814..cfd7b5e71 100644 --- a/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Helper/TableStyle.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Helper; +namespace RectorPrefix202506\Symfony\Component\Console\Helper; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; /** * Defines the styles for a Table. * @@ -21,102 +21,30 @@ */ class TableStyle { - /** - * @var string - */ - private $paddingChar = ' '; - /** - * @var string - */ - private $horizontalOutsideBorderChar = '-'; - /** - * @var string - */ - private $horizontalInsideBorderChar = '-'; - /** - * @var string - */ - private $verticalOutsideBorderChar = '|'; - /** - * @var string - */ - private $verticalInsideBorderChar = '|'; - /** - * @var string - */ - private $crossingChar = '+'; - /** - * @var string - */ - private $crossingTopRightChar = '+'; - /** - * @var string - */ - private $crossingTopMidChar = '+'; - /** - * @var string - */ - private $crossingTopLeftChar = '+'; - /** - * @var string - */ - private $crossingMidRightChar = '+'; - /** - * @var string - */ - private $crossingBottomRightChar = '+'; - /** - * @var string - */ - private $crossingBottomMidChar = '+'; - /** - * @var string - */ - private $crossingBottomLeftChar = '+'; - /** - * @var string - */ - private $crossingMidLeftChar = '+'; - /** - * @var string - */ - private $crossingTopLeftBottomChar = '+'; - /** - * @var string - */ - private $crossingTopMidBottomChar = '+'; - /** - * @var string - */ - private $crossingTopRightBottomChar = '+'; - /** - * @var string - */ - private $headerTitleFormat = ' %s '; - /** - * @var string - */ - private $footerTitleFormat = ' %s '; - /** - * @var string - */ - private $cellHeaderFormat = '%s'; - /** - * @var string - */ - private $cellRowFormat = '%s'; - /** - * @var string - */ - private $cellRowContentFormat = ' %s '; - /** - * @var string - */ - private $borderFormat = '%s'; - /** - * @var int - */ - private $padType = \STR_PAD_RIGHT; + private string $paddingChar = ' '; + private string $horizontalOutsideBorderChar = '-'; + private string $horizontalInsideBorderChar = '-'; + private string $verticalOutsideBorderChar = '|'; + private string $verticalInsideBorderChar = '|'; + private string $crossingChar = '+'; + private string $crossingTopRightChar = '+'; + private string $crossingTopMidChar = '+'; + private string $crossingTopLeftChar = '+'; + private string $crossingMidRightChar = '+'; + private string $crossingBottomRightChar = '+'; + private string $crossingBottomMidChar = '+'; + private string $crossingBottomLeftChar = '+'; + private string $crossingMidLeftChar = '+'; + private string $crossingTopLeftBottomChar = '+'; + private string $crossingTopMidBottomChar = '+'; + private string $crossingTopRightBottomChar = '+'; + private string $headerTitleFormat = ' %s '; + private string $footerTitleFormat = ' %s '; + private string $cellHeaderFormat = '%s'; + private string $cellRowFormat = '%s'; + private string $cellRowContentFormat = ' %s '; + private string $borderFormat = '%s'; + private int $padType = \STR_PAD_RIGHT; /** * Sets padding character, used for cell padding. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php b/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php index aba785517..0277dd89a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/ArgvInput.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; /** * ArgvInput represents an input coming from the CLI arguments. * @@ -38,17 +38,11 @@ */ class ArgvInput extends Input { - /** - * @var mixed[] - */ - private $tokens; - /** - * @var mixed[] - */ - private $parsed; + private array $tokens; + private array $parsed; public function __construct(?array $argv = null, ?InputDefinition $definition = null) { - $argv = $argv ?? $_SERVER['argv'] ?? []; + $argv ??= $_SERVER['argv'] ?? []; // strip the application name \array_shift($argv); $this->tokens = $argv; @@ -161,8 +155,7 @@ private function parseArgument(string $token) : void } else { $all = $this->definition->getArguments(); $symfonyCommandName = null; - \reset($all); - if (($inputArgument = $all[$key = \key($all)] ?? null) && 'command' === $inputArgument->getName()) { + if (($inputArgument = $all[$key = \array_key_first($all)] ?? null) && 'command' === $inputArgument->getName()) { $symfonyCommandName = $this->arguments['command'] ?? null; unset($all[$key]); } diff --git a/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php b/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php index f1ae5220f..e94f0d4d8 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/ArrayInput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidOptionException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidOptionException; /** * ArrayInput represents an input provided as an array. * @@ -23,10 +23,7 @@ */ class ArrayInput extends Input { - /** - * @var mixed[] - */ - private $parameters; + private array $parameters; public function __construct(array $parameters, ?InputDefinition $definition = null) { $this->parameters = $parameters; diff --git a/vendor/rector/rector/vendor/symfony/console/Input/Input.php b/vendor/rector/rector/vendor/symfony/console/Input/Input.php index 566c54aa5..b644c44e9 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/Input.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/Input.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; /** * Input is the base class for all concrete Input classes. * @@ -63,9 +63,7 @@ public function validate() { $definition = $this->definition; $givenArguments = $this->arguments; - $missingArguments = \array_filter(\array_keys($definition->getArguments()), function ($argument) use($givenArguments, $definition) { - return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired(); - }); + $missingArguments = \array_filter(\array_keys($definition->getArguments()), fn($argument) => !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired()); if (\count($missingArguments) > 0) { throw new RuntimeException(\sprintf('Not enough arguments (missing: "%s").', \implode(', ', $missingArguments))); } diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php b/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php index bb68479d7..9119bc447 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputArgument.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; /** * Represents a command line argument. * @@ -26,14 +26,8 @@ class InputArgument public const REQUIRED = 1; public const OPTIONAL = 2; public const IS_ARRAY = 4; - /** - * @var string - */ - private $name; - /** - * @var int - */ - private $mode; + private string $name; + private int $mode; /** * @var mixed[]|bool|float|int|string|null */ @@ -42,10 +36,7 @@ class InputArgument * @var mixed[]|\Closure */ private $suggestedValues; - /** - * @var string - */ - private $description; + private string $description; /** * @param string $name The argument name * @param int|null $mode The argument mode: a bit mask of self::REQUIRED, self::OPTIONAL and self::IS_ARRAY diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php b/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php index 9a5f23fcf..1c1df3a0b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputAwareInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; /** * InputAwareInterface should be implemented by classes that depends on the diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php b/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php index f4ffc3b7b..02c0f3102 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputDefinition.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; /** * A InputDefinition represents a set of valid command line arguments and options. * @@ -26,34 +26,13 @@ */ class InputDefinition { - /** - * @var mixed[] - */ - private $arguments = []; - /** - * @var int - */ - private $requiredCount = 0; - /** - * @var \Symfony\Component\Console\Input\InputArgument|null - */ - private $lastArrayArgument; - /** - * @var \Symfony\Component\Console\Input\InputArgument|null - */ - private $lastOptionalArgument; - /** - * @var mixed[] - */ - private $options = []; - /** - * @var mixed[] - */ - private $negations = []; - /** - * @var mixed[] - */ - private $shortcuts = []; + private array $arguments = []; + private int $requiredCount = 0; + private ?InputArgument $lastArrayArgument = null; + private ?InputArgument $lastOptionalArgument = null; + private array $options = []; + private array $negations = []; + private array $shortcuts = []; /** * @param array $definition An array of InputArgument and InputOption instance */ diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php b/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php index 759ffa2da..0c7aa7d8b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputInterface.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; /** * InputInterface is the interface implemented by all input classes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php b/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php index d35c4da56..bf264d11a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/InputOption.php @@ -8,14 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Completion\Suggestion; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Completion\Suggestion; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; /** * Represents a command line option. * @@ -43,18 +43,12 @@ class InputOption * The option may have either positive or negative value (e.g. --ansi or --no-ansi). */ public const VALUE_NEGATABLE = 16; - /** - * @var string - */ - private $name; + private string $name; /** * @var mixed[]|string|null */ private $shortcut; - /** - * @var int - */ - private $mode; + private int $mode; /** * @var mixed[]|bool|float|int|string|null */ @@ -63,10 +57,7 @@ class InputOption * @var mixed[]|\Closure */ private $suggestedValues; - /** - * @var string - */ - private $description; + private string $description; /** * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts * @param int|null $mode The option mode: One of the VALUE_* constants diff --git a/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php b/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php index f11e390f0..c1f1bb51e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/StreamableInputInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; /** * StreamableInputInterface is the interface implemented by all input classes diff --git a/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php b/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php index 04f4cc2c5..70dc7da5d 100644 --- a/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php +++ b/vendor/rector/rector/vendor/symfony/console/Input/StringInput.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Input; +namespace RectorPrefix202506\Symfony\Component\Console\Input; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; /** * StringInput represents an input provided as a string. * diff --git a/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php b/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php index 06eaaf908..a0d350450 100644 --- a/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php +++ b/vendor/rector/rector/vendor/symfony/console/Logger/ConsoleLogger.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Logger; +namespace RectorPrefix202506\Symfony\Component\Console\Logger; -use RectorPrefix202411\Psr\Log\AbstractLogger; -use RectorPrefix202411\Psr\Log\InvalidArgumentException; -use RectorPrefix202411\Psr\Log\LogLevel; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Psr\Log\AbstractLogger; +use RectorPrefix202506\Psr\Log\InvalidArgumentException; +use RectorPrefix202506\Psr\Log\LogLevel; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * PSR-3 compliant console logger. * @@ -26,22 +26,10 @@ class ConsoleLogger extends AbstractLogger { public const INFO = 'info'; public const ERROR = 'error'; - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; - /** - * @var mixed[] - */ - private $verbosityLevelMap = [LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE, LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE, LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG]; - /** - * @var mixed[] - */ - private $formatLevelMap = [LogLevel::EMERGENCY => self::ERROR, LogLevel::ALERT => self::ERROR, LogLevel::CRITICAL => self::ERROR, LogLevel::ERROR => self::ERROR, LogLevel::WARNING => self::INFO, LogLevel::NOTICE => self::INFO, LogLevel::INFO => self::INFO, LogLevel::DEBUG => self::INFO]; - /** - * @var bool - */ - private $errored = \false; + private OutputInterface $output; + private array $verbosityLevelMap = [LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE, LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE, LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG]; + private array $formatLevelMap = [LogLevel::EMERGENCY => self::ERROR, LogLevel::ALERT => self::ERROR, LogLevel::CRITICAL => self::ERROR, LogLevel::ERROR => self::ERROR, LogLevel::WARNING => self::INFO, LogLevel::NOTICE => self::INFO, LogLevel::INFO => self::INFO, LogLevel::DEBUG => self::INFO]; + private bool $errored = \false; public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = []) { $this->output = $output; @@ -86,7 +74,7 @@ private function interpolate(string $message, array $context) : string } $replacements = []; foreach ($context as $key => $val) { - if (null === $val || \is_scalar($val) || $val instanceof \Stringable) { + if (null === $val || \is_scalar($val) || \is_object($val) && \method_exists($val, '__toString')) { $replacements["{{$key}}"] = $val; } elseif ($val instanceof \DateTimeInterface) { $replacements["{{$key}}"] = $val->format(\DateTimeInterface::RFC3339); diff --git a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php index 45f6da0aa..3ade7c0d0 100644 --- a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php +++ b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandContext.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Messenger; +namespace RectorPrefix202506\Symfony\Component\Console\Messenger; /** * @author Kevin Bond @@ -17,19 +17,16 @@ final class RunCommandContext { /** * @readonly - * @var \Symfony\Component\Console\Messenger\RunCommandMessage */ - public $message; + public RunCommandMessage $message; /** * @readonly - * @var int */ - public $exitCode; + public int $exitCode; /** * @readonly - * @var string */ - public $output; + public string $output; public function __construct(RunCommandMessage $message, int $exitCode, string $output) { $this->message = $message; diff --git a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php index 259961006..82101be3a 100644 --- a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php +++ b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessage.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Messenger; +namespace RectorPrefix202506\Symfony\Component\Console\Messenger; -use RectorPrefix202411\Symfony\Component\Console\Exception\RunCommandFailedException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RunCommandFailedException; /** * @author Kevin Bond */ @@ -18,19 +18,18 @@ class RunCommandMessage { /** * @readonly - * @var string */ - public $input; + public string $input; /** * @var bool * @readonly */ - public $throwOnFailure = \true; + public bool $throwOnFailure = \true; /** * @var bool * @readonly */ - public $catchExceptions = \false; + public bool $catchExceptions = \false; /** * @param bool $throwOnFailure If the command has a non-zero exit code, throw {@see RunCommandFailedException} * @param bool $catchExceptions @see Application::setCatchExceptions() diff --git a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php index b3cc1d462..6ad5a7f9c 100644 --- a/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php +++ b/vendor/rector/rector/vendor/symfony/console/Messenger/RunCommandMessageHandler.php @@ -8,13 +8,13 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Messenger; +namespace RectorPrefix202506\Symfony\Component\Console\Messenger; -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Exception\RunCommandFailedException; -use RectorPrefix202411\Symfony\Component\Console\Input\StringInput; -use RectorPrefix202411\Symfony\Component\Console\Output\BufferedOutput; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Exception\RunCommandFailedException; +use RectorPrefix202506\Symfony\Component\Console\Input\StringInput; +use RectorPrefix202506\Symfony\Component\Console\Output\BufferedOutput; /** * @author Kevin Bond */ @@ -22,9 +22,8 @@ final class RunCommandMessageHandler { /** * @readonly - * @var \Symfony\Component\Console\Application */ - private $application; + private Application $application; public function __construct(Application $application) { $this->application = $application; diff --git a/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php b/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php index 97ff4b80c..017f6bee1 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/AnsiColorMode.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; class AnsiColorMode { public const Ansi4 = 'ansi4'; diff --git a/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php index 64980ffbb..72ac5ce44 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/BufferedOutput.php @@ -8,17 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; /** * @author Jean-François Simon */ class BufferedOutput extends Output { - /** - * @var string - */ - private $buffer = ''; + private string $buffer = ''; /** * Empties buffer and returns its content. */ diff --git a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php index a8ca03c0a..b6040cf42 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutput.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR. * @@ -27,14 +27,8 @@ */ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface { - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $stderr; - /** - * @var mixed[] - */ - private $consoleSectionOutputs = []; + private OutputInterface $stderr; + private array $consoleSectionOutputs = []; /** * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) diff --git a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php index f8d36d5d9..5db7f2a46 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleOutputInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; /** * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. diff --git a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php index ae18ee0b1..286e31f0f 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/ConsoleSectionOutput.php @@ -8,37 +8,22 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; -use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202411\Symfony\Component\Console\Terminal; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202506\Symfony\Component\Console\Terminal; /** * @author Pierre du Plessis * @author Gabriel Ostrolucký */ class ConsoleSectionOutput extends StreamOutput { - /** - * @var mixed[] - */ - private $content = []; - /** - * @var int - */ - private $lines = 0; - /** - * @var mixed[] - */ - private $sections; - /** - * @var \Symfony\Component\Console\Terminal - */ - private $terminal; - /** - * @var int - */ - private $maxHeight = 0; + private array $content = []; + private int $lines = 0; + private array $sections; + private Terminal $terminal; + private int $maxHeight = 0; /** * @param resource $stream * @param ConsoleSectionOutput[] $sections diff --git a/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php index 1d848d655..0176f4a31 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/NullOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Formatter\NullOutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Formatter\NullOutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * NullOutput suppresses all output. * @@ -22,10 +22,7 @@ */ class NullOutput implements OutputInterface { - /** - * @var \Symfony\Component\Console\Formatter\NullOutputFormatter - */ - private $formatter; + private NullOutputFormatter $formatter; /** * @return void */ @@ -36,7 +33,7 @@ public function setFormatter(OutputFormatterInterface $formatter) public function getFormatter() : OutputFormatterInterface { // to comply with the interface we must return a OutputFormatterInterface - return $this->formatter = $this->formatter ?? new NullOutputFormatter(); + return $this->formatter ??= new NullOutputFormatter(); } /** * @return void diff --git a/vendor/rector/rector/vendor/symfony/console/Output/Output.php b/vendor/rector/rector/vendor/symfony/console/Output/Output.php index c2d3a0a4e..4985f85a6 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/Output.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/Output.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * Base class for output classes. * @@ -27,14 +27,8 @@ */ abstract class Output implements OutputInterface { - /** - * @var int - */ - private $verbosity; - /** - * @var \Symfony\Component\Console\Formatter\OutputFormatterInterface - */ - private $formatter; + private int $verbosity; + private OutputFormatterInterface $formatter; /** * @param int|null $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) * @param bool $decorated Whether to decorate messages diff --git a/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php b/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php index 651edfce1..cc357c855 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/OutputInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * OutputInterface is the interface implemented by all Output classes. * diff --git a/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php index ea3cf26ce..43175833e 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/StreamOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * StreamOutput writes the output to a given stream. * @@ -43,7 +43,7 @@ public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, ?b throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); } $this->stream = $stream; - $decorated = $decorated ?? $this->hasColorSupport(); + $decorated ??= $this->hasColorSupport(); parent::__construct($verbosity, $decorated, $formatter); } /** diff --git a/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php b/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php index 5571338ab..c4b83cc26 100644 --- a/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php +++ b/vendor/rector/rector/vendor/symfony/console/Output/TrimmedBufferOutput.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Output; +namespace RectorPrefix202506\Symfony\Component\Console\Output; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * A BufferedOutput that keeps only the last N chars. * @@ -19,14 +19,8 @@ */ class TrimmedBufferOutput extends Output { - /** - * @var int - */ - private $maxLength; - /** - * @var string - */ - private $buffer = ''; + private int $maxLength; + private string $buffer = ''; public function __construct(int $maxLength, ?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = \false, ?OutputFormatterInterface $formatter = null) { if ($maxLength <= 0) { diff --git a/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php b/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php index 2071649b3..e43b87162 100644 --- a/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php +++ b/vendor/rector/rector/vendor/symfony/console/Question/ChoiceQuestion.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Question; +namespace RectorPrefix202506\Symfony\Component\Console\Question; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; /** * Represents a choice question. * @@ -18,22 +18,10 @@ */ class ChoiceQuestion extends Question { - /** - * @var mixed[] - */ - private $choices; - /** - * @var bool - */ - private $multiselect = \false; - /** - * @var string - */ - private $prompt = ' > '; - /** - * @var string - */ - private $errorMessage = 'Value "%s" is invalid'; + private array $choices; + private bool $multiselect = \false; + private string $prompt = ' > '; + private string $errorMessage = 'Value "%s" is invalid'; /** * @param string $question The question to ask to the user * @param array $choices The list of available choices diff --git a/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php b/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php index a18ee5686..b6d7cdc06 100644 --- a/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php +++ b/vendor/rector/rector/vendor/symfony/console/Question/ConfirmationQuestion.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Question; +namespace RectorPrefix202506\Symfony\Component\Console\Question; /** * Represents a yes/no question. @@ -17,10 +17,7 @@ */ class ConfirmationQuestion extends Question { - /** - * @var string - */ - private $trueAnswerRegex; + private string $trueAnswerRegex; /** * @param string $question The question to ask to the user * @param bool $default The default answer to return, true or false diff --git a/vendor/rector/rector/vendor/symfony/console/Question/Question.php b/vendor/rector/rector/vendor/symfony/console/Question/Question.php index 67a55c24e..04391c78b 100644 --- a/vendor/rector/rector/vendor/symfony/console/Question/Question.php +++ b/vendor/rector/rector/vendor/symfony/console/Question/Question.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Question; +namespace RectorPrefix202506\Symfony\Component\Console\Question; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\LogicException; /** * Represents a Question. * @@ -19,46 +19,19 @@ */ class Question { - /** - * @var string - */ - private $question; - /** - * @var int|null - */ - private $attempts; - /** - * @var bool - */ - private $hidden = \false; - /** - * @var bool - */ - private $hiddenFallback = \true; - /** - * @var \Closure|null - */ - private $autocompleterCallback; - /** - * @var \Closure|null - */ - private $validator; + private string $question; + private ?int $attempts = null; + private bool $hidden = \false; + private bool $hiddenFallback = \true; + private ?\Closure $autocompleterCallback = null; + private ?\Closure $validator = null; /** * @var bool|float|int|string|null */ private $default; - /** - * @var \Closure|null - */ - private $normalizer; - /** - * @var bool - */ - private $trimmable = \true; - /** - * @var bool - */ - private $multiline = \false; + private ?\Closure $normalizer = null; + private bool $trimmable = \true; + private bool $multiline = \false; /** * @param string $question The question to ask to the user * @param string|bool|int|float|null $default The default answer to return if the user enters nothing @@ -158,13 +131,11 @@ public function setAutocompleterValues(?iterable $values) { if (\is_array($values)) { $values = $this->isAssoc($values) ? \array_merge(\array_keys($values), \array_values($values)) : \array_values($values); - $callback = static function () use($values) { - return $values; - }; + $callback = static fn() => $values; } elseif ($values instanceof \Traversable) { $callback = static function () use($values) { static $valueCache; - return $valueCache = $valueCache ?? \iterator_to_array($values, \false); + return $valueCache ??= \iterator_to_array($values, \false); }; } else { $callback = null; diff --git a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php index 925aa5a4e..2598a7fe8 100644 --- a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php +++ b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalMap.php @@ -8,17 +8,14 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\SignalRegistry; +namespace RectorPrefix202506\Symfony\Component\Console\SignalRegistry; /** * @author Grégoire Pineau */ class SignalMap { - /** - * @var mixed[] - */ - private static $map; + private static array $map; public static function getSignalName(int $signal) : ?string { if (!\extension_loaded('pcntl')) { @@ -27,9 +24,7 @@ public static function getSignalName(int $signal) : ?string if (!isset(self::$map)) { $r = new \ReflectionExtension('pcntl'); $c = $r->getConstants(); - $map = \array_filter($c, function ($k) { - return \strncmp($k, 'SIG', \strlen('SIG')) === 0 && \strncmp($k, 'SIG_', \strlen('SIG_')) !== 0; - }, \ARRAY_FILTER_USE_KEY); + $map = \array_filter($c, fn($k) => \strncmp($k, 'SIG', \strlen('SIG')) === 0 && \strncmp($k, 'SIG_', \strlen('SIG_')) !== 0 && 'SIGBABY' !== $k, \ARRAY_FILTER_USE_KEY); self::$map = \array_flip($map); } return self::$map[$signal] ?? null; diff --git a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php index dfb4a1e1d..120595b2c 100644 --- a/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php +++ b/vendor/rector/rector/vendor/symfony/console/SignalRegistry/SignalRegistry.php @@ -8,14 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\SignalRegistry; +namespace RectorPrefix202506\Symfony\Component\Console\SignalRegistry; final class SignalRegistry { - /** - * @var mixed[] - */ - private $signalHandlers = []; + private array $signalHandlers = []; public function __construct() { if (\function_exists('pcntl_async_signals')) { diff --git a/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php b/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php index ee2b7bf89..0c9e09d41 100644 --- a/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php +++ b/vendor/rector/rector/vendor/symfony/console/SingleCommandApplication.php @@ -8,28 +8,19 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console; +namespace RectorPrefix202506\Symfony\Component\Console; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * @author Grégoire Pineau */ class SingleCommandApplication extends Command { - /** - * @var string - */ - private $version = 'UNKNOWN'; - /** - * @var bool - */ - private $autoExit = \true; - /** - * @var bool - */ - private $running = \false; + private string $version = 'UNKNOWN'; + private bool $autoExit = \true; + private bool $running = \false; /** * @return $this */ diff --git a/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php b/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php index 62add6fff..c66cf98a6 100644 --- a/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Style/OutputStyle.php @@ -8,12 +8,12 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Style; +namespace RectorPrefix202506\Symfony\Component\Console\Style; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatterInterface; -use RectorPrefix202411\Symfony\Component\Console\Helper\ProgressBar; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RectorPrefix202506\Symfony\Component\Console\Helper\ProgressBar; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; /** * Decorates output to add console style guide helpers. * @@ -21,10 +21,7 @@ */ abstract class OutputStyle implements OutputInterface, StyleInterface { - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; + private OutputInterface $output; public function __construct(OutputInterface $output) { $this->output = $output; diff --git a/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php b/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php index 1566ffa13..992f8df77 100644 --- a/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php +++ b/vendor/rector/rector/vendor/symfony/console/Style/StyleInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Style; +namespace RectorPrefix202506\Symfony\Component\Console\Style; /** * Output style helpers. diff --git a/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php index 03e77ca3e..2540f2c80 100644 --- a/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php +++ b/vendor/rector/rector/vendor/symfony/console/Style/SymfonyStyle.php @@ -8,27 +8,27 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console\Style; +namespace RectorPrefix202506\Symfony\Component\Console\Style; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Console\Formatter\OutputFormatter; -use RectorPrefix202411\Symfony\Component\Console\Helper\Helper; -use RectorPrefix202411\Symfony\Component\Console\Helper\OutputWrapper; -use RectorPrefix202411\Symfony\Component\Console\Helper\ProgressBar; -use RectorPrefix202411\Symfony\Component\Console\Helper\SymfonyQuestionHelper; -use RectorPrefix202411\Symfony\Component\Console\Helper\Table; -use RectorPrefix202411\Symfony\Component\Console\Helper\TableCell; -use RectorPrefix202411\Symfony\Component\Console\Helper\TableSeparator; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleOutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\ConsoleSectionOutput; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Output\TrimmedBufferOutput; -use RectorPrefix202411\Symfony\Component\Console\Question\ChoiceQuestion; -use RectorPrefix202411\Symfony\Component\Console\Question\ConfirmationQuestion; -use RectorPrefix202411\Symfony\Component\Console\Question\Question; -use RectorPrefix202411\Symfony\Component\Console\Terminal; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Formatter\OutputFormatter; +use RectorPrefix202506\Symfony\Component\Console\Helper\Helper; +use RectorPrefix202506\Symfony\Component\Console\Helper\OutputWrapper; +use RectorPrefix202506\Symfony\Component\Console\Helper\ProgressBar; +use RectorPrefix202506\Symfony\Component\Console\Helper\SymfonyQuestionHelper; +use RectorPrefix202506\Symfony\Component\Console\Helper\Table; +use RectorPrefix202506\Symfony\Component\Console\Helper\TableCell; +use RectorPrefix202506\Symfony\Component\Console\Helper\TableSeparator; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Output\TrimmedBufferOutput; +use RectorPrefix202506\Symfony\Component\Console\Question\ChoiceQuestion; +use RectorPrefix202506\Symfony\Component\Console\Question\ConfirmationQuestion; +use RectorPrefix202506\Symfony\Component\Console\Question\Question; +use RectorPrefix202506\Symfony\Component\Console\Terminal; /** * Output decorator helpers for the Symfony Style Guide. * @@ -37,30 +37,12 @@ class SymfonyStyle extends OutputStyle { public const MAX_LINE_LENGTH = 120; - /** - * @var \Symfony\Component\Console\Input\InputInterface - */ - private $input; - /** - * @var \Symfony\Component\Console\Output\OutputInterface - */ - private $output; - /** - * @var \Symfony\Component\Console\Helper\SymfonyQuestionHelper - */ - private $questionHelper; - /** - * @var \Symfony\Component\Console\Helper\ProgressBar - */ - private $progressBar; - /** - * @var int - */ - private $lineLength; - /** - * @var \Symfony\Component\Console\Output\TrimmedBufferOutput - */ - private $bufferedOutput; + private InputInterface $input; + private OutputInterface $output; + private SymfonyQuestionHelper $questionHelper; + private ProgressBar $progressBar; + private int $lineLength; + private TrimmedBufferOutput $bufferedOutput; public function __construct(InputInterface $input, OutputInterface $output) { $this->input = $input; @@ -107,9 +89,7 @@ public function section(string $message) public function listing(array $elements) { $this->autoPrependText(); - $elements = \array_map(function ($element) { - return \sprintf(' * %s', $element); - }, $elements); + $elements = \array_map(fn($element) => \sprintf(' * %s', $element), $elements); $this->writeln($elements); $this->newLine(); } @@ -334,7 +314,7 @@ public function askQuestion(Question $question) if ($this->input->isInteractive()) { $this->autoPrependBlock(); } - $this->questionHelper = $this->questionHelper ?? new SymfonyQuestionHelper(); + $this->questionHelper ??= new SymfonyQuestionHelper(); $answer = $this->questionHelper->ask($this->input, $this, $question); if ($this->input->isInteractive()) { if ($this->output instanceof ConsoleSectionOutput) { diff --git a/vendor/rector/rector/vendor/symfony/console/Terminal.php b/vendor/rector/rector/vendor/symfony/console/Terminal.php index c9a521f3f..eca401251 100644 --- a/vendor/rector/rector/vendor/symfony/console/Terminal.php +++ b/vendor/rector/rector/vendor/symfony/console/Terminal.php @@ -8,28 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Console; +namespace RectorPrefix202506\Symfony\Component\Console; -use RectorPrefix202411\Symfony\Component\Console\Output\AnsiColorMode; +use RectorPrefix202506\Symfony\Component\Console\Output\AnsiColorMode; class Terminal { public const DEFAULT_COLOR_MODE = AnsiColorMode::Ansi4; - /** - * @var \Symfony\Component\Console\Output\AnsiColorMode|null - */ - private static $colorMode; - /** - * @var int|null - */ - private static $width; - /** - * @var int|null - */ - private static $height; - /** - * @var bool|null - */ - private static $stty; + private static ?AnsiColorMode $colorMode = null; + private static ?int $width = null; + private static ?int $height = null; + private static ?bool $stty = null; /** * About Ansi color types: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors * For more information about true color support with terminals https://github.com/termstandard/colors/. @@ -193,7 +181,7 @@ private static function readFromProcess($command) : ?string } $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; $cp = \function_exists('sapi_windows_cp_set') ? \sapi_windows_cp_get() : 0; - if (!($process = @\proc_open(\is_array($command) ? \implode(' ', \array_map('escapeshellarg', $command)) : $command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]))) { + if (!($process = @\proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]))) { return null; } $info = \stream_get_contents($pipes[1]); diff --git a/vendor/rector/rector/vendor/symfony/console/composer.json b/vendor/rector/rector/vendor/symfony/console/composer.json index d49732db0..4b575c365 100644 --- a/vendor/rector/rector/vendor/symfony/console/composer.json +++ b/vendor/rector/rector/vendor/symfony/console/composer.json @@ -52,7 +52,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Console\\": "" + "RectorPrefix202506\\Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/deprecation-contracts/composer.json b/vendor/rector/rector/vendor/symfony/deprecation-contracts/composer.json index 696f5a7f2..cd17b7a53 100644 --- a/vendor/rector/rector/vendor/symfony/deprecation-contracts/composer.json +++ b/vendor/rector/rector/vendor/symfony/deprecation-contracts/composer.json @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" }, "thanks": { "name": "symfony\/contracts", diff --git a/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php b/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php index 6852f8e03..1c9c15a08 100644 --- a/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php +++ b/vendor/rector/rector/vendor/symfony/deprecation-contracts/function.php @@ -1,6 +1,6 @@ path = $path; diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Exception/IOExceptionInterface.php b/vendor/rector/rector/vendor/symfony/filesystem/Exception/IOExceptionInterface.php index 26cd1124d..b2b1afc4e 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Exception/IOExceptionInterface.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Exception/IOExceptionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Filesystem\Exception; +namespace RectorPrefix202506\Symfony\Component\Filesystem\Exception; /** * IOException interface for file and input/output stream related exceptions thrown by the component. diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Exception/InvalidArgumentException.php b/vendor/rector/rector/vendor/symfony/filesystem/Exception/InvalidArgumentException.php index 9f818b03e..80b3040c6 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Exception/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Exception/InvalidArgumentException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Filesystem\Exception; +namespace RectorPrefix202506\Symfony\Component\Filesystem\Exception; /** * @author Christian Flothmann diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php index 026947997..0865e5720 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Filesystem\Exception; +namespace RectorPrefix202506\Symfony\Component\Filesystem\Exception; /** * @author Théo Fidry diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php b/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php index 056647442..58da07357 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Filesystem.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Filesystem; +namespace RectorPrefix202506\Symfony\Component\Filesystem; -use RectorPrefix202411\Symfony\Component\Filesystem\Exception\FileNotFoundException; -use RectorPrefix202411\Symfony\Component\Filesystem\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Filesystem\Exception\IOException; +use RectorPrefix202506\Symfony\Component\Filesystem\Exception\FileNotFoundException; +use RectorPrefix202506\Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Filesystem\Exception\IOException; /** * Provides basic utility to manipulate the file system. * @@ -20,10 +20,7 @@ */ class Filesystem { - /** - * @var string|null - */ - private static $lastError; + private static ?string $lastError = null; /** * Copies a file. * @@ -422,9 +419,7 @@ public function makePathRelative(string $endPath, string $startPath) : string $endPath = \str_replace('\\', '/', $endPath); $startPath = \str_replace('\\', '/', $startPath); } - $splitDriveLetter = function ($path) { - return \strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && \ctype_alpha($path[0]) ? [\substr($path, 2), \strtoupper($path[0])] : [$path, null]; - }; + $splitDriveLetter = fn($path) => \strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && \ctype_alpha($path[0]) ? [\substr($path, 2), \strtoupper($path[0])] : [$path, null]; $splitPath = function ($path) { $result = []; foreach (\explode('/', \trim($path, '/')) as $segment) { diff --git a/vendor/rector/rector/vendor/symfony/filesystem/Path.php b/vendor/rector/rector/vendor/symfony/filesystem/Path.php index 9137dc9ea..c511b2706 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/Path.php +++ b/vendor/rector/rector/vendor/symfony/filesystem/Path.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Filesystem; +namespace RectorPrefix202506\Symfony\Component\Filesystem; -use RectorPrefix202411\Symfony\Component\Filesystem\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Filesystem\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Filesystem\Exception\RuntimeException; /** * Contains utility methods for handling path strings. * @@ -38,11 +38,8 @@ final class Path * * @var array */ - private static $buffer = []; - /** - * @var int - */ - private static $bufferSize = 0; + private static array $buffer = []; + private static int $bufferSize = 0; /** * Canonicalizes the given path. * diff --git a/vendor/rector/rector/vendor/symfony/filesystem/composer.json b/vendor/rector/rector/vendor/symfony/filesystem/composer.json index 9d9cb3ef7..bd5de8374 100644 --- a/vendor/rector/rector/vendor/symfony/filesystem/composer.json +++ b/vendor/rector/rector/vendor/symfony/filesystem/composer.json @@ -25,7 +25,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Filesystem\\": "" + "RectorPrefix202506\\Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php b/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php index 7d5dee03f..1b681eb06 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Comparator/Comparator.php @@ -8,21 +8,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Comparator; +namespace RectorPrefix202506\Symfony\Component\Finder\Comparator; /** * @author Fabien Potencier */ class Comparator { - /** - * @var string - */ - private $target; - /** - * @var string - */ - private $operator; + private string $target; + private string $operator; public function __construct(string $target, string $operator = '==') { if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { diff --git a/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php b/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php index 28ab81ba3..d1ac5a413 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Comparator/DateComparator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Comparator; +namespace RectorPrefix202506\Symfony\Component\Finder\Comparator; /** * DateCompare compiles date comparisons. @@ -33,7 +33,7 @@ public function __construct(string $test) } catch (\Exception $exception) { throw new \InvalidArgumentException(\sprintf('"%s" is not a valid date.', $matches[2])); } - $operator = $matches[1] ?? '=='; + $operator = $matches[1] ?: '=='; if ('since' === $operator || 'after' === $operator) { $operator = '>'; } diff --git a/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php b/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php index 4c8c276ad..f40d2823d 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Comparator/NumberComparator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Comparator; +namespace RectorPrefix202506\Symfony\Component\Finder\Comparator; /** * NumberComparator compiles a simple comparison to an anonymous diff --git a/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php b/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php index 1e8cb11e8..b4472d651 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php +++ b/vendor/rector/rector/vendor/symfony/finder/Exception/AccessDeniedException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Exception; +namespace RectorPrefix202506\Symfony\Component\Finder\Exception; /** * @author Jean-François Simon diff --git a/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php b/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php index aac16801f..243bf0d4b 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php +++ b/vendor/rector/rector/vendor/symfony/finder/Exception/DirectoryNotFoundException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Exception; +namespace RectorPrefix202506\Symfony\Component\Finder\Exception; /** * @author Andreas Erhard diff --git a/vendor/rector/rector/vendor/symfony/finder/Finder.php b/vendor/rector/rector/vendor/symfony/finder/Finder.php index 93626dca6..9524af5ed 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Finder.php +++ b/vendor/rector/rector/vendor/symfony/finder/Finder.php @@ -8,20 +8,20 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder; +namespace RectorPrefix202506\Symfony\Component\Finder; -use RectorPrefix202411\Symfony\Component\Finder\Comparator\DateComparator; -use RectorPrefix202411\Symfony\Component\Finder\Comparator\NumberComparator; -use RectorPrefix202411\Symfony\Component\Finder\Exception\DirectoryNotFoundException; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\CustomFilterIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\DateRangeFilterIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\FilecontentFilterIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\FilenameFilterIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\LazyIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; -use RectorPrefix202411\Symfony\Component\Finder\Iterator\SortableIterator; +use RectorPrefix202506\Symfony\Component\Finder\Comparator\DateComparator; +use RectorPrefix202506\Symfony\Component\Finder\Comparator\NumberComparator; +use RectorPrefix202506\Symfony\Component\Finder\Exception\DirectoryNotFoundException; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\CustomFilterIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\DateRangeFilterIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\FilecontentFilterIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\FilenameFilterIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\LazyIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; +use RectorPrefix202506\Symfony\Component\Finder\Iterator\SortableIterator; /** * Finder allows to build rules to find files and directories. * @@ -42,90 +42,30 @@ class Finder implements \IteratorAggregate, \Countable public const IGNORE_VCS_FILES = 1; public const IGNORE_DOT_FILES = 2; public const IGNORE_VCS_IGNORED_FILES = 4; - /** - * @var int - */ - private $mode = 0; - /** - * @var mixed[] - */ - private $names = []; - /** - * @var mixed[] - */ - private $notNames = []; - /** - * @var mixed[] - */ - private $exclude = []; - /** - * @var mixed[] - */ - private $filters = []; - /** - * @var mixed[] - */ - private $pruneFilters = []; - /** - * @var mixed[] - */ - private $depths = []; - /** - * @var mixed[] - */ - private $sizes = []; - /** - * @var bool - */ - private $followLinks = \false; - /** - * @var bool - */ - private $reverseSorting = \false; + private int $mode = 0; + private array $names = []; + private array $notNames = []; + private array $exclude = []; + private array $filters = []; + private array $pruneFilters = []; + private array $depths = []; + private array $sizes = []; + private bool $followLinks = \false; + private bool $reverseSorting = \false; /** * @var \Closure|int|false */ private $sort = \false; - /** - * @var int - */ - private $ignore = 0; - /** - * @var mixed[] - */ - private $dirs = []; - /** - * @var mixed[] - */ - private $dates = []; - /** - * @var mixed[] - */ - private $iterators = []; - /** - * @var mixed[] - */ - private $contains = []; - /** - * @var mixed[] - */ - private $notContains = []; - /** - * @var mixed[] - */ - private $paths = []; - /** - * @var mixed[] - */ - private $notPaths = []; - /** - * @var bool - */ - private $ignoreUnreadableDirs = \false; - /** - * @var mixed[] - */ - private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; + private int $ignore = 0; + private array $dirs = []; + private array $dates = []; + private array $iterators = []; + private array $contains = []; + private array $notContains = []; + private array $paths = []; + private array $notPaths = []; + private bool $ignoreUnreadableDirs = \false; + private static array $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; public function __construct() { $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES; @@ -672,9 +612,7 @@ public function getIterator() : \Iterator } $iterator = new \AppendIterator(); foreach ($this->dirs as $dir) { - $iterator->append(new \IteratorIterator(new LazyIterator(function () use($dir) { - return $this->searchInDirectory($dir); - }))); + $iterator->append(new \IteratorIterator(new LazyIterator(fn() => $this->searchInDirectory($dir)))); } foreach ($this->iterators as $it) { $iterator->append($it); diff --git a/vendor/rector/rector/vendor/symfony/finder/Gitignore.php b/vendor/rector/rector/vendor/symfony/finder/Gitignore.php index e0a633171..606bed777 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Gitignore.php +++ b/vendor/rector/rector/vendor/symfony/finder/Gitignore.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder; +namespace RectorPrefix202506\Symfony\Component\Finder; /** * Gitignore matches against text. @@ -70,9 +70,7 @@ private static function lineToRegex(string $gitignoreLine) : string $isAbsolute = \false; } $regex = \preg_quote(\str_replace('\\', '', $gitignoreLine), '~'); - $regex = \preg_replace_callback('~\\\\\\[((?:\\\\!)?)([^\\[\\]]*)\\\\\\]~', function (array $matches) : string { - return '[' . ('' !== $matches[1] ? '^' : '') . \str_replace('\\-', '-', $matches[2]) . ']'; - }, $regex); + $regex = \preg_replace_callback('~\\\\\\[((?:\\\\!)?)([^\\[\\]]*)\\\\\\]~', fn(array $matches): string => '[' . ('' !== $matches[1] ? '^' : '') . \str_replace('\\-', '-', $matches[2]) . ']', $regex); $regex = \preg_replace('~(?:(?:\\\\\\*){2,}(/?))+~', '(?:(?:(?!//).(? $iterator The Iterator to filter * @param callable[] $filters An array of PHP callbacks diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php index ca117157d..fce3b35a1 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\Comparator\DateComparator; +use RectorPrefix202506\Symfony\Component\Finder\Comparator\DateComparator; /** * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates). * @@ -20,10 +20,7 @@ */ class DateRangeFilterIterator extends \FilterIterator { - /** - * @var mixed[] - */ - private $comparators = []; + private array $comparators = []; /** * @param \Iterator $iterator * @param DateComparator[] $comparators diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php index d1a6caae0..e1c2e172b 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; /** * DepthRangeFilterIterator limits the directory depth. @@ -22,10 +22,7 @@ */ class DepthRangeFilterIterator extends \FilterIterator { - /** - * @var int - */ - private $minDepth = 0; + private int $minDepth = 0; /** * @param \RecursiveIteratorIterator<\RecursiveIterator> $iterator The Iterator to filter * @param int $minDepth The min depth diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php index 08adee9af..1dfcf47dc 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; /** * ExcludeDirectoryFilterIterator filters out directories. * @@ -23,19 +23,13 @@ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator { /** @var \Iterator */ - private $iterator; - /** - * @var bool - */ - private $isRecursive; + private \Iterator $iterator; + private bool $isRecursive; /** @var array */ - private $excludedDirs = []; - /** - * @var string|null - */ - private $excludedPattern; + private array $excludedDirs = []; + private ?string $excludedPattern = null; /** @var list */ - private $pruneFilters = []; + private array $pruneFilters = []; /** * @param \Iterator $iterator The Iterator to filter * @param list $directories An array of directories to exclude diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php index 414bc1c32..517dfaf76 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; /** * FileTypeFilterIterator only keeps files, directories, or both. @@ -21,10 +21,7 @@ class FileTypeFilterIterator extends \FilterIterator { public const ONLY_FILES = 1; public const ONLY_DIRECTORIES = 2; - /** - * @var int - */ - private $mode; + private int $mode; /** * @param \Iterator $iterator The Iterator to filter * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php index cdddea993..07fa452a5 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; /** * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings). * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php index 2527abaa6..4f480e093 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/FilenameFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\Glob; +use RectorPrefix202506\Symfony\Component\Finder\Glob; /** * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string). * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php index 60fd79492..a1a7f4d9c 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/LazyIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; /** * @author Jérémy Derussé @@ -17,10 +17,7 @@ */ class LazyIterator implements \IteratorAggregate { - /** - * @var \Closure - */ - private $iteratorFactory; + private \Closure $iteratorFactory; public function __construct(callable $iteratorFactory) { $this->iteratorFactory = \Closure::fromCallable($iteratorFactory); diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php index 82749e3c7..5ccfbc99f 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; /** * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings). diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php index c46edbae2..94f94dfd5 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/PathFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; /** * PathFilterIterator filters files by path patterns (e.g. some/special/dir). * diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php index d510527bb..81e88471d 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\Exception\AccessDeniedException; -use RectorPrefix202411\Symfony\Component\Finder\SplFileInfo; +use RectorPrefix202506\Symfony\Component\Finder\Exception\AccessDeniedException; +use RectorPrefix202506\Symfony\Component\Finder\SplFileInfo; /** * Extends the \RecursiveDirectoryIterator to support relative paths. * @@ -21,27 +21,12 @@ */ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator { - /** - * @var bool - */ - private $ignoreUnreadableDirs; - /** - * @var bool - */ - private $ignoreFirstRewind = \true; + private bool $ignoreUnreadableDirs; + private bool $ignoreFirstRewind = \true; // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations - /** - * @var string - */ - private $rootPath; - /** - * @var string - */ - private $subPath; - /** - * @var string - */ - private $directorySeparator = '/'; + private string $rootPath; + private string $subPath; + private string $directorySeparator = '/'; /** * @throws \RuntimeException */ diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php index 628ddd141..89753f611 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\Comparator\NumberComparator; +use RectorPrefix202506\Symfony\Component\Finder\Comparator\NumberComparator; /** * SizeRangeFilterIterator filters out files that are not in the given size range. * @@ -20,10 +20,7 @@ */ class SizeRangeFilterIterator extends \FilterIterator { - /** - * @var mixed[] - */ - private $comparators = []; + private array $comparators = []; /** * @param \Iterator $iterator * @param NumberComparator[] $comparators diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php index fc3cb50b3..68c862994 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/SortableIterator.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; /** * SortableIterator applies a sort on a given Iterator. @@ -31,7 +31,7 @@ class SortableIterator implements \IteratorAggregate public const SORT_BY_EXTENSION = 9; public const SORT_BY_SIZE = 10; /** @var \Traversable */ - private $iterator; + private \Traversable $iterator; /** * @var \Closure|int */ @@ -47,21 +47,13 @@ public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = $this->iterator = $iterator; $order = $reverseOrder ? -1 : 1; if (self::SORT_BY_NAME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * \strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * \strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_NAME_NATURAL === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * \strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * \strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_NAME_CASE_INSENSITIVE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * \strcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * \strcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * \strnatcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * \strnatcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_TYPE === $sort) { $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { if ($a->isDir() && $b->isFile()) { @@ -72,31 +64,19 @@ public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = return $order * \strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); }; } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * ($a->getATime() - $b->getATime()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getATime() - $b->getATime()); } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * ($a->getCTime() - $b->getCTime()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getCTime() - $b->getCTime()); } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * ($a->getMTime() - $b->getMTime()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getMTime() - $b->getMTime()); } elseif (self::SORT_BY_EXTENSION === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * \strnatcmp($a->getExtension(), $b->getExtension()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * \strnatcmp($a->getExtension(), $b->getExtension()); } elseif (self::SORT_BY_SIZE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use($order) { - return $order * ($a->getSize() - $b->getSize()); - }; + $this->sort = static fn(\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getSize() - $b->getSize()); } elseif (self::SORT_BY_NONE === $sort) { $this->sort = $order; } elseif (\is_callable($sort)) { - $this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use($sort) { - return -$sort($a, $b); - } : \Closure::fromCallable($sort); + $this->sort = $reverseOrder ? static fn(\SplFileInfo $a, \SplFileInfo $b) => -$sort($a, $b) : \Closure::fromCallable($sort); } else { throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); } diff --git a/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php b/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php index 8dbddf3c2..aef9ae6b3 100644 --- a/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php +++ b/vendor/rector/rector/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php @@ -8,26 +8,23 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder\Iterator; +namespace RectorPrefix202506\Symfony\Component\Finder\Iterator; -use RectorPrefix202411\Symfony\Component\Finder\Gitignore; +use RectorPrefix202506\Symfony\Component\Finder\Gitignore; /** * @extends \FilterIterator */ final class VcsIgnoredFilterIterator extends \FilterIterator { - /** - * @var string - */ - private $baseDir; + private string $baseDir; /** * @var array */ - private $gitignoreFilesCache = []; + private array $gitignoreFilesCache = []; /** * @var array */ - private $ignoredPathsCache = []; + private array $ignoredPathsCache = []; /** * @param \Iterator $iterator */ @@ -96,9 +93,7 @@ private function parentDirectoriesUpwards(string $from) : array } private function parentDirectoriesUpTo(string $from, string $upTo) : array { - return \array_filter($this->parentDirectoriesUpwards($from), static function (string $directory) use($upTo) : bool { - return \strncmp($directory, $upTo, \strlen($upTo)) === 0; - }); + return \array_filter($this->parentDirectoriesUpwards($from), static fn(string $directory): bool => \strncmp($directory, $upTo, \strlen($upTo)) === 0); } /** * @return list diff --git a/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php b/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php index ccf4f71b8..7a431f22b 100644 --- a/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php +++ b/vendor/rector/rector/vendor/symfony/finder/SplFileInfo.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Finder; +namespace RectorPrefix202506\Symfony\Component\Finder; /** * Extends \SplFileInfo to support relative paths. @@ -17,14 +17,8 @@ */ class SplFileInfo extends \SplFileInfo { - /** - * @var string - */ - private $relativePath; - /** - * @var string - */ - private $relativePathname; + private string $relativePath; + private string $relativePathname; /** * @param string $file The file name * @param string $relativePath The relative path diff --git a/vendor/rector/rector/vendor/symfony/finder/composer.json b/vendor/rector/rector/vendor/symfony/finder/composer.json index 049d086ee..b4a0d261c 100644 --- a/vendor/rector/rector/vendor/symfony/finder/composer.json +++ b/vendor/rector/rector/vendor/symfony/finder/composer.json @@ -23,7 +23,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Finder\\": "" + "RectorPrefix202506\\Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Mbstring.php index 910838a33..00e7b5993 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Mbstring.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -783,7 +783,7 @@ public static function mb_ltrim(string $string, ?string $characters = null, ?str } public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null) : string { - return self::mb_internal_trim('{[%s]+$}D', $string, $characters, $encoding, __FUNCTION__); + return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__); } private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function) : string { diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php index a05a85c53..7c1966087 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php @@ -1,5 +1,5 @@ 'i̇', 'µ' => 'μ', 'ſ' => 's', 'ͅ' => 'ι', 'ς' => 'σ', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϵ' => 'ε', 'ẛ' => 'ṡ', 'ι' => 'ι', 'ß' => 'ss', 'ʼn' => 'ʼn', 'ǰ' => 'ǰ', 'ΐ' => 'ΐ', 'ΰ' => 'ΰ', 'և' => 'եւ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẚ' => 'aʾ', 'ẞ' => 'ss', 'ὐ' => 'ὐ', 'ὒ' => 'ὒ', 'ὔ' => 'ὔ', 'ὖ' => 'ὖ', 'ᾀ' => 'ἀι', 'ᾁ' => 'ἁι', 'ᾂ' => 'ἂι', 'ᾃ' => 'ἃι', 'ᾄ' => 'ἄι', 'ᾅ' => 'ἅι', 'ᾆ' => 'ἆι', 'ᾇ' => 'ἇι', 'ᾈ' => 'ἀι', 'ᾉ' => 'ἁι', 'ᾊ' => 'ἂι', 'ᾋ' => 'ἃι', 'ᾌ' => 'ἄι', 'ᾍ' => 'ἅι', 'ᾎ' => 'ἆι', 'ᾏ' => 'ἇι', 'ᾐ' => 'ἠι', 'ᾑ' => 'ἡι', 'ᾒ' => 'ἢι', 'ᾓ' => 'ἣι', 'ᾔ' => 'ἤι', 'ᾕ' => 'ἥι', 'ᾖ' => 'ἦι', 'ᾗ' => 'ἧι', 'ᾘ' => 'ἠι', 'ᾙ' => 'ἡι', 'ᾚ' => 'ἢι', 'ᾛ' => 'ἣι', 'ᾜ' => 'ἤι', 'ᾝ' => 'ἥι', 'ᾞ' => 'ἦι', 'ᾟ' => 'ἧι', 'ᾠ' => 'ὠι', 'ᾡ' => 'ὡι', 'ᾢ' => 'ὢι', 'ᾣ' => 'ὣι', 'ᾤ' => 'ὤι', 'ᾥ' => 'ὥι', 'ᾦ' => 'ὦι', 'ᾧ' => 'ὧι', 'ᾨ' => 'ὠι', 'ᾩ' => 'ὡι', 'ᾪ' => 'ὢι', 'ᾫ' => 'ὣι', 'ᾬ' => 'ὤι', 'ᾭ' => 'ὥι', 'ᾮ' => 'ὦι', 'ᾯ' => 'ὧι', 'ᾲ' => 'ὰι', 'ᾳ' => 'αι', 'ᾴ' => 'άι', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾶι', 'ᾼ' => 'αι', 'ῂ' => 'ὴι', 'ῃ' => 'ηι', 'ῄ' => 'ήι', 'ῆ' => 'ῆ', 'ῇ' => 'ῆι', 'ῌ' => 'ηι', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'ῲ' => 'ὼι', 'ῳ' => 'ωι', 'ῴ' => 'ώι', 'ῶ' => 'ῶ', 'ῷ' => 'ῶι', 'ῼ' => 'ωι', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ']; diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php index 82640f4e6..62ad631bc 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -1,5 +1,5 @@ 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i̇', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃'); diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php index 4d6d87faa..6317b6e20 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -1,6 +1,6 @@ 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ἈΙ', 'ᾁ' => 'ἉΙ', 'ᾂ' => 'ἊΙ', 'ᾃ' => 'ἋΙ', 'ᾄ' => 'ἌΙ', 'ᾅ' => 'ἍΙ', 'ᾆ' => 'ἎΙ', 'ᾇ' => 'ἏΙ', 'ᾐ' => 'ἨΙ', 'ᾑ' => 'ἩΙ', 'ᾒ' => 'ἪΙ', 'ᾓ' => 'ἫΙ', 'ᾔ' => 'ἬΙ', 'ᾕ' => 'ἭΙ', 'ᾖ' => 'ἮΙ', 'ᾗ' => 'ἯΙ', 'ᾠ' => 'ὨΙ', 'ᾡ' => 'ὩΙ', 'ᾢ' => 'ὪΙ', 'ᾣ' => 'ὫΙ', 'ᾤ' => 'ὬΙ', 'ᾥ' => 'ὭΙ', 'ᾦ' => 'ὮΙ', 'ᾧ' => 'ὯΙ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ΑΙ', 'ι' => 'Ι', 'ῃ' => 'ΗΙ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ΩΙ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', 'ß' => 'SS', 'ff' => 'FF', 'fi' => 'FI', 'fl' => 'FL', 'ffi' => 'FFI', 'ffl' => 'FFL', 'ſt' => 'ST', 'st' => 'ST', 'և' => 'ԵՒ', 'ﬓ' => 'ՄՆ', 'ﬔ' => 'ՄԵ', 'ﬕ' => 'ՄԻ', 'ﬖ' => 'ՎՆ', 'ﬗ' => 'ՄԽ', 'ʼn' => 'ʼN', 'ΐ' => 'Ϊ́', 'ΰ' => 'Ϋ́', 'ǰ' => 'J̌', 'ẖ' => 'H̱', 'ẗ' => 'T̈', 'ẘ' => 'W̊', 'ẙ' => 'Y̊', 'ẚ' => 'Aʾ', 'ὐ' => 'Υ̓', 'ὒ' => 'Υ̓̀', 'ὔ' => 'Υ̓́', 'ὖ' => 'Υ̓͂', 'ᾶ' => 'Α͂', 'ῆ' => 'Η͂', 'ῒ' => 'Ϊ̀', 'ΐ' => 'Ϊ́', 'ῖ' => 'Ι͂', 'ῗ' => 'Ϊ͂', 'ῢ' => 'Ϋ̀', 'ΰ' => 'Ϋ́', 'ῤ' => 'Ρ̓', 'ῦ' => 'Υ͂', 'ῧ' => 'Ϋ͂', 'ῶ' => 'Ω͂', 'ᾈ' => 'ἈΙ', 'ᾉ' => 'ἉΙ', 'ᾊ' => 'ἊΙ', 'ᾋ' => 'ἋΙ', 'ᾌ' => 'ἌΙ', 'ᾍ' => 'ἍΙ', 'ᾎ' => 'ἎΙ', 'ᾏ' => 'ἏΙ', 'ᾘ' => 'ἨΙ', 'ᾙ' => 'ἩΙ', 'ᾚ' => 'ἪΙ', 'ᾛ' => 'ἫΙ', 'ᾜ' => 'ἬΙ', 'ᾝ' => 'ἭΙ', 'ᾞ' => 'ἮΙ', 'ᾟ' => 'ἯΙ', 'ᾨ' => 'ὨΙ', 'ᾩ' => 'ὩΙ', 'ᾪ' => 'ὪΙ', 'ᾫ' => 'ὫΙ', 'ᾬ' => 'ὬΙ', 'ᾭ' => 'ὭΙ', 'ᾮ' => 'ὮΙ', 'ᾯ' => 'ὯΙ', 'ᾼ' => 'ΑΙ', 'ῌ' => 'ΗΙ', 'ῼ' => 'ΩΙ', 'ᾲ' => 'ᾺΙ', 'ᾴ' => 'ΆΙ', 'ῂ' => 'ῊΙ', 'ῄ' => 'ΉΙ', 'ῲ' => 'ῺΙ', 'ῴ' => 'ΏΙ', 'ᾷ' => 'Α͂Ι', 'ῇ' => 'Η͂Ι', 'ῷ' => 'Ω͂Ι'); diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/bootstrap80.php b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/bootstrap80.php index 9226d5df5..2139e9fd6 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/bootstrap80.php +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -193,7 +193,7 @@ function mb_ord(?string $string, ?string $encoding = null) { return p\Mbstring:: function mb_chr(?int $codepoint, ?string $encoding = null) { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } } if (!function_exists('mb_scrub')) { - function mb_scrub(?string $string, ?string $encoding = null): string { $encoding = $encoding ?? mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } + function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } } if (!function_exists('mb_str_split')) { function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } @@ -204,11 +204,11 @@ function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $ } if (!function_exists('mb_ucfirst')) { - function mb_ucfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } + function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } } if (!function_exists('mb_lcfirst')) { - function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } + function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } } if (!function_exists('mb_trim')) { diff --git a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/composer.json b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/composer.json index 38d53f819..b866a843a 100644 --- a/vendor/rector/rector/vendor/symfony/polyfill-mbstring/composer.json +++ b/vendor/rector/rector/vendor/symfony/polyfill-mbstring/composer.json @@ -22,7 +22,8 @@ } ], "require": { - "php": ">=7.2" + "php": ">=7.2", + "ext-iconv": "*" }, "provide": { "ext-mbstring": "*" diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php b/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php index 8c5aea51f..df4f81866 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ExceptionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; /** * Marker Interface for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php b/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php index d8e07addc..6f5dc0de7 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/InvalidArgumentException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; /** * InvalidArgumentException for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php b/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php index 0717c68c4..5cc9e50d0 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/LogicException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; /** * LogicException for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php index 371d572d8..b7c7dec08 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessFailedException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * Exception for failed processes. * @@ -18,10 +18,7 @@ */ class ProcessFailedException extends RuntimeException { - /** - * @var \Symfony\Component\Process\Process - */ - private $process; + private Process $process; public function __construct(Process $process) { if ($process->isSuccessful()) { diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php index 7f68d1de1..9ef0bd39f 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessSignaledException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * Exception that is thrown when a process has been signaled. * @@ -18,10 +18,7 @@ */ final class ProcessSignaledException extends RuntimeException { - /** - * @var \Symfony\Component\Process\Process - */ - private $process; + private Process $process; public function __construct(Process $process) { $this->process = $process; diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php index 68cd6195a..2186a96aa 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/ProcessTimedOutException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * Exception that is thrown when a process times out. * @@ -20,14 +20,8 @@ class ProcessTimedOutException extends RuntimeException { public const TYPE_GENERAL = 1; public const TYPE_IDLE = 2; - /** - * @var \Symfony\Component\Process\Process - */ - private $process; - /** - * @var int - */ - private $timeoutType; + private Process $process; + private int $timeoutType; public function __construct(Process $process, int $timeoutType) { $this->process = $process; diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php b/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php index 8c82d1cb4..f274ebf32 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/RunProcessFailedException.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; -use RectorPrefix202411\Symfony\Component\Process\Messenger\RunProcessContext; +use RectorPrefix202506\Symfony\Component\Process\Messenger\RunProcessContext; /** * @author Kevin Bond */ @@ -18,9 +18,8 @@ final class RunProcessFailedException extends RuntimeException { /** * @readonly - * @var \Symfony\Component\Process\Messenger\RunProcessContext */ - public $context; + public RunProcessContext $context; public function __construct(ProcessFailedException $exception, RunProcessContext $context) { $this->context = $context; diff --git a/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php index a0745836f..89b1ef1bb 100644 --- a/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/process/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Exception; +namespace RectorPrefix202506\Symfony\Component\Process\Exception; /** * RuntimeException for the Process Component. diff --git a/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php b/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php index a074fa54e..232edf69d 100644 --- a/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php +++ b/vendor/rector/rector/vendor/symfony/process/ExecutableFinder.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process; +namespace RectorPrefix202506\Symfony\Component\Process; /** * Generic executable finder. @@ -19,10 +19,7 @@ class ExecutableFinder { private const CMD_BUILTINS = ['assoc', 'break', 'call', 'cd', 'chdir', 'cls', 'color', 'copy', 'date', 'del', 'dir', 'echo', 'endlocal', 'erase', 'exit', 'for', 'ftype', 'goto', 'help', 'if', 'label', 'md', 'mkdir', 'mklink', 'move', 'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'rem', 'ren', 'rename', 'rmdir', 'set', 'setlocal', 'shift', 'start', 'time', 'title', 'type', 'ver', 'vol']; - /** - * @var mixed[] - */ - private $suffixes = []; + private array $suffixes = []; /** * Replaces default suffixes of executable. * diff --git a/vendor/rector/rector/vendor/symfony/process/InputStream.php b/vendor/rector/rector/vendor/symfony/process/InputStream.php index 83951fbb3..37419a1f0 100644 --- a/vendor/rector/rector/vendor/symfony/process/InputStream.php +++ b/vendor/rector/rector/vendor/symfony/process/InputStream.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process; +namespace RectorPrefix202506\Symfony\Component\Process; -use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Process\Exception\RuntimeException; /** * Provides a way to continuously write to the input of a Process until the InputStream is closed. * @@ -20,18 +20,9 @@ */ class InputStream implements \IteratorAggregate { - /** - * @var \Closure|null - */ - private $onEmpty; - /** - * @var mixed[] - */ - private $input = []; - /** - * @var bool - */ - private $open = \true; + private ?\Closure $onEmpty = null; + private array $input = []; + private bool $open = \true; /** * Sets a callback that is called when the write buffer becomes empty. * diff --git a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php index c54489e78..f021ea9b7 100644 --- a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php +++ b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessContext.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Messenger; +namespace RectorPrefix202506\Symfony\Component\Process\Messenger; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * @author Kevin Bond */ @@ -18,24 +18,20 @@ final class RunProcessContext { /** * @readonly - * @var \Symfony\Component\Process\Messenger\RunProcessMessage */ - public $message; + public RunProcessMessage $message; /** * @readonly - * @var int|null */ - public $exitCode; + public ?int $exitCode; /** * @readonly - * @var string|null */ - public $output; + public ?string $output; /** * @readonly - * @var string|null */ - public $errorOutput; + public ?string $errorOutput; public function __construct(RunProcessMessage $message, Process $process) { $this->message = $message; diff --git a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php index aaa15957e..1209daf99 100644 --- a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php +++ b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessage.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Messenger; +namespace RectorPrefix202506\Symfony\Component\Process\Messenger; /** * @author Kevin Bond @@ -17,19 +17,16 @@ class RunProcessMessage { /** * @readonly - * @var mixed[] */ - public $command; + public array $command; /** * @readonly - * @var string|null */ - public $cwd; + public ?string $cwd = null; /** * @readonly - * @var mixed[]|null */ - public $env; + public ?array $env = null; /** * @readonly * @var mixed @@ -37,9 +34,8 @@ class RunProcessMessage public $input = null; /** * @readonly - * @var float|null */ - public $timeout = 60.0; + public ?float $timeout = 60.0; /** * @param mixed $input */ diff --git a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php index 4e7380d5c..1d44bc2b5 100644 --- a/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php +++ b/vendor/rector/rector/vendor/symfony/process/Messenger/RunProcessMessageHandler.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Messenger; +namespace RectorPrefix202506\Symfony\Component\Process\Messenger; -use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessFailedException; -use RectorPrefix202411\Symfony\Component\Process\Exception\RunProcessFailedException; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Process\Exception\ProcessFailedException; +use RectorPrefix202506\Symfony\Component\Process\Exception\RunProcessFailedException; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * @author Kevin Bond */ diff --git a/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php b/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php index 0625c35a5..ff10d60f9 100644 --- a/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php +++ b/vendor/rector/rector/vendor/symfony/process/PhpExecutableFinder.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process; +namespace RectorPrefix202506\Symfony\Component\Process; /** * An executable finder specifically designed for the PHP executable. @@ -18,10 +18,7 @@ */ class PhpExecutableFinder { - /** - * @var \Symfony\Component\Process\ExecutableFinder - */ - private $executableFinder; + private ExecutableFinder $executableFinder; public function __construct() { $this->executableFinder = new ExecutableFinder(); diff --git a/vendor/rector/rector/vendor/symfony/process/PhpProcess.php b/vendor/rector/rector/vendor/symfony/process/PhpProcess.php index 38a10b3fb..a3442af22 100644 --- a/vendor/rector/rector/vendor/symfony/process/PhpProcess.php +++ b/vendor/rector/rector/vendor/symfony/process/PhpProcess.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process; +namespace RectorPrefix202506\Symfony\Component\Process; -use RectorPrefix202411\Symfony\Component\Process\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Process\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Process\Exception\RuntimeException; /** * PhpProcess runs a PHP script in an independent process. * diff --git a/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php b/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php index 9425c1c2b..0fd8b731c 100644 --- a/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php +++ b/vendor/rector/rector/vendor/symfony/process/PhpSubprocess.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process; +namespace RectorPrefix202506\Symfony\Component\Process; -use RectorPrefix202411\Symfony\Component\Process\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Process\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Process\Exception\RuntimeException; /** * PhpSubprocess runs a PHP command as a subprocess while keeping the original php.ini settings. * diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php b/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php index d9fc28c38..c561bc504 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/AbstractPipes.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Pipes; +namespace RectorPrefix202506\Symfony\Component\Process\Pipes; -use RectorPrefix202411\Symfony\Component\Process\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Process\Exception\InvalidArgumentException; /** * @author Romain Neutron * @@ -18,24 +18,12 @@ */ abstract class AbstractPipes implements PipesInterface { - /** - * @var mixed[] - */ - public $pipes = []; - /** - * @var string - */ - private $inputBuffer = ''; + public array $pipes = []; + private string $inputBuffer = ''; /** @var resource|string|\Iterator */ private $input; - /** - * @var bool - */ - private $blocked = \true; - /** - * @var string|null - */ - private $lastError; + private bool $blocked = \true; + private ?string $lastError = null; /** * @param resource|string|\Iterator $input */ diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php b/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php index 7ed0478f1..9a5575c10 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/PipesInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Pipes; +namespace RectorPrefix202506\Symfony\Component\Process\Pipes; /** * PipesInterface manages descriptors and pipes for the use of proc_open. diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php b/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php index 9ff4c4f8d..d0f1d17d4 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/UnixPipes.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Pipes; +namespace RectorPrefix202506\Symfony\Component\Process\Pipes; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * UnixPipes implementation uses unix pipes as handles. * @@ -20,18 +20,9 @@ */ class UnixPipes extends AbstractPipes { - /** - * @var bool|null - */ - private $ttyMode; - /** - * @var bool - */ - private $ptyMode; - /** - * @var bool - */ - private $haveReadSupport; + private ?bool $ttyMode; + private bool $ptyMode; + private bool $haveReadSupport; /** * @param mixed $input */ @@ -64,7 +55,7 @@ public function getDescriptors() : array return [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']]; } if ($this->ptyMode && Process::isPtySupported()) { - return [['pty'], ['pty'], ['pty']]; + return [['pty'], ['pty'], ['pipe', 'w']]; } return [ ['pipe', 'r'], diff --git a/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php b/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php index 3d0566fe4..d909c22d7 100644 --- a/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php +++ b/vendor/rector/rector/vendor/symfony/process/Pipes/WindowsPipes.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process\Pipes; +namespace RectorPrefix202506\Symfony\Component\Process\Pipes; -use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Process\Process; +use RectorPrefix202506\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Process\Process; /** * WindowsPipes implementation uses temporary files as handles. * @@ -24,26 +24,11 @@ */ class WindowsPipes extends AbstractPipes { - /** - * @var mixed[] - */ - private $files = []; - /** - * @var mixed[] - */ - private $fileHandles = []; - /** - * @var mixed[] - */ - private $lockHandles = []; - /** - * @var mixed[] - */ - private $readBytes = [Process::STDOUT => 0, Process::STDERR => 0]; - /** - * @var bool - */ - private $haveReadSupport; + private array $files = []; + private array $fileHandles = []; + private array $lockHandles = []; + private array $readBytes = [Process::STDOUT => 0, Process::STDERR => 0]; + private bool $haveReadSupport; /** * @param mixed $input */ diff --git a/vendor/rector/rector/vendor/symfony/process/Process.php b/vendor/rector/rector/vendor/symfony/process/Process.php index 22a4eafcf..c64ea7e8f 100644 --- a/vendor/rector/rector/vendor/symfony/process/Process.php +++ b/vendor/rector/rector/vendor/symfony/process/Process.php @@ -8,16 +8,16 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process; +namespace RectorPrefix202506\Symfony\Component\Process; -use RectorPrefix202411\Symfony\Component\Process\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Process\Exception\LogicException; -use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessFailedException; -use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessSignaledException; -use RectorPrefix202411\Symfony\Component\Process\Exception\ProcessTimedOutException; -use RectorPrefix202411\Symfony\Component\Process\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Process\Pipes\UnixPipes; -use RectorPrefix202411\Symfony\Component\Process\Pipes\WindowsPipes; +use RectorPrefix202506\Symfony\Component\Process\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Process\Exception\LogicException; +use RectorPrefix202506\Symfony\Component\Process\Exception\ProcessFailedException; +use RectorPrefix202506\Symfony\Component\Process\Exception\ProcessSignaledException; +use RectorPrefix202506\Symfony\Component\Process\Exception\ProcessTimedOutException; +use RectorPrefix202506\Symfony\Component\Process\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Process\Pipes\UnixPipes; +use RectorPrefix202506\Symfony\Component\Process\Pipes\WindowsPipes; /** * Process is a thin wrapper around proc_* functions to easily * start independent PHP processes. @@ -47,102 +47,41 @@ class Process implements \IteratorAggregate // Use this flag to skip STDOUT while iterating public const ITER_SKIP_ERR = 8; // Use this flag to skip STDERR while iterating - /** - * @var \Closure|null - */ - private $callback; + private ?\Closure $callback = null; /** * @var mixed[]|string */ private $commandline; - /** - * @var string|null - */ - private $cwd; - /** - * @var mixed[] - */ - private $env = []; + private ?string $cwd; + private array $env = []; /** @var resource|string|\Iterator|null */ private $input; - /** - * @var float|null - */ - private $starttime; - /** - * @var float|null - */ - private $lastOutputTime; - /** - * @var float|null - */ - private $timeout; - /** - * @var float|null - */ - private $idleTimeout; - /** - * @var int|null - */ - private $exitcode; - /** - * @var mixed[] - */ - private $fallbackStatus = []; - /** - * @var mixed[] - */ - private $processInformation; - /** - * @var bool - */ - private $outputDisabled = \false; + private ?float $starttime = null; + private ?float $lastOutputTime = null; + private ?float $timeout = null; + private ?float $idleTimeout = null; + private ?int $exitcode = null; + private array $fallbackStatus = []; + private array $processInformation; + private bool $outputDisabled = \false; /** @var resource */ private $stdout; /** @var resource */ private $stderr; /** @var resource|null */ private $process; - /** - * @var string - */ - private $status = self::STATUS_READY; - /** - * @var int - */ - private $incrementalOutputOffset = 0; - /** - * @var int - */ - private $incrementalErrorOutputOffset = 0; - /** - * @var bool - */ - private $tty = \false; - /** - * @var bool - */ - private $pty; - /** - * @var mixed[] - */ - private $options = ['suppress_errors' => \true, 'bypass_shell' => \true]; + private string $status = self::STATUS_READY; + private int $incrementalOutputOffset = 0; + private int $incrementalErrorOutputOffset = 0; + private bool $tty = \false; + private bool $pty; + private array $options = ['suppress_errors' => \true, 'bypass_shell' => \true]; /** * @var \Symfony\Component\Process\Pipes\WindowsPipes|\Symfony\Component\Process\Pipes\UnixPipes */ private $processPipes; - /** - * @var int|null - */ - private $latestSignal; - /** - * @var int|null - */ - private $cachedExitCode; - /** - * @var bool|null - */ - private static $sigchild; + private ?int $latestSignal = null; + private static ?bool $sigchild = null; /** * Exit codes translation table. * @@ -1117,7 +1056,7 @@ public function setOptions(array $options) public static function isTtySupported() : bool { static $isTtySupported; - return $isTtySupported = $isTtySupported ?? '/' === \DIRECTORY_SEPARATOR && \stream_isatty(\STDOUT) && @\is_writable('/dev/tty'); + return $isTtySupported ??= '/' === \DIRECTORY_SEPARATOR && \stream_isatty(\STDOUT) && @\is_writable('/dev/tty'); } /** * Returns whether PTY is supported on the current operating system. @@ -1159,9 +1098,7 @@ private function getDescriptors(bool $hasCallback) : array protected function buildCallback(?callable $callback = null) : \Closure { if ($this->outputDisabled) { - return function ($type, $data) use($callback) : bool { - return null !== $callback && $callback($type, $data); - }; + return fn($type, $data): bool => null !== $callback && $callback($type, $data); } $out = self::OUT; return function ($type, $data) use($callback, $out) : bool { @@ -1185,19 +1122,10 @@ protected function updateStatus(bool $blocking) if (self::STATUS_STARTED !== $this->status) { return; } - $this->processInformation = \proc_get_status($this->process); - $running = $this->processInformation['running']; - // In PHP < 8.3, "proc_get_status" only returns the correct exit status on the first call. - // Subsequent calls return -1 as the process is discarded. This workaround caches the first - // retrieved exit status for consistent results in later calls, mimicking PHP 8.3 behavior. - if (\PHP_VERSION_ID < 80300) { - if (!isset($this->cachedExitCode) && !$running && -1 !== $this->processInformation['exitcode']) { - $this->cachedExitCode = $this->processInformation['exitcode']; - } - if (isset($this->cachedExitCode) && !$running && -1 === $this->processInformation['exitcode']) { - $this->processInformation['exitcode'] = $this->cachedExitCode; - } + if ($this->processInformation['running'] ?? \true) { + $this->processInformation = \proc_get_status($this->process); } + $running = $this->processInformation['running']; $this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running); if ($this->fallbackStatus && $this->isSigchildEnabled()) { $this->processInformation = $this->fallbackStatus + $this->processInformation; diff --git a/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php b/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php index f3e4e3983..55fe775d9 100644 --- a/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php +++ b/vendor/rector/rector/vendor/symfony/process/ProcessUtils.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Process; +namespace RectorPrefix202506\Symfony\Component\Process; -use RectorPrefix202411\Symfony\Component\Process\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Process\Exception\InvalidArgumentException; /** * ProcessUtils is a bunch of utility methods. * diff --git a/vendor/rector/rector/vendor/symfony/process/composer.json b/vendor/rector/rector/vendor/symfony/process/composer.json index 14e3dcd67..dd06d1bca 100644 --- a/vendor/rector/rector/vendor/symfony/process/composer.json +++ b/vendor/rector/rector/vendor/symfony/process/composer.json @@ -20,7 +20,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Process\\": "" + "RectorPrefix202506\\Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php index 1abe6b124..9f86d8f07 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/Required.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service\Attribute; +namespace RectorPrefix202506\Symfony\Contracts\Service\Attribute; /** * A required dependency. diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php index a5796b424..1361c37c1 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/Attribute/SubscribedService.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service\Attribute; +namespace RectorPrefix202506\Symfony\Contracts\Service\Attribute; -use RectorPrefix202411\Symfony\Contracts\Service\ServiceMethodsSubscriberTrait; -use RectorPrefix202411\Symfony\Contracts\Service\ServiceSubscriberInterface; +use RectorPrefix202506\Symfony\Contracts\Service\ServiceMethodsSubscriberTrait; +use RectorPrefix202506\Symfony\Contracts\Service\ServiceSubscriberInterface; /** * For use as the return value for {@see ServiceSubscriberInterface}. * @@ -28,17 +28,17 @@ final class SubscribedService /** * @var string|null */ - public $key; + public ?string $key = null; /** * @var class-string|null */ - public $type; + public ?string $type = null; /** * @var bool */ - public $nullable = \false; + public bool $nullable = \false; /** @var object[] */ - public $attributes; + public array $attributes; /** * @param string|null $key The key to use for the service * @param class-string|null $type The service class diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php index 482411a46..fcc030ad4 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ResetInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service; +namespace RectorPrefix202506\Symfony\Contracts\Service; /** * Provides a way to reset an object to its initial state. diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php index 2edb9708a..b3c04c2bb 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceCollectionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service; +namespace RectorPrefix202506\Symfony\Contracts\Service; /** * A ServiceProviderInterface that is also countable and iterable. diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php index e8a146566..caa8dc635 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceLocatorTrait.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service; +namespace RectorPrefix202506\Symfony\Contracts\Service; -use RectorPrefix202411\Psr\Container\ContainerExceptionInterface; -use RectorPrefix202411\Psr\Container\NotFoundExceptionInterface; +use RectorPrefix202506\Psr\Container\ContainerExceptionInterface; +use RectorPrefix202506\Psr\Container\NotFoundExceptionInterface; // Help opcache.preload discover always-needed symbols \class_exists(ContainerExceptionInterface::class); \class_exists(NotFoundExceptionInterface::class); @@ -24,17 +24,11 @@ trait ServiceLocatorTrait { /** - * @var mixed[] + * @var array */ - private $factories; - /** - * @var mixed[] - */ - private $loading = []; - /** - * @var mixed[] - */ - private $providedTypes; + private array $factories; + private array $loading = []; + private array $providedTypes; /** * @param array $factories */ diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php index e6c615a09..af8b96a57 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service; +namespace RectorPrefix202506\Symfony\Contracts\Service; -use RectorPrefix202411\Psr\Container\ContainerInterface; -use RectorPrefix202411\Symfony\Contracts\Service\Attribute\Required; -use RectorPrefix202411\Symfony\Contracts\Service\Attribute\SubscribedService; +use RectorPrefix202506\Psr\Container\ContainerInterface; +use RectorPrefix202506\Symfony\Contracts\Service\Attribute\Required; +use RectorPrefix202506\Symfony\Contracts\Service\Attribute\SubscribedService; /** * Implementation of ServiceSubscriberInterface that determines subscribed services * from methods that have the #[SubscribedService] attribute. @@ -24,10 +24,7 @@ */ trait ServiceMethodsSubscriberTrait { - /** - * @var \Psr\Container\ContainerInterface - */ - protected $container; + protected ContainerInterface $container; public static function getSubscribedServices() : array { $services = \method_exists(\get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; @@ -46,9 +43,9 @@ public static function getSubscribedServices() : array } /* @var SubscribedService $attribute */ $attribute = $attribute->newInstance(); - $attribute->key = $attribute->key ?? self::class . '::' . $method->name; - $attribute->type = $attribute->type ?? ($returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType); - $attribute->nullable = $returnType->allowsNull(); + $attribute->key ??= self::class . '::' . $method->name; + $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; + $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull(); if ($attribute->attributes) { $services[] = $attribute; } else { diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php index bfb9356ae..9b3f48d85 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceProviderInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service; +namespace RectorPrefix202506\Symfony\Contracts\Service; -use RectorPrefix202411\Psr\Container\ContainerInterface; +use RectorPrefix202506\Psr\Container\ContainerInterface; /** * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. * diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php index bdc63d95b..d929d888b 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberInterface.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service; +namespace RectorPrefix202506\Symfony\Contracts\Service; -use RectorPrefix202411\Symfony\Contracts\Service\Attribute\SubscribedService; +use RectorPrefix202506\Symfony\Contracts\Service\Attribute\SubscribedService; /** * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. * diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php index 78d6aff1a..1b414c229 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php +++ b/vendor/rector/rector/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Contracts\Service; +namespace RectorPrefix202506\Symfony\Contracts\Service; -use RectorPrefix202411\Psr\Container\ContainerInterface; -use RectorPrefix202411\Symfony\Contracts\Service\Attribute\Required; -use RectorPrefix202411\Symfony\Contracts\Service\Attribute\SubscribedService; +use RectorPrefix202506\Psr\Container\ContainerInterface; +use RectorPrefix202506\Symfony\Contracts\Service\Attribute\Required; +use RectorPrefix202506\Symfony\Contracts\Service\Attribute\SubscribedService; trigger_deprecation('symfony/contracts', 'v3.5', '"%s" is deprecated, use "ServiceMethodsSubscriberTrait" instead.', ServiceSubscriberTrait::class); /** * Implementation of ServiceSubscriberInterface that determines subscribed services @@ -47,9 +47,9 @@ public static function getSubscribedServices() : array } /* @var SubscribedService $attribute */ $attribute = $attribute->newInstance(); - $attribute->key = $attribute->key ?? self::class . '::' . $method->name; - $attribute->type = $attribute->type ?? ($returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType); - $attribute->nullable = $returnType->allowsNull(); + $attribute->key ??= self::class . '::' . $method->name; + $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; + $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull(); if ($attribute->attributes) { $services[] = $attribute; } else { diff --git a/vendor/rector/rector/vendor/symfony/service-contracts/composer.json b/vendor/rector/rector/vendor/symfony/service-contracts/composer.json index 5c5ea37f1..35379d9a0 100644 --- a/vendor/rector/rector/vendor/symfony/service-contracts/composer.json +++ b/vendor/rector/rector/vendor/symfony/service-contracts/composer.json @@ -32,7 +32,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Contracts\\Service\\": "" + "RectorPrefix202506\\Symfony\\Contracts\\Service\\": "" }, "exclude-from-classmap": [ "\/Test\/" @@ -41,7 +41,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" }, "thanks": { "name": "symfony\/contracts", diff --git a/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php b/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php index da6745760..bc201aeb5 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Command/LintCommand.php @@ -8,23 +8,23 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml\Command; +namespace RectorPrefix202506\Symfony\Component\Yaml\Command; -use RectorPrefix202411\Symfony\Component\Console\Attribute\AsCommand; -use RectorPrefix202411\Symfony\Component\Console\CI\GithubActionReporter; -use RectorPrefix202411\Symfony\Component\Console\Command\Command; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionInput; -use RectorPrefix202411\Symfony\Component\Console\Completion\CompletionSuggestions; -use RectorPrefix202411\Symfony\Component\Console\Exception\InvalidArgumentException; -use RectorPrefix202411\Symfony\Component\Console\Exception\RuntimeException; -use RectorPrefix202411\Symfony\Component\Console\Input\InputArgument; -use RectorPrefix202411\Symfony\Component\Console\Input\InputInterface; -use RectorPrefix202411\Symfony\Component\Console\Input\InputOption; -use RectorPrefix202411\Symfony\Component\Console\Output\OutputInterface; -use RectorPrefix202411\Symfony\Component\Console\Style\SymfonyStyle; -use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; -use RectorPrefix202411\Symfony\Component\Yaml\Parser; -use RectorPrefix202411\Symfony\Component\Yaml\Yaml; +use RectorPrefix202506\Symfony\Component\Console\Attribute\AsCommand; +use RectorPrefix202506\Symfony\Component\Console\CI\GithubActionReporter; +use RectorPrefix202506\Symfony\Component\Console\Command\Command; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionInput; +use RectorPrefix202506\Symfony\Component\Console\Completion\CompletionSuggestions; +use RectorPrefix202506\Symfony\Component\Console\Exception\InvalidArgumentException; +use RectorPrefix202506\Symfony\Component\Console\Exception\RuntimeException; +use RectorPrefix202506\Symfony\Component\Console\Input\InputArgument; +use RectorPrefix202506\Symfony\Component\Console\Input\InputInterface; +use RectorPrefix202506\Symfony\Component\Console\Input\InputOption; +use RectorPrefix202506\Symfony\Component\Console\Output\OutputInterface; +use RectorPrefix202506\Symfony\Component\Console\Style\SymfonyStyle; +use RectorPrefix202506\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202506\Symfony\Component\Yaml\Parser; +use RectorPrefix202506\Symfony\Component\Yaml\Yaml; /** * Validates YAML files syntax and outputs encountered errors. * @@ -33,26 +33,11 @@ */ class LintCommand extends Command { - /** - * @var \Symfony\Component\Yaml\Parser - */ - private $parser; - /** - * @var string|null - */ - private $format; - /** - * @var bool - */ - private $displayCorrectFiles; - /** - * @var \Closure|null - */ - private $directoryIteratorProvider; - /** - * @var \Closure|null - */ - private $isReadableProvider; + private Parser $parser; + private ?string $format = null; + private bool $displayCorrectFiles; + private ?\Closure $directoryIteratorProvider; + private ?\Closure $isReadableProvider; public function __construct(?string $name = null, ?callable $directoryIteratorProvider = null, ?callable $isReadableProvider = null) { parent::__construct($name); @@ -76,6 +61,9 @@ protected function configure() : void Or of a whole directory: php %command.full_name% dirname + +The --format option specifies the format of the command output: + php %command.full_name% dirname --format=json You can also exclude one or more specific files: @@ -207,13 +195,11 @@ private function getFiles(string $fileOrDirectory) : iterable } private function getParser() : Parser { - return $this->parser = $this->parser ?? new Parser(); + return $this->parser ??= new Parser(); } private function getDirectoryIterator(string $directory) : iterable { - $default = function ($directory) { - return new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), \RecursiveIteratorIterator::LEAVES_ONLY); - }; + $default = fn($directory) => new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), \RecursiveIteratorIterator::LEAVES_ONLY); if (null !== $this->directoryIteratorProvider) { return ($this->directoryIteratorProvider)($directory, $default); } @@ -233,6 +219,7 @@ public function complete(CompletionInput $input, CompletionSuggestions $suggesti $suggestions->suggestValues($this->getAvailableFormatOptions()); } } + /** @return string[] */ private function getAvailableFormatOptions() : array { return ['txt', 'json', 'github']; diff --git a/vendor/rector/rector/vendor/symfony/yaml/Dumper.php b/vendor/rector/rector/vendor/symfony/yaml/Dumper.php index 0218d2bd8..aaaabb220 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Dumper.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Dumper.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml; +namespace RectorPrefix202506\Symfony\Component\Yaml; -use RectorPrefix202411\Symfony\Component\Yaml\Tag\TaggedValue; +use RectorPrefix202506\Symfony\Component\Yaml\Tag\TaggedValue; /** * Dumper dumps PHP variables to YAML strings. * @@ -21,26 +21,38 @@ class Dumper { /** - * The amount of spaces to use for indentation of nested nodes. * @var int */ - private $indentation; + private int $indentation = 4; + /** + * @param int $indentation The amount of spaces to use for indentation of nested nodes + */ public function __construct(int $indentation = 4) { + $this->indentation = $indentation; if ($indentation < 1) { throw new \InvalidArgumentException('The indentation must be greater than zero.'); } - $this->indentation = $indentation; } /** * Dumps a PHP value to YAML. * - * @param mixed $input The PHP value - * @param int $inline The level where you switch to inline YAML - * @param int $indent The level of indentation (used internally) - * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The level of indentation (used internally) + * @param int-mask-of $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string */ public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0) : string + { + if ($flags & Yaml::DUMP_NULL_AS_EMPTY && $flags & Yaml::DUMP_NULL_AS_TILDE) { + throw new \InvalidArgumentException('The Yaml::DUMP_NULL_AS_EMPTY and Yaml::DUMP_NULL_AS_TILDE flags cannot be used together.'); + } + return $this->doDump($input, $inline, $indent, $flags); + } + /** + * @param mixed $input + */ + private function doDump($input, int $inline = 0, int $indent = 0, int $flags = 0, int $nestingLevel = 0) : string { $output = ''; $prefix = $indent ? \str_repeat(' ', $indent) : ''; @@ -49,11 +61,12 @@ public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0) : $dumpObjectAsInlineMap = !(array) $input; } if ($inline <= 0 || !\is_array($input) && !$input instanceof TaggedValue && $dumpObjectAsInlineMap || !$input) { - $output .= $prefix . Inline::dump($input, $flags); + $output .= $prefix . Inline::dump($input, $flags, 0 === $nestingLevel); } elseif ($input instanceof TaggedValue) { - $output .= $this->dumpTaggedValue($input, $inline, $indent, $flags, $prefix); + $output .= $this->dumpTaggedValue($input, $inline, $indent, $flags, $prefix, $nestingLevel); } else { $dumpAsMap = Inline::isHash($input); + $compactNestedMapping = Yaml::DUMP_COMPACT_NESTED_MAPPING & $flags && !$dumpAsMap; foreach ($input as $key => $value) { if ('' !== $output && "\n" !== $output[-1]) { $output .= "\n"; @@ -91,10 +104,10 @@ public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0) : continue; } if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) { - $output .= ' ' . $this->dump($value->getValue(), $inline - 1, 0, $flags) . "\n"; + $output .= ' ' . $this->doDump($value->getValue(), $inline - 1, 0, $flags, $nestingLevel + 1) . "\n"; } else { $output .= "\n"; - $output .= $this->dump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags); + $output .= $this->doDump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags, $nestingLevel + 1); } continue; } @@ -103,12 +116,12 @@ public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0) : $dumpObjectAsInlineMap = !(array) $value; } $willBeInlined = $inline - 1 <= 0 || !\is_array($value) && $dumpObjectAsInlineMap || !$value; - $output .= \sprintf('%s%s%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags) . ':' : '-', $willBeInlined ? ' ' : "\n", $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags)) . ($willBeInlined ? "\n" : ''); + $output .= \sprintf('%s%s%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags) . ':' : '-', $willBeInlined || $compactNestedMapping && \is_array($value) && Inline::isHash($value) ? ' ' : "\n", $compactNestedMapping && \is_array($value) && Inline::isHash($value) ? \substr($this->doDump($value, $inline - 1, $indent + 2, $flags, $nestingLevel + 1), $indent + 2) : $this->doDump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags, $nestingLevel + 1)) . ($willBeInlined ? "\n" : ''); } } return $output; } - private function dumpTaggedValue(TaggedValue $value, int $inline, int $indent, int $flags, string $prefix) : string + private function dumpTaggedValue(TaggedValue $value, int $inline, int $indent, int $flags, string $prefix, int $nestingLevel) : string { $output = \sprintf('%s!%s', $prefix ? $prefix . ' ' : '', $value->getTag()); if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && \strpos($value->getValue(), "\n") !== \false && \strpos($value->getValue(), "\r\n") === \false) { @@ -120,9 +133,9 @@ private function dumpTaggedValue(TaggedValue $value, int $inline, int $indent, i return $output; } if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) { - return $output . ' ' . $this->dump($value->getValue(), $inline - 1, 0, $flags) . "\n"; + return $output . ' ' . $this->doDump($value->getValue(), $inline - 1, 0, $flags, $nestingLevel + 1) . "\n"; } - return $output . "\n" . $this->dump($value->getValue(), $inline - 1, $indent, $flags); + return $output . "\n" . $this->doDump($value->getValue(), $inline - 1, $indent, $flags, $nestingLevel + 1); } private function getBlockIndentationIndicator(string $value) : string { diff --git a/vendor/rector/rector/vendor/symfony/yaml/Escaper.php b/vendor/rector/rector/vendor/symfony/yaml/Escaper.php index ecdbea38d..1501c84de 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Escaper.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Escaper.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml; +namespace RectorPrefix202506\Symfony\Component\Yaml; /** * Escaper encapsulates escaping rules for single and double-quoted diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php index 694f2943b..ec4297fe3 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/DumpException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202506\Symfony\Component\Yaml\Exception; /** * Exception class thrown when an error occurs during dumping. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php index 590115523..2e53cfc7e 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/ExceptionInterface.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202506\Symfony\Component\Yaml\Exception; /** * Exception interface for all exceptions thrown by the component. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php index 0eee01968..5e855c9b3 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/ParseException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202506\Symfony\Component\Yaml\Exception; /** * Exception class thrown when an error occurs during parsing. @@ -20,19 +20,19 @@ class ParseException extends RuntimeException /** * @var string */ - private $rawMessage; + private string $rawMessage; /** * @var int */ - private $parsedLine = -1; + private int $parsedLine = -1; /** * @var string|null */ - private $snippet; + private ?string $snippet = null; /** * @var string|null */ - private $parsedFile; + private ?string $parsedFile = null; /** * @param string $rawMessage The error message * @param int $parsedLine The line where the error occurred diff --git a/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php b/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php index a08da65eb..4d3ff34a9 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Exception/RuntimeException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml\Exception; +namespace RectorPrefix202506\Symfony\Component\Yaml\Exception; /** * Exception class thrown when an error occurs during parsing. diff --git a/vendor/rector/rector/vendor/symfony/yaml/Inline.php b/vendor/rector/rector/vendor/symfony/yaml/Inline.php index 42bbe0236..c64c2c889 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Inline.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Inline.php @@ -8,11 +8,11 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml; +namespace RectorPrefix202506\Symfony\Component\Yaml; -use RectorPrefix202411\Symfony\Component\Yaml\Exception\DumpException; -use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; -use RectorPrefix202411\Symfony\Component\Yaml\Tag\TaggedValue; +use RectorPrefix202506\Symfony\Component\Yaml\Exception\DumpException; +use RectorPrefix202506\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202506\Symfony\Component\Yaml\Tag\TaggedValue; /** * Inline implements a YAML parser/dumper for the YAML inline syntax. * @@ -23,30 +23,12 @@ class Inline { public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')'; - /** - * @var int - */ - public static $parsedLineNumber = -1; - /** - * @var string|null - */ - public static $parsedFilename; - /** - * @var bool - */ - private static $exceptionOnInvalidType = \false; - /** - * @var bool - */ - private static $objectSupport = \false; - /** - * @var bool - */ - private static $objectForMap = \false; - /** - * @var bool - */ - private static $constantSupport = \false; + public static int $parsedLineNumber = -1; + public static ?string $parsedFilename = null; + private static bool $exceptionOnInvalidType = \false; + private static bool $objectSupport = \false; + private static bool $objectForMap = \false; + private static bool $constantSupport = \false; public static function initialize(int $flags, ?int $parsedLineNumber = null, ?string $parsedFilename = null) : void { self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags); @@ -105,7 +87,7 @@ public static function parse(string $value, int $flags = 0, array &$references = * * @throws DumpException When trying to dump PHP resource */ - public static function dump($value, int $flags = 0) : string + public static function dump($value, int $flags = 0, bool $rootLevel = \false) : string { switch (\true) { case \is_resource($value): @@ -143,7 +125,7 @@ public static function dump($value, int $flags = 0) : string case \is_array($value): return self::dumpArray($value, $flags); case null === $value: - return self::dumpNull($flags); + return self::dumpNull($flags, $rootLevel); case \true === $value: return 'true'; case \false === $value: @@ -177,6 +159,7 @@ public static function dump($value, int $flags = 0) : string case self::isBinaryString($value): return '!!binary ' . \base64_encode($value); case Escaper::requiresDoubleQuoting($value): + case Yaml::DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES & $flags: return Escaper::escapeWithDoubleQuotes($value); case Escaper::requiresSingleQuoting($value): $singleQuoted = Escaper::escapeWithSingleQuotes($value); @@ -238,19 +221,23 @@ private static function dumpArray(array $value, int $flags) : string private static function dumpHashArray($value, int $flags) : string { $output = []; + $keyFlags = $flags & ~Yaml::DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES; foreach ($value as $key => $val) { if (\is_int($key) && Yaml::DUMP_NUMERIC_KEY_AS_STRING & $flags) { $key = (string) $key; } - $output[] = \sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags)); + $output[] = \sprintf('%s: %s', self::dump($key, $keyFlags), self::dump($val, $flags)); } return \sprintf('{ %s }', \implode(', ', $output)); } - private static function dumpNull(int $flags) : string + private static function dumpNull(int $flags, bool $rootLevel = \false) : string { if (Yaml::DUMP_NULL_AS_TILDE & $flags) { return '~'; } + if (Yaml::DUMP_NULL_AS_EMPTY & $flags && !$rootLevel) { + return ''; + } return 'null'; } /** @@ -528,7 +515,7 @@ private static function evaluateScalar(string $scalar, int $flags, array &$refer $value = \substr($scalar, 1); } // an unquoted * - if (\false === $value || '' === $value) { + if ('' === $value) { throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename); } if (!\array_key_exists($value, $references)) { @@ -549,7 +536,7 @@ private static function evaluateScalar(string $scalar, int $flags, array &$refer case '!' === $scalar[0]: switch (\true) { case \strncmp($scalar, '!!str ', \strlen('!!str ')) === 0: - $s = (string) \substr($scalar, 6); + $s = \substr($scalar, 6); if (\in_array($s[0] ?? '', ['"', "'"], \true)) { $isQuotedString = \true; $s = self::parseQuotedScalar($s); diff --git a/vendor/rector/rector/vendor/symfony/yaml/Parser.php b/vendor/rector/rector/vendor/symfony/yaml/Parser.php index b66602a40..bfc62c298 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Parser.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Parser.php @@ -8,10 +8,10 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml; +namespace RectorPrefix202506\Symfony\Component\Yaml; -use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; -use RectorPrefix202411\Symfony\Component\Yaml\Tag\TaggedValue; +use RectorPrefix202506\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202506\Symfony\Component\Yaml\Tag\TaggedValue; /** * Parser parses YAML strings to convert them to PHP arrays. * @@ -24,55 +24,22 @@ class Parser public const TAG_PATTERN = '(?P![\\w!.\\/:-]+)'; public const BLOCK_SCALAR_HEADER_PATTERN = '(?P\\||>)(?P\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(?P +#.*)?'; public const REFERENCE_PATTERN = '#^&(?P[^ ]++) *+(?P.*)#u'; - /** - * @var string|null - */ - private $filename; - /** - * @var int - */ - private $offset = 0; - /** - * @var int - */ - private $numberOfParsedLines = 0; - /** - * @var int|null - */ - private $totalNumberOfLines; - /** - * @var mixed[] - */ - private $lines = []; - /** - * @var int - */ - private $currentLineNb = -1; - /** - * @var string - */ - private $currentLine = ''; - /** - * @var mixed[] - */ - private $refs = []; - /** - * @var mixed[] - */ - private $skippedLineNumbers = []; - /** - * @var mixed[] - */ - private $locallySkippedLineNumbers = []; - /** - * @var mixed[] - */ - private $refsBeingParsed = []; + private ?string $filename = null; + private int $offset = 0; + private int $numberOfParsedLines = 0; + private ?int $totalNumberOfLines = null; + private array $lines = []; + private int $currentLineNb = -1; + private string $currentLine = ''; + private array $refs = []; + private array $skippedLineNumbers = []; + private array $locallySkippedLineNumbers = []; + private array $refsBeingParsed = []; /** * Parses a YAML file into a PHP value. * - * @param string $filename The path to the YAML file to be parsed - * @param int $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior + * @param string $filename The path to the YAML file to be parsed + * @param int-mask-of $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior * * @throws ParseException If the file could not be read or the YAML is not valid * @return mixed @@ -95,8 +62,8 @@ public function parseFile(string $filename, int $flags = 0) /** * Parses a YAML string to a PHP value. * - * @param string $value A YAML string - * @param int $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior + * @param string $value A YAML string + * @param int-mask-of $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior * * @throws ParseException If the YAML is not valid * @return mixed @@ -133,7 +100,7 @@ private function doParse(string $value, int $flags) $this->lines = \explode("\n", $value); $this->numberOfParsedLines = \count($this->lines); $this->locallySkippedLineNumbers = []; - $this->totalNumberOfLines = $this->totalNumberOfLines ?? $this->numberOfParsedLines; + $this->totalNumberOfLines ??= $this->numberOfParsedLines; if (!$this->moveToNextLine()) { return null; } @@ -287,6 +254,9 @@ private function doParse(string $value, int $flags) // Spec: Keys MUST be unique; first one wins. // But overwriting is allowed when a merge node is used in current block. if ($allowOverwrite || !isset($data[$key])) { + if (!$allowOverwrite && \array_key_exists($key, $data)) { + trigger_deprecation('symfony/yaml', '7.2', 'Duplicate key "%s" detected on line %d whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated and will throw a ParseException in 8.0.', $key, $this->getRealCurrentLineNb() + 1); + } if (null !== $subTag) { $data[$key] = new TaggedValue($subTag, ''); } else { @@ -306,6 +276,9 @@ private function doParse(string $value, int $flags) } $data += $value; } elseif ($allowOverwrite || !isset($data[$key])) { + if (!$allowOverwrite && \array_key_exists($key, $data)) { + trigger_deprecation('symfony/yaml', '7.2', 'Duplicate key "%s" detected on line %d whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated and will throw a ParseException in 8.0.', $key, $this->getRealCurrentLineNb() + 1); + } // Spec: Keys MUST be unique; first one wins. // But overwriting is allowed when a merge node is used in current block. if (null !== $subTag) { @@ -322,6 +295,9 @@ private function doParse(string $value, int $flags) // Spec: Keys MUST be unique; first one wins. // But overwriting is allowed when a merge node is used in current block. if ($allowOverwrite || !isset($data[$key])) { + if (!$allowOverwrite && \array_key_exists($key, $data)) { + trigger_deprecation('symfony/yaml', '7.2', 'Duplicate key "%s" detected on line %d whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated and will throw a ParseException in 8.0.', $key, $this->getRealCurrentLineNb() + 1); + } $data[$key] = $value; } else { throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine); @@ -746,7 +722,7 @@ private function parseBlockScalar(string $style, string $chomping = '', int $ind if ($notEOF) { $blockLines[] = ''; $this->moveToPreviousLine(); - } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) { + } elseif (!$this->isCurrentLineLastLineInDocument()) { $blockLines[] = ''; } // folded style @@ -984,21 +960,29 @@ private function lexInlineQuotedString(int &$cursor = 0) : string private function lexUnquotedString(int &$cursor) : string { $offset = $cursor; - $cursor += \strcspn($this->currentLine, '[]{},: ', $cursor); + while ($cursor < \strlen($this->currentLine)) { + if (\in_array($this->currentLine[$cursor], ['[', ']', '{', '}', ',', ':'], \true)) { + break; + } + if (\in_array($this->currentLine[$cursor], [' ', "\t"], \true) && '#' === ($this->currentLine[$cursor + 1] ?? '')) { + break; + } + ++$cursor; + } if ($cursor === $offset) { throw new ParseException('Malformed unquoted YAML string.'); } return \substr($this->currentLine, $offset, $cursor - $offset); } - private function lexInlineMapping(int &$cursor = 0) : string + private function lexInlineMapping(int &$cursor = 0, bool $consumeUntilEol = \true) : string { - return $this->lexInlineStructure($cursor, '}'); + return $this->lexInlineStructure($cursor, '}', $consumeUntilEol); } - private function lexInlineSequence(int &$cursor = 0) : string + private function lexInlineSequence(int &$cursor = 0, bool $consumeUntilEol = \true) : string { - return $this->lexInlineStructure($cursor, ']'); + return $this->lexInlineStructure($cursor, ']', $consumeUntilEol); } - private function lexInlineStructure(int &$cursor, string $closingTag) : string + private function lexInlineStructure(int &$cursor, string $closingTag, bool $consumeUntilEol = \true) : string { $value = $this->currentLine[$cursor]; ++$cursor; @@ -1016,14 +1000,17 @@ private function lexInlineStructure(int &$cursor, string $closingTag) : string ++$cursor; break; case '{': - $value .= $this->lexInlineMapping($cursor); + $value .= $this->lexInlineMapping($cursor, \false); break; case '[': - $value .= $this->lexInlineSequence($cursor); + $value .= $this->lexInlineSequence($cursor, \false); break; case $closingTag: $value .= $this->currentLine[$cursor]; ++$cursor; + if ($consumeUntilEol && isset($this->currentLine[$cursor]) && ($whitespaces = \strspn($this->currentLine, ' ', $cursor) + $cursor) < \strlen($this->currentLine) && '#' !== $this->currentLine[$whitespaces]) { + throw new ParseException(\sprintf('Unexpected token "%s".', \trim(\substr($this->currentLine, $cursor)))); + } return $value; case '#': break 2; @@ -1044,7 +1031,7 @@ private function consumeWhitespaces(int &$cursor) : bool { $whitespacesConsumed = 0; do { - $whitespaceOnlyTokenLength = \strspn($this->currentLine, ' ', $cursor); + $whitespaceOnlyTokenLength = \strspn($this->currentLine, " \t", $cursor); $whitespacesConsumed += $whitespaceOnlyTokenLength; $cursor += $whitespaceOnlyTokenLength; if (isset($this->currentLine[$cursor])) { diff --git a/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint b/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint index 7121a19fd..035c4f1d7 100755 --- a/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint +++ b/vendor/rector/rector/vendor/symfony/yaml/Resources/bin/yaml-lint @@ -1,6 +1,6 @@ #!/usr/bin/env php */ -use RectorPrefix202411\Symfony\Component\Console\Application; -use RectorPrefix202411\Symfony\Component\Yaml\Command\LintCommand; +use RectorPrefix202506\Symfony\Component\Console\Application; +use RectorPrefix202506\Symfony\Component\Yaml\Command\LintCommand; function includeIfExists(string $file) : bool { return \file_exists($file) && (include $file); diff --git a/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php index 5a7145396..6a4186c61 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Tag/TaggedValue.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml\Tag; +namespace RectorPrefix202506\Symfony\Component\Yaml\Tag; /** * @author Nicolas Grekas @@ -16,10 +16,7 @@ */ final class TaggedValue { - /** - * @var string - */ - private $tag; + private string $tag; /** * @var mixed */ diff --git a/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php b/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php index 5bf1ac14c..8e509a929 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Unescaper.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml; +namespace RectorPrefix202506\Symfony\Component\Yaml; -use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202506\Symfony\Component\Yaml\Exception\ParseException; /** * Unescaper encapsulates unescaping rules for single and double-quoted * YAML strings. @@ -41,9 +41,7 @@ public function unescapeSingleQuotedString(string $value) : string */ public function unescapeDoubleQuotedString(string $value) : string { - $callback = function ($match) { - return $this->unescapeCharacter($match[0]); - }; + $callback = fn($match) => $this->unescapeCharacter($match[0]); // evaluate the string return \preg_replace_callback('/' . self::REGEX_ESCAPED_CHARACTER . '/u', $callback, $value); } diff --git a/vendor/rector/rector/vendor/symfony/yaml/Yaml.php b/vendor/rector/rector/vendor/symfony/yaml/Yaml.php index b6f9f1b0a..8d492212e 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/Yaml.php +++ b/vendor/rector/rector/vendor/symfony/yaml/Yaml.php @@ -8,9 +8,9 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Symfony\Component\Yaml; +namespace RectorPrefix202506\Symfony\Component\Yaml; -use RectorPrefix202411\Symfony\Component\Yaml\Exception\ParseException; +use RectorPrefix202506\Symfony\Component\Yaml\Exception\ParseException; /** * Yaml offers convenience methods to load and dump YAML. * @@ -33,6 +33,9 @@ class Yaml public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024; public const DUMP_NULL_AS_TILDE = 2048; public const DUMP_NUMERIC_KEY_AS_STRING = 4096; + public const DUMP_NULL_AS_EMPTY = 8192; + public const DUMP_COMPACT_NESTED_MAPPING = 16384; + public const DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES = 32768; /** * Parses a YAML file into a PHP value. * @@ -41,8 +44,8 @@ class Yaml * $array = Yaml::parseFile('config.yml'); * print_r($array); * - * @param string $filename The path to the YAML file to be parsed - * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * @param string $filename The path to the YAML file to be parsed + * @param int-mask-of $flags A bit field of PARSE_* constants to customize the YAML parser behavior * * @throws ParseException If the file could not be read or the YAML is not valid * @return mixed @@ -61,8 +64,8 @@ public static function parseFile(string $filename, int $flags = 0) * print_r($array); * * - * @param string $input A string containing YAML - * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * @param string $input A string containing YAML + * @param int-mask-of $flags A bit field of PARSE_* constants to customize the YAML parser behavior * * @throws ParseException If the YAML is not valid * @return mixed @@ -78,10 +81,10 @@ public static function parse(string $input, int $flags = 0) * The dump method, when supplied with an array, will do its best * to convert the array into friendly YAML. * - * @param mixed $input The PHP value - * @param int $inline The level where you switch to inline YAML - * @param int $indent The amount of spaces to use for indentation of nested nodes - * @param int $flags A bit field of DUMP_* constants to customize the dumped YAML string + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The amount of spaces to use for indentation of nested nodes + * @param int-mask-of $flags A bit field of DUMP_* constants to customize the dumped YAML string */ public static function dump($input, int $inline = 2, int $indent = 4, int $flags = 0) : string { diff --git a/vendor/rector/rector/vendor/symfony/yaml/composer.json b/vendor/rector/rector/vendor/symfony/yaml/composer.json index 2008af5d5..9837796fd 100644 --- a/vendor/rector/rector/vendor/symfony/yaml/composer.json +++ b/vendor/rector/rector/vendor/symfony/yaml/composer.json @@ -17,6 +17,7 @@ ], "require": { "php": ">=8.2", + "symfony\/deprecation-contracts": "^2.5|^3.0", "symfony\/polyfill-ctype": "^1.8" }, "require-dev": { @@ -27,7 +28,7 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Symfony\\Component\\Yaml\\": "" + "RectorPrefix202506\\Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "\/Tests\/" diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json b/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json index bfd76801d..8fccc99c7 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/composer.json @@ -20,12 +20,12 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Symplify\\EasyParallel\\": "src" + "RectorPrefix202506\\Symplify\\EasyParallel\\": "src" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\Symplify\\EasyParallel\\Tests\\": "tests" + "RectorPrefix202506\\Symplify\\EasyParallel\\Tests\\": "tests" } }, "scripts": { diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php b/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php index 9a18a1eab..da39bf2ab 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/config/config.php @@ -1,9 +1,9 @@ services(); $services->defaults()->public()->autowire(); diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php b/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php index 8efa442e1..dba045ab2 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/src/CommandLine/WorkerCommandLineFactory.php @@ -1,12 +1,12 @@ commandFromReflectionFactory = new CommandFromReflectionFactory(); diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/src/Contract/SerializableInterface.php b/vendor/rector/rector/vendor/symplify/easy-parallel/src/Contract/SerializableInterface.php index bc2d61733..a6e0aa864 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/src/Contract/SerializableInterface.php +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/src/Contract/SerializableInterface.php @@ -1,7 +1,7 @@ command = $command; diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/ProcessPool.php b/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/ProcessPool.php index 50e48250b..79e19395f 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/ProcessPool.php +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/ProcessPool.php @@ -1,10 +1,10 @@ */ - private $processes = []; + private array $processes = []; public function __construct(TcpServer $tcpServer) { $this->tcpServer = $tcpServer; diff --git a/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/Schedule.php b/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/Schedule.php index c5f8c9626..db07c6565 100644 --- a/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/Schedule.php +++ b/vendor/rector/rector/vendor/symplify/easy-parallel/src/ValueObject/Schedule.php @@ -1,7 +1,7 @@ > * @readonly */ - private $jobs; + private array $jobs; /** * @param array> $jobs */ diff --git a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/AbstractCodeSample.php b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/AbstractCodeSample.php index 9652d1636..5b8c50909 100644 --- a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/AbstractCodeSample.php +++ b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/AbstractCodeSample.php @@ -11,12 +11,12 @@ abstract class AbstractCodeSample implements CodeSampleInterface * @var non-empty-string * @readonly */ - private $goodCode; + private string $goodCode; /** * @var non-empty-string * @readonly */ - private $badCode; + private string $badCode; public function __construct(string $badCode, string $goodCode) { $badCode = \trim($badCode); diff --git a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ComposerJsonAwareCodeSample.php b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ComposerJsonAwareCodeSample.php index 465805f52..71503ca1d 100644 --- a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ComposerJsonAwareCodeSample.php +++ b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ComposerJsonAwareCodeSample.php @@ -8,9 +8,8 @@ final class ComposerJsonAwareCodeSample extends AbstractCodeSample { /** * @readonly - * @var string */ - private $composerJson; + private string $composerJson; public function __construct(string $badCode, string $goodCode, string $composerJson) { $this->composerJson = $composerJson; diff --git a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php index f5c92f0ef..9a18d8a95 100644 --- a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php +++ b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php @@ -11,7 +11,7 @@ final class ConfiguredCodeSample extends AbstractCodeSample implements CodeSampl /** * @var mixed[] */ - private $configuration = []; + private array $configuration = []; /** * @param mixed[] $configuration */ diff --git a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php index 51728aab8..94743084f 100644 --- a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php +++ b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php @@ -8,9 +8,8 @@ final class ExtraFileCodeSample extends AbstractCodeSample { /** * @readonly - * @var string */ - private $extraFile; + private string $extraFile; public function __construct(string $badCode, string $goodCode, string $extraFile) { $this->extraFile = $extraFile; diff --git a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php index 5e76c95b1..a70ac2539 100644 --- a/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php +++ b/vendor/rector/rector/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php @@ -11,21 +11,14 @@ final class RuleDefinition { /** * @readonly - * @var string */ - private $description; - /** - * @var string|null - */ - private $ruleClass; - /** - * @var string|null - */ - private $ruleFilePath; + private string $description; + private ?string $ruleClass = null; + private ?string $ruleFilePath = null; /** * @var CodeSampleInterface[] */ - private $codeSamples = []; + private array $codeSamples = []; /** * @param CodeSampleInterface[] $codeSamples */ diff --git a/vendor/rector/rector/vendor/webmozart/assert/composer.json b/vendor/rector/rector/vendor/webmozart/assert/composer.json index ae25a4f0c..6595191c0 100644 --- a/vendor/rector/rector/vendor/webmozart/assert/composer.json +++ b/vendor/rector/rector/vendor/webmozart/assert/composer.json @@ -26,13 +26,13 @@ }, "autoload": { "psr-4": { - "RectorPrefix202411\\Webmozart\\Assert\\": "src\/" + "RectorPrefix202506\\Webmozart\\Assert\\": "src\/" } }, "autoload-dev": { "psr-4": { - "RectorPrefix202411\\Webmozart\\Assert\\Tests\\": "tests\/", - "RectorPrefix202411\\Webmozart\\Assert\\Bin\\": "bin\/src" + "RectorPrefix202506\\Webmozart\\Assert\\Tests\\": "tests\/", + "RectorPrefix202506\\Webmozart\\Assert\\Bin\\": "bin\/src" } }, "extra": { diff --git a/vendor/rector/rector/vendor/webmozart/assert/src/Assert.php b/vendor/rector/rector/vendor/webmozart/assert/src/Assert.php index cb4246198..34acce057 100644 --- a/vendor/rector/rector/vendor/webmozart/assert/src/Assert.php +++ b/vendor/rector/rector/vendor/webmozart/assert/src/Assert.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Webmozart\Assert; +namespace RectorPrefix202506\Webmozart\Assert; use ArrayAccess; use BadMethodCallException; diff --git a/vendor/rector/rector/vendor/webmozart/assert/src/InvalidArgumentException.php b/vendor/rector/rector/vendor/webmozart/assert/src/InvalidArgumentException.php index 5243d4fe0..eb2208ae2 100644 --- a/vendor/rector/rector/vendor/webmozart/assert/src/InvalidArgumentException.php +++ b/vendor/rector/rector/vendor/webmozart/assert/src/InvalidArgumentException.php @@ -8,7 +8,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace RectorPrefix202411\Webmozart\Assert; +namespace RectorPrefix202506\Webmozart\Assert; class InvalidArgumentException extends \InvalidArgumentException { diff --git a/vendor/rector/rector/vendor/webmozart/assert/src/Mixin.php b/vendor/rector/rector/vendor/webmozart/assert/src/Mixin.php index e2fe9c642..639b4f5b8 100644 --- a/vendor/rector/rector/vendor/webmozart/assert/src/Mixin.php +++ b/vendor/rector/rector/vendor/webmozart/assert/src/Mixin.php @@ -1,6 +1,6 @@ Date: Wed, 11 Jun 2025 23:35:03 +0200 Subject: [PATCH 3/3] Update composer.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 840da459b..ac8c15eac 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "require": { "php": ">=7.4", - "rector/rector": ">1.2.10", + "rector/rector": "^1.2.10", "friendsofphp/php-cs-fixer": ">3.38.2", "redaxo/php-cs-fixer-config": "^1.0" },